You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@whimsical.apache.org by Sam Ruby <ru...@apache.org> on 2015/12/13 16:14:57 UTC

[whimsy.git] [37/37] Commit e412a5b: Merge remote-tracking branch 'whimsy/master' into secmail

Commit e412a5b8f262d54ed4f877c5433fbac431dd8021:
    Merge remote-tracking branch 'whimsy/master' into secmail


Branch: refs/heads/secmail
Author: Sam Ruby <ru...@intertwingly.net>
Committer: Sam Ruby <ru...@intertwingly.net>
Pusher: rubys <ru...@apache.org>

-----------------------------------------------------------------
Gemfile                                                           | +++ 
README                                                            | +++++++++ 
Rakefile                                                          | ++++++ 
asf.gemspec                                                       | +++++++++ 
asf.version                                                       | + 
doap_Whimsy.rdf                                                   | ++++++++++ 
examples/Dockerfile                                               | ++++++++++++++ 
examples/board.rb                                                 | +++++++++ 
images/animated-overlay.gif                                       |  
images/ui-bg_flat_0_aaaaaa_40x100.png                             |  
images/ui-bg_flat_55_999999_40x100.png                            |  
images/ui-bg_flat_75_aaaaaa_40x100.png                            |  
images/ui-bg_flat_75_ffffff_40x100.png                            |  
images/ui-bg_glass_45_0078ae_1x400.png                            |  
images/ui-bg_glass_55_f8da4e_1x400.png                            |  
images/ui-bg_glass_55_fbf9ee_1x400.png                            |  
images/ui-bg_glass_65_ffffff_1x400.png                            |  
images/ui-bg_glass_75_79c9ec_1x400.png                            |  
images/ui-bg_glass_75_dadada_1x400.png                            |  
images/ui-bg_glass_75_e6e6e6_1x400.png                            |  
images/ui-bg_glass_95_fef1ec_1x400.png                            |  
images/ui-bg_gloss-wave_45_e14f1c_500x100.png                     |  
images/ui-bg_gloss-wave_50_6eac2c_500x100.png                     |  
images/ui-bg_gloss-wave_75_2191c0_500x100.png                     |  
images/ui-bg_highlight-soft_75_cccccc_1x100.png                   |  
images/ui-bg_inset-hard_100_fcfdfd_1x100.png                      |  
images/ui-icons_0078ae_256x240.png                                |  
images/ui-icons_056b93_256x240.png                                |  
images/ui-icons_222222_256x240.png                                |  
images/ui-icons_2e83ff_256x240.png                                |  
images/ui-icons_454545_256x240.png                                |  
images/ui-icons_888888_256x240.png                                |  
images/ui-icons_cd0a0a_256x240.png                                |  
images/ui-icons_d8e7f3_256x240.png                                |  
images/ui-icons_e0fdff_256x240.png                                |  
images/ui-icons_f5e175_256x240.png                                |  
images/ui-icons_f7a50d_256x240.png                                |  
images/ui-icons_fcd113_256x240.png                                |  
lib/whimsy/asf.rb                                                 | ++++++++++ 
lib/whimsy/asf/agenda.rb                                          | ++++++++++ 
lib/whimsy/asf/agenda/attachments.rb                              | +++++++++++++ 
lib/whimsy/asf/agenda/back.rb                                     | ++++++++++++++ 
lib/whimsy/asf/agenda/committee.rb                                | ++++++++++ 
lib/whimsy/asf/agenda/exec-officer.rb                             | +++++++++ 
lib/whimsy/asf/agenda/front.rb                                    | +++++++++ 
lib/whimsy/asf/agenda/minutes.rb                                  | ++++++++++++ 
lib/whimsy/asf/agenda/special.rb                                  | ++++++++++++++ 
lib/whimsy/asf/auth.rb                                            | ++++++++++++++ 
lib/whimsy/asf/bundler.rb                                         | ++++++++ 
lib/whimsy/asf/committee.rb                                       | ++++++++++ 
lib/whimsy/asf/config.rb                                          | ++++++++++++++ 
lib/whimsy/asf/icla.rb                                            | +++++++++++++++ 
lib/whimsy/asf/ldap.rb                                            | +++++++++++++ 
lib/whimsy/asf/mail.rb                                            | +++++++++++++ 
lib/whimsy/asf/member.rb                                          | ++++++++++++ 
lib/whimsy/asf/nominees.rb                                        | ++++++++ 
lib/whimsy/asf/podlings.rb                                        | ++++++++++++ 
lib/whimsy/asf/rack.rb                                            | +++++++++++++++ 
lib/whimsy/asf/site.rb                                            | +++++++++++++ 
lib/whimsy/asf/svn.rb                                             | ++++++++++++ 
lib/whimsy/asf/watch.rb                                           | +++++++++++ 
secmail.py                                                        | ++++++++++++ 
vagrant/README                                                    | +++++++++++++ 
vagrant/Vagrantfile                                               | +++++++++ 
vagrant/cookbooks/whimsy/recipes/apache.rb                        | +++++++++ 
vagrant/cookbooks/whimsy/recipes/default.rb                       | ++++ 
vagrant/cookbooks/whimsy/recipes/model.rb                         | ++++++++++ 
vagrant/cookbooks/whimsy/recipes/secretary.rb                     | +++++++++ 
vagrant/cookbooks/whimsy/recipes/system.rb                        | +++++++++ 
vagrant/recipes                                                   | + 
vagrant/secmail.rb                                                | ++++++++++++ 
www/apmail/mods.cgi                                               | ++++++++ 
www/board/posted-reports.cgi                                      | ++++++++++ 
www/board/publish_minutes.cgi                                     | ++++++++++ 
www/board/subscriptions.cgi                                       | +++++++++++ 
www/calendar-demo/Rakefile                                        | +++ 
www/calendar-demo/app.rb                                          | ++++++++++++++ 
www/calendar-demo/config.ru                                       | +++ 
www/calendar-demo/model.rb                                        | ++++++++++++ 
www/calendar-demo/monkey_patches.rb                               | +++++++++++ 
www/calendar-demo/public/css/calendar.css                         | ++++++++++ 
www/calendar-demo/public/js/react-0.12.2.min.js                   | ++++++++ 
www/calendar-demo/spec/spec_helper.rb                             | ++++++ 
www/calendar-demo/spec/static_spec.rb                             | ++++++++++ 
www/calendar-demo/views/calendar.html.rb                          | +++++++++++++++ 
www/calendar-demo/views/calendar.js.rb                            | +++++++++ 
www/classic/board/agenda/README                                   | ++++++++ 
www/classic/board/agenda/Rakefile                                 | ++++++++++++++ 
www/classic/board/agenda/config.ru                                | +++++++++ 
www/classic/board/agenda/helpers/string.rb                        | ++++++++++++ 
www/classic/board/agenda/js/app._js                               | +++++++++++++++ 
www/classic/board/agenda/js/directives._js                        | +++++++++ 
www/classic/board/agenda/js/filters._js                           | ++++++++ 
www/classic/board/agenda/js/services._js                          | ++++++++++++++ 
www/classic/board/agenda/json/approve._json                       | +++++++++++++++ 
www/classic/board/agenda/json/attend._json                        | ++++++++++++ 
www/classic/board/agenda/json/comment._json                       | ++++++++++ 
www/classic/board/agenda/json/commit._json                        | ++++++++++++++ 
www/classic/board/agenda/json/draft._json                         | ++++++++ 
www/classic/board/agenda/json/jira._json                          | ++++++++ 
www/classic/board/agenda/json/markseen._json                      | ++++++++++++ 
www/classic/board/agenda/json/minute._json                        | +++++++++++++++ 
www/classic/board/agenda/json/post._json                          | +++++++++++ 
www/classic/board/agenda/json/publish._json                       | +++++++++++++++ 
www/classic/board/agenda/json/refresh._json                       | +++++++++ 
www/classic/board/agenda/json/todos._json                         | +++++++++++ 
www/classic/board/agenda/main.rb                                  | ++++++++++ 
www/classic/board/agenda/model/draft.rb                           | +++++++++++++ 
www/classic/board/agenda/model/pending.rb                         | ++++++++++++ 
www/classic/board/agenda/partials/comment._html                   | ++++++++ 
www/classic/board/agenda/partials/comments._html                  | ++++++++++++ 
www/classic/board/agenda/partials/commit._html                    | +++++++++++ 
www/classic/board/agenda/partials/draft-minutes._html             | +++++++++++++ 
www/classic/board/agenda/partials/help._html                      | +++++++++++++++ 
www/classic/board/agenda/partials/index._html                     | ++++++++++++++ 
www/classic/board/agenda/partials/minute._html                    | +++++++++++ 
www/classic/board/agenda/partials/pending._html                   | ++++++++++++++ 
www/classic/board/agenda/partials/post._html                      | +++++++++++++++ 
www/classic/board/agenda/partials/publish-minutes._html           | +++++++++++++ 
www/classic/board/agenda/partials/search._html                    | ++++++++++ 
www/classic/board/agenda/partials/section._html                   | +++++++++ 
www/classic/board/agenda/partials/shepherd._html                  | +++++++++++ 
www/classic/board/agenda/partials/special_order._html             | +++++++++++++ 
www/classic/board/agenda/partials/vote._html                      | ++++++++++++ 
www/classic/board/agenda/public/stylesheets/app.css               | ++++++++++++++ 
www/classic/board/agenda/test/data/board_agenda_2014_02_19.txt    | ++++++++ 
www/classic/board/agenda/test/data/board_agenda_2014_03_19.txt    | ++++++++++ 
www/classic/board/agenda/test/data/board_minutes_2014_02_19.txt   | +++++++++++++++ 
www/classic/board/agenda/test/protractor.conf.js                  | ++ 
www/classic/board/agenda/test/specs/agenda.rb                     | ++++++++ 
www/classic/board/agenda/views/main._html                         | +++++++++++++++ 
www/classic/roster/committee.cgi                                  | ++++++++ 
www/classic/roster/committer.cgi                                  | +++++++++++ 
www/classic/roster/modify_group_member.cgi                        | ++++++++ 
www/committers/X_______.cgi                                       | + 
www/committers/subscribe.cgi                                      | ++++++++++ 
www/favicon.ico                                                   |  
www/fundraising/invoice.cgi                                       |  
www/fundraising/prospects.cgi                                     |  
www/fundraising/sponsorship.cgi                                   |  
www/incubator/moderators.cgi                                      |  
www/incubator/podlings/by-age.cgi                                 |  
www/incubator/signoff.cgi                                         |  
www/index.html                                                    |  
www/jquery-min.js                                                 |  
www/jquery-ui.css                                                 |  
www/jquery-ui.min.js                                              |  
www/jquery.min.js                                                 |  
www/jquery.tablesorter.js                                         |  
www/jquery.tablesorter.pager.js                                   |  
www/members/css/bootstrap-combobox.css                            |  
www/members/css/bootstrap.min.css                                 |  
www/members/js/bootstrap-combobox.js                              |  
www/members/js/bootstrap.min.js                                   |  
www/members/js/jquery-1.11.1.min.js                               |  
www/members/nominations.cgi                                       |  
www/members/non-participants.cgi                                  |  
www/members/proxy.cgi                                             |  
www/members/subscriptions.cgi                                     |  
www/members/watch.cgi                                             |  
www/new-account-request-queue.cgi                                 |  
www/robots.txt                                                    |  
www/roster/config.ru                                              |  
www/roster/js/app._js                                             |  
www/roster/js/services._js                                        |  
www/roster/main.rb                                                |  
www/roster/model/ldap.rb                                          |  
www/roster/partials/committee._html                               |  
www/roster/partials/committees._html                              |  
www/roster/partials/committer._html                               |  
www/roster/partials/committers._html                              |  
www/roster/partials/group._html                                   |  
www/roster/partials/groups._html                                  |  
www/roster/partials/index._html                                   |  
www/roster/public/stylesheets/app.css                             |  
www/roster/public_committee_info.rb                               |  
www/roster/public_icla_info.rb                                    |  
www/roster/public_member_info.rb                                  |  
www/roster/tmp/restart.txt                                        |  
www/roster/views/main._html                                       |  
www/secretary/icla-lint.cgi                                       |  
www/secretary/iclasort.rb                                         |  
www/secretary/public-names.cgi                                    |  
www/secretary/response-time.cgi                                   |  
www/secretary/workbench/HOWTO.html                                |  
www/secretary/workbench/README                                    |  
www/secretary/workbench/ccla.erb                                  |  
www/secretary/workbench/file.cgi                                  |  
www/secretary/workbench/grant.erb                                 |  
www/secretary/workbench/icla.erb                                  |  
www/secretary/workbench/index.html                                |  
www/secretary/workbench/jquery-1.7.2.min.js                       |  
www/secretary/workbench/jquery.timeago.js                         |  
www/secretary/workbench/local_paths.rb                            |  
www/secretary/workbench/local_paths.yml                           |  
www/secretary/workbench/mem.erb                                   |  
www/secretary/workbench/nda.erb                                   |  
www/secretary/workbench/spinner.gif                               |  
www/secretary/workbench/unsigned.erb                              |  
www/secretary/workbench/upload.cgi                                |  
www/secretary/workbench/worklist.cgi                              |  
www/secretary/workbench/worklist.css                              |  
www/secretary/workbench/worklist.js                               |  
www/spinner.gif                                                   |  
www/technology.html                                               |  
www/test/icla/.gitignore                                          |  
www/test/icla/Gemfile                                             |  
www/test/icla/Rakefile                                            |  
www/test/icla/config.ru                                           |  
www/test/icla/main.rb                                             |  
www/test/icla/package.json                                        |  
www/test/icla/public/assets/bootstrap-min.css                     |  
www/test/icla/public/assets/bootstrap-min.js                      |  
www/test/icla/public/assets/bootstrap-theme.min.css               |  
www/test/icla/public/assets/jquery-min.js                         |  
www/test/icla/public/assets/react-min.js                          |  
www/test/icla/public/css/icla.css                                 |  
www/test/icla/views/actions/draft-icla.json.rb                    |  
www/test/icla/views/actions/validate.json.rb                      |  
www/test/icla/views/app.html.rb                                   |  
www/test/icla/views/app.js.rb                                     |  
www/test/icla/views/main.js.rb                                    |  
www/test/icla/views/markdown.js.rb                                |  
www/test/icla/views/pages.js.rb                                   |  
www/test/icla/views/pages/complete.js.rb                          |  
www/test/icla/views/pages/form.js.rb                              |  
www/test/icla/views/pages/interview.js.rb                         |  
www/test/icla/views/pages/invite.js.rb                            |  
www/test/icla/views/pages/preview.js.rb                           |  
www/test/local_paths.rb                                           |  
www/test/roster/Gemfile                                           |  
www/test/roster/banner.rb                                         |  
www/test/roster/config.ru                                         |  
www/test/roster/main.rb                                           |  
www/test/roster/models.rb                                         |  
www/test/roster/models/committee.rb                               |  
www/test/roster/models/committer.rb                               |  
www/test/roster/package.json                                      |  
www/test/roster/public/fonts/glyphicons-halflings-regular.eot     |  
www/test/roster/public/fonts/glyphicons-halflings-regular.svg     |  
www/test/roster/public/fonts/glyphicons-halflings-regular.ttf     |  
www/test/roster/public/fonts/glyphicons-halflings-regular.woff    |  
www/test/roster/public/fonts/glyphicons-halflings-regular.woff2   |  
www/test/roster/public/javascript/es6-promise.js                  |  
www/test/roster/public/javascript/fetch.js                        |  
www/test/roster/public/stylesheets/app.css                        |  
www/test/roster/views/app.js.rb                                   |  
www/test/roster/views/committee.html.rb                           |  
www/test/roster/views/committee.js.rb                             |  
www/test/roster/views/committees.html.rb                          |  
www/test/roster/views/committer.html.rb                           |  
www/test/roster/views/committer.js.rb                             |  
www/test/roster/views/committerSearch.js.rb                       |  
www/test/roster/views/committers.html.rb                          |  
www/test/roster/views/index.html.rb                               |  
www/test/roster/views/polyfill.js.rb                              |  
www/test/secmail.rb                                               |  
www/test/secretary/workbench/email.rb                             |  
www/treasurer/bill-upload.cgi                                     |  
www/treasurer/expenses.cgi                                        |  
www/treasurer/index.cgi                                           |  
www/treasurer/paypal.cgi                                          |  
www/treasurer/statements.cgi                                      |  
www/voter/jquery.min.js                                           |  
www/whimsy.svg                                                    |  
-----------------------------------------------------------------
22159 changes: 22159 additions, 0 deletions.
-----------------------------------------------------------------


diff --git a/Gemfile b/Gemfile
new file mode 100644
index 0000000..fa75df1
--- /dev/null
+++ b/Gemfile
@@ -0,0 +1,3 @@
+source 'https://rubygems.org'
+
+gemspec
diff --git a/README b/README
new file mode 100644
index 0000000..045f438
--- /dev/null
+++ b/README
@@ -0,0 +1,130 @@
+************************************************************************
+*                               Preface                                *
+************************************************************************
+
+Whimsy is a set of independent tools and a common library which typically will
+need to access various ASF SVN directories and/or LDAP.  To do development and
+testing, you will need access to a machine on which you are willing to install
+libraries which do things like access LDAP, XML parsing, composing mail and
+the like.  While some tools may work on Microsoft Windows, many don't
+currently.  Alternatives include a Docker image or a Vagrant VM.
+
+The primary advantage of using an image or a VM is isolation.  The primary
+disadvantage is that you will need to install your SVN credentials there and
+arrange to either duplicate or mount your SVN directories.
+
+************************************************************************
+*                               Overview                               *
+************************************************************************
+
+This directory has two main subdirectories...
+
+1) "asf" contains the "model", i.e., a set of classes which encapsulate access
+   to a number of data sources such as LDAP, ICLAs, auth lists, etc.  This
+   code originally was developed as a part of separate tools and was later
+   refactored out into a common library.  Some of the older tools don't fully
+   make use of this refactoring.
+
+2) "www" contains the "view", largely a set of cgi scripts that produce HTML.
+   Generally a cgi script is self contained, including all of the CSS,
+   scripts, AJAX logic (client and server), SVG images, etc.  A single script
+   may also produce a set (subtree) of web pages. 
+
+   Some of the scripts (like the roster tool) are long running servers.  The
+   board agenda tool is currently hosted on github, but this will be
+   consolidated to the consolidated svn repository once the following
+   request is complete:
+
+     https://issues.apache.org/jira/browse/INFRA-10399
+
+************************************************************************
+*                                Setup                                 *
+************************************************************************
+
+This section is for those desiring to run a whimsy tool on their own machine.
+Skip this section if you are running a Docker container or a Vagrant VM.
+
+1) The ruby version needs be ruby 1.9.3 or higher.  Verify with 'ruby -v'.
+   If you use a system provided version of Ruby, you may need to prefix
+   certain commands (like gem install) with 'sudo'.  Alternatives to using
+   the system provided version include using a Ruby version manager like
+   rbenv or rvm.  Rbenv generally requires you to be more aware of what you
+   are doing (e.g., the need for shims).  While rvm tends to be more of a set
+   and forget operation, it tends to be more system intrusive (e.g. aliasing
+   'cd' in bash).
+
+   Links:
+
+   https://github.com/sstephenson/rbenv#understanding-shims
+   https://github.com/sstephenson/rbenv/wiki/Understanding-binstubs
+
+   https://rvm.io/
+
+2) Make sure that the whimsy-asf gem installed.  If it is not, run
+
+  gem install whimsy-asf
+
+3) current SVN checkouts of various repositories are made (or linked to from)
+   /home/whimsysvn/svn:
+
+   svn co --depth=files https://svn.apache.org/repos/private/foundation
+
+   You can specify an alternate location for these directories by placing
+   a configuration file named `.whimsy` in your home directory.  The format
+   for this file is YAML, and an example (be sure to include the dashed
+   lines):
+
+     ---
+     :svn:
+     - /home/rubys/svn/foundation
+     - /home/rubys/svn/committers
+
+4) Access to LDAP requires configuration, and a cert.
+
+   a) The model code determines what host and port to connect to by parsing
+      either /etc/ldap/ldap.conf or /etc/ldap/ldap.conf for a line that looks
+      like the following:
+        uri     ldaps://ldap1-us-east.apache.org:636
+
+   b) A TLS_CACERT can be obtained via either of the following commands:
+
+        ruby -r whimsy/asf -e "puts ASF::LDAP.cert"
+        openssl s_client -connect ldap1-us-east.apache.org:636 </dev/null
+
+      Copy from BEGIN to END inclusive into the file 
+      /etc/ldap/asf-ldap-client.pem.  Point to the file in
+      /etc/ldap/ldap.conf with a line like the following:
+
+        TLS_CACERT      /etc/ldap/asf-ldap-client.pem
+
+      N.B. OpenLDAP uses /etc/openldap/ instead of /etc/ldap/ 
+      Adjust the paths above as necessary
+ 
+      These above updates can be done for you with the following command:
+
+        sudo ruby -r whimsy/asf -e "ASF::LDAP.configure"
+
+      Note: the certificate is needed because the LDAP hosts use a self-signed
+      certificate
+
+5) Verify that the configuration is correct by running:
+
+   ruby examples/board.rb
+
+   See comments in that file for running the script as a standalone server.
+
+************************************************************************
+*                           Further reading                            *
+************************************************************************
+
+An example of a complete tool that makes full use of the library factoring,
+has a suite of test cases, and client componentization (using ReactJS), and
+provides instructions for setting up both a Docker component and a Vagrant VM:
+
+  https://github.com/rubys/whimsy-agenda#readme
+
+If you would like to understand how the view code works, you can get started
+by looking at a few of the Wunderbar demos and README:
+
+  https://github.com/rubys/wunderbar/tree/master/demo
+  https://github.com/rubys/wunderbar/blob/master/README.md
diff --git a/Rakefile b/Rakefile
new file mode 100644
index 0000000..28ebd4a
--- /dev/null
+++ b/Rakefile
@@ -0,0 +1,6 @@
+require 'rubygems/package_task'
+
+spec = eval(File.read('asf.gemspec'))
+Gem::PackageTask.new(spec) do |pkg|
+  pkg.gem_spec = spec
+end
diff --git a/asf.gemspec b/asf.gemspec
new file mode 100644
index 0000000..fb68567
--- /dev/null
+++ b/asf.gemspec
@@ -0,0 +1,33 @@
+version = File.read(File.expand_path('../asf.version', __FILE__)).strip
+
+Gem::Specification.new do |s|
+
+  # Change these as appropriate
+  s.name           = "whimsy-asf"
+  s.license        = 'Apache License, Version 2.0'
+  s.version        = version
+  s.summary        = "Whimsy 'model' of the ASF"
+  s.author         = "Sam Ruby"
+  s.email          = "rubys@intertwingly.net"
+  s.homepage       = "https://whimsy.apache.org/"
+  s.description    = <<-EOD
+    This package contains a set of classes which encapsulate access
+    to a number of data sources such as LDAP, ICLAs, auth lists, etc.
+  EOD
+
+  # Add any extra files to include in the gem
+  s.files             = Dir.glob(["asf.*", "lib/**/*"])
+  s.require_paths     = ["lib"]
+
+  # If you want to depend on other gems, add them here, along with any
+  # relevant versions
+  s.add_dependency("nokogiri")
+  s.add_dependency("rack")
+  s.add_dependency("ruby-ldap")
+  s.add_dependency("tzinfo")
+  s.add_dependency("tzinfo-data")
+  s.add_dependency("wunderbar")
+
+  # If your tests use any gems, include them here
+  # s.add_development_dependency("mocha") # for example
+end
diff --git a/asf.version b/asf.version
new file mode 100644
index 0000000..9a52cbd
--- /dev/null
+++ b/asf.version
@@ -0,0 +1 @@
+0.0.69
diff --git a/doap_Whimsy.rdf b/doap_Whimsy.rdf
new file mode 100644
index 0000000..d8e9153
--- /dev/null
+++ b/doap_Whimsy.rdf
@@ -0,0 +1,40 @@
+<?xml version="1.0"?>
+<?xml-stylesheet type="text/xsl"?>
+<rdf:RDF xml:lang="en"
+         xmlns="http://usefulinc.com/ns/doap#" 
+         xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" 
+         xmlns:asfext="http://projects.apache.org/ns/asfext#"
+         xmlns:foaf="http://xmlns.com/foaf/0.1/">
+<!--
+    Licensed to the Apache Software Foundation (ASF) under one or more
+    contributor license agreements.  See the NOTICE file distributed with
+    this work for additional information regarding copyright ownership.
+    The ASF licenses this file to You 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.
+-->
+  <Project rdf:about="http://whimsy.apache.org">
+    <created>2015-06-25</created>
+    <license rdf:resource="http://spdx.org/licenses/Apache-2.0" />
+    <name>Apache Whimsy</name>
+    <homepage rdf:resource="http://whimsy.apache.org/" />
+    <asfext:pmc rdf:resource="http://whimsy.apache.org" />
+    <shortdesc>Whimsy is a site where a set of absolutely unnecessary yet often quite handy applications are deployed. </shortdesc>
+    <programming-language>JavaScript</programming-language>
+    <category rdf:resource="http://projects.apache.org/category/content" />
+    <repository>
+      <SVNRepository>
+        <location rdf:resource="https://svn.apache.org/repos/infra/infrastructure/trunk/projects/whimsy"/>
+        <browse rdf:resource="http://svn.apache.org/repos/infra/infrastructure/trunk/projects/whimsy"/>
+      </SVNRepository>
+    </repository>
+  </Project>
+</rdf:RDF>
diff --git a/examples/Dockerfile b/examples/Dockerfile
new file mode 100644
index 0000000..2a3bce6
--- /dev/null
+++ b/examples/Dockerfile
@@ -0,0 +1,28 @@
+FROM ubuntu:14.04.3
+ENV DEBIAN_FRONTEND noninteractive
+
+ENV RUBY_VERSION 2.2
+
+# generate locales
+ENV LANG en_US.UTF-8
+RUN locale-gen $LANG
+
+EXPOSE 9292
+
+# system packages
+RUN apt-get install -y software-properties-common && \
+    apt-add-repository ppa:brightbox/ruby-ng && \
+    apt-get update -y && \
+    apt-get install -y ruby$RUBY_VERSION  && \
+    apt-get install -y ruby$RUBY_VERSION-dev && \
+    apt-get install -y build-essential && \
+    apt-get install -y libssl-dev && \
+    apt-get install -y libldap2-dev && \
+    apt-get install -y libsasl2-dev
+
+# board example
+RUN gem install whimsy-asf
+RUN ruby -r whimsy/asf -e "ASF::LDAP.configure"
+ADD . /home/board
+WORKDIR /home/board
+CMD ["/usr/bin/ruby", "board.rb", "--port=9292"]
diff --git a/examples/board.rb b/examples/board.rb
new file mode 100644
index 0000000..ddb1d15
--- /dev/null
+++ b/examples/board.rb
@@ -0,0 +1,33 @@
+# To run with output going to STDOUT:
+#
+#   ruby examples/board.rb
+#
+# To run as a server:
+#
+#   ruby examples/board.rb --port=8080
+#
+# To install on a server that supports CGI:
+#
+#   ruby examples/board.rb --install=/Users/rubys/Sites/
+
+require 'whimsy/asf'
+
+_html do
+  _h1_ 'List of ASF board members'
+
+  _table do
+    _tr do
+      _th 'id'
+      _th 'name'
+      _th 'mail'
+    end
+
+    ASF::Service.find('board').members.each do |person|
+      _tr_ do
+        _td person.id
+        _td person.public_name
+        _td person.mail.first
+      end
+    end
+  end
+end
diff --git a/images/animated-overlay.gif b/images/animated-overlay.gif
new file mode 100644
index 0000000..d441f75
Binary files /dev/null and b/images/animated-overlay.gif differ
diff --git a/images/ui-bg_flat_0_aaaaaa_40x100.png b/images/ui-bg_flat_0_aaaaaa_40x100.png
new file mode 100644
index 0000000..5b5dab2
Binary files /dev/null and b/images/ui-bg_flat_0_aaaaaa_40x100.png differ
diff --git a/images/ui-bg_flat_55_999999_40x100.png b/images/ui-bg_flat_55_999999_40x100.png
new file mode 100644
index 0000000..c02a884
Binary files /dev/null and b/images/ui-bg_flat_55_999999_40x100.png differ
diff --git a/images/ui-bg_flat_75_aaaaaa_40x100.png b/images/ui-bg_flat_75_aaaaaa_40x100.png
new file mode 100644
index 0000000..7f22e22
Binary files /dev/null and b/images/ui-bg_flat_75_aaaaaa_40x100.png differ
diff --git a/images/ui-bg_flat_75_ffffff_40x100.png b/images/ui-bg_flat_75_ffffff_40x100.png
new file mode 100644
index 0000000..ac8b229
Binary files /dev/null and b/images/ui-bg_flat_75_ffffff_40x100.png differ
diff --git a/images/ui-bg_glass_45_0078ae_1x400.png b/images/ui-bg_glass_45_0078ae_1x400.png
new file mode 100644
index 0000000..da0fdd9
Binary files /dev/null and b/images/ui-bg_glass_45_0078ae_1x400.png differ
diff --git a/images/ui-bg_glass_55_f8da4e_1x400.png b/images/ui-bg_glass_55_f8da4e_1x400.png
new file mode 100644
index 0000000..9895a43
Binary files /dev/null and b/images/ui-bg_glass_55_f8da4e_1x400.png differ
diff --git a/images/ui-bg_glass_55_fbf9ee_1x400.png b/images/ui-bg_glass_55_fbf9ee_1x400.png
new file mode 100644
index 0000000..ad3d634
Binary files /dev/null and b/images/ui-bg_glass_55_fbf9ee_1x400.png differ
diff --git a/images/ui-bg_glass_65_ffffff_1x400.png b/images/ui-bg_glass_65_ffffff_1x400.png
new file mode 100644
index 0000000..42ccba2
Binary files /dev/null and b/images/ui-bg_glass_65_ffffff_1x400.png differ
diff --git a/images/ui-bg_glass_75_79c9ec_1x400.png b/images/ui-bg_glass_75_79c9ec_1x400.png
new file mode 100644
index 0000000..278d45a
Binary files /dev/null and b/images/ui-bg_glass_75_79c9ec_1x400.png differ
diff --git a/images/ui-bg_glass_75_dadada_1x400.png b/images/ui-bg_glass_75_dadada_1x400.png
new file mode 100644
index 0000000..5a46b47
Binary files /dev/null and b/images/ui-bg_glass_75_dadada_1x400.png differ
diff --git a/images/ui-bg_glass_75_e6e6e6_1x400.png b/images/ui-bg_glass_75_e6e6e6_1x400.png
new file mode 100644
index 0000000..86c2baa
Binary files /dev/null and b/images/ui-bg_glass_75_e6e6e6_1x400.png differ
diff --git a/images/ui-bg_glass_95_fef1ec_1x400.png b/images/ui-bg_glass_95_fef1ec_1x400.png
new file mode 100644
index 0000000..4443fdc
Binary files /dev/null and b/images/ui-bg_glass_95_fef1ec_1x400.png differ
diff --git a/images/ui-bg_gloss-wave_45_e14f1c_500x100.png b/images/ui-bg_gloss-wave_45_e14f1c_500x100.png
new file mode 100644
index 0000000..09d9020
Binary files /dev/null and b/images/ui-bg_gloss-wave_45_e14f1c_500x100.png differ
diff --git a/images/ui-bg_gloss-wave_50_6eac2c_500x100.png b/images/ui-bg_gloss-wave_50_6eac2c_500x100.png
new file mode 100644
index 0000000..0f57b71
Binary files /dev/null and b/images/ui-bg_gloss-wave_50_6eac2c_500x100.png differ
diff --git a/images/ui-bg_gloss-wave_75_2191c0_500x100.png b/images/ui-bg_gloss-wave_75_2191c0_500x100.png
new file mode 100644
index 0000000..205e25e
Binary files /dev/null and b/images/ui-bg_gloss-wave_75_2191c0_500x100.png differ
diff --git a/images/ui-bg_highlight-soft_75_cccccc_1x100.png b/images/ui-bg_highlight-soft_75_cccccc_1x100.png
new file mode 100644
index 0000000..7c9fa6c
Binary files /dev/null and b/images/ui-bg_highlight-soft_75_cccccc_1x100.png differ
diff --git a/images/ui-bg_inset-hard_100_fcfdfd_1x100.png b/images/ui-bg_inset-hard_100_fcfdfd_1x100.png
new file mode 100644
index 0000000..534a864
Binary files /dev/null and b/images/ui-bg_inset-hard_100_fcfdfd_1x100.png differ
diff --git a/images/ui-icons_0078ae_256x240.png b/images/ui-icons_0078ae_256x240.png
new file mode 100644
index 0000000..b9faa3d
Binary files /dev/null and b/images/ui-icons_0078ae_256x240.png differ
diff --git a/images/ui-icons_056b93_256x240.png b/images/ui-icons_056b93_256x240.png
new file mode 100644
index 0000000..67924b7
Binary files /dev/null and b/images/ui-icons_056b93_256x240.png differ
diff --git a/images/ui-icons_222222_256x240.png b/images/ui-icons_222222_256x240.png
new file mode 100644
index 0000000..ee039dc
Binary files /dev/null and b/images/ui-icons_222222_256x240.png differ
diff --git a/images/ui-icons_2e83ff_256x240.png b/images/ui-icons_2e83ff_256x240.png
new file mode 100644
index 0000000..45e8928
Binary files /dev/null and b/images/ui-icons_2e83ff_256x240.png differ
diff --git a/images/ui-icons_454545_256x240.png b/images/ui-icons_454545_256x240.png
new file mode 100644
index 0000000..7ec70d1
Binary files /dev/null and b/images/ui-icons_454545_256x240.png differ
diff --git a/images/ui-icons_888888_256x240.png b/images/ui-icons_888888_256x240.png
new file mode 100644
index 0000000..5ba708c
Binary files /dev/null and b/images/ui-icons_888888_256x240.png differ
diff --git a/images/ui-icons_cd0a0a_256x240.png b/images/ui-icons_cd0a0a_256x240.png
new file mode 100644
index 0000000..7930a55
Binary files /dev/null and b/images/ui-icons_cd0a0a_256x240.png differ
diff --git a/images/ui-icons_d8e7f3_256x240.png b/images/ui-icons_d8e7f3_256x240.png
new file mode 100644
index 0000000..9b46228
Binary files /dev/null and b/images/ui-icons_d8e7f3_256x240.png differ
diff --git a/images/ui-icons_e0fdff_256x240.png b/images/ui-icons_e0fdff_256x240.png
new file mode 100644
index 0000000..c6a8533
Binary files /dev/null and b/images/ui-icons_e0fdff_256x240.png differ
diff --git a/images/ui-icons_f5e175_256x240.png b/images/ui-icons_f5e175_256x240.png
new file mode 100644
index 0000000..0365f59
Binary files /dev/null and b/images/ui-icons_f5e175_256x240.png differ
diff --git a/images/ui-icons_f7a50d_256x240.png b/images/ui-icons_f7a50d_256x240.png
new file mode 100644
index 0000000..e084802
Binary files /dev/null and b/images/ui-icons_f7a50d_256x240.png differ
diff --git a/images/ui-icons_fcd113_256x240.png b/images/ui-icons_fcd113_256x240.png
new file mode 100644
index 0000000..dd51951
Binary files /dev/null and b/images/ui-icons_fcd113_256x240.png differ
diff --git a/lib/whimsy/asf.rb b/lib/whimsy/asf.rb
new file mode 100644
index 0000000..7e6b4cc
--- /dev/null
+++ b/lib/whimsy/asf.rb
@@ -0,0 +1,20 @@
+require File.expand_path('../asf/config', __FILE__)
+require File.expand_path('../asf/committee', __FILE__)
+require File.expand_path('../asf/ldap', __FILE__)
+require File.expand_path('../asf/mail', __FILE__)
+require File.expand_path('../asf/svn', __FILE__)
+require File.expand_path('../asf/watch', __FILE__)
+require File.expand_path('../asf/nominees', __FILE__)
+require File.expand_path('../asf/icla', __FILE__)
+require File.expand_path('../asf/auth', __FILE__)
+require File.expand_path('../asf/member', __FILE__)
+require File.expand_path('../asf/site', __FILE__)
+
+module ASF
+  def self.library_mtime
+    parent_dir = File.dirname(File.expand_path(__FILE__))
+    sources = Dir.glob("#{parent_dir}/**/*")
+    times = sources.map {|source| File.mtime(source)}
+    times.max.gmtime
+  end
+end
diff --git a/lib/whimsy/asf/agenda.rb b/lib/whimsy/asf/agenda.rb
new file mode 100644
index 0000000..41f6439
--- /dev/null
+++ b/lib/whimsy/asf/agenda.rb
@@ -0,0 +1,147 @@
+require_relative '../asf'
+
+require 'time'
+require 'tzinfo'
+require 'tzinfo/data'
+require 'digest/md5'
+
+module ASF
+  module Board
+  end
+end
+
+class ASF::Board::Agenda
+  CONTENTS = {
+    '2.' => 'Roll Call',
+    '3A' => 'Minutes',
+    '4A' => 'Executive Officer',
+    '1'  => 'Additional Officer',
+    'A'  => 'Committee Reports',
+    '7A' => 'Special Orders',
+    '8.' => 'Discussion Items',
+    '9.' => 'Action Items'
+  }
+
+  @@parsers = []
+  def self.parse(file=nil, quick=false, &block)
+    @@parsers << block if block
+    new.parse(file, quick)  if file
+  end
+
+  def initialize
+    @sections = {}
+  end
+
+  def scan(text, pattern, &block)
+    # convert tabs to spaces
+    text.gsub!(/^(\t+)/) {|tabs| ' ' * (8*tabs.length)}
+
+    text.scan(pattern).each do |matches|
+      hash = Hash[pattern.names.zip(matches)]
+      yield hash if block
+
+      section = hash.delete('section')
+      section ||= hash.delete('attach')
+
+      if section
+        hash['approved'] &&= hash['approved'].strip.split(/[ ,]+/)
+
+        @sections[section] ||= {}
+        next if hash['text'] and @sections[section]['text']
+        @sections[section].merge!(hash)
+      end
+    end
+  end
+
+  def parse(file, quick=false)
+    @file = file
+    @quick = quick
+    
+    if not @file.valid_encoding?
+      filter = Proc.new {|c| c.unpack('U').first rescue 0xFFFD}
+      @file = @file.chars.map(&filter).pack('U*').force_encoding('utf-8')
+    end
+
+    @@parsers.each { |parser| instance_exec(&parser) }
+
+    # add index markers for major sections
+    CONTENTS.each do |section, index|
+      @sections[section][:index] = index if @sections[section]
+    end
+
+    # look for flags
+    flagged_reports = Hash[@file[/ \d\. Committee Reports.*?\n\s+A\./m].
+      scan(/# (.*?) \[(.*)\]/)]
+
+    president = @sections.values.find {|item| item['title'] == 'President'}
+    preports = Range.new(*president['report'][/\d+ through \d+\.$/].scan(/\d+/)) 
+    # cleanup text and comment whitespace, add flags
+    @sections.each do |section, hash|
+      text = hash['text'] || hash['report']
+      if text
+        text.sub!(/\A\s*\n/, '')
+        text.sub!(/\s+\Z/, '')
+        unindent = text.sub(/s+\Z/,'').scan(/^ *\S/).map(&:length).min || 1
+        text.gsub! /^ {#{unindent-1}}/, ''
+      end
+
+      text = hash['comments']
+      if text
+        text.sub!(/\A\s*\n/, '')
+        text.sub!(/\s+\Z/, '')
+        unindent = text.sub(/s+\Z/,'').scan(/^ *\S/).map(&:length).min || 1
+        text.gsub! /^ {#{unindent-1}}/, ''
+      end
+
+      # add flags
+      flags = flagged_reports[hash['title']]
+      hash['flagged_by'] = flags.split(', ') if flags
+
+      # mark president reports
+      hash['to'] = 'president' if preports.include? section
+    end
+
+    unless @quick
+      # add roster and prior report link
+      whimsy = 'https://whimsy.apache.org'
+      @sections.each do |section, hash|
+        next unless section =~ /^(4[A-Z]|\d+|[A-Z][A-Z]?)$/
+        committee = ASF::Committee.find(hash['title'] ||= 'UNKNOWN')
+        unless section =~ /^4[A-Z]$/
+          hash['roster'] = 
+            "#{whimsy}/roster/committee/#{CGI.escape committee.name}"
+        end
+        if section =~ /^[A-Z][A-Z]?$/
+          hash['stats'] = 
+            "https://reporter.apache.org/?#{CGI.escape committee.name}"
+        end
+        hash['prior_reports'] = minutes(committee.display_name)
+      end
+    end
+
+    # add attach to section
+    @sections.each do |section, hash|
+      hash[:attach] = section
+    end
+
+    @sections.values
+  end
+
+  def minutes(title)
+    "https://whimsy.apache.org/board/minutes/#{title.gsub(/\W/,'_')}"
+  end
+
+  def timestamp(time)
+    date = @file[/(\w+ \d+, \d+)/]
+    tz = TZInfo::Timezone.get('America/Los_Angeles')
+    tz.local_to_utc(Time.parse("#{date} #{time}")).to_i * 1000
+  end
+end
+
+require_relative 'agenda/front'
+require_relative 'agenda/minutes'
+require_relative 'agenda/exec-officer'
+require_relative 'agenda/attachments'
+require_relative 'agenda/committee'
+require_relative 'agenda/special'
+require_relative 'agenda/back'
diff --git a/lib/whimsy/asf/agenda/attachments.rb b/lib/whimsy/asf/agenda/attachments.rb
new file mode 100644
index 0000000..e6aca92
--- /dev/null
+++ b/lib/whimsy/asf/agenda/attachments.rb
@@ -0,0 +1,52 @@
+# Attachments
+
+class ASF::Board::Agenda
+  parse do
+    pattern = /
+      -{41}\n
+      Attachment\s\s?(?<attach>\w+):\s(?<title>.*?)\n+
+      (?<report>.*?)
+      (?=-{41,}\n(?:End|Attach))
+    /mx
+
+    scan @file, pattern do |attrs|
+
+      attrs['title'].sub! /^Report from the VP of /, ''
+      attrs['title'].sub! /^Report from the /, ''
+      attrs['title'].sub! /^Status report for the /, ''
+      attrs['title'].sub! /^Apache /, ''
+
+      if attrs['title'] =~ /\s*\[.*\]$/
+        attrs['owner'] = attrs['title'][/\[(.*?)\]/, 1]
+        attrs['title'].sub! /\s*\[.*\]$/, ''
+      end
+
+      attrs['title'].sub! /\sTeam$/, ''
+      attrs['title'].sub! /\sCommittee$/, ''
+      attrs['title'].sub! /\sProject$/, ''
+
+      attrs['digest'] = Digest::MD5.hexdigest(attrs['report'])
+
+      attrs['report'].sub! /\n+\Z/, "\n"
+      attrs.delete('report') if attrs['report'] == "\n"
+
+      attrs['missing'] = true if attrs['report'].strip.empty?
+
+      unless @quick
+        begin
+          committee = ASF::Committee.find(attrs['title'])
+          attrs['chair_email'] = committee.chair.mail.first
+          attrs['mail_list'] = committee.mail_list
+          attrs.delete('mail_list') if attrs['mail_list'].include? ' '
+
+          attrs['notes'] = $1 if committee.report =~ /^Next month: (.*)/
+        rescue
+        end
+      end
+
+      if attrs['report'].to_s.include? "\uFFFD"
+        attrs['warnings'] = ['UTF-8 encoding error']
+      end
+    end
+  end
+end
diff --git a/lib/whimsy/asf/agenda/back.rb b/lib/whimsy/asf/agenda/back.rb
new file mode 100644
index 0000000..f1251ee
--- /dev/null
+++ b/lib/whimsy/asf/agenda/back.rb
@@ -0,0 +1,54 @@
+# Back sections:
+# * Discussion Items
+# * Review Outstanding Action Items
+# * Unfinished Business
+# * New Business
+# * Announcements
+# * Adjournment
+
+class ASF::Board::Agenda
+  parse do
+    pattern = /
+      ^(?<attach>(?:\s[89]|\s9|1\d)\.)
+      \s(?<title>.*?)\n
+      (?<text>.*?)
+      (?=\n[\s1]\d\.|\n===)
+    /mx
+
+    scan @file, pattern do |attrs|
+      attrs['attach'].strip!
+      attrs['title'].sub! /^Review Outstanding /, ''
+
+      if attrs['title'] =~ /Discussion|Action|Business|Announcements/
+        attrs['prior_reports'] = minutes(attrs['title'])
+      elsif attrs['title'] == 'Adjournment'
+        attrs['timestamp'] = timestamp(attrs['text'][/\d+:\d+([ap]m)?/])
+      end
+
+      if attrs['title'] =~ /Action Items/
+
+        # extract action items associated with projects
+        text = attrs['text'].sub(/\A\s*\n/, '').sub(/\s+\Z/, '')
+        unindent = text.sub(/s+\Z/,'').scan(/^ *\S/).map(&:length).min || 1
+        text.gsub! /^ {#{unindent-1}}/, ''
+
+        attrs['missing'] = text.empty?
+
+        attrs['actions'] = text.sub(/^\* /, '').split(/^\n\* /).map do |text|
+          match1 = /(.*?)(\n\s*Status:(.*))/m.match(text)
+          match2 = /(.*?)(\[ ([^\]]+) \])?\s*\Z/m.match(match1[1])
+          match3 = /(.*?): (.*)\Z/m.match(match2[1])
+          match4 = /(.*?)( (\d+-\d+-\d+))?$/.match(match2[3])
+
+          { 
+            owner: match3[1],
+            text: match3[2].strip,
+            status: match1[3].to_s.strip,
+            pmc: (match4[1] if match4), 
+            date: (match4[3] if match4)
+          }
+        end
+      end
+    end
+  end
+end
diff --git a/lib/whimsy/asf/agenda/committee.rb b/lib/whimsy/asf/agenda/committee.rb
new file mode 100644
index 0000000..d3a7bcf
--- /dev/null
+++ b/lib/whimsy/asf/agenda/committee.rb
@@ -0,0 +1,20 @@
+# Additional Officer Reports and Committee Reports
+
+class ASF::Board::Agenda
+  parse do
+    pattern = /
+      \[(?<owner>[^\n]+)\]\n\n
+      \s{7}See\sAttachment\s\s?(?<attach>\w+)[^\n]*?\s+
+      \[\s[^\n]*\s*approved:\s*?(?<approved>.*?)
+      \s*comments:(?<comments>.*?)\n\s{9}\]
+    /mx
+
+    scan @file, pattern do |attrs|
+      attrs['shepherd'] = attrs['owner'].split('/').last.strip
+      attrs['owner'] = attrs['owner'].split('/').first.strip
+
+      attrs['comments'].gsub! /^ {1,10}(\w+:)/, '\1'
+      attrs['comments'].gsub! /^ {11}/, ''
+    end
+  end
+end
diff --git a/lib/whimsy/asf/agenda/exec-officer.rb b/lib/whimsy/asf/agenda/exec-officer.rb
new file mode 100644
index 0000000..69d815a
--- /dev/null
+++ b/lib/whimsy/asf/agenda/exec-officer.rb
@@ -0,0 +1,34 @@
+# Executive Officer Reports
+
+class ASF::Board::Agenda
+  parse do
+    reports = @file.split(/^ 4. Executive Officer Reports/,2).last.
+      split(/^ 5. Additional Officer Reports/,2).first
+
+    pattern = /
+      \s{4}(?<section>[A-Z])\.
+      \s(?<title>[^\[]+?)
+      \s\[(?<owner>[^\]]+?)\]
+      (?<report>.*?)
+      (?=\n\s{4}[A-Z]\.\s|\z)
+    /mx
+
+    scan reports, pattern do |attrs|
+      attrs['section'] = '4' + attrs['section'] 
+      attrs['shepherd'] = attrs['owner'].split('/').last
+      attrs['owner'] = attrs['owner'].split('/').first
+
+      attrs['report'].sub! /\A\s*\n/, ''
+
+      attrs['report'].gsub! /\n\s*\n\s+\[ comments:(.*)\]\s*$/m do
+        attrs['comments'] = $1.sub(/\A\s*\n/, '').sub(/\s+\Z/, '')
+        "\n"
+      end
+
+      report = attrs['report'].strip
+      if report.empty? or report[0..12] == 'Additionally,'
+        attrs['missing'] = true
+      end
+    end
+  end
+end
diff --git a/lib/whimsy/asf/agenda/front.rb b/lib/whimsy/asf/agenda/front.rb
new file mode 100644
index 0000000..434c88d
--- /dev/null
+++ b/lib/whimsy/asf/agenda/front.rb
@@ -0,0 +1,70 @@
+# Front sections:
+# * Call to Order
+# * Roll Call
+
+class ASF::Board::Agenda
+  parse do
+    pattern = /
+      ^\n\x20(?<section>[12]\.)
+      \s(?<title>.*?)\n\n+
+      (?<text>.*?)
+      (?=\n\s[23]\.)
+    /mx
+
+    scan @file, pattern do |attr|
+      if attr['title'] == 'Roll Call'
+        attr['people'] = {}
+        list = nil
+
+        absent = attr['text'].scan(/Absent:\n\n.*?\n\n/m).join
+        directors = attr['text'].scan(/^ +Directors[ \S]*?:\n\n.*?\n\n/m).join
+        officers = attr['text'].scan(/^ +Executive[ \S]*?:\n\n.*?\n\n/m).join
+
+        # attempt to identify the people mentioned in the Roll Call
+        people = attr['text'].scan(/ {8}(\w.*)/).flatten.each do |name|
+          next if name == 'none'
+          name.gsub! /\s*\(.*?\)/, ''
+
+          role = :guest
+          role = :director if directors.include? name
+          role = :officer if officers.include? name
+
+          sort_name = name.sub(/\(.*\)\s*$/, '').split(' ').rotate(-1).join(' ')
+
+          if @quick
+            attr['people']['_' + name.gsub(/\W/, '_')] = {
+              name: name,
+              sortName: sort_name,
+              role: role,
+              attending: !absent.include?(name)
+            }
+          else
+
+            # look up name
+            search = ASF::Person.list("cn=#{name}")
+
+            # if found, save results in the attributes
+            if search.length == 1
+              person = search.first
+
+              attr['people'][person.id] = {
+                name: name,
+                sortName: sort_name,
+                role: role,
+                member: person.asf_member?,
+                attending: !absent.include?(name)
+              }
+            end
+          end
+        end
+
+        if attr['people']
+          attr['people'] = Hash[attr['people'].
+            sort_by {|id, person| person[:sortName]}]
+        end
+      elsif attr['title'] == 'Call to order'
+        attr['timestamp'] = timestamp(attr['text'][/\d+:\d+([ap]m)?/])
+      end
+    end
+  end
+end
diff --git a/lib/whimsy/asf/agenda/minutes.rb b/lib/whimsy/asf/agenda/minutes.rb
new file mode 100644
index 0000000..db5b67f
--- /dev/null
+++ b/lib/whimsy/asf/agenda/minutes.rb
@@ -0,0 +1,23 @@
+# Minutes from previous meetings
+
+class ASF::Board::Agenda
+  parse do
+    minutes = @file.split(/^ 3. Minutes from previous meetings/,2).last.
+      split(/^ 4. Executive Officer Reports/,2).first
+
+    pattern = /
+      \s{4}(?<section>[A-Z])\.
+      \sThe.meeting.of\s+(?<title>.*?)\n
+      (?<text>.*?)
+      \[\s(?:.*?):\s*?(?<approved>.*?)
+      \s*comments:(?<comments>.*?)\n
+      \s{8,9}\]\n
+    /mx
+
+    scan minutes, pattern do |attrs|
+      attrs['section'] = '3' + attrs['section'] 
+      attrs['text'] = attrs['text'].strip
+      attrs['approved'] = attrs['approved'].strip.gsub(/\s+/, ' ')
+    end
+  end
+end
diff --git a/lib/whimsy/asf/agenda/special.rb b/lib/whimsy/asf/agenda/special.rb
new file mode 100644
index 0000000..df6ded7
--- /dev/null
+++ b/lib/whimsy/asf/agenda/special.rb
@@ -0,0 +1,111 @@
+# Special Orders
+
+class ASF::Board::Agenda
+  parse do
+    orders = @file.split(/^ 7. Special Orders/,2).last.
+      split(/^ 8. Discussion Items/,2).first
+
+    pattern = /
+      \n+(?<indent>\s{3,5})(?<section>[A-Z])\.
+      \s(?<title>.*?)\n
+      (?<text>.*?)
+      (?=\n\s{4}[A-Z]\.\s|\z)
+    /mx
+
+    people = []
+    scan orders, pattern do |attrs|
+      attrs['section'] = '7' + attrs['section'] 
+
+      title = attrs['title']
+      title.strip!
+      fulltitle = title.dup
+      title.sub! /^Resolution to /, ''
+      title.sub! /\sthe\s/, ' '
+      title.sub! /\sApache\s/, ' '
+      title.sub! /\sCommittee\s/, ' '
+      title.sub! /\sProject(\s|$)/, '\1'
+      title.sub! /\sPMC(\s|$)/, '\1'
+      title.sub! /\s\(.*\)$/, ''
+
+      attrs['fulltitle'] = fulltitle if title != fulltitle
+
+      text = attrs['text']
+      attrs['digest'] = Digest::MD5.hexdigest(attrs['text'])
+
+      attrs['warnings'] = []
+      if attrs['indent'] != '    '
+        attrs['warnings'] << 'Heading is not indented 4 spaces'
+      end
+      if text.sub(/s+\Z/,'').scan(/^ *\S/).map(&:length).min != 8
+        attrs['warnings'] << 'Resolution is not indented 7 spaces'
+      end
+      attrs.delete 'indent'
+      attrs.delete 'warnings' if attrs['warnings'].empty?
+
+      next if @quick
+
+      asfid = '[a-z][-.a-z0-9_]+' # dot added to help detect errors
+      list_item = '^\s*(?:[-*\u2022]\s*)?(.*?)\s+'
+
+      people = text.scan(/#{list_item}\((#{asfid})\)\s*$/)
+      people += text.scan(/#{list_item}\((#{asfid})(?:@|\s*at\s*)
+        (?:\.\.\.|apache\.org)\)\s*$/x)
+      people += text.scan(/#{list_item}<(#{asfid})(?:@|\s*at\s*)
+        (?:\.\.\.|apache\.org|apache\sdot\sorg)>\s*$/x)
+
+      whimsy = 'https://whimsy.apache.org'
+      if title =~ /Change (.*?) Chair/ or title =~ /Terminate (\w+)$/
+        people.clear
+        committee = ASF::Committee.find($1)
+        attrs['roster'] =
+          "#{whimsy}/roster/committee/#{CGI.escape committee.name}"
+        attrs['stats'] = 
+          "https://reporter.apache.org/?#{CGI.escape committee.name}"
+        attrs['prior_reports'] = minutes(committee.display_name)
+
+        ids = text.scan(/\((\w[-.\w]+)\)/).flatten
+        unless ids.empty?
+          ids.each do |id|
+            person = ASF::Person.find(id)
+            people << [person.public_name, id] if person.icla
+          end
+        end
+
+        next unless committee.names
+        committee.names.each do |id, name|
+          people << [name, id] if text.include? name
+        end
+
+        if people.length < 2 and not title.start_with? 'Terminate'
+          attrs['warnings'] ||= ['Unable to match expected number of names']
+          attrs['names'] = committee.names
+        end
+      else
+        if title =~ /Establish (.*)/
+          name = $1
+          attrs['prior_reports'] =
+            "#{whimsy}/board/minutes/#{name.gsub(/\W/,'_')}"
+          if text =~ /FURTHER RESOLVED, that\s+([^,]*?),?\s+be\b/
+            chairname = $1.gsub(/\s+/, ' ').strip
+            chair = people.find {|person| person.first == chairname}
+            attrs['chair'] = (chair ? chair.last : nil)
+            unless chair and chair.last
+              attrs['warnings'] ||= ['Chair not found in resolution'] 
+            end
+          else
+            attrs['warnings'] ||= ['Chair not found in resolution'] 
+          end
+        end
+      end
+
+      people.map! do |name, id| 
+        person = ASF::Person.new(id)
+        icla = person.icla
+        [id, {name: name, icla: icla ? person.icla.name : false,
+          member: person.asf_member?}]
+      end
+
+      attrs['people'] = Hash[people] unless people.empty?
+    end
+  end
+end
diff --git a/lib/whimsy/asf/auth.rb b/lib/whimsy/asf/auth.rb
new file mode 100644
index 0000000..85c9063
--- /dev/null
+++ b/lib/whimsy/asf/auth.rb
@@ -0,0 +1,28 @@
+module ASF
+
+  class Authorization
+    include Enumerable
+
+    def self.find_by_id(value)
+      new.select {|auth, ids| ids.include? value}.map(&:first)
+    end
+
+    def initialize(file='asf')
+      @file = file
+    end
+
+    def each
+      auth = ASF::SVN['infra/infrastructure/trunk/subversion/authorization']
+      File.read("#{auth}/#{@file}-authorization-template").
+        scan(/^([-\w]+)=(\w.*)$/).each do |pmc, ids|
+        yield pmc, ids.split(',')
+      end
+    end
+  end
+
+  class Person
+    def auth
+      @auths ||= ASF::Authorization.find_by_id(name)
+    end
+  end
+end
diff --git a/lib/whimsy/asf/bundler.rb b/lib/whimsy/asf/bundler.rb
new file mode 100644
index 0000000..410c759
--- /dev/null
+++ b/lib/whimsy/asf/bundler.rb
@@ -0,0 +1,32 @@
+require 'bundler'
+require 'whimsy/asf/config'
+
+#
+# modify bundler to be aware of whimsy library overrides
+#
+module Bundler
+  class Dsl
+    bundler_gem = instance_method(:gem)
+    libs = ASF::Config.get(:lib)
+
+    define_method :gem do |name, *args|
+      pname = name.gsub('-', '/')
+
+      path = nil
+      libs.each do |lib|
+	 if File.exist?("#{lib}/#{pname}")
+	   path = lib
+	 end
+      end
+
+      if path
+	args.push({}) unless args.last.is_a?(Hash)
+	args.last[:path] = File.dirname(path)
+      end
+
+      bundler_gem.bind(self).(name, *args)
+    end
+  end
+end
+
+require 'bundler/setup'
diff --git a/lib/whimsy/asf/committee.rb b/lib/whimsy/asf/committee.rb
new file mode 100644
index 0000000..2f30837
--- /dev/null
+++ b/lib/whimsy/asf/committee.rb
@@ -0,0 +1,151 @@
+require 'time'
+
+module ASF
+
+  class Base
+  end
+
+  class Committee < Base
+    attr_accessor :info, :emeritus, :report, :roster, :established, :chairs,
+      :schedule
+    def initialize(*args)
+      @info = []
+      @emeritus = []
+      @chairs = []
+      @roster = {}
+      super
+    end
+
+    # mapping of committee names to canonical names (generally from ldap)
+    # See also www/roster/committee.cgi
+    @@aliases = Hash.new {|hash, name| name}
+    @@aliases.merge! \
+      'community development'       => 'comdev',
+      'conference planning'         => 'concom',
+      'conferences'                 => 'concom',
+      'http server'                 => 'httpd',
+      'httpserver'                  => 'httpd',
+      'java community process'      => 'jcp',
+      'logging services'            => 'logging',
+      'lucene.net'                  => 'lucenenet',
+      'portable runtime'            => 'apr',
+      'quetzalcoatl'                => 'quetz',
+      'security team'               => 'security',
+      'open climate workbench'      => 'climate',
+      'c++ standard library'        => 'stdcxx',
+      'travel assistance'           => 'tac',
+      'traffic server'              => 'trafficserver',
+      'web services'                => 'ws',
+      'xml graphics'                => 'xmlgraphics',
+      'incubating'                  => 'incubator' # special for index.html
+
+    @@namemap = Proc.new do |name|
+      cname = @@aliases[name.sub(/\s+\(.*?\)/, '').downcase]
+      cname
+    end
+
+    def self.load_committee_info
+      board = ASF::SVN['private/committers/board']
+      file = "#{board}/committee-info.txt"
+      return unless File.exist? file
+      if @committee_info and File.mtime(file) == @committee_mtime
+        return @committee_info 
+      end
+      @committee_mtime = File.mtime(file)
+      @@svn_change = Time.parse(
+        `svn info #{file}`[/Last Changed Date: (.*) \(/, 1]).gmtime
+
+      info = File.read(file).split(/^\* /)
+      head, report = info.shift.split(/^\d\./)[1..2]
+      head.gsub! /^\s+NAME\s+CHAIR\s*$/,'' # otherwise could match an entry with no e-mail
+
+      # extract the committee chairs (e-mail address is required here)
+      head.scan(/^[ \t]+(\w.*?)[ \t][ \t]+(.*)[ \t]+<(.*?)@apache\.org>/).
+        each do |committee, name, id|
+          find(committee).chairs << {name: name, id: id}
+        end
+      # Extract the non-PMC committees (e-mail address may be absent)
+      @nonpmcs = head.sub(/.*?also has/m,'').
+        scan(/^[ \t]+(\w.*?)(?:[ \t][ \t]|[ \t]?$)/).flatten.uniq.
+        map {|name| find(name)}
+
+      info.each do |roster|
+        committee = find(@@namemap.call(roster[/(\w.*?)\s+\(/,1]))
+        committee.established = roster[/\(est\. (.*?)\)/, 1]
+        roster.gsub! /^.*\(\s*emeritus\s*\).*/i do |line|
+          committee.emeritus += line.scan(/<(.*?)@apache\.org>/).flatten
+          ''
+        end
+        committee.info = roster.scan(/<(.*?)@apache\.org>/).flatten
+        committee.roster = Hash[roster.gsub(/\(\w+\)/, '').
+          scan(/^\s*(.*?)\s*<(.*?)@apache\.org>\s+(\[(.*?)\])?/).
+          map {|list| [list[1], {name: list[0], date: list[3]}]}]
+      end
+
+      report.scan(/^([^\n]+)\n---+\n(.*?)\n\n/m).each do |period, committees|
+        committees.scan(/^   \s*(.*)/).each do |committee|
+          committee, comment = committee.first.split(/\s+#\s+/,2)
+          committee = find(committee)
+          if comment
+            committee.report = "#{period}: #{comment}"
+          elsif period == 'Next month'
+            committee.report = 'Every month'
+          else
+            committee.schedule = period
+          end
+        end
+      end
+
+      @committee_info = ASF::Committee.collection.values
+    end
+
+    def self.nonpmcs
+      @nonpmcs
+    end
+
+    def self.find(name)
+      result = super(@@namemap.call(name))
+      result.display_name = name if name =~ /[A-Z]/
+      result
+    end
+
+    def self.svn_change
+      @@svn_change
+    end
+
+    def chair
+      Committee.load_committee_info
+      if @chairs.length >= 1
+        ASF::Person.find(@chairs.first[:id])
+      else
+        nil
+      end
+    end
+
+    def display_name
+      Committee.load_committee_info
+      @display_name || name
+    end
+
+    def display_name=(name)
+      @display_name ||= name
+    end
+
+    def report
+      @report || @schedule
+    end
+
+    def info=(list)
+      @info = list
+    end
+
+    def names
+      Committee.load_committee_info
+      Hash[@roster.map {|id, info| [id, info[:name]]}]
+    end
+
+    def nonpmc?
+      Committee.nonpmcs.include? self
+    end
+  end
+end
diff --git a/lib/whimsy/asf/config.rb b/lib/whimsy/asf/config.rb
new file mode 100644
index 0000000..16dee7c
--- /dev/null
+++ b/lib/whimsy/asf/config.rb
@@ -0,0 +1,27 @@
+# load configuration information from $HOME/.whimsy
+
+require 'yaml'
+
+module ASF
+
+  class Config
+    @home = ENV['HOME'] || Dir.pwd
+
+    @config = YAML.load_file("#@home/.whimsy") rescue {}
+
+    # default :svn for backwards compatibility
+    @config[:svn] ||= ['/home/whimsysvn/svn/*']
+
+    # add libraries to RUBYLIB, load path
+    (@config[:lib] || []).reverse.each do |lib|
+      next unless File.exist? lib
+      ENV['RUBYLIB']=([lib] + ENV['RUBYLIB'].to_s.split(':')).uniq.join(':')
+      $LOAD_PATH.unshift lib.untaint unless $LOAD_PATH.include? lib
+    end
+
+    def self.get(value)
+      @config[value]
+    end
+  end
+
+end
diff --git a/lib/whimsy/asf/icla.rb b/lib/whimsy/asf/icla.rb
new file mode 100644
index 0000000..29d4154
--- /dev/null
+++ b/lib/whimsy/asf/icla.rb
@@ -0,0 +1,230 @@
+module ASF
+
+  class ICLA
+    attr_accessor :id, :legal_name, :name, :email
+
+    @@mtime = nil
+
+    OFFICERS = ASF::SVN['private/foundation/officers']
+    SOURCE = OFFICERS ? "#{OFFICERS}/iclas.txt" : nil
+
+    # flush caches if source file changed
+    def self.refresh
+      if not SOURCE or File.mtime(SOURCE) != @@mtime
+        @@mtime = SOURCE ? File.mtime(SOURCE) : Time.now
+        @@id_index = nil
+        @@email_index = nil
+        @@name_index = nil
+        @@svn_change = nil
+
+        @@availids = nil
+      end
+    end
+
+    def self.svn_change
+      self.refresh
+      if SOURCE
+        @@svn_change ||= Time.parse(
+          `svn info #{SOURCE}`[/Last Changed Date: (.*) \(/, 1]).gmtime
+      end
+    end
+
+    # load ICLA information for every committer
+    def self.preload
+      each do |icla|
+        ASF::Person.find(icla.id).icla =  icla unless icla.id == 'notinaval'
+      end
+    end
+
+    # find ICLA by ID
+    def self.find_by_id(value)
+      return if value == 'notinavail' or not SOURCE
+
+      refresh
+      unless @@id_index
+        @@id_index = {}
+        each {|icla| @@id_index[icla.id] = icla}
+      end
+
+      @@id_index[value]
+    end
+
+    # find ICLA by email
+    def self.find_by_email(value)
+      return unless SOURCE
+
+      refresh
+      unless @@email_index
+        @@email_index = {}
+        each {|icla| @@email_index[icla.email.downcase] = icla}
+      end
+
+      @@email_index[value.downcase]
+    end
+
+    # find ICLA by name
+    def self.find_by_name(value)
+      return unless SOURCE
+      refresh
+      unless @@name_index
+        @@name_index = {}
+        each {|icla| @@name_index[icla.name] = icla}
+      end
+
+      @@email_index[value]
+    end
+
+    # list of all ids
+    def self.availids
+      return unless SOURCE
+      refresh
+      return @@availids if @@availids
+      availids = []
+      each {|icla| availids << icla.id unless icla.id == 'notinavail'}
+      @availids = availids
+    end
+
+    # iterate over all of the ICLAs
+    def self.each(&block)
+      refresh
+      if @@id_index and not @@id_index.empty?
+        @@id_index.values.each(&block)
+      elsif @@email_index and not @@email_index.empty?
+        @@email_index.values.each(&block)
+      elsif @@name_index and not @@name_index.empty?
+        @@name_index.values.each(&block)
+      elsif SOURCE and File.exist?(SOURCE)
+        File.read(SOURCE).scan(/^([-\w]+):(.*?):(.*?):(.*?):/).each do |list|
+          icla = ICLA.new()
+          icla.id = list[0]
+          icla.legal_name = list[1]
+          icla.name = list[2]
+          icla.email = list[3]
+          block.call(icla)
+        end
+      end
+    end
+
+    # sort support
+
+    def self.asciize(name)
+      if name.match /[^\x00-\x7F]/
+        # digraphs.  May be culturally sensitive
+        name.gsub! /\u00df/, 'ss'
+        name.gsub! /\u00e4|a\u0308/, 'ae'
+        name.gsub! /\u00e5|a\u030a/, 'aa'
+        name.gsub! /\u00e6/, 'ae'
+        name.gsub! /\u00f1|n\u0303/, 'ny'
+        name.gsub! /\u00f6|o\u0308/, 'oe'
+        name.gsub! /\u00fc|u\u0308/, 'ue'
+
+        # latin 1
+        name.gsub! /[\u00e0-\u00e5]/, 'a'
+        name.gsub! /\u00e7/, 'c'
+        name.gsub! /[\u00e8-\u00eb]/, 'e'
+        name.gsub! /[\u00ec-\u00ef]/, 'i'
+        name.gsub! /[\u00f2-\u00f6]|\u00f8/, 'o'
+        name.gsub! /[\u00f9-\u00fc]/, 'u'
+        name.gsub! /[\u00fd\u00ff]/, 'y'
+
+        # Latin Extended-A
+        name.gsub! /[\u0100-\u0105]/, 'a'
+        name.gsub! /[\u0106-\u010d]/, 'c'
+        name.gsub! /[\u010e-\u0111]/, 'd'
+        name.gsub! /[\u0112-\u011b]/, 'e'
+        name.gsub! /[\u011c-\u0123]/, 'g'
+        name.gsub! /[\u0124-\u0127]/, 'h'
+        name.gsub! /[\u0128-\u0131]/, 'i'
+        name.gsub! /[\u0132-\u0133]/, 'ij'
+        name.gsub! /[\u0134-\u0135]/, 'j'
+        name.gsub! /[\u0136-\u0138]/, 'k'
+        name.gsub! /[\u0139-\u0142]/, 'l'
+        name.gsub! /[\u0143-\u014b]/, 'n'
+        name.gsub! /[\u014C-\u0151]/, 'o'
+        name.gsub! /[\u0152-\u0153]/, 'oe'
+        name.gsub! /[\u0154-\u0159]/, 'r'
+        name.gsub! /[\u015a-\u0162]/, 's'
+        name.gsub! /[\u0162-\u0167]/, 't'
+        name.gsub! /[\u0168-\u0173]/, 'u'
+        name.gsub! /[\u0174-\u0175]/, 'w'
+        name.gsub! /[\u0176-\u0178]/, 'y'
+        name.gsub! /[\u0179-\u017e]/, 'z'
+
+        # denormalized diacritics
+        name.gsub! /[\u0300-\u036f]/, ''
+      end
+
+      name.strip.gsub /[^\w]+/, '-'
+    end
+
+    SUFFIXES = /^([Jj][Rr]\.?|I{2,3}|I?V|VI{1,3}|[A-Z]\.)$/
+
+    # rearrange line in an order suitable for sorting
+    def self.lname(line)
+      return '' if line.start_with? '#'
+      id, name, rest = line.split(':',3)
+      return '' unless name
+
+      # Drop trailing (comment string) or /* comment */
+      name.sub! /\(.+\)$/,''
+      name.sub! /\/\*.+\*\/$/,''
+      return '' if name.strip.empty?
+
+      name = name.split.reverse
+      suffix = (name.shift if name.first =~ SUFFIXES)
+      suffix += ' ' + name.shift if name.first =~ SUFFIXES
+      name << name.shift
+      name << name.shift if name.first=='Lewis' and name.last=='Ship'
+      name << name.shift if name.first=='Gallardo' and name.last=='Rivera'
+      name << name.shift if name.first=="S\u00e1nchez" and name.last=='Vega'
+      # name << name.shift if name.first=='van'
+      name.last.sub! /^IJ/, 'Ij'
+      name.unshift(suffix) if suffix
+      name.map! {|word| asciize(word)}
+      name = name.reverse.join(' ')
+
+      "#{name}:#{rest}"
+    end
+
+    # sort an entire iclas.txt file
+    def self.sort(source)
+      headers = source.scan(/^#.*/)
+      lines = source.scan(/^\w.*/)
+
+      headers.join("\n") + "\n" + 
+        lines.sort_by {|line| lname(line + "\n")}.join("\n") + "\n"
+    end
+  end
+
+  class Person
+    def icla
+      @icla ||= ASF::ICLA.find_by_id(name)
+    end
+
+    def icla=(icla)
+      @icla = icla
+    end
+
+    def icla?
+      @icla || ICLA.availids.include?(name)
+    end
+  end
+
+  # Search archive for historical records of people who were committers
+  # but never submitted an ICLA (some of which are still ASF members or
+  # members of a PMC).
+  def self.search_archive_by_id(value)
+    require 'net/http'
+    require 'nokogiri'
+    historical_committers = 'http://people.apache.org/~rubys/committers.html'
+    doc = Nokogiri::HTML(Net::HTTP.get(URI.parse(historical_committers)))
+    doc.search('tr').each do |tr|
+      tds = tr.search('td')
+      next unless tds.length == 3
+      return tds[1].text if tds[0].text == value
+    end
+    nil
+  rescue
+    nil
+  end
+end
diff --git a/lib/whimsy/asf/ldap.rb b/lib/whimsy/asf/ldap.rb
new file mode 100644
index 0000000..04e50a5
--- /dev/null
+++ b/lib/whimsy/asf/ldap.rb
@@ -0,0 +1,391 @@
+require 'wunderbar'
+require 'ldap'
+
+module ASF
+  # determine where ldap.conf resides
+  if Dir.exist? '/etc/openldap'
+    ETCLDAP = '/etc/openldap'
+  else
+    ETCLDAP = '/etc/ldap'
+  end
+
+  # determine whether or not the LDAP API can be used
+  def self.init_ldap
+    @ldap = nil
+    @mtime = Time.now
+
+    host = ASF::LDAP.host
+
+    Wunderbar.info "Connecting to LDAP server: #{host}"
+
+    begin
+      uri = URI.parse(host)
+      if uri.scheme == 'ldaps'
+        @ldap = ::LDAP::SSLConn.new(uri.host, uri.port)
+      else
+        @ldap = ::LDAP::Conn.new(uri.host, uri.port)
+      end
+    rescue ::LDAP::ResultError=>re
+      Wunderbar.error "Error binding to LDAP server: message: ["+ re.message + "]"
+    end
+  end
+
+  def self.ldap
+    @ldap || self.init_ldap
+  end
+
+  # search with a scope of one
+  def self.search_one(base, filter, attrs=nil)
+    init_ldap unless defined? @ldap
+    return [] unless @ldap
+
+    Wunderbar.info "ldapsearch -x -LLL -b #{base} -s one #{filter} " +
+      "#{[attrs].flatten.join(' ')}"
+    
+    begin
+      result = @ldap.search2(base, ::LDAP::LDAP_SCOPE_ONELEVEL, filter, attrs)
+    rescue
+      result = []
+    end
+
+    result.map! {|hash| hash[attrs]} if String === attrs
+
+    result
+  end
+
+  def self.refresh(symbol)
+    if not @mtime or Time.now - @mtime > 300.0
+      @mtime = Time.now
+    end
+
+    if instance_variable_get("#{symbol}_mtime") != @mtime
+      instance_variable_set("#{symbol}_mtime", @mtime)
+      instance_variable_set(symbol, nil)
+    end
+  end
+
+  def self.pmc_chairs
+    refresh(:@pmc_chairs)
+    @pmc_chairs ||= Service.find('pmc-chairs').members
+  end
+
+  def self.committers
+    refresh(:@committers)
+    @committers ||= Group.find('committers').members
+  end
+
+  def self.members
+    refresh(:@members)
+    @members ||= Group.find('member').members
+  end
+
+  class Base
+    attr_reader :name
+
+    def self.base
+      @base
+    end
+
+    def base
+      self.class.base
+    end
+
+    def self.collection
+      @collection ||= Hash.new
+    end
+
+    def self.[] name
+      collection[name] || new(name)
+    end
+
+    def self.find name
+      collection[name] || new(name)
+    end
+
+    def self.new name
+      collection[name] || super
+    end
+
+    def initialize name
+      self.class.collection[name] = self
+      @name = name
+    end
+
+    unless Object.respond_to? :id
+      def id
+        @name
+      end
+    end
+  end
+
+  class LazyHash < Hash
+    def initialize(&initializer)
+      @initializer = initializer
+    end
+
+    def load
+     return unless @initializer
+     merge! @initializer.call || {}
+     @initializer = super
+    end
+
+    def [](key)
+      result = super
+      if not result and not keys.include? key and @initializer
+        merge! @initializer.call || {}
+        @initializer = nil
+        result = super
+      end
+      result
+    end
+  end
+
+  class Person < Base
+    @base = 'ou=people,dc=apache,dc=org'
+
+    def self.list(filter='uid=*')
+      ASF.search_one(base, filter, 'uid').flatten.map {|uid| find(uid)}
+    end
+
+    # pre-fetch a given attribute, for a given list of people
+    def self.preload(attributes, people={})
+      attributes = [attributes].flatten
+
+      if people.empty?
+        filter = "(|#{attributes.map {|attribute| "(#{attribute}=*)"}.join})"
+      else
+        filter = "(|#{people.map {|person| "(uid=#{person.name})"}.join})"
+      end
+      
+      zero = Hash[attributes.map {|attribute| [attribute,nil]}]
+
+      data = ASF.search_one(base, filter, attributes + ['uid'])
+      data = Hash[data.map! {|hash| [find(hash['uid'].first), hash]}]
+      data.each {|person, hash| person.attrs.merge!(zero.merge(hash))}
+
+      if people.empty?
+        (collection.values - data.keys).each do |person| 
+          person.attrs.merge! zero
+        end
+      end
+    end
+
+    def attrs
+      @attrs ||= LazyHash.new {ASF.search_one(base, "uid=#{name}").first}
+    end
+
+    def public_name
+      return icla.name if icla
+      cn = [attrs['cn']].flatten.first
+      cn.force_encoding('utf-8') if cn.respond_to? :force_encoding
+      return cn if cn
+      ASF.search_archive_by_id(name)
+    end
+
+    def asf_member?
+      ASF::Member.status[name] or ASF.members.include? self
+    end
+
+    def asf_committer?
+       ASF::Group.new('committers').include? self
+    end
+
+    def banned?
+      not attrs['loginShell'] or attrs['loginShell'].include? "/usr/bin/false"
+    end
+
+    def mail
+      attrs['mail'] || []
+    end
+
+    def alt_email
+      attrs['asf-altEmail'] || []
+    end
+
+    def pgp_key_fingerprints
+      attrs['asf-pgpKeyFingerprint']
+    end
+
+    def urls
+      attrs['asf-personalURL'] || []
+    end
+
+    def committees
+      Committee.list("member=uid=#{name},#{base}")
+    end
+
+    def groups
+      Group.list("memberUid=#{name}")
+    end
+
+    def dn
+      value = attrs['dn']
+      value.first if Array === value
+    end
+
+    def method_missing(name, *args)
+      if name.to_s.end_with? '=' and args.length == 1
+        return modify(name.to_s[0..-2], args)
+      end
+
+      return super unless args.empty?
+      result = self.attrs[name.to_s]
+      return super unless result
+
+      if result.empty?
+        return nil
+      else
+        result.map! do |value|
+          value = value.dup.force_encoding('utf-8') if String === value
+          value
+        end
+
+        if result.length == 1
+          result.first
+        else
+          result
+        end
+      end
+    end
+
+    def modify(attr, value)
+      value = Array(value) unless Hash === value
+      mod = ::LDAP::Mod.new(::LDAP::LDAP_MOD_REPLACE, attr.to_s, value)
+      ASF.ldap.modify(self.dn, [mod])
+      attrs[attr.to_s] = value
+    end
+  end
+
+  class Group < Base
+    @base = 'ou=groups,dc=apache,dc=org'
+
+    def self.list(filter='cn=*')
+      ASF.search_one(base, filter, 'cn').flatten.map {|cn| find(cn)}
+    end
+
+    def include?(person)
+      filter = "(&(cn=#{name})(memberUid=#{person.name}))"
+      if ASF.search_one(base, filter, 'cn').empty?
+        return false
+      else
+        return true
+      end
+    end
+
+    def members
+      ASF.search_one(base, "cn=#{name}", 'memberUid').flatten.
+        map {|uid| Person.find(uid)}
+    end
+  end
+
+  class Committee < Base
+    @base = 'ou=pmc,ou=committees,ou=groups,dc=apache,dc=org'
+
+    def self.list(filter='cn=*')
+      ASF.search_one(base, filter, 'cn').flatten.map {|cn| Committee.find(cn)}
+    end
+
+    def members
+      ASF.search_one(base, "cn=#{name}", 'member').flatten.
+        map {|uid| Person.find uid[/uid=(.*?),/,1]}
+    end
+
+    def dn
+      @dn ||= ASF.search_one(base, "cn=#{name}", 'dn').first.first
+    end
+  end
+
+  class Service < Base
+    @base = 'ou=groups,ou=services,dc=apache,dc=org'
+
+    def self.list(filter='cn=*')
+      ASF.search_one(base, filter, 'cn').flatten
+    end
+
+    def dn
+      "cn=#{id},#{self.class.base}"
+    end
+
+    def members
+      ASF.search_one(base, "cn=#{name}", 'member').flatten.
+        map {|uid| Person.find uid[/uid=(.*?),/,1]}
+    end
+
+    def remove(people)
+      people = Array(people).map(&:dn)
+      mod = ::LDAP::Mod.new(::LDAP::LDAP_MOD_DELETE, 'member', people)
+      ASF.ldap.modify(self.dn, [mod])
+    end
+
+    def add(people)
+      people = Array(people).map(&:dn)
+      mod = ::LDAP::Mod.new(::LDAP::LDAP_MOD_ADD, 'member', people)
+      ASF.ldap.modify(self.dn, [mod])
+    end
+  end
+
+  module LDAP
+    def self.bind(user, password, &block)
+      dn = ASF::Person.new(user).dn
+      if block
+        ASF.ldap.bind(dn, password, &block)
+      else
+        ASF.ldap.bind(dn, password)
+      end
+      ASF.init_ldap
+    end
+
+    # select LDAP host
+    def self.host
+      # try whimsy config
+      host = ASF::Config.get(:ldap)
+
+      # check system configuration
+      unless host
+        conf = "#{ETCLDAP}/ldap.conf"
+        if File.exist? conf
+          host = File.read(conf)[/^uri\s+(ldaps?:\/\/\S+?:\d+)/i, 1]
+        end
+      end
+
+      # if all else fails, pick one at random
+      unless host
+        # https://www.pingmybox.com/dashboard?location=304
+        host = %w(ldaps://ldap1-us-west.apache.org:636
+          ldaps://ldap1-eu-central.apache.org:636
+          ldaps://ldap2-us-west.apache.org:636
+          ldaps://ldap1-us-east.apache.org:636).sample
+      end
+
+      host
+    end
+
+    # query and extract cert from openssl output
+    def self.cert
+      host = LDAP.host[%r{//(.*?)(/|$)}, 1]
+      query = "openssl s_client -connect #{host} -showcerts"
+      output = `#{query} < /dev/null 2> /dev/null`
+      output[/^-+BEGIN.*?\n-+END[^\n]+\n/m]
+    end
+
+    # update /etc/ldap.conf. Usage:
+    #   sudo ruby -r whimsy/asf -e "ASF::LDAP.configure"
+    def self.configure
+      if not File.exist? "#{ETCLDAP}/asf-ldap-client.pem"
+        File.write "#{ETCLDAP}/asf-ldap-client.pem", self.cert
+      end
+
+      ldap_conf = "#{ETCLDAP}/ldap.conf"
+      content = File.read(ldap_conf)
+      unless content.include? 'asf-ldap-client.pem'
+        content.gsub!(/^TLS_CACERT/, '# TLS_CACERT')
+        content.gsub!(/^TLS_REQCERT/, '# TLS_REQCERT')
+        content += "TLS_CACERT #{ETCLDAP}/asf-ldap-client.pem\n"
+        content += "uri #{LDAP.host}\n"
+        content += "base dc=apache,dc=org\n"
+        content += "TLS_REQCERT allow\n" if ETCLDAP.include? 'openldap'
+        File.write(ldap_conf, content)
+      end
+    end
+  end
+end
diff --git a/lib/whimsy/asf/mail.rb b/lib/whimsy/asf/mail.rb
new file mode 100644
index 0000000..fc69a6d
--- /dev/null
+++ b/lib/whimsy/asf/mail.rb
@@ -0,0 +1,103 @@
+
+module ASF
+
+  class Mail
+    def self.list
+      return @list if @list
+
+      list = Hash.new
+
+      # load info from LDAP
+      ASF::Person.preload(['mail', 'asf-altEmail'])
+      ASF::Person.collection.each do |name, person|
+        (person.mail+person.alt_email).each do |mail|
+          list[mail.downcase] = person
+        end
+      end
+
+      # load all member emails in one pass
+      ASF::Member.each do |id, text|
+        Member.emails(text).each {|mail| list[mail.downcase] ||= Person[id]}
+      end
+
+      # load all ICLA emails in one pass
+      ASF::ICLA.each do |icla|
+        person = Person.find(icla.id)
+        list[icla.email.downcase] ||= person
+        next if icla.id == 'notinavail'
+        list["#{icla.id.downcase}@apache.org"] ||= person
+      end
+
+      @list = list
+    end
+
+    def self.lists(public_private= false)
+      apmail_bin = ASF::SVN['infra/infrastructure/apmail/trunk/bin']
+      file = File.join(apmail_bin, '.archives')
+      if not @lists or File.mtime(file) != @list_mtime
+        @list_mtime = File.mtime(file)
+        @lists = Hash[File.read(file).scan(
+          /^\s+"(\w[-\w]+)", "\/home\/apmail\/(public|private)-arch\//
+        )]
+      end
+
+      public_private ? @lists : @lists.keys
+    end
+  end
+
+  class Person < Base
+    def self.find_by_email(value)
+      value.downcase!
+
+      person = Mail.list[value]
+      return person if person
+    end
+
+    def obsolete_emails
+      return @obsolete_emails if @obsolete_emails
+      result = []
+      if icla
+        unless active_emails.any? {|mail| mail.downcase == icla.email.downcase}
+          result << icla.email
+        end
+      end
+      @obsolete_emails = result
+    end
+
+    def active_emails
+      (mail + alt_email + member_emails).uniq
+    end
+
+    def all_mail
+      active_emails + obsolete_emails
+    end
+  end
+
+  class Committee
+    def mail_list
+      case name.downcase
+      when 'comdev'
+        'community'
+      when 'httpcomponents'
+        'hc'
+      when 'whimsy'
+        'whimsical'
+
+      when 'brand management'
+        'trademarks@apache.org'
+      when 'executive assistant'
+        'ea@apache.org'
+      when 'legal affairs'
+        'legal-discuss@apache.org'
+      when 'marketing and publicity'
+        'press@apache.org'
+      when 'tac'
+        'travel-assistance@apache.org'
+      when 'w3c relations'
+        'w3c@apache.org'
+      else
+        name
+      end
+    end
+  end
+end
diff --git a/lib/whimsy/asf/member.rb b/lib/whimsy/asf/member.rb
new file mode 100644
index 0000000..49615aa
--- /dev/null
+++ b/lib/whimsy/asf/member.rb
@@ -0,0 +1,89 @@
+module ASF
+  class Member
+    include Enumerable
+    attr_accessor :full
+
+    def self.find_text_by_id(value)
+      new.each do |id, text|
+        return text if id==value
+      end
+      nil
+    end
+
+    def self.each(&block)
+      new.each(&block)
+    end
+
+    def self.list
+      result = Hash[self.new(true).map {|name, text| [name, {text: text}]}]
+      self.status.each do |name, value|
+        result[name]['status'] = value
+      end
+      result
+    end
+
+    def self.find_by_email(value)
+      value = value.downcase
+      each do |id, text|
+        emails(text).each do |email|
+          return Person[id] if email.downcase == value
+        end
+      end
+      nil
+    end
+
+    def self.status
+      return @status if @status
+      status = {}
+      foundation = ASF::SVN['private/foundation']
+      return status unless foundation
+      sections = File.read("#{foundation}/members.txt").split(/(.*\n===+)/)
+      sections.shift(3)
+      sections.each_slice(2) do |header, text|
+        header.sub!(/s\n=+/,'')
+        text.scan(/Avail ID: (.*)/).flatten.each {|id| status[id] = header}
+      end
+      @status = status
+    end
+
+    def initialize(full = nil)
+      @full = (full.nil? ? ASF::Person.new($USER).asf_member? : full)
+    end
+
+    def each
+      foundation = ASF::SVN['private/foundation']
+      File.read("#{foundation}/members.txt").split(/^ \*\) /).each do |section|
+        id = section[/Avail ID: (.*)/,1]
+        section = '' unless @full
+        yield id, section.sub(/\n.*\n===+\s*?\n(.*\n)+.*/,'').strip if id
+      end
+      nil
+    end
+
+    def self.find(id)
+      each {|availid| return true if availid == id}
+      return false
+    end
+
+    def self.emails(text)
+      emails = text.to_s.scan(/Email: (.*(?:\n\s+\S+@.*)*)/).flatten.
+        join(' ').split(/\s+/).grep(/@/)
+    end
+
+    def self.svn_change
+      foundation = ASF::SVN['private/foundation']
+      file = "#{foundation}/members.txt"
+      return Time.parse(`svn info #{file}`[/Last Changed Date: (.*) \(/, 1]).gmtime
+    end
+  end
+
+  class Person
+    def members_txt
+      @members_txt ||= ASF::Member.find_text_by_id(name)
+    end
+
+    def member_emails
+      ASF::Member.emails(members_txt)
+    end
+  end
+end
diff --git a/lib/whimsy/asf/nominees.rb b/lib/whimsy/asf/nominees.rb
new file mode 100644
index 0000000..da78259
--- /dev/null
+++ b/lib/whimsy/asf/nominees.rb
@@ -0,0 +1,32 @@
+module ASF
+
+  class Person < Base
+  
+    def self.member_nominees
+      return @member_nominees if @member_nominees
+
+      meetings = ASF::SVN['private/foundation/Meetings']
+      nominations = Dir["#{meetings}/*/nominated-members.txt"].sort.last.untaint
+
+      nominations = File.read(nominations).split(/^\s*---+\s*/)
+      nominations.shift(2)
+
+      nominees = {}
+      nominations.each do |nomination|
+        id = nomination[/^\s?\w+.*<(\...@apache.org>/,1]
+        id ||= nomination[/^\s?\w+.*\((\S+)@apache.org\)/,1]
+        id ||= nomination[/^\s?\w+.*\(([a-z]+)\)/,1]
+
+        next unless id
+
+        nominees[find(id)] = nomination
+      end
+
+      @member_nominees = nominees
+    end
+
+    def member_nomination
+      Person.member_nominees[self]
+    end
+  end
+end
diff --git a/lib/whimsy/asf/podlings.rb b/lib/whimsy/asf/podlings.rb
new file mode 100644
index 0000000..bf1e26a
--- /dev/null
+++ b/lib/whimsy/asf/podlings.rb
@@ -0,0 +1,48 @@
+require 'nokogiri'
+require_relative '../asf'
+
+module ASF
+  class Podlings
+    include Enumerable
+
+    def quarter
+      [
+        Date.today.strftime('%B'),
+        Date.today.next_month.strftime('%B'),
+        Date.today.next_month.next_month.strftime('%B')
+      ]
+    end
+
+    def each
+      incubator_content = ASF::SVN['asf/incubator/public/trunk/content']
+      podlings = Nokogiri::XML(File.read("#{incubator_content}/podlings.xml"))
+      podlings.search('podling').map do |node|
+
+        reporting = node.at('reporting')
+        if reporting
+          group = reporting['group']
+          monthly = reporting.text.split(/,\s*/) if reporting['monthly']
+          reporting = %w(January April July October) if group == '1'
+          reporting = %w(February May August November) if group == '2'
+          reporting = %w(March June September December) if group == '3'
+          reporting.rotate! until quarter.include? reporting.first
+
+          if monthly
+            monthly.shift until monthly.empty? or quarter.include? monthly.first
+            reporting = (monthly + reporting).uniq
+          end
+        end
+
+        data = {
+          name: node['name'],
+          status: node['status'],
+          reporting: reporting,
+          description: node.at('description').text,
+          mentors: node.search('mentor').map {|mentor| mentor['username']}
+        }
+        data[:champion] = node.at('champion')['availid'] if node.at('champion')
+        yield node['resource'], data
+      end
+    end
+  end
+end
diff --git a/lib/whimsy/asf/rack.rb b/lib/whimsy/asf/rack.rb
new file mode 100644
index 0000000..83a7fd2
--- /dev/null
+++ b/lib/whimsy/asf/rack.rb
@@ -0,0 +1,113 @@
+require_relative '../asf.rb'
+require 'rack'
+require 'etc'
+
+module ASF
+  module Auth
+    DIRECTORS = {
+      'rbowen'      => 'rb',
+      'curcuru'     => 'sc',
+      'bdelacretaz' => 'bd',
+      'jim'         => 'jj',
+      'mattmann'    => 'cm',
+      'ke4qqq'      => 'dn',
+      'brett'       => 'bp',
+      'rubys'       => 'sr',
+      'gstein'      => 'gs'
+    }
+
+    # decode HTTP authorization, when present
+    def self.decode(env)
+      class << env; attr_accessor :user, :password; end
+
+      if env['HTTP_AUTHORIZATION']
+        require 'base64'
+        env.user, env.password = Base64.decode64(env['HTTP_AUTHORIZATION'][
+          /^Basic ([A-Za-z0-9+\/=]+)$/,1]).split(':',2)
+      else
+        env.user = env['REMOTE_USER'] || ENV['USER'] || Etc.getpwuid.name
+      end
+
+      env['REMOTE_USER'] ||= env.user
+
+      ASF::Person.new(env.user)
+    end
+
+    # Simply 'use' the following class in config.ru to limit access
+    # to the application to ASF committers
+    class Committers < Rack::Auth::Basic
+      def initialize(app)
+        super(app, "ASF Committers", &proc {})
+      end
+
+      def call(env)
+        authorized = ( ENV['RACK_ENV'] == 'test' )
+
+        authorized ||= ASF::Auth.decode(env).asf_committer?
+
+        if authorized
+          @app.call(env)
+        else
+          unauthorized
+        end
+      end
+    end
+
+    # Simply 'use' the following class in config.ru to limit access
+    # to the application to ASF members and officers and the accounting group.
+    class MembersAndOfficers < Rack::Auth::Basic
+      def initialize(app)
+        super(app, "ASF Members and Officers", &proc {})
+      end
+
+      def call(env)
+        authorized = ( ENV['RACK_ENV'] == 'test' )
+
+        person = ASF::Auth.decode(env)
+
+        authorized ||= DIRECTORS[env.user]
+        authorized ||= person.asf_member?
+        authorized ||= ASF.pmc_chairs.include? person
+
+        if not authorized
+          accounting = ASF::Authorization.new('pit').
+            find {|group, list| group=='accounting'}
+          authorized = (accounting and accounting.last.include? env.user)
+        end
+
+        if authorized
+          @app.call(env)
+        else
+          unauthorized
+        end
+      end
+    end
+  end
+
+  # Apache httpd on whimsy-vm is behind a proxy that converts https
+  # requests into http requests.  Update the environment variables to
+  # match.
+  class HTTPS_workarounds
+    def initialize(app)
+      @app = app
+    end
+
+    def call(env)
+      if env['HTTPS'] == 'on'
+        env['SCRIPT_URI'].sub!(/^http:/, 'https:')
+        env['SERVER_PORT'] = '443'
+
+        # for reasons I don't understand, Passenger on whimsy doesn't
+        # forward root directory requests directly, so as a workaround
+        # these requests are rewritten and the following code maps
+        # the requests back:
+        if env['PATH_INFO'] == '/index.html'
+          env['PATH_INFO'] = '/'
+          env['SCRIPT_URI'] += '/'
+        end
+      end
+      return  @app.call(env)
+    end
+  end
+
+end
diff --git a/lib/whimsy/asf/site.rb b/lib/whimsy/asf/site.rb
new file mode 100644
index 0000000..70d4599
--- /dev/null
+++ b/lib/whimsy/asf/site.rb
@@ -0,0 +1,101 @@
+require_relative '../asf'
+require 'nokogiri'
+
+module ASF
+
+  class Site
+    # add entries that are not currently defined in index.html (or elsewhere)
+    @@default = {
+      "brand management" => {
+        link: "http://www.apache.org/foundation/marks/pmcs",
+        text: "define how Apache projects should refer to trademarks and display their brand"
+      },
+      "comdev" => {
+        link: "http://community.apache.org/",
+        text: "Resources to help people become involved with Apache projects"
+      },
+      "executive assistant" => {
+        link: "http://www.apache.org/foundation/ASF-EA.html",
+        text: "Executive Assistant"
+      },
+      "fundraising" => {
+        link: "http://www.apache.org/foundation/contributing.html",
+        text: "Fund Raising"
+      },
+      "infrastructure" => {
+        link: "http://www.apache.org/dev/infrastructure.html",
+        text: "Infrastructure Team"
+      },
+      "legal affairs" => {
+        link: "http://www.apache.org/legal/",
+        text: "Establishing and managing legal policies"
+      },
+      "marketing and publicity" => {
+        link: "http://www.apache.org/press/",
+        text: "public relations and for the press-related issues"
+      },
+      "security" => {
+        link: "http://www.apache.org/security/",
+        text: "Security Team"
+      },
+      "tac" => {
+        link: "http://www.apache.org/travel/",
+        text: "Travel Assistance Committee"
+      },
+      "w3c relations" => {
+        link: "http://www.apache.org/foundation/foundation-projects.html#w3c",
+        text: "Liaison between the ASF and the World Wide Web Consortium"
+      },
+    }
+    @@list = {}
+
+    def self.list
+      templates = ASF::SVN['asf/infrastructure/site/trunk/content']
+      file = "#{templates}/index.html"
+      return @@list if not @@list.empty? and File.mtime(file) == @@mtime
+      @@mtime = File.mtime(file)
+
+      @@list = @@default
+
+      Committee.load_committee_info
+      doc = Nokogiri::HTML.parse(File.read(file))
+      list = doc.at("#by_name")
+      if list
+        list.search('a').each do |a|
+          @@list[Committee.find(a.text).name] = 
+            {link: a['href'], text: a['title']}
+        end
+      end
+
+      list = doc.at("#by_category")
+      if list
+        list.search('a').each do |a|
+          if a['title']
+            @@list[Committee.find(a.text).name] = 
+              {link: a['href'], text: a['title']}
+          end
+        end
+      end
+
+      @@list
+    end
+
+    def self.find(committee)
+      committee = committee.name if ASF::Committee == committee
+      list[committee]
+    end
+  end
+
+
+  class Committee
+    def site
+      site = ASF::Site.find(name)
+      site[:link] if site
+    end
+
+    def description
+      site = ASF::Site.find(name)
+      site[:text] if site
+    end
+  end
+end
diff --git a/lib/whimsy/asf/svn.rb b/lib/whimsy/asf/svn.rb
new file mode 100644
index 0000000..8205c66
--- /dev/null
+++ b/lib/whimsy/asf/svn.rb
@@ -0,0 +1,46 @@
+require 'uri'
+require 'thread'
+
+module ASF
+
+  class SVN
+    @base = URI.parse('https://svn.apache.org/repos/')
+    @mock = 'file:///var/tools/svnrep/'
+    @semaphore = Mutex.new
+    @testdata = {}
+
+    def self.repos
+      @semaphore.synchronize do
+        svn = ASF::Config.get(:svn).map {|dir| dir.untaint}
+        @repos ||= Hash[Dir[*svn].map { |name| 
+          Dir.chdir name.untaint do
+            [`svn info`[/URL: (.*)/,1].sub(/^http:/,'https:'), Dir.pwd.untaint]
+          end
+        }]
+      end
+    end
+
+    def self.[]=(name, path)
+      @testdata[name] = File.expand_path(path).untaint
+    end
+
+    def self.[](name)
+      return @testdata[name] if @testdata[name]
+
+      result = repos[(@mock+name.sub('private/','')).to_s.sub(/\/*$/, '')] ||
+        repos[(@base+name).to_s.sub(/\/*$/, '')] # lose trailing slash
+
+      return result if result
+
+      # recursively try parent directory
+      if name.include? '/'
+        base = File.basename(name)
+        result = self[File.dirname(name)]
+        if result and File.exist?(File.join(result, base))
+          File.join(result, base)
+        end
+      end
+    end
+  end
+
+end
diff --git a/lib/whimsy/asf/watch.rb b/lib/whimsy/asf/watch.rb
new file mode 100644
index 0000000..8e691aa
--- /dev/null
+++ b/lib/whimsy/asf/watch.rb
@@ -0,0 +1,41 @@
+module ASF
+
+  class Person < Base
+  
+    def self.member_watch_list
+      return @member_watch_list if @member_watch_list
+
+      foundation = ASF::SVN['private/foundation']
+      text = File.read "#{foundation}/potential-member-watch-list.txt"
+
+      nominations = text.scan(/^\s+\*\)\s+\w.*?\n\s*(?:---|\Z)/m)
+
+      i = 0
+      member_watch_list = {}
+      nominations.each do |nomination|
+        id = nil
+        name = nomination[/\*\)\s+(.+?)\s+(\(|\<|$)/,1]
+        id ||= nomination[/\*\)\s.+?\s\((.*?)\)/,1]
+        id ||= nomination[/\*\)\s.+?\s<(....@apache.org>/,1]
+
+        unless id
+          id = "notinavail_#{i+=1}"
+          find(id).attrs['cn'] = name
+        end
+
+        member_watch_list[find(id)] = nomination
+      end
+
+      @member_watch_list = member_watch_list
+    end
+
+    def member_watch
+      text = Person.member_watch_list[self]
+      if text
+        text.sub!(/\A\s*\n/,'')
+        text.sub!(/\n---\Z/,'')
+      end
+      text
+    end
+  end
+end
diff --git a/secmail.py b/secmail.py
new file mode 100644
index 0000000..3929fae
--- /dev/null
+++ b/secmail.py
@@ -0,0 +1,355 @@
+#!/usr/bin/python
+
+"""
+The purpose of this script is to find attachments to email messages that
+are sent to secretary@apache.org and commit them into svn:documents/received.
+
+This task is made more difficult by the fact that email often uses payloads
+for reasons other than attachments, from time to time we get spam, some
+people routinely pgp sign all of their emails, and others use pgp signatures
+to sign forms.
+
+Deciding what to commit is therefore, necessarily, a bit of heuristics.  When
+in doubt, the intent here is to err on the side of commiting more than is
+necessary than to miss an email.
+
+Examples of heurisitics:
+ * Images less than 10K bytes tend to be decorations for HTML formatted
+   spam emails, and are not likely to be scanned forms.
+ * text/plain email that contain a PGP signature and the ASF fax number
+   are likely to be signed forms.
+"""
+
+import email
+import gzip
+import mailbox
+import rfc822
+import mimetypes
+import os 
+from datetime import datetime
+from email.header import decode_header
+from glob import glob
+import re
+from subprocess import Popen, PIPE
+from threading import Thread
+import commands
+import getpass
+
+try:
+  from hashlib import md5
+except ImportError:
+  from md5 import new as md5
+
+# attachment types which generally are not saved.
+skip = ['multipart/alternative', 'multipart/related', 'multipart/mixed',
+        'message/delivery-status', 'text/plain', 'text/html']
+
+# attachment file names which always are saved, even if they come in
+# with one of the 'skip' mime types.
+forms = ['pgp.txt', 'icla.txt', 'icla.txt.asc', 'icla.pdf', 'icla.pdf.asc', 'membership-application.txt']
+
+# mime types for pgp signatures
+sigs  = ['application/pkcs7-signature', 'application/pgp-signature']
+
+# convert header from whatever encoding it is in to utf-8.  Handle
+# mislabelled encodings.
+def decode(header, field=0):
+  if isinstance(header, unicode):
+    data = (header.encode('utf-8'), 'utf-8')
+  else:
+    data = decode_header(header)[field]
+
+  try:
+    return data[0].decode(data[1]).encode('utf-8')
+  except:
+    return data[0].decode('iso-8859-1').encode('utf-8')
+
+# convert non-ascii characters into rough equivalents for the purpose
+# of determining a file name to store in SVN.
+def asciize(name):
+  if re.search(r"[^\x00-\x7F]", name):
+    # digraphs.  May be culturally sensitive
+    name=re.sub(r"\xc3\x9f", 'ss', name)
+    name=re.sub(r"\xc3\xa4|a\xcc\x88", 'ae', name)
+    name=re.sub(r"\xc3\xa5|a\xcc\x8a", 'aa', name)
+    name=re.sub(r"\xc3\xa6", 'ae', name)
+    name=re.sub(r"\xc3\xb1|n\xcc\x83", 'ny', name)
+    name=re.sub(r"\xc3\xb6|o\xcc\x88", 'oe', name)
+    name=re.sub(r"\xc3\xbc|u\xcc\x88", 'ue', name)
+
+    # latin 1
+    name=re.sub(r"\xc3[\xa0-\xa5]", 'a', name)
+    name=re.sub(r"\xc3\xa7", 'c', name)
+    name=re.sub(r"\xc3[\xa8-\xab]", 'e', name)
+    name=re.sub(r"\xc3[\xac-\xaf]", 'i', name)
+    name=re.sub(r"\xc3[\xb2-\xb6]|\xc3\xb8", 'o', name)
+    name=re.sub(r"\xc3[\xb9-\xbc]", 'u', name)
+    name=re.sub(r"\xc3[\xbd\xbf]", 'y', name)
+
+    # Latin Extended-A
+    name=re.sub(r"\xc4[\x80-\x85]", 'a', name)
+    name=re.sub(r"\xc4[\x86-\x8d]", 'c', name)
+    name=re.sub(r"\xc4[\x8e-\x91]", 'd', name)
+    name=re.sub(r"\xc4[\x92-\x9b]", 'e', name)
+    name=re.sub(r"\xc4[\x9c-\xa3]", 'g', name)
+    name=re.sub(r"\xc4[\xa4-\xa7]", 'h', name)
+    name=re.sub(r"\xc4[\xa8-\xb1]", 'i', name)
+    name=re.sub(r"\xc4[\xb2-\xb3]", 'ij', name)
+    name=re.sub(r"\xc4[\xb4-\xb5]", 'j', name)
+    name=re.sub(r"\xc4[\xb6-\xb8]", 'k', name)
+    name=re.sub(r"\xc4[\xb9-\xff]|\xc5[\x80-\x82]", 'l', name)
+    name=re.sub(r"\xc5[\x83-\x8b]", 'n', name)
+    name=re.sub(r"\xc5[\x8c-\x91]", 'o', name)
+    name=re.sub(r"\xc5[\x92-\x93]", 'oe', name)
+    name=re.sub(r"\xc5[\x94-\x99]", 'r', name)
+    name=re.sub(r"\xc5[\x9a-\xa2]", 's', name)
+    name=re.sub(r"\xc5[\xa2-\xa7]", 't', name)
+    name=re.sub(r"\xc5[\xa8-\xb3]", 'u', name)
+    name=re.sub(r"\xc5[\xb4-\xb5]", 'w', name)
+    name=re.sub(r"\xc5[\xb6-\xb8]", 'y', name)
+    name=re.sub(r"\xc5[\xb9-\xbe]", 'z', name)
+
+    # denormalized diacritics
+    name=re.sub(r"\xcc[\x80-\xff]|\xcd[\x80-\xaf]", '', name)
+
+  return re.sub(r"[^.\w]+", '-', name)
+
+# add svn at sign if necessary
+def svn(command, file):
+  command = 'svn ' + command + ' ' + file
+  if '@' in file: command = command + '@'
+  # import sys
+  # sys.stderr.write(command+"\n")
+  return os.system(command)
+
+# spam assassin client
+def analyze(msg):
+  spamc = Popen('spamc', shell=True, stdin=PIPE, stdout=PIPE)
+  class passthru(Thread):
+    def __init__(self, stdin, msg):
+      Thread.__init__(self)
+      self.msg = msg
+      self.stdin = stdin
+    def run(self):
+      try:
+        email.generator.Generator(self.stdin).flatten(self.msg)
+      except:
+        pass
+      self.stdin.close()
+  thread = passthru(spamc.stdin, msg)
+  thread.start()
+  subject = msg['subject']
+  msg = email.message_from_file(spamc.stdout)
+  msg['subject'] = subject # spamc mangles encoded strings
+  setattr(msg, 'spam', str(msg['X-Spam-Status']).startswith('Yes'))
+  thread.join()
+  spamc.wait()
+  spamc.stdout.close()
+  return msg
+
+# main logic for this script: process attachments for a single message
+def detach(msg):
+  # quick exit if we have seen this entry before
+  if not msg['message-id']: return
+  id = md5(msg['message-id']).hexdigest()
+  if os.path.exists(os.path.join('tally',id)): return
+
+  # known spammers
+  if '<r_...@yahoo.ro>' in msg['from']:
+    return
+
+  # collect eligible attachments
+  attachments = []
+  for payload in msg.get_payload():
+
+    # progress into multipart/mixed
+    if payload.get_content_type() == 'multipart/mixed':
+      payload = payload.get_payload()
+    else:
+      payload = [payload]
+    
+    # iterate over (possibly nested) attachments
+    for subpayload in payload:
+      if subpayload.get_content_type() in skip:
+        if subpayload.get_filename() not in forms: continue
+        content = subpayload.get_payload(decode=True)
+        if 'License Agreement' not in content and \
+          '-----BEGIN PGP SIGNATURE-----' not in content:
+          continue
+      if subpayload.get_content_type() == 'image/gif':
+        if len(subpayload.get_payload(decode=True))<10240: continue
+      # if not subpayload.get_payload(decode=True): continue
+
+      # get_filename doesn't appear to have an endswith method
+      # if subpayload.get_filename().endswith('.gpg'): continue
+      attachments.append(subpayload)
+
+  if len(attachments) == 0: return
+
+  if os.system('svn update received') != 0:
+    return
+
+  ## COMMENTED OUT - AS SPAMC IS NOT INSTALLED HERE
+  #
+  # if 'eFax message from' not in decode(msg['subject']):
+  #   msg = analyze(msg)
+  #   if msg.spam:
+  #     attachments = []
+
+  # determine output file name prefix
+  prefix = ''
+  if len(attachments) > 1:
+    prefix = rfc822.parseaddr(decode(msg['from']).decode('utf-8'))[1]
+    received = os.path.join('received',prefix)
+    if (not re.match(r'^[.@\w]+$',prefix)) or os.path.exists(received):
+      dirname = datetime(*email.utils.parsedate(msg['date'])[:7]).isoformat()
+      prefix = dirname.replace(':','_').replace('-','_')
+      received = os.path.join('received',prefix)
+    if not os.path.exists(received): os.mkdir(received)
+    svn('add', received)
+    prefix += os.sep
+  elif len(attachments) == 1:
+    name=asciize(decode(attachments[0].get_filename()))
+    if not name: return
+    if attachments[0].get_content_type() in sigs: return
+    if len(name)<16:
+      prefix = decode(msg['from'])
+      if prefix.startswith('"eFax"'):
+        prefix = 'eFax'
+      else:
+        prefix = asciize(prefix)
+        if prefix.find('<')>=0: prefix = prefix.split('<')[1]
+        prefix = prefix.split('@')[0]
+      prefix = prefix + '-'
+    try:
+      name.decode('utf-8')
+    except:
+      name=name.decode('iso-8859-1').encode('utf-8')
+
+  # determine commit message
+  summary = "\n".join([
+    'Subject: ' + decode(msg['subject']),
+    'From: ' + decode(msg['from']),
+    'Date: ' + str(msg['date']),
+    'Message-Id: ' + str(msg['message-id']),
+    'X-Spam-Status' + str(msg['X-Spam-Status']),
+  ])
+
+  count = 0
+  file = None
+
+  # decode payloads and place add to svn
+  for attachment in attachments:
+    mime = attachment.get_content_type()
+    if mime == 'application/octet-stream':
+      mime = mimetypes.guess_type(decode(attachment.get_filename()))[0]
+    name=asciize(decode(attachment.get_filename()))
+    if name=='none': name=str(dict(attachment.get_params()).get('name'))
+
+    content = attachment.get_payload(decode=True)
+    if content:
+      file=os.path.join('received',(prefix+name).strip('-'))
+      if os.path.isdir(file): file = os.path.join(file, 'unnamed')
+      fh=open(file,'w')
+      fh.write(content)
+      fh.close()
+
+      svn('add', file)
+      if mime: svn('propset svn:mime-type ' + mime, file)
+      count = count + 1
+
+  if count>1: file = os.path.join('received',prefix.strip('-'))
+
+  try:
+    name = decode(msg['from'],0)
+    try:
+      addr = rfc822.parseaddr(decode(msg['from'],1))[1]
+    except:
+      name, addr = rfc822.parseaddr(name)
+
+    if name != 'eFax' and file:
+      props = {
+        'email:id': msg['message-id'],
+        'email:subject': re.sub(r'\n\s*', ' ', decode(msg['subject']))
+      }
+      if name: props['email:name'] = name
+      if addr: props['email:addr'] = addr
+      if msg['cc']: props['email:cc'] =  re.sub('\s+', ' ', decode(msg['cc']))
+      for (key, value) in props.items():
+        svn('propset ' + key + ' ' + repr(value), file)
+  except:
+    pass
+
+  tally = os.path.join('tally',id)
+  fh=open(tally,'w')
+  fh.write(summary + "\n")
+  fh.close()
+
+  if count>0 and getpass.getuser() != 'www-data':
+    if svn('commit --file ' + tally, file) != 0:
+      return # try again next cron cycle
+
+if __name__ == "__main__":
+  if os.path.exists('/home/apmail/private-arch/officers-secretary'):
+    archive = '/home/apmail/private-arch/officers-secretary/20*'
+    os.chdir('/home/apmail/secretary-mail')
+    previous = os.stat('latest').st_mtime
+  elif os.path.exists('mailbox'):
+    archive = 'mailbox'
+    previous = int(os.stat(archive).st_mtime) - 1
+  else:
+    import sys
+    sys.stderr.write("can't find mailbox.  Exiting.\n")
+    sys.exit(1)
+
+  latest = previous
+  last_processed = None
+
+  # process updated mbox files
+  for file in glob(archive):
+    if int(previous) >= int(os.stat(file).st_mtime): continue
+
+    # open gzipped/raw file
+    if file.endswith('.gz'):
+      fh=gzip.open(file)
+    else:
+      fh=open(file)
+
+    # process each multipart message in the mailbox 
+    for msg in iter(mailbox.UnixMailbox(fh, email.message_from_file)):
+      last_processed = msg['Date']
+
+      if msg.is_multipart():
+        detach(msg)
+      elif '919-573-9199' in msg.get_payload():
+        if '-----BEGIN PGP SIGNATURE-----' in msg.get_payload().split("\n"):
+          msg.add_header('Content-Disposition', 'attachment',
+            filename='pgp.txt')
+          wrapper=email.message.Message()
+          wrapper.attach(msg)
+          for header in msg.keys(): wrapper[header]=msg[header]
+          detach(wrapper)
+
+    # keep track of the latest
+    if latest < os.stat(file).st_mtime:
+      latest = os.stat(file).st_mtime
+
+  # record where we are so that the next run can pick up where we left off
+  if latest > previous:
+    os.utime('latest', (latest, latest))
+     
+  # check for any incomplete removals
+  if commands.getoutput('svn status received') != '':
+    os.system("svn st received | grep '!' | cut -c 8- | xargs -r svn revert --")
+
+  # check for any incomplete commits
+  if commands.getoutput('svn status received') != '':
+    if getpass.getuser() != 'www-data':
+      os.system('svn commit -m "queued documents" received')
+
+  # update web page with last processed information
+  if last_processed and os.path.exists('../public_html/secmail.txt'):
+    fh = open('../public_html/secmail.txt', 'w')
+    fh.write("Latest email processed was sent: %s" % last_processed)
+    fh.close()
+
diff --git a/vagrant/README b/vagrant/README
new file mode 100644
index 0000000..f65619e
--- /dev/null
+++ b/vagrant/README
@@ -0,0 +1,101 @@
+*** WORK IN PROGRESS ***
+
+This early prototype roughs-in the configuration of a virtual machine
+to run whimsy services.
+workbench.
+
+Step 1: download and install Oracle VirtualBox
+
+  https://www.virtualbox.org/wiki/Downloads
+
+Step 2: download and install Vagrant
+
+  http://www.vagrantup.com/downloads.html
+
+Step 3: configure the virtual machine
+
+  Setup the network bridge your vagrant instance should use:
+
+    http://docs-v1.vagrantup.com/v1/docs/bridged_networking.html
+
+Step 4: start the virtual machine
+
+  Making sure that you are in this directory as your working directory, enter:
+
+    USER=<user> vagrant up
+
+  Change <user> to your ASF id.  You can leave this part out entirely if your ASF
+  id matches your current user id.
+  On Windows, try the following:
+  set USER=<user> & vagrant up
+
+  Messages will scroll by.  Somewhere near the fourth from the last you will
+  see a message like:
+
+    Whimsy is available at http://192.168.1.165/whimsy
+
+  Note the URL.
+
+Step 5a: (for use of the secretary workbench) check out foundation and documents
+
+  In the same working directory, enter:
+
+    vagrant ssh
+    cd /var/tools/secretary
+    svn co https://svn.apache.org/repos/private/foundation --username=<yourid>
+    svn co https://svn.apache.org/repos/private/documents --username=<yourid>
+    exit
+
+  Notes:
+
+    a) vagrant ssh will also provide the whimsy URL for you.  This can be
+       handy if you forgot it
+    b) svn co will prompt you for your password, and ask you if you want to
+       save it as plain text.  Doing so is likely necessary, but does mean
+       that you will need to protect your machine from being accessed by
+       others.
+
+Step 5b: (to use tools such as invoice or committee/committer roster):
+
+  vagrant ssh
+  bin/checkout-svn
+  bin/get-cert
+  bin/ldap-tunnel
+
+  These will prompt you for things like your ASF password.
+  
+  If you forgot to define USER= before creating the VM, or you need to change the username
+  to be used for logging in to the ASF systems, define the following variable:
+  
+  AVAILID=<user>;export AVAILID
+  
+  before running the above commands.
+  
+  You will also need to edit /etc/apache2/sites-available/default
+  and change the line RequestHeader set USER "<previous>"
+
+Step 6:
+
+  Visit the URL, and click on the service you wish to use 
+
+-----
+
+Todo:
+
+1) Complete checkouts of foundation and documents are cumbersome, and will
+   be destroyed if you ever decide to destroy the virtual machine.  Should you
+   happen to have a checkout of documents and foundation on your machine, 
+   this vagrant script will attempt to 'mount' the directory on /mnt/svn.
+   With this in place, an alternative version of step 4a is:
+
+      vagrant ssh
+      cd /var/tools/secretary
+      ln -s /mnt/svn/foundation
+      ln -s /mnt/svn/documents
+      cd foundation
+      svn update
+      exit
+
+   Note: if the autodetection of the checkout for the foundation directory
+   on your host machine isn't working, you can control the directory being
+   mounted by setting the SVN_ROOT environment variable.
diff --git a/vagrant/Vagrantfile b/vagrant/Vagrantfile
new file mode 100644
index 0000000..7535fee
--- /dev/null
+++ b/vagrant/Vagrantfile
@@ -0,0 +1,68 @@
+# -*- mode: ruby -*-
+# vi: set ft=ruby :
+
+Vagrant::Config.run do |config|
+  # All Vagrant configuration is done here. The most common configuration
+  # options are documented and commented below. For a complete reference,
+  # please see the online documentation at vagrantup.com.
+
+  # host name to use for the guest machine
+  config.vm.host_name = 'whimsy'
+
+  # Every Vagrant virtual environment requires a box to build off of.
+  config.vm.box = "precise32"
+
+  # The url from where the 'config.vm.box' box will be fetched if it
+  # doesn't already exist on the user's system.
+  config.vm.box_url = "http://files.vagrantup.com/precise32.box"
+
+  # Boot with a GUI so you can see the screen. (Default is headless)
+  # config.vm.boot_mode = :gui
+
+  # Assign this VM to a host-only network IP, allowing you to access it
+  # via the IP. Host-only networks can talk to the host machine as well as
+  # any other machines on the same network, but cannot be accessed (through this
+  # network interface) by any external networks.
+  # config.vm.network :hostonly, "192.168.33.10"
+
+  # Assign this VM to a bridged network, allowing you to connect directly to a
+  # network using the host's network device. This makes the VM appear as another
+  # physical device on your network.
+  # To find the bridged devices, the following command can be used:
+  # $ VBoxManage list bridgedifs | grep "^Name"
+  # Note: VBoxManage is found in the VirtualBox installation directory
+  # config.vm.network :bridged, :bridge => 'eth1'
+  # For Windows, it might be something like:
+  # config.vm.network :bridged, :bridge => 'Intel(R) PRO/1000 PL Network Connection'
+
+  # Forward a port from the guest to the host, which allows for outside
+  # computers to access the VM, whereas host only networking does not.
+  # config.vm.forward_port 3000, 3000
+
+  # Provision VM using chef
+  config.vm.provision :chef_solo do |chef|
+    chef.cookbooks_path = "cookbooks"
+    chef.add_recipe "whimsy"
+    chef.json = {
+      :user => ENV['USER']
+    }
+  end
+
+  # Speed up network access
+  # config.vm.customize ["modifyvm", :id, "--natdnsproxy1", "on"]
+  # config.vm.customize ["modifyvm", :id, "--natdnshostresolver1", "on"]
+
+  # Adjust amount of memory
+  # config.vm.customize ["modifyvm", :id, "--memory", 1024]
+
+  # share svn folder if we can find a checkout of the foundation repository
+  require 'pathname'
+  path = Pathname.new(ENV['SVN_ROOT'] || __FILE__).realpath
+  while not path.root?
+    path = path.parent
+    if (path+'foundation/.svn').exist?
+      config.vm.share_folder "shared-svn", "/mnt/svn", path.to_s
+      break
+    end
+  end
+end
diff --git a/vagrant/cookbooks/whimsy/recipes/apache.rb b/vagrant/cookbooks/whimsy/recipes/apache.rb
new file mode 100644
index 0000000..173c610
--- /dev/null
+++ b/vagrant/cookbooks/whimsy/recipes/apache.rb
@@ -0,0 +1,142 @@
+#
+# install apache2
+# install and configure suexec
+# allow .htaccess overrides
+# configure CGI
+# enable file extensions to be omitted (MultiViewsMatch)
+# set servername
+# change owner of web directory to vagrant user and group
+# install wunderbar gem
+# install jquery
+# restart apache2 server
+# report on location of dashboard in Chef log and welcome message
+#
+ 
+package "apache2"
+package "apache2-suexec"
+
+bash 'enable suexec' do
+  code 'a2enmod suexec'
+  not_if {File.exist? '/etc/apache2/mods-enabled/suexec.load'}
+end
+
+bash 'enable headers' do
+  code 'a2enmod headers'
+  not_if {File.exist? '/etc/apache2/mods-enabled/headers.load'}
+end
+
+ruby_block 'update site' do
+  block do
+    default = '/etc/apache2/sites-available/default'
+    original = File.read(default)
+    content = original.dup
+
+    unless File.exist? "#{default}.bak"
+      File.open("#{default}.bak", 'w') {|file| file.write original}
+    end
+
+    unless content.include? 'SuexecUserGroup'
+      content.sub! "\n\n", "\n\tSuexecUserGroup vagrant vagrant\n\n"
+    end
+
+    unless content.include? 'RequestHeader'
+      content.sub! "\n\n", "\n\tRequestHeader set USER \"#{node.user}\"\n\n"
+    end
+
+    content.sub!(%r{<Directory /var/www/>.*?\n\s*</Directory>}m) do |var_www|
+      var_www.sub! /^\s*AllowOverride\s.*/ do |line|
+        line.sub 'None', 'All'
+      end
+
+      var_www.sub! /^\s*Options\s.*/ do |line|
+        line += ' +ExecCGI' unless line.include? 'ExecCGI'
+        line
+      end
+
+      unless var_www.include? 'AddHandler cgi-script'
+        var_www[%r{^()\s*</Directory>}, 1] = "\t\tAddHandler cgi-script .cgi\n"
+      end
+
+      unless var_www.include? 'MultiViewsMatch Any'
+        var_www[%r{^()\s*</Directory>}, 1] = "\t\tMultiViewsMatch Any\n"
+      end
+
+      var_www
+    end
+
+    unless content == original
+      File.open(default, 'w') {|file| file.write content}
+    end
+  end
+end
+
+file '/etc/apache2/conf.d/servername' do
+  content "ServerName #{`hostname`}"
+end
+
+directory '/var/www' do
+  user 'vagrant'
+  group 'vagrant'
+end
+
+subversion "whimsy site" do
+  repository 'https://svn.apache.org/repos/infra/infrastructure/trunk/projects/whimsy/www'
+  destination "/var/www/whimsy"
+  user "vagrant"
+  group "vagrant"
+end
+
+gem_package "wunderbar" do
+  gem_binary "/usr/bin/gem1.9.1"
+end
+
+bash '/var/www/jquery-ui.css' do
+  user 'vagrant'
+  group 'vagrant'
+  code %{
+    cp /var/tools/www/jquery* /var/www
+  }
+  not_if {File.exist? '/var/www/jquery.min.js'}
+end
+
+link "/var/www/.subversion" do
+  to "/home/vagrant/.subversion"
+end
+
+directory '/var/www/members' do
+  user 'vagrant'
+  group 'vagrant'
+end
+
+link "/var/www/members/received" do
+  to "/var/tools/secretary/documents/received"
+end
+
+service "apache2" do 
+  action :restart
+end
+
+ruby_block 'welcome' do
+  ip=%{/sbin/ifconfig eth1|grep inet|head -1|sed 's/\:/ /'|awk '{print \$3}'}
+
+  block do
+    profile = '/home/vagrant/.bash_profile'
+    unless File.exist?(profile) and File.read(profile).include? ip
+      open(profile, 'a') do |file|
+        file.puts "\nip=$(#{ip})"
+        file.write <<-'EOF'.gsub(/^ {10}/, '')
+          if [[ "${TERM:-dumb}" != "dumb" ]]; then
+            echo
+            echo "Whimsy is available at http://$ip/whimsy"
+
+            PS1="\[\e]0;${debian_chroot:+($debian_chroot)}\u@\h: \w\a\]$PS1"
+          fi
+        EOF
+      end
+
+      Chef::ShellOut.new("chown vagrant:vagrant #{profile}").run_command
+    end
+
+    Chef::Log.info "Whimsy is available at http://" + `#{ip}`.chomp + "/whimsy"
+  end
+end
diff --git a/vagrant/cookbooks/whimsy/recipes/default.rb b/vagrant/cookbooks/whimsy/recipes/default.rb
new file mode 100644
index 0000000..6db3a31
--- /dev/null
+++ b/vagrant/cookbooks/whimsy/recipes/default.rb
@@ -0,0 +1,4 @@
+include_recipe "whimsy::system"    # update packaging information
+include_recipe "whimsy::model"     # asf model
+include_recipe "whimsy::secretary" # secretary workbench
+include_recipe "whimsy::apache"    # web interface
diff --git a/vagrant/cookbooks/whimsy/recipes/model.rb b/vagrant/cookbooks/whimsy/recipes/model.rb
new file mode 100644
index 0000000..f3b25c9
--- /dev/null
+++ b/vagrant/cookbooks/whimsy/recipes/model.rb
@@ -0,0 +1,155 @@
+#
+# installs ruby, subversion, ldap-utils, wkhtmltopdf
+# check outs whimsy tools (a.k.a. asf model)
+# install configuration scripts:
+#  checkout-svn
+#  get-cert
+#  ldap-tunnel
+# installs nokogiri gem
+# installs ruby-ldap gem
+#
+
+package 'ruby1.9.3'
+package 'subversion'
+package 'ldap-utils'
+package 'wkhtmltopdf'
+
+directory "/var/tools" do
+  user "vagrant"
+  group "vagrant"
+end
+
+subversion "asf model" do
+  repository 'https://svn.apache.org/repos/infra/infrastructure/trunk/projects/whimsy'
+  destination "/var/tools"
+  user "vagrant"
+  group "vagrant"
+end
+
+directory '/home/whimsysvn' do
+  user "vagrant"
+  group "vagrant"
+end
+
+directory '/home/whimsysvn/svn' do
+  user "vagrant"
+  group "vagrant"
+end
+
+link '/home/vagrant/svn' do
+  to '/home/whimsysvn/svn'
+end
+
+directory '/home/vagrant/bin' do
+  user "vagrant"
+  group "vagrant"
+end
+
+file '/home/vagrant/bin/checkout-svn' do
+  user "vagrant"
+  group "vagrant"
+  mode 0755
+  content <<-EOF.gsub(/^    /,'')
+    #!/bin/bash
+    function update {
+      if [[ -e $1 ]]; then
+        (cd $1; svn update)
+      else
+        svn checkout $2 --depth=${3:-infinity} --username ${AVAILID:-#{node.user}} $1
+      fi
+    }
+
+    cd $HOME/svn
+
+    update foundation \\
+      https://svn.apache.org/repos/private/foundation files
+
+    update board \\
+      https://svn.apache.org/repos/private/foundation/board files
+
+    update committers-board \\
+      https://svn.apache.org/repos/private/committers/board files
+
+    update templates \\
+      https://svn.apache.org/repos/asf/infrastructure/site/trunk/templates 
+
+    update officers \\
+      https://svn.apache.org/repos/private/foundation/officers files
+
+    update authorization \\
+      https://svn.apache.org/repos/infra/infrastructure/trunk/subversion/authorization files
+
+  EOF
+end
+
+file '/home/vagrant/bin/ldap-tunnel' do
+  user "vagrant"
+  group "vagrant"
+  mode 0755
+  content <<-EOF.gsub(/^    /,'')
+    #!/bin/bash
+    clear
+    echo "******************************************************************"
+    echo "*                                                                *"
+    echo "*                        ASF LDAP Tunnel                         *"
+    echo "*                                                                *"
+    echo "******************************************************************"
+    while [[ 1 ]]; do
+      ssh -N -L 6636:minotaur.apache.org:636 ${AVAILID:-#{node.user}}@minotaur.apache.org
+      sleep 5
+    done
+  EOF
+end
+
+file '/home/vagrant/bin/get-cert' do
+  user "vagrant"
+  group "vagrant"
+  mode 0755
+  content <<-EOF.gsub(/^    /,'')
+    #!/usr/bin/ruby
+    output = `ssh ${AVAILID:-#{node.user}}@minotaur.apache.org openssl s_client -connect \\
+              minotaur.apache.org:636 -showcerts < /dev/null 2> /dev/null`
+    File.open("asf-ldap-client.pem", 'w') do |file|
+      file.write output[/^-+BEGIN.*\\n-+END[^\\n]+\\n/m]
+    end
+    system "sudo chown root:root asf-ldap-client.pem"
+    system "sudo mv asf-ldap-client.pem /etc/ldap"
+  EOF
+end
+
+ruby_block 'update ldap.conf' do
+  block do
+    ldap_conf = '/etc/ldap/ldap.conf'
+    content = File.read(ldap_conf)
+    unless content.include? 'ldap-tunnel'
+      content.gsub!(/^TLS_CACERT/, '# TLS_CACERT')
+      content += "uri ldaps://ldap-tunnel.apache.org:6636\n"
+      content += "TLS_CACERT /etc/ldap/asf-ldap-client.pem\n"
+      File.open(ldap_conf, 'w') {|file| file.write content}
+    end
+  end
+end
+
+ruby_block 'update hosts' do
+  block do
+    content = File.read('/etc/hosts')
+    unless content.include? 'ldap-tunnel'
+      content[/localhost()\b/, 1] = ' ldap-tunnel.apache.org'
+      File.open('/etc/hosts', 'w') {|file| file.write content}
+    end
+  end
+end
+
+directory "/var/tools/data" do
+  user "vagrant"
+  group "vagrant"
+end
+
+directory "/var/tools/invoice" do
+  user "vagrant"
+  group "vagrant"
+end
+
+package "build-essential"
+package "ruby-nokogiri"
+package "ruby-ldap"
diff --git a/vagrant/cookbooks/whimsy/recipes/secretary.rb b/vagrant/cookbooks/whimsy/recipes/secretary.rb
new file mode 100644
index 0000000..bf42511
--- /dev/null
+++ b/vagrant/cookbooks/whimsy/recipes/secretary.rb
@@ -0,0 +1,143 @@
+#
+# install pdftk
+# install escape gem
+# install secmail.rb
+#
+
+package 'pdftk'
+package 'imagemagick'
+
+gem_package "escape" do
+  gem_binary "/usr/bin/gem"
+end
+
+gem_package "mail" do
+  gem_binary "/usr/bin/gem"
+end
+
+directory "/var/tools/secretary" do
+  user "vagrant"
+  group "vagrant"
+end
+
+bash '/var/tools/secretary/secmail.rb' do
+  user 'vagrant'
+  group 'vagrant'
+  code %{
+    cp /vagrant/secmail.rb /var/tools/secretary/secmail.rb
+  }
+  not_if {File.exist? '/var/tools/secretary/secmail.rb'}
+end
+
+directory "/var/tools/svnrep" do
+  user "vagrant"
+  group "vagrant"
+end
+
+bash "/var/tools/svnrep/foundation" do
+  user 'vagrant'
+  group 'vagrant'
+  code %{
+    cd /var/tools/svnrep
+    HOME=/home/vagrant svnadmin create foundation
+  }
+  not_if {File.exist? "/var/tools/svnrep/foundation"}
+end
+
+bash "/var/tools/svnrep/documents" do
+  user 'vagrant'
+  group 'vagrant'
+  code %{
+    cd /var/tools/svnrep
+    HOME=/home/vagrant svnadmin create documents
+  }
+  not_if {File.exist? "/var/tools/svnrep/documents"}
+end
+
+subversion "documents" do
+  repository 'file:///var/tools/svnrep/documents'
+  destination "/var/tools/secretary/documents"
+  user "vagrant"
+  group "vagrant"
+end
+
+subversion "foundation" do
+  repository 'file:///var/tools/svnrep/foundation'
+  destination "/var/tools/secretary/foundation"
+  user "vagrant"
+  group "vagrant"
+end
+
+bash "documents received" do
+  user 'vagrant'
+  group 'vagrant'
+  code %{
+    cd /var/tools/secretary/documents
+    mkdir -p received iclas cclas grants
+    svn add *
+    svn commit -m 'empty directories'
+  }
+  not_if {File.exist? "/var/tools/secretary/documents/received"}
+end
+
+bash "foundation officers" do
+  user 'vagrant'
+  group 'vagrant'
+  code %{
+    cd /var/tools/secretary/foundation
+    mkdir -p officers
+    if [[ -e /mnt/svn/foundation/officers/ ]]; then
+      cd /mnt/svn/foundation/officers/
+      cp iclas.txt cclas.txt grants.txt /var/tools/secretary/foundation/officers
+      cd -
+    fi
+    svn add officers
+    svn commit -m 'officer files'
+  }
+  not_if {File.exist? "/var/tools/secretary/foundation/officers"}
+end
+
+bash "foundation meetings" do
+  user 'vagrant'
+  group 'vagrant'
+  code %{
+    cd /var/tools/secretary/foundation
+    mkdir -p Meetings
+    if [[ -e /mnt/svn/foundation/Meetings/ ]]; then
+      cd /mnt/svn/foundation/Meetings/
+      cp -r $(ls -d 2* | tail -1) /var/tools/secretary/foundation/Meetings
+      cd -
+      find Meetings -name .svn | xargs --no-run-if-empty rm -rf
+    fi
+    svn add Meetings
+    svn commit -m 'meeting files'
+  }
+  not_if {File.exist? "/var/tools/secretary/foundation/Meetings"}
+end
+
+directory "/var/tools/secretary/secmail" do
+  user "vagrant"
+  group "vagrant"
+end
+
+file "/var/tools/secretary/secmail/latest" do
+  user "vagrant"
+  group "vagrant"
+end
+
+subversion "secmail received" do
+  repository 'file:///var/tools/svnrep/documents/received'
+  destination "/var/tools/secretary/secmail/received"
+  user "vagrant"
+  group "vagrant"
+end
+
+directory "/var/tools/secretary/secmail/tally" do
+  user "vagrant"
+  group "vagrant"
+end
+
+link '/var/tools/secretary/secmail/secmail.py' do
+  to '/var/tools/secmail.py'
+end
+
diff --git a/vagrant/cookbooks/whimsy/recipes/system.rb b/vagrant/cookbooks/whimsy/recipes/system.rb
new file mode 100644
index 0000000..a0abde4
--- /dev/null
+++ b/vagrant/cookbooks/whimsy/recipes/system.rb
@@ -0,0 +1,36 @@
+#
+# Update packaging information if the previous info is over a day old
+# Install update-notifier-common to keep the update-success-stamp current
+#
+
+ruby_block 'upgrade subversion' do
+  block do
+    if File.exist? '/mnt/svn/foundation/.svn/format'
+      cmd = Chef::ShellOut.new(
+        'apt-key adv --keyserver keyserver.ubuntu.com --recv-key A2F4C039 2>&1'
+      ).run_command
+
+      unless cmd.exitstatus == 0
+        Chef::Application.fatal! 'Failed to import subversion signing key'
+      end
+
+      File.open('/etc/apt/sources.list.d/subversion.list', 'w') do |file|
+        file.write <<-EOF.gsub(/^ +/,'')
+          deb http://ppa.launchpad.net/svn/ppa/ubuntu precise main 
+          deb-src http://ppa.launchpad.net/svn/ppa/ubuntu precise main
+        EOF
+      end
+    end
+  end
+end
+
+execute "apt-get-update-periodic" do
+  timestamp = '/var/lib/apt/periodic/update-success-stamp'
+  command "apt-get update && touch #{timestamp}"
+  ignore_failure true
+  only_if do
+    not File.exists?(timestamp) or File.mtime(timestamp) < Time.now - 86400
+  end
+end
+
+package 'update-notifier-common'
diff --git a/vagrant/recipes b/vagrant/recipes
new file mode 120000
index 0000000..0ecc8d1
--- /dev/null
+++ b/vagrant/recipes
@@ -0,0 +1 @@
+cookbooks/whimsy/recipes/
\ No newline at end of file
diff --git a/vagrant/secmail.rb b/vagrant/secmail.rb
new file mode 100644
index 0000000..614e3c4
--- /dev/null
+++ b/vagrant/secmail.rb
@@ -0,0 +1,48 @@
+require 'mail'
+
+Mail.defaults do
+  delivery_method :test
+
+  if $USER == 'clr'
+
+    @from = 'Craig L Russell <cl...@apache.org>'
+    @sig = %{
+      -- Craig L Russell
+      Secretary, Apache Software Foundation
+    }
+
+  elsif $USER == 'jcarman'
+
+    @from = 'James Carman <jc...@apache.org>'
+    @sig = %{
+      -- James Carman
+      Assistant Secretary, Apache Software Foundation
+    }
+
+  elsif $USER == 'rubys'
+
+    @from = 'Sam Ruby <ru...@apache.org>'
+    @sig = %{
+      -- Sam Ruby
+      Apache Software Foundation Secretarial Team
+    }
+
+  elsif $USER == 'sanders'
+
+    @from = 'Scott Sander <sa...@apache.org>'
+    @sig = %{
+      -- Scott Sander
+      Apache Software Foundation Secretarial Team
+    }
+
+  elsif $USER == 'mnour'
+
+    @from = 'Mohammad Nour El-Din <mn...@apache.org>'
+    @sig = %{
+      -- Mohammad Nour El-Din
+      Apache Software Foundation Secretarial Team
+    }
+  end
+end
+
+
diff --git a/www/apmail/mods.cgi b/www/apmail/mods.cgi
new file mode 100755
index 0000000..ca25db3
--- /dev/null
+++ b/www/apmail/mods.cgi
@@ -0,0 +1,246 @@
+#!/usr/bin/ruby1.9.1
+require 'shellwords'
+require 'whimsy/asf'
+
+# TODO: determine apmail@hermes,wheel@hermes gorup membership
+unless apmail.include? $USER or wheel.include? $USER
+  pmc = ENV['PATH_INFO'][/\/([-\w]+)\.apache\.org\//,1]
+  pmc &&= ASF::Committee.find(pmc)
+  user = ASF::Person.find($USER)
+  unless pmc and pmc.members.include? user
+    print "Status: 401 Unauthorized\r\n"
+    if pmc and not pmc.members.empty?
+      print "WWW-Authenticate: Basic realm=\"#{pmc.display_name} PMC\"\r\n\r\n"
+    else
+      print "WWW-Authenticate: Basic realm=\"APMail\"\r\n\r\n"
+    end
+    exit
+  end
+end
+
+mods = JSON.load(File.read('/home/apmail/subscriptions/mods'))
+
+_html do
+  _head_ do
+    _title 'ASF Mailing List Moderator administration'
+    _script src: '/jquery-min.js'
+    _style %{
+      table {border-spacing: 1em 0.2em }
+      thead th {border-bottom: solid black}
+      tbody tr:hover {background-color: #FF8}
+      label {display: block}
+      .message {border: 1px solid #0F0; background-color: #CFC}
+      .warn {border: 1px solid #F00; background-color: #FCC}
+      .demo {border: 1px solid #F80; background-color: #FC0}
+      .message, .warn, .demo {padding: 0.5em; border-radius: 1em}
+    }
+  end
+
+  _body? do
+    # common banner
+    _a href: 'https://whimsy.apache.org/' do
+      _img title: "Logo", alt: "Logo", 
+        src: "https://id.apache.org/img/asf_logo_wide.png"
+    end
+
+    _h2.demo "*** Demo mode - Changes aren't saved ***"
+    _h1_ 'ASF Moderator administration'
+
+    if ENV['PATH_INFO'] == '/'
+
+      _h2_ 'Domains'
+      _ul do
+        _li! { _a 'apache.org', href: "apache.org/" }
+        _li! { _a 'apachecon.com', href: "apachecon.com/" }
+      end
+      _ul do
+        mods.keys.sort.each do |domain|
+          next if %w(apache.org apachecon.com).include? domain
+          _li! { _a domain.split('.').first, href: "#{domain}/" }
+        end
+      end
+
+    elsif ENV['PATH_INFO'] == '/list'
+
+      _h2 "ASF Mailing List moderators" 
+      emails = [] 
+      mods.each do |domain, lists| 
+        lists.each do |list, moderators| 
+          emails += moderators.map(&:downcase) 
+        end 
+      end 
+ 
+      _ul do 
+        emails.uniq.sort.each do |email| 
+          _li! { _a email, href: email } 
+        end 
+      end 
+
+    elsif ENV['PATH_INFO'] =~ %r{@}
+
+      email = env['PATH_INFO'][1..-1].downcase
+      _h2 "Lists moderated by #{email}" 
+      _ul do 
+        mods.each do |domain, lists| 
+          lists.each do |list, moderators| 
+            if moderators.map(&:downcase).include? email 
+              _li! do
+                _a "#{list}@#{domain}", href: "#{domain}/#{list}/"
+              end
+            end 
+          end 
+        end 
+      end 
+
+    elsif ENV['PATH_INFO'] =~ %r{^/([-.\w]*apache\w*\.\w+)/$}
+
+      _h2_ "Mailing Lists - #{$1}"
+      stem = "#{$1}-"
+      _ul do
+        mods[$1].keys.each do |list|
+          _li! { _a list, href: "#{list}/" }
+        end
+      end
+
+    elsif ENV['PATH_INFO'] =~ %r{^/([-.\w]*apache\w*\.\w+)/([-\w]+)/$}
+
+      domain, list = $1, $2
+
+      dir = "/home/apmail/lists/#{domain}/#{list}"
+
+      if _.post? and @email.to_s.include? '@'
+        if %w(sub unsub).include? @op
+          person = ASF::Person.find_by_email(@email)
+          op = (@op == 'sub' ? 'added' : 'removed')
+          mods[domain][list] << @email if @op == 'sub'
+          mods[domain][list].delete @email if @op == 'unsub'
+          if person
+            _p.message "#{person.public_name} was #{op} as a moderator."
+          else
+            _p.message "#{@email} was #{op} as a moderator."
+          end
+        end
+      end
+
+      apmail_bin = ASF::SVN['infra/infrastructure/apmail/trunk/bin']
+      archives = File.read(File.join(apmail_bin, '.archives'))
+      archives = Hash[*JSON.parse('['+archives.sub(/,?\s*\Z/,']'))]
+
+      pmc = domain.split('.').first
+      listname = "#{pmc}-#{list}"
+      href = 
+        if archives[listname]
+          if archives[listname].include? '/apmail/public-arch/'
+            "http://mail-archives.apache.org/mod_mbox/#{listname}"
+          else
+            user = ASF::Person.find($USER)
+            if user.asf_member?
+              "https://mail-search.apache.org/members/private-arch/#{listname}"
+            elsif ASF::Committee.find(pmc).members.include? user
+              "https://mail-search.apache.org/pmc/private-arch/#{listname}"
+            end
+          end
+        end
+  
+      if href
+        _h2_ {_a "#{list}@#{domain}", href: href}
+      else
+        _h2_ "#{list}@#{domain}"
+      end
+
+      _table_ do
+        _thead_ do
+          _tr do
+            _th 'Email'
+            _th 'Name'
+          end
+        end
+        _tbody do
+          mods[domain][list].sort.each do |email|
+            person = ASF::Person.find_by_email(email.chomp)
+            _tr_ do
+              _td email.chomp
+              _td! do
+                if person
+                  href = "/roster/committer/#{person.id}"
+                  if person.asf_member?
+                    _strong { _a person.public_name, href: href }
+                  else
+                    _a person.public_name, href: href
+                  end
+                else
+                  _em 'unknown'
+                end
+              end
+            end
+          end
+        end
+
+        if mods == ''
+          _tr do
+            _td(colspan: 2) {_em 'none'}
+          end
+        end
+      end
+
+      _h2 'Action'
+      _form_ method: 'post' do
+        _div style: 'float: left' do
+          _label do
+            _input type: 'radio', name: 'op', value: 'sub', required: true,
+              checked: true
+            _ 'Add'
+          end
+          _label do
+            _input type: 'radio', name: 'op', value: 'unsub', 
+              disabled: (mods[domain][list].length <= 2)
+            _ 'Remove'
+          end
+        end
+        _input type: 'email', name: 'email', placeholder: 'email',
+          required: true, style: 'margin-left: 1em; margin-top: 0.5em'
+      end
+
+      _script %{
+        // Make click select the email to be removed
+        $('tbody tr').click(function() {
+          $('input[name=email]').val($('td:first', this).text()).focus();
+          $('input:enabled[value=unsub]').prop('checked', true);
+        });
+
+        // Confirmation dialog
+        var confirmed = false;
+        $('form').submit(function() {
+          if (confirmed) return true;
+          var spinner = $('<img src="/spinner.gif"/>');
+          $('input[name=email]').after(spinner);
+          $.post('', $('form').serialize(), function(_) {
+            if (confirm(_.prompt)) {
+              confirmed = true;
+              $('form').submit();
+            }
+            spinner.remove();
+          }, 'json');
+          return false;
+        });
+      }
+    end
+  end
+end
+
+_json do
+  person = ASF::Person.find_by_email(@email)
+  if @op == 'unsub'
+    if person
+      _prompt "Remove #{person.public_name} as a moderator?"
+    else
+      _prompt "Remove #{@email} as a moderator?"
+    end
+  else
+    if person
+      _prompt "Add #{person.public_name} as a moderator?"
+    else
+      _prompt "Unknown email.  Add #{@email} as a moderator anyway?"
+    end
+  end
+end
diff --git a/www/board/posted-reports.cgi b/www/board/posted-reports.cgi
new file mode 100755
index 0000000..48b82c7
--- /dev/null
+++ b/www/board/posted-reports.cgi
@@ -0,0 +1,77 @@
+#!/usr/bin/ruby1.9.1
+
+require 'mail'
+require 'wunderbar'
+require 'whimsy/asf/agenda'
+
+# link to board private-arch
+MBOX = "https://mail-search.apache.org/members/private-arch/board"
+
+# get a list of current board messages
+archive = Dir['/home/apmail/board/archive/*/*']
+
+# select messages that have a subject line starting with [REPORT]
+reports = []
+archive.each do |email|
+  next if email.end_with? '/index'
+  message = IO.read(email, mode: 'rb')
+  subject = message[/^Subject: .*/]
+  next unless subject and subject.upcase.include? "[REPORT]"
+  mail = Mail.new(message)
+  reports << mail if mail.subject.upcase.start_with? "[REPORT]"
+end
+
+# Get a list of missing board reports
+Dir.chdir ASF::SVN['private/foundation/board']
+agenda = Dir['board_agenda_*.txt'].sort.last
+parsed = ASF::Board::Agenda.parse(IO.read(agenda), true)
+missing = parsed.select {|item| item['missing']}.
+  map {|item| item['title'].downcase}
+
+# produce HTML output of reports, highlighting ones that have not (yet)
+# been posted
+_html do
+  _style %{
+    .missing {background-color: yellow}
+  }
+
+  _h1 "Posted PMC reports"
+
+  _a agenda, href: 'https://whimsy.apache.org/board/agenda/' +
+    agenda[/\d+_\d+_\d+/].gsub('_', '-') + '/'
+
+  # attempt to sort reports by PMC name
+  reports.sort_by! do |mail| 
+    mail.subject.downcase.sub /\sapache\s/, ' '
+  end
+
+  # output an unordered list of subjects linked to the message archive
+  _ul reports do |mail|
+    _li do
+      mbox = mail.date.strftime("#{MBOX}/%Y%m.mbox/")
+      href = mbox + URI.escape('<' + mail.message_id + '>')
+
+      if missing.any? {|title| mail.subject.downcase =~ /\b#{title}\b/}
+        _a.missing mail.subject, href: href
+      else
+        _a.present mail.subject, href: href
+      end
+    end
+  end
+end
+
+# produce JSON output of reports
+_json do
+  _ reports do |mail|
+    mbox = mail.date.strftime("#{MBOX}/%Y%m.mbox/")
+
+    _subject mail.subject
+    _link mbox + URI.escape('<' + mail.message_id + '>')
+
+    subject = mail.subject.downcase
+    _missing missing.any? {|title| subject =~ /\b#{title}\b/}
+
+    item = parsed.find {|item| subject =~ /\b#{item['title'].downcase}\b/}
+    _title item['title'] if item
+  end
+end
diff --git a/www/board/publish_minutes.cgi b/www/board/publish_minutes.cgi
new file mode 100755
index 0000000..057b37f
--- /dev/null
+++ b/www/board/publish_minutes.cgi
@@ -0,0 +1,150 @@
+#!/usr/bin/ruby1.9.1
+require 'wunderbar'
+require 'date'
+require 'whimsy/asf'
+require 'shellwords'
+
+secretary = %w(clr rubys jcarman).include? $USER
+
+unless secretary 
+  print "Status: 401 Unauthorized\r\n"
+  print "WWW-Authenticate: Basic realm=\"ASF Secretarial team\"\r\n\r\n"
+  exit
+end
+
+CONTENT = 'asf/infrastructure/site/trunk/content'
+BOARD_SITE = ASF::SVN["#{CONTENT}/foundation/board"]
+MINUTES = ASF::SVN["#{CONTENT}/foundation/records/minutes"]
+BOARD_PRIVATE = ASF::SVN['private/foundation/board']
+CALENDAR = "#{BOARD_SITE}/calendar.mdtext"
+
+_html do
+  _head do
+    _title 'Commit Minutes'
+    _style %{
+      ._stdin {display: none}
+      ._stdout, ._stderr {margin: 0}
+      ._stderr {color: red}
+      li {margin: 0.5em}
+    }
+  end
+  _body? do
+    # update from svn
+    [MINUTES, BOARD_SITE, BOARD_PRIVATE].each do |dir| 
+      Dir.chdir(dir) {`svn cleanup`; `svn up`}
+    end
+
+    calendar = File.read(CALENDAR)
+
+    # clean up summary; extract date and year from it
+    @summary = @summary.gsub(/\r\n/,"\n").sub(/\s+\Z/,'') + "\n"
+    date = @summary[/\[(.*?)\]/,1]
+    year = date.split(' ').last
+
+    # add year header
+    unless calendar.include? '#'+year
+      calendar[/^()#.*Board meeting minutes #/,1] =
+        "# #{year} Board meeting minutes # {##{year}}\n\n"
+    end
+
+    # add summary
+    if calendar.include? "\n- [#{date}]"
+      calendar.sub! /\n-\s+\[#{date}\].*?(\n[-#])/m, "\n" + @summary + '\1'
+    else
+      calendar[/# #{year} Board meeting minutes #.*\n()/,1] = "\n" + @summary
+    end
+
+    # remove from calendar
+    calendar.sub! /^(\s+-\s+#{date}\s*\n)/, ''
+
+    # parse and cleanup input
+    date = Date.parse(date).strftime("%Y_%m_%d")
+    year.untaint if year =~ /^\d+$/
+    message = Shellwords.escape(@message).untaint
+
+    _h1 'Publish the Minutes'
+
+    _h2 'Commit the Minutes'
+    Dir.chdir MINUTES do
+      unless Dir.exist? year
+        _.system "mkdir #{year}"
+        _.system "svn add #{year}"
+      end
+      if File.exist? "#{year}/board_minutes_#{date}.txt"
+        _p "#{year}/board_minutes_#{date}.txt already exists", class: '_stderr'
+      else
+        _.system "cp #{BOARD_PRIVATE}/board_minutes_#{date}.txt #{year}"
+        _.system "svn add #{year}/board_minutes_#{date}.txt"
+        _p
+        _.system [
+          'svn', 'commit', '-m', message, year,
+          ['--no-auth-cache', '--non-interactive'],
+          (['--username', $USER, '--password', $PASSWORD] if $PASSWORD)
+        ]
+
+        File.unlink 'svn-commit.tmp' if File.exist? 'svn-commit.tmp'
+
+        unless `svn st`.empty?
+          _.system ['svn', 'status']
+          raise "svn failure"
+        end
+      end
+    end
+
+    _h2 'Update the Calendar'
+    Dir.chdir BOARD_SITE do
+      if File.read(CALENDAR) == calendar
+        _p "#{File.basename CALENDAR} already up to date", class: '_stderr'
+      else
+        File.open(CALENDAR, 'w') {|fh| fh.write calendar}
+        _.system "svn diff #{File.basename CALENDAR}"
+        _p
+        _.system [
+          'svn', 'commit', '-m', message, File.basename(CALENDAR),
+          ['--no-auth-cache', '--non-interactive'],
+          (['--username', $USER, '--password', $PASSWORD] if $PASSWORD)
+        ]
+
+        unless `svn st`.empty?
+          _.system ['svn', 'status']
+          raise "svn failure"
+        end
+      end
+    end
+
+    _h2 'Clean up board directory'
+    Dir.chdir BOARD_PRIVATE do
+      updated = false
+
+      if File.exist? "board_minutes_#{date}.txt"
+        _.system "svn rm board_minutes_#{date}.txt"
+        updated = true
+      end
+      
+      if File.exist? "board_agenda_#{date}.txt"
+        _.system "svn mv board_agenda_#{date}.txt archived_agendas"
+        updated = true
+      end
+
+      if updated
+        _p
+        _.system [
+          'svn', 'commit', '-m', message,
+          ['--no-auth-cache', '--non-interactive'],
+          (['--username', $USER, '--password', $PASSWORD] if $PASSWORD)
+        ]
+
+        unless `svn st`.empty?
+          _.system ['svn', 'status']
+          raise "svn failure"
+        end
+      else
+        _p "Nothing to clean up", class: '_stderr'
+      end
+    end
+
+    _h2 'Publish www site'
+    _a 'Proceed to CMS', href: 'https://cms.apache.org/www/publish'
+  end
+end
+
diff --git a/www/board/subscriptions.cgi b/www/board/subscriptions.cgi
new file mode 100755
index 0000000..c56991c
--- /dev/null
+++ b/www/board/subscriptions.cgi
@@ -0,0 +1,171 @@
+#!/usr/bin/ruby1.9.1
+require 'wunderbar'
+require 'whimsy/asf'
+require 'whimsy/asf/podlings'
+require 'whimsy/asf/site'
+
+SUBSCRIPTIONS = '/home/apmail/subscriptions/board'
+
+info_chairs = ASF::Committee.load_committee_info.group_by(&:chair)
+ldap_chairs = ASF.pmc_chairs
+
+_html do
+  _head_ do
+    _title 'Apache pmc-chair/board list'
+    _style %{
+      table {border-collapse: collapse}
+      th, td { border: 1pt solid black}
+      .issue, .issue a {color: red}
+    }
+  end
+
+  _body? do
+
+    _h1 'Apache pmc-chair/board list'
+
+    _p! do
+      _ 'This process starts with the list of subscribers to '
+      _a 'board@apache.org', href: 'https://mail-search.apache.org/members/private-arch/board/'
+      _ '.  '
+      _a 'members.txt', href: 'https://svn.apache.org/repos/private/foundation/members.txt'
+      _ ', '
+      _a 'iclas.txt', href: 'https://svn.apache.org/repos/private/foundation/officers/iclas.txt'
+      _ ', and '
+      _code 'ldapsearch mail'
+      _ ' to attempt to match the email address to an Apache ID.  '
+      _ 'Those that are not found are listed as '
+      _code.issue '*missing*'
+      _ '.  ASF members are '
+      _strong 'listed in bold'
+      _ '.  Emeritus members are '
+      _em 'listed in italics'
+      _ '.  Non ASF member, non-committee chairs are also '
+      _span.issue 'listed in red'
+      _ '.'
+    end
+
+    _p! do
+      _ 'The resulting list is then cross-checked against '
+      _a 'committee-info.text', href: 'https://svn.apache.org/repos/private/committers/board/committee-info.txt'
+      _ ' and '
+      _code 'ldapsearch cn=pmc-chairs'
+      _ '.  Membership that is only listed in one of these two sources is '
+      _span.issue 'listed in red'
+      _ '.'
+    end
+
+    _p! do
+      _ 'Committee chairs for which a matching email address can not be found are '
+      _a 'listed in a separate table', href: "#unsub"
+      _ '.'
+    end
+
+    ids = []
+
+    File.readlines(SUBSCRIPTIONS).each do |line|
+      person = ASF::Mail.list[line.downcase.strip]
+      person ||= ASF::Mail.list[line.downcase.strip.sub(/\+\w+@/,'@')]
+      if person
+        id = person.id
+        id = '*notinavail*' if id == 'notinavail'
+      else
+        person = ASF::Person.find('notinavail')
+        id = '*missing*'
+      end
+      ids << [id, person, line.strip]
+    end
+
+    _table_ border: '1', cellpadding: '2', cellspacing: '0' do
+      _tr do
+        _th 'id'
+        _th 'email'
+        _th 'name'
+        _th 'committee'
+      end
+
+      ids.sort.each do |id, person, email|
+        next if email == 'board-archive@apache.org'
+        _tr_ do
+          href = "/roster/committer/#{id}"
+          if person.asf_member?
+            if person.asf_member? == true
+              _td! {_strong {_a id, href: href}}
+            else
+            _td! {_em {_a id, href: href}}
+            end
+          elsif id.include? '*'
+            _td.issue id
+          elsif info_chairs.include? person or ldap_chairs.include? person
+            _td {_a id, href: href}
+          else
+            _td.issue {_a id, href: href}
+          end
+          _td email
+
+          if not id.include? '*'
+            _td person.public_name
+          else
+	    icla = ASF::ICLA.find_by_email(id)
+	    if icla
+              _td.issue icla.name
+	    else
+              _td.issue '*notinavail*'
+	    end
+          end
+
+          if info_chairs.include? person
+            text = info_chairs[person].uniq.map(&:display_name).join(', ')
+            if ldap_chairs.include? person or info_chairs[person].all? &:nonpmc?
+              _td text
+            else
+              _td.issue text
+            end
+          elsif ldap_chairs.include? person
+            _td.issue '***LDAP only***'
+          elsif person.asf_member?
+            _td
+          else
+            _td.issue '*** non-member, non-officer ***'
+          end
+        end
+      end
+    end
+
+    chairs = ( info_chairs.keys + ldap_chairs ).uniq
+    missing = chairs.map(&:id) - ids.map(&:first)
+
+    unless missing.empty?
+      _h3_.unsub! 'Not subscribed to the list'
+      _table border: '1', cellpadding: '2', cellspacing: '0' do
+	_tr do
+	  _th 'id'
+	  _th 'name'
+	  _th 'committee'
+	end
+	missing.sort.each do |id|
+          person = ASF::Person.find(id)
+	  _tr_ do
+	    if person.asf_member?
+	      _td! {_strong id}
+	    else
+	      _td id
+	    end
+	    _td person.public_name
+	    if info_chairs.include? person
+              text = info_chairs[person].uniq.map(&:display_name).join(', ')
+	      if ldap_chairs.include? person
+		_td text
+	      else
+		_td.issue text
+	      end
+	    elsif ldap_chairs.include? person
+	      _td.issue '***LDAP only***'
+	    else
+	      _td
+	    end
+	  end
+	end
+      end
+    end
+  end
+end
diff --git a/www/calendar-demo/Rakefile b/www/calendar-demo/Rakefile
new file mode 100644
index 0000000..45a7860
--- /dev/null
+++ b/www/calendar-demo/Rakefile
@@ -0,0 +1,3 @@
+require 'rspec/core/rake_task'
+RSpec::Core::RakeTask.new(:spec)
+task :default => :spec
diff --git a/www/calendar-demo/app.rb b/www/calendar-demo/app.rb
new file mode 100644
index 0000000..9dcbd49
--- /dev/null
+++ b/www/calendar-demo/app.rb
@@ -0,0 +1,28 @@
+require 'wunderbar/sinatra'
+require 'wunderbar/script'
+require 'ruby2js/filter/react'
+
+require_relative 'monkey_patches'
+
+require_relative 'model.rb'
+
+# Redirect to this month's page
+get '/' do
+  today = Date.today
+  redirect to("/#{today.year}/#{today.strftime('%m')}")
+end
+
+# Calendar page - html
+get %r{/(\d\d\d\d)/(\d\d?)$} do |year, month|
+  @year = year.to_i
+  @month = month.to_i
+  @items = Holiday.find(@year, @month)
+  _html :calendar
+end
+
+# Calendar page - json
+get %r{/(\d\d\d\d)/(\d\d?)\.json} do |year, month|
+  _json do 
+    Holiday.find(year.to_i, month.to_i)
+  end
+end
diff --git a/www/calendar-demo/config.ru b/www/calendar-demo/config.ru
new file mode 100644
index 0000000..527e3e9
--- /dev/null
+++ b/www/calendar-demo/config.ru
@@ -0,0 +1,3 @@
+require File.expand_path('../app.rb', __FILE__)
+
+run Sinatra::Application
diff --git a/www/calendar-demo/model.rb b/www/calendar-demo/model.rb
new file mode 100644
index 0000000..fe7796b
--- /dev/null
+++ b/www/calendar-demo/model.rb
@@ -0,0 +1,361 @@
+# encoding: UTF-8
+
+module Holiday
+
+  def self.find(year, month)
+    Hash[@@data.find_all {|y, m, d, t| year==y and month==m}.
+      group_by {|y, m, d, t| d}.
+      map {|d, list| [d, list.map {|y, m, d, t| t}]}]
+  end
+
+  # http://www.timeanddate.com/holidays/us/
+  @@data = [
+    [2015, 1, 1, "New Year's Day"],
+    [2015, 1, 3, "The Prophet's Birthday"],
+    [2015, 1, 4, "World Braille Day"],
+    [2015, 1, 6, "Epiphany"],
+    [2015, 1, 7, "Orthodox Christmas Day"],
+    [2015, 1, 7, "International Programmers' Day"],
+    [2015, 1, 13, "Stephen Foster Memorial Day"],
+    [2015, 1, 14, "Orthodox New Year"],
+    [2015, 1, 16, "Lee Jackson Day"],
+    [2015, 1, 18, "World Religion Day"],
+    [2015, 1, 19, "Martin Luther King Day"],
+    [2015, 1, 19, "Robert E Lee's Birthday"],
+    [2015, 1, 19, "Confederate Memorial Day"],
+    [2015, 1, 19, "Idaho Human Rights Day"],
+    [2015, 1, 19, "Civil Rights Day"],
+    [2015, 1, 25, "World Leprosy Day"],
+    [2015, 1, 26, "International Customs Day"],
+    [2015, 1, 27, "International Day of Commemoration in Memory of the Victims of the Holocaust"],
+    [2015, 1, 27, "e-Day"],
+    [2015, 1, 29, "Kansas Day"],
+    [2015, 2, 1, "National Freedom Day"],
+    [2015, 2, 2, "World Wetlands Day"],
+    [2015, 2, 2, "Groundhog Day"],
+    [2015, 2, 4, "Tu Bishvat/Tu B'Shevat"],
+    [2015, 2, 4, "World Cancer Day"],
+    [2015, 2, 4, "Rosa Parks Day"],
+    [2015, 2, 6, "International Day of Zero Tolerance to Female Genital Mutilation"],
+    [2015, 2, 6, "National Wear Red Day"],
+    [2015, 2, 7, "e-Day"],
+    [2015, 2, 11, "World Day of the Sick"],
+    [2015, 2, 12, "Lincoln's Birthday"],
+    [2015, 2, 13, "World Radio Day"],
+    [2015, 2, 13, "Friday the 13th"],
+    [2015, 2, 14, "Valentine's Day"],
+    [2015, 2, 15, "Susan B Anthony's Birthday"],
+    [2015, 2, 16, "Presidents' Day"],
+    [2015, 2, 16, "Daisy Gatson Bates Day"],
+    [2015, 2, 17, "Shrove Tuesday/Mardi Gras"],
+    [2015, 2, 18, "Ash Wednesday"],
+    [2015, 2, 19, "Chinese New Year"],
+    [2015, 2, 20, "World Day of Social Justice"],
+    [2015, 2, 21, "International Mother Language Day"],
+    [2015, 3, 1, "Zero Discrimination Day"],
+    [2015, 3, 1, "Self-injury Awareness Day"],
+    [2015, 3, 1, "St. David's Day"],
+    [2015, 3, 2, "Texas Independence Day"],
+    [2015, 3, 2, "Casimir Pulaski Day"],
+    [2015, 3, 2, "Read Across America Day"],
+    [2015, 3, 3, "World Wildlife Day"],
+    [2015, 3, 3, "Town Meeting Day Vermont"],
+    [2015, 3, 5, "Purim"],
+    [2015, 3, 6, "Employee Appreciation Day"],
+    [2015, 3, 8, "Daylight Saving Time starts"],
+    [2015, 3, 8, "International Women's Day"],
+    [2015, 3, 12, "World Kidney Day"],
+    [2015, 3, 13, "Friday the 13th"],
+    [2015, 3, 14, "Pi Day"],
+    [2015, 3, 17, "St. Patrick's Day"],
+    [2015, 3, 17, "Evacuation Day"],
+    [2015, 3, 20, "March equinox"],
+    [2015, 3, 20, "International Day of Happiness"],
+    [2015, 3, 21, "International Day for the Elimination of Racial Discrimination"],
+    [2015, 3, 21, "World Poetry Day"],
+    [2015, 3, 21, "International Day of Nowruz"],
+    [2015, 3, 21, "World Down Syndrome Day"],
+    [2015, 3, 21, "International Day of Forests"],
+    [2015, 3, 22, "World Water Day"],
+    [2015, 3, 23, "World Meteorological Day"],
+    [2015, 3, 24, "World Tuberculosis Day"],
+    [2015, 3, 24, "International Day for the Right to the Truth concerning Gross Human Rights Violations and for the Dignity of Victims"],
+    [2015, 3, 25, "International Day of Remembrance of Slavery Victims and the Transatlantic Slave Trade"],
+    [2015, 3, 25, "International Day of Solidarity with Detained and Missing Staff Members"],
+    [2015, 3, 25, "Maryland Day"],
+    [2015, 3, 26, "Prince Jonah Kuhio Kalanianaole Day"],
+    [2015, 3, 28, "Earth Hour"],
+    [2015, 3, 29, "Palm Sunday"],
+    [2015, 3, 30, "Seward's Day"],
+    [2015, 3, 31, "César Chávez Day"],
+    [2015, 4, 1, "April Fool's Day"],
+    [2015, 4, 2, "Maundy Thursday"],
+    [2015, 4, 2, "World Autism Awareness Day"],
+    [2015, 4, 2, "Pascua Florida Day"],
+    [2015, 4, 3, "Good Friday"],
+    [2015, 4, 4, "Holy Saturday"],
+    [2015, 4, 4, "Passover"],
+    [2015, 4, 4, "United Nations' Mine Awareness Day"],
+    [2015, 4, 5, "Easter Sunday"],
+    [2015, 4, 6, "International Day of Sport for the Development of Peace"],
+    [2015, 4, 6, "Easter Monday"],
+    [2015, 4, 6, "National Tartan Day"],
+    [2015, 4, 7, "United Nations' World Health Day"],
+    [2015, 4, 7, "Day of Remembrance of the Victims of the Rwanda Genocide"],
+    [2015, 4, 10, "Orthodox Good Friday"],
+    [2015, 4, 11, "Last Day of Passover"],
+    [2015, 4, 11, "Orthodox Holy Saturday"],
+    [2015, 4, 12, "Orthodox Easter"],
+    [2015, 4, 12, "International Day of Human Space Flight"],
+    [2015, 4, 13, "Orthodox Easter Monday"],
+    [2015, 4, 13, "Thomas Jefferson's Birthday"],
+    [2015, 4, 15, "Yom HaShoah"],
+    [2015, 4, 15, "Tax Day"],
+    [2015, 4, 15, "Father Damien Day"],
+    [2015, 4, 16, "Emancipation Day"],
+    [2015, 4, 17, "Global Youth Service Day"],
+    [2015, 4, 18, "International Day for Monuments and Sites"],
+    [2015, 4, 20, "Chinese Language Day"],
+    [2015, 4, 20, "Patriot's Day"],
+    [2015, 4, 21, "San Jacinto Day"],
+    [2015, 4, 21, "National Library Workers' Day"],
+    [2015, 4, 22, "Earth Day"],
+    [2015, 4, 22, "Oklahoma Day"],
+    [2015, 4, 22, "Administrative Professionals Day"],
+    [2015, 4, 23, "Yom Ha'atzmaut"],
+    [2015, 4, 23, "World Book and Copyright Day"],
+    [2015, 4, 23, "English Language Day"],
+    [2015, 4, 24, "Arbor Day"],
+    [2015, 4, 25, "World Malaria Day"],
+    [2015, 4, 26, "World Intellectual Property Day"],
+    [2015, 4, 26, "Confederate Memorial Day"],
+    [2015, 4, 27, "Confederate Memorial Day"],
+    [2015, 4, 28, "World Day for Safety and Health at Work"],
+    [2015, 4, 29, "Day of Remembrance for all Victims of Chemical Warfare"],
+    [2015, 4, 30, "International Jazz Day"],
+    [2015, 5, 1, "Law Day"],
+    [2015, 5, 1, "Loyalty Day"],
+    [2015, 5, 2, "National Explosive Ordnance Disposal Day"],
+    [2015, 5, 3, "World Press Freedom Day"],
+    [2015, 5, 4, "Rhode Island Independence Day"],
+    [2015, 5, 5, "Cinco de Mayo"],
+    [2015, 5, 5, "Primary Election Day Indiana"],
+    [2015, 5, 6, "National Nurses Day"],
+    [2015, 5, 7, "Lag BaOmer"],
+    [2015, 5, 7, "National Day of Prayer"],
+    [2015, 5, 8, "Time of Remembrance and Reconciliation for Those Who Lost Their Lives during the Second World War"],
+    [2015, 5, 8, "World Ovarian Cancer Day"],
+    [2015, 5, 8, "Truman Day"],
+    [2015, 5, 9, "World Migratory Bird Day"],
+    [2015, 5, 10, "Mothers' Day"],
+    [2015, 5, 10, "Confederate Memorial Day"],
+    [2015, 5, 11, "Confederate Memorial Day observed"],
+    [2015, 5, 14, "Ascension Day"],
+    [2015, 5, 15, "International Day of Families"],
+    [2015, 5, 15, "Peace Officers Memorial Day"],
+    [2015, 5, 15, "National Defense Transportation Day"],
+    [2015, 5, 16, "Isra and Mi'raj"],
+    [2015, 5, 16, "Armed Forces Day"],
+    [2015, 5, 17, "World Information Society Day"],
+    [2015, 5, 20, "World Autoimmune Arthritis Day"],
+    [2015, 5, 20, "Emergency Medical Services for Children Day"],
+    [2015, 5, 21, "World Day for Cultural Diversity for Dialogue and Development"],
+    [2015, 5, 22, "International Day for Biological Diversity"],
+    [2015, 5, 22, "National Maritime Day"],
+    [2015, 5, 22, "Harvey Milk Day"],
+    [2015, 5, 23, "International Day to End Obstetric Fistula"],
+    [2015, 5, 24, "Pentecost"],
+    [2015, 5, 24, "Shavuot"],
+    [2015, 5, 25, "Whit Monday"],
+    [2015, 5, 25, "African Liberation Day"],
+    [2015, 5, 25, "Towel Day"],
+    [2015, 5, 25, "Memorial Day"],
+    [2015, 5, 25, "Jefferson Davis Birthday"],
+    [2015, 5, 25, "National Missing Children's Day"],
+    [2015, 5, 29, "International Day of United Nations Peacekeepers"],
+    [2015, 5, 31, "Trinity Sunday"],
+    [2015, 5, 31, "World No Tobacco Day"],
+    [2015, 6, 1, "Global Day of Parents"],
+    [2015, 6, 1, "Day of Vesak"],
+    [2015, 6, 1, "Statehood Day"],
+    [2015, 6, 1, "Jefferson Davis Birthday"],
+    [2015, 6, 3, "Jefferson Davis Birthday"],
+    [2015, 6, 4, "Corpus Christi"],
+    [2015, 6, 4, "International Day of Innocent Children Victims of Aggression"],
+    [2015, 6, 5, "World Environment Day"],
+    [2015, 6, 6, "D-Day"],
+    [2015, 6, 8, "World Oceans Day"],
+    [2015, 6, 11, "Kamehameha Day"],
+    [2015, 6, 12, "World Day Against Child Labour"],
+    [2015, 6, 14, "World Blood Donor Day"],
+    [2015, 6, 14, "Flag Day"],
+    [2015, 6, 15, "World Elder Abuse Awareness Day"],
+    [2015, 6, 17, "World Day to Combat Desertification and Drought"],
+    [2015, 6, 17, "Bunker Hill Day"],
+    [2015, 6, 18, "Ramadan starts"],
+    [2015, 6, 19, "Juneteenth"],
+    [2015, 6, 19, "Emancipation Day"],
+    [2015, 6, 20, "World Refugee Day"],
+    [2015, 6, 20, "West Virginia Day"],
+    [2015, 6, 21, "June Solstice"],
+    [2015, 6, 21, "Fathers' Day"],
+    [2015, 6, 23, "Public Service Day"],
+    [2015, 6, 23, "International Widows' Day"],
+    [2015, 6, 25, "Day of the Seafarer"],
+    [2015, 6, 26, "International Day Against Drug Abuse and Illicit Trafficking"],
+    [2015, 6, 26, "International Day in Support of Victims of Torture"],
+    [2015, 7, 3, "Independence Day observed"],
+    [2015, 7, 4, "International Day of Cooperatives"],
+    [2015, 7, 4, "Independence Day"],
+    [2015, 7, 11, "World Population Day"],
+    [2015, 7, 13, "Lailat al-Qadr"],
+    [2015, 7, 18, "Eid al-Fitr"],
+    [2015, 7, 18, "Nelson Mandela Day"],
+    [2015, 7, 22, "Pi Approximation Day"],
+    [2015, 7, 24, "Pioneer Day"],
+    [2015, 7, 26, "Tisha B'Av"],
+    [2015, 7, 26, "Parents' Day"],
+    [2015, 7, 28, "World Hepatitis Day"],
+    [2015, 7, 30, "International Day of Friendship"],
+    [2015, 8, 1, "Colorado Day"],
+    [2015, 8, 9, "International Day of the World's Indigenous People"],
+    [2015, 8, 10, "Victory Day"],
+    [2015, 8, 12, "International Youth Day"],
+    [2015, 8, 15, "Assumption of Mary"],
+    [2015, 8, 16, "Bennington Battle Day"],
+    [2015, 8, 17, "Bennington Battle Day observed"],
+    [2015, 8, 19, "World Humanitarian Day"],
+    [2015, 8, 19, "National Aviation Day"],
+    [2015, 8, 21, "Statehood Day in Hawaii"],
+    [2015, 8, 21, "Senior Citizens Day"],
+    [2015, 8, 23, "International Day for the Remembrance of the Slave Trade and its Abolition"],
+    [2015, 8, 26, "Women's Equality Day"],
+    [2015, 8, 27, "Lyndon Baines Johnson Day"],
+    [2015, 8, 29, "International Day against Nuclear Tests"],
+    [2015, 8, 30, "International Day of the Victims of Enforced Disappearances"],
+    [2015, 8, 31, "International Overdose Awareness Day"],
+    [2015, 9, 5, "International Day of Charity"],
+    [2015, 9, 7, "Labor Day"],
+    [2015, 9, 8, "International Literacy Day"],
+    [2015, 9, 9, "California Admission Day"],
+    [2015, 9, 10, "World Suicide Prevention Day"],
+    [2015, 9, 11, "Patriot Day"],
+    [2015, 9, 12, "International Day for South-South Cooperation"],
+    [2015, 9, 12, "Carl Garner Federal Lands Cleanup Day"],
+    [2015, 9, 13, "International Programmers' Day"],
+    [2015, 9, 13, "National Grandparents Day"],
+    [2015, 9, 14, "Rosh Hashana"],
+    [2015, 9, 15, "International Day of Democracy"],
+    [2015, 9, 16, "International Day for the Preservation of the Ozone Layer"],
+    [2015, 9, 17, "Constitution Day and Citizenship Day"],
+    [2015, 9, 18, "National POW/MIA Recognition Day"],
+    [2015, 9, 19, "International Talk Like a Pirate Day"],
+    [2015, 9, 21, "International Day of Peace"],
+    [2015, 9, 22, "Emancipation Day"],
+    [2015, 9, 23, "Yom Kippur"],
+    [2015, 9, 23, "September equinox"],
+    [2015, 9, 23, "International Celebrate Bisexuality Day"],
+    [2015, 9, 24, "Eid al-Adha"],
+    [2015, 9, 24, "World Maritime Day"],
+    [2015, 9, 25, "Native Americans' Day"],
+    [2015, 9, 26, "World Day against Trafficking Persons"],
+    [2015, 9, 26, "International Day for the Total Elimination of Nuclear Weapons"],
+    [2015, 9, 27, "World Tourism Day"],
+    [2015, 9, 27, "Gold Star Mother's Day"],
+    [2015, 9, 28, "First Day of Sukkot"],
+    [2015, 9, 28, "World Rabies Day"],
+    [2015, 9, 29, "World Heart Day"],
+    [2015, 10, 1, "International Day of Older Persons"],
+    [2015, 10, 2, "International Day of Non-Violence"],
+    [2015, 10, 4, "Feast of St Francis of Assisi"],
+    [2015, 10, 4, "Last Day of Sukkot"],
+    [2015, 10, 5, "Shmini Atzeret"],
+    [2015, 10, 5, "World Teachers' Day"],
+    [2015, 10, 5, "World Habitat Day"],
+    [2015, 10, 5, "Child Health Day"],
+    [2015, 10, 6, "Simchat Torah"],
+    [2015, 10, 7, "World Cerebral Palsy Day"],
+    [2015, 10, 8, "World Sight Day"],
+    [2015, 10, 9, "World Post Day"],
+    [2015, 10, 9, "Leif Erikson Day"],
+    [2015, 10, 10, "World Mental Health Day"],
+    [2015, 10, 11, "International Day of the Girl Child"],
+    [2015, 10, 12, "Columbus Day"],
+    [2015, 10, 12, "Native Americans' Day"],
+    [2015, 10, 12, "Indigenous People's Day"],
+    [2015, 10, 14, "International Day for Natural Disaster Reduction"],
+    [2015, 10, 15, "Muharram"],
+    [2015, 10, 15, "International Day of Rural Women"],
+    [2015, 10, 15, "White Cane Safety Day"],
+    [2015, 10, 16, "World Food Day"],
+    [2015, 10, 16, "Boss's Day"],
+    [2015, 10, 17, "International Day for the Eradication of Poverty"],
+    [2015, 10, 18, "Alaska Day"],
+    [2015, 10, 19, "Alaska Day observed"],
+    [2015, 10, 24, "United Nations Day"],
+    [2015, 10, 24, "World Development Information Day"],
+    [2015, 10, 27, "World Day for Audiovisual Heritage"],
+    [2015, 10, 29, "World Stroke Day"],
+    [2015, 10, 30, "Nevada Day"],
+    [2015, 10, 31, "Halloween"],
+    [2015, 11, 1, "All Saints' Day"],
+    [2015, 11, 1, "Daylight Saving Time ends"],
+    [2015, 11, 2, "All Souls' Day"],
+    [2015, 11, 2, "International Day to End Impunity for Crimes against Journalists"],
+    [2015, 11, 3, "Election Day"],
+    [2015, 11, 6, "International Day for Preventing the Exploitation of the Environment in War and Armed Conflict"],
+    [2015, 11, 10, "World Science Day for Peace and Development"],
+    [2015, 11, 11, "Veterans Day"],
+    [2015, 11, 11, "Diwali/Deepavali"],
+    [2015, 11, 12, "World Pneumonia Day"],
+    [2015, 11, 13, "Friday the 13th"],
+    [2015, 11, 14, "World Diabetes Day"],
+    [2015, 11, 15, "World Day of Remembrance for Road Traffic Victims"],
+    [2015, 11, 16, "International Day for Tolerance"],
+    [2015, 11, 17, "World Prematurity Day"],
+    [2015, 11, 19, "World Philosophy Day"],
+    [2015, 11, 19, "World Toilet Day"],
+    [2015, 11, 19, "International Men's Day"],
+    [2015, 11, 20, "Universal Children's Day"],
+    [2015, 11, 20, "Africa Industrialization Day"],
+    [2015, 11, 21, "World Television Day"],
+    [2015, 11, 25, "International Day for the Elimination of Violence against Women"],
+    [2015, 11, 26, "Thanksgiving Day"],
+    [2015, 11, 27, "Robert E Lee's Birthday"],
+    [2015, 11, 27, "Presidents' Day"],
+    [2015, 11, 27, "Lincoln's Birthday/Lincoln's Day"],
+    [2015, 11, 27, "Black Friday"],
+    [2015, 11, 27, "American Indian Heritage Day"],
+    [2015, 11, 29, "First Sunday of Advent"],
+    [2015, 11, 29, "International Day of Solidarity with the Palestinian People"],
+    [2015, 11, 30, "Cyber Monday"],
+    [2015, 12, 1, "World AIDS Day"],
+    [2015, 12, 2, "International Day for the Abolition of Slavery"],
+    [2015, 12, 3, "International Day of Persons with Disabilities"],
+    [2015, 12, 5, "International Volunteer Day for Economic and Social Development"],
+    [2015, 12, 5, "World Soil Day"],
+    [2015, 12, 6, "St Nicholas' Day"],
+    [2015, 12, 7, "Chanukah/Hanukkah"],
+    [2015, 12, 7, "International Civil Aviation Day"],
+    [2015, 12, 7, "Pearl Harbor Remembrance Day"],
+    [2015, 12, 8, "Feast of the Immaculate Conception"],
+    [2015, 12, 9, "International Anti-Corruption Day"],
+    [2015, 12, 10, "Human Rights Day"],
+    [2015, 12, 11, "International Mountain Day"],
+    [2015, 12, 12, "Feast of Our Lady of Guadalupe"],
+    [2015, 12, 14, "Last Day of Chanukah"],
+    [2015, 12, 17, "Pan American Aviation Day"],
+    [2015, 12, 17, "Wright Brothers Day"],
+    [2015, 12, 18, "International Migrants Day"],
+    [2015, 12, 18, "Arabic Language Day"],
+    [2015, 12, 20, "International Human Solidarity Day"],
+    [2015, 12, 22, "December Solstice"],
+    [2015, 12, 24, "The Prophet's Birthday"],
+    [2015, 12, 24, "Christmas Eve"],
+    [2015, 12, 24, "Washington's Birthday"],
+    [2015, 12, 25, "Christmas Day"],
+    [2015, 12, 26, "Kwanzaa"],
+    [2015, 12, 26, "Day After Christmas Day"],
+    [2015, 12, 31, "New Year's Eve"]
+  ]
+end
diff --git a/www/calendar-demo/monkey_patches.rb b/www/calendar-demo/monkey_patches.rb
new file mode 100644
index 0000000..a2ce39d
--- /dev/null
+++ b/www/calendar-demo/monkey_patches.rb
@@ -0,0 +1,82 @@
+# Monkeypatch to address https://github.com/sstephenson/execjs/pull/180
+require 'execjs'
+class ExecJS::ExternalRuntime::Context
+  alias_method :w_write_to_tempfile, :write_to_tempfile
+  def write_to_tempfile(*args)
+    tmpfile = w_write_to_tempfile(*args).path.untaint
+    tmpfile = Struct.new(:path, :to_str).new(tmpfile, tmpfile)
+    def tmpfile.unlink
+      File.unlink path
+    end
+    tmpfile
+  end
+end
+
+# Proof of concept implementation of React.render method; needs to be
+# cleaned up, generalized, and have tests written for it before it can
+# be added to Wunderbar proper.
+Wunderbar::CALLERS_TO_IGNORE.clear
+require 'nokogumbo'
+class Wunderbar::XmlMarkup
+  def render container, &block
+    csspath = Wunderbar::Node.parse_css_selector(container)
+    root = @node.root
+
+    # find the scripts and target on the page
+    scripts = root.search('script')
+    target = root.at(container)
+
+    # compute client side container
+    element = "document.querySelector(#{container.inspect})"
+    if csspath.length == 1 and csspath[0].length == 1
+      value = csspath[0].values.first
+      case csspath[0].keys.first
+      when :id
+        element = "document.getElementById(#{value.inspect})"
+      when :class
+        value = value.join(' ')
+        element = "document.getElementsByClassName(#{value.inspect})[0]"
+      when :name
+        element = "document.getElementsByName(#{value.inspect})[0]"
+      end
+    end
+
+    # build client and server scripts
+    common = Ruby2JS.convert(block, scope: @_scope)
+    server = "React.renderToString(#{common})"
+    client = "React.render(#{common}, #{element})"
+
+    # extract content of scripts
+    scripts.map! do |script|
+      result = nil
+      if script.attrs[:src]
+        src = script.attrs[:src]
+        name = File.join(@_scope.settings.public_folder, src)
+        if File.exist? name
+          result = File.read(name)
+        else
+          name = File.join(@_scope.settings.views, src+'.rb')
+          result = Ruby2JS.convert(File.read(name)) if File.exist? name
+        end
+      end
+
+      result
+    end
+
+    # concatenate and execute scripts on server
+    scripts.compact!
+    scripts.unshift 'global=this'
+    context = ExecJS.compile(scripts.join(";\n"))
+
+    # insert results into target
+    builder = Wunderbar::HtmlMarkup.new({})
+    target.children += builder._ { context.eval(server) }
+
+    # add client side script
+    tag! 'script', Wunderbar::ScriptNode, client
+  end
+end
+
+get %r{^/([-\w]+)\.js$} do |script|
+  _js :"#{script}"
+end
diff --git a/www/calendar-demo/public/css/calendar.css b/www/calendar-demo/public/css/calendar.css
new file mode 100644
index 0000000..84e3a37
--- /dev/null
+++ b/www/calendar-demo/public/css/calendar.css
@@ -0,0 +1,75 @@
+body, html {
+  margin: 0;
+  padding: 0;
+  position: absolute;
+  top: 0;
+  bottom: 0;
+  width: 100%;
+  font-family: Helvetica Neue, sans-serif;
+  font-weight: 300;
+  font-size: 28px;
+}
+
+div#page, section {
+  height: 100%;
+}
+
+header {
+  display: flex;
+  min-height: 10%;
+  align-items: center;
+  justify-content: center;
+}
+
+#calendar {
+  display: flex;
+  flex-direction: column;
+  list-style: none;
+  margin: 0;
+  padding: 0;
+}
+
+#calendar > li {
+  display: block;
+  align-items: center;
+  justify-content: flex-start;
+  box-sizing: border-box;
+  margin: 0;
+  padding: 0 0 0 20px;
+  min-width: 100%;
+  min-height: 69px;
+  border: 1px solid #c2c2c2;
+}
+
+#calendar > li.spacer {
+  display: none
+}
+
+ul {
+  margin: 6px 0;
+  font-size: medium;
+  padding-left: 0;
+}
+
+@media only screen and (min-width: 640px) {
+  #calendar {
+    min-height: 90%;
+    flex-direction: row;
+    flex-wrap: wrap;
+  }
+
+  #calendar > li {
+    flex-basis: calc(100% / 7);
+    align-items: flex-start;
+    min-width: 0;
+  }
+
+  div.day {
+    float: right;
+    padding: 8px 8px 0 0;
+  }
+
+  #calendar > li.spacer {
+    display: flex
+  }
+}
diff --git a/www/calendar-demo/public/js/react-0.12.2.min.js b/www/calendar-demo/public/js/react-0.12.2.min.js
new file mode 100644
index 0000000..c6559bd
--- /dev/null
+++ b/www/calendar-demo/public/js/react-0.12.2.min.js
@@ -0,0 +1,16 @@
+/**
+ * React v0.12.2
+ *
+ * Copyright 2013-2014, Facebook, Inc.
+ * All rights reserved.
+ *
+ * This source code is licensed under the BSD-style license found in the
+ * LICENSE file in the root directory of this source tree. An additional grant
+ * of patent rights can be found in the PATENTS file in the same directory.
+ *
+ */
+!function(e){if("object"==typeof exports&&"undefined"!=typeof module)module.exports=e();else if("function"==typeof define&&define.amd)define([],e);else{var t;"undefined"!=typeof window?t=window:"undefined"!=typeof global?t=global:"undefined"!=typeof self&&(t=self),t.React=e()}}(function(){return function e(t,n,r){function o(i,s){if(!n[i]){if(!t[i]){var u="function"==typeof require&&require;if(!s&&u)return u(i,!0);if(a)return a(i,!0);var c=new Error("Cannot find module '"+i+"'");throw c.code="MODULE_NOT_FOUND",c}var l=n[i]={exports:{}};t[i][0].call(l.exports,function(e){var n=t[i][1][e];return o(n?n:e)},l,l.exports,e,t,n,r)}return n[i].exports}for(var a="function"==typeof require&&require,i=0;i<r.length;i++)o(r[i]);return o}({1:[function(e,t){"use strict";var n=e("./DOMPropertyOperations"),r=e("./EventPluginUtils"),o=e("./ReactChildren"),a=e("./ReactComponent"),i=e("./ReactCompositeComponent"),s=e("./ReactContext"),u=e("./ReactCurrentOwner"),c=e("./ReactElement"),l=(e("./ReactElement
 Validator"),e("./ReactDOM")),p=e("./ReactDOMComponent"),d=e("./ReactDefaultInjection"),f=e("./ReactInstanceHandles"),h=e("./ReactLegacyElement"),m=e("./ReactMount"),v=e("./ReactMultiChild"),g=e("./ReactPerf"),y=e("./ReactPropTypes"),E=e("./ReactServerRendering"),C=e("./ReactTextComponent"),R=e("./Object.assign"),M=e("./deprecated"),b=e("./onlyChild");d.inject();var O=c.createElement,D=c.createFactory;O=h.wrapCreateElement(O),D=h.wrapCreateFactory(D);var x=g.measure("React","render",m.render),P={Children:{map:o.map,forEach:o.forEach,count:o.count,only:b},DOM:l,PropTypes:y,initializeTouchEvents:function(e){r.useTouchEvents=e},createClass:i.createClass,createElement:O,createFactory:D,constructAndRenderComponent:m.constructAndRenderComponent,constructAndRenderComponentByID:m.constructAndRenderComponentByID,render:x,renderToString:E.renderToString,renderToStaticMarkup:E.renderToStaticMarkup,unmountComponentAtNode:m.unmountComponentAtNode,isValidClass:h.isValidClass,isValidElement:c.isVal
 idElement,withContext:s.withContext,__spread:R,renderComponent:M("React","renderComponent","render",this,x),renderComponentToString:M("React","renderComponentToString","renderToString",this,E.renderToString),renderComponentToStaticMarkup:M("React","renderComponentToStaticMarkup","renderToStaticMarkup",this,E.renderToStaticMarkup),isValidComponent:M("React","isValidComponent","isValidElement",this,c.isValidElement)};"undefined"!=typeof __REACT_DEVTOOLS_GLOBAL_HOOK__&&"function"==typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.inject&&__REACT_DEVTOOLS_GLOBAL_HOOK__.inject({Component:a,CurrentOwner:u,DOMComponent:p,DOMPropertyOperations:n,InstanceHandles:f,Mount:m,MultiChild:v,TextComponent:C});P.version="0.12.2",t.exports=P},{"./DOMPropertyOperations":12,"./EventPluginUtils":20,"./Object.assign":27,"./ReactChildren":31,"./ReactComponent":32,"./ReactCompositeComponent":34,"./ReactContext":35,"./ReactCurrentOwner":36,"./ReactDOM":37,"./ReactDOMComponent":39,"./ReactDefaultInjection":49,"./ReactEl
 ement":50,"./ReactElementValidator":51,"./ReactInstanceHandles":58,"./ReactLegacyElement":59,"./ReactMount":61,"./ReactMultiChild":62,"./ReactPerf":66,"./ReactPropTypes":70,"./ReactServerRendering":74,"./ReactTextComponent":76,"./deprecated":104,"./onlyChild":135}],2:[function(e,t){"use strict";var n=e("./focusNode"),r={componentDidMount:function(){this.props.autoFocus&&n(this.getDOMNode())}};t.exports=r},{"./focusNode":109}],3:[function(e,t){"use strict";function n(){var e=window.opera;return"object"==typeof e&&"function"==typeof e.version&&parseInt(e.version(),10)<=12}function r(e){return(e.ctrlKey||e.altKey||e.metaKey)&&!(e.ctrlKey&&e.altKey)}var o=e("./EventConstants"),a=e("./EventPropagators"),i=e("./ExecutionEnvironment"),s=e("./SyntheticInputEvent"),u=e("./keyOf"),c=i.canUseDOM&&"TextEvent"in window&&!("documentMode"in document||n()),l=32,p=String.fromCharCode(l),d=o.topLevelTypes,f={beforeInput:{phasedRegistrationNames:{bubbled:u({onBeforeInput:null}),captured:u({onBeforeInp
 utCapture:null})},dependencies:[d.topCompositionEnd,d.topKeyPress,d.topTextInput,d.topPaste]}},h=null,m=!1,v={eventTypes:f,extractEvents:function(e,t,n,o){var i;if(c)switch(e){case d.topKeyPress:var u=o.which;if(u!==l)return;m=!0,i=p;break;case d.topTextInput:if(i=o.data,i===p&&m)return;break;default:return}else{switch(e){case d.topPaste:h=null;break;case d.topKeyPress:o.which&&!r(o)&&(h=String.fromCharCode(o.which));break;case d.topCompositionEnd:h=o.data}if(null===h)return;i=h}if(i){var v=s.getPooled(f.beforeInput,n,o);return v.data=i,h=null,a.accumulateTwoPhaseDispatches(v),v}}};t.exports=v},{"./EventConstants":16,"./EventPropagators":21,"./ExecutionEnvironment":22,"./SyntheticInputEvent":87,"./keyOf":131}],4:[function(e,t){"use strict";function n(e,t){return e+t.charAt(0).toUpperCase()+t.substring(1)}var r={columnCount:!0,flex:!0,flexGrow:!0,flexShrink:!0,fontWeight:!0,lineClamp:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0,fillOpacity:!0,strokeOpac
 ity:!0},o=["Webkit","ms","Moz","O"];Object.keys(r).forEach(function(e){o.forEach(function(t){r[n(t,e)]=r[e]})});var a={background:{backgroundImage:!0,backgroundPosition:!0,backgroundRepeat:!0,backgroundColor:!0},border:{borderWidth:!0,borderStyle:!0,borderColor:!0},borderBottom:{borderBottomWidth:!0,borderBottomStyle:!0,borderBottomColor:!0},borderLeft:{borderLeftWidth:!0,borderLeftStyle:!0,borderLeftColor:!0},borderRight:{borderRightWidth:!0,borderRightStyle:!0,borderRightColor:!0},borderTop:{borderTopWidth:!0,borderTopStyle:!0,borderTopColor:!0},font:{fontStyle:!0,fontVariant:!0,fontWeight:!0,fontSize:!0,lineHeight:!0,fontFamily:!0}},i={isUnitlessNumber:r,shorthandPropertyExpansions:a};t.exports=i},{}],5:[function(e,t){"use strict";var n=e("./CSSProperty"),r=e("./ExecutionEnvironment"),o=(e("./camelizeStyleName"),e("./dangerousStyleValue")),a=e("./hyphenateStyleName"),i=e("./memoizeStringOnly"),s=(e("./warning"),i(function(e){return a(e)})),u="cssFloat";r.canUseDOM&&void 0===docum
 ent.documentElement.style.cssFloat&&(u="styleFloat");var c={createMarkupForStyles:function(e){var t="";for(var n in e)if(e.hasOwnProperty(n)){var r=e[n];null!=r&&(t+=s(n)+":",t+=o(n,r)+";")}return t||null},setValueForStyles:function(e,t){var r=e.style;for(var a in t)if(t.hasOwnProperty(a)){var i=o(a,t[a]);if("float"===a&&(a=u),i)r[a]=i;else{var s=n.shorthandPropertyExpansions[a];if(s)for(var c in s)r[c]="";else r[a]=""}}}};t.exports=c},{"./CSSProperty":4,"./ExecutionEnvironment":22,"./camelizeStyleName":98,"./dangerousStyleValue":103,"./hyphenateStyleName":122,"./memoizeStringOnly":133,"./warning":141}],6:[function(e,t){"use strict";function n(){this._callbacks=null,this._contexts=null}var r=e("./PooledClass"),o=e("./Object.assign"),a=e("./invariant");o(n.prototype,{enqueue:function(e,t){this._callbacks=this._callbacks||[],this._contexts=this._contexts||[],this._callbacks.push(e),this._contexts.push(t)},notifyAll:function(){var e=this._callbacks,t=this._contexts;if(e){a(e.length===t
 .length),this._callbacks=null,this._contexts=null;for(var n=0,r=e.length;r>n;n++)e[n].call(t[n]);e.length=0,t.length=0}},reset:function(){this._callbacks=null,this._contexts=null},destructor:function(){this.reset()}}),r.addPoolingTo(n),t.exports=n},{"./Object.assign":27,"./PooledClass":28,"./invariant":124}],7:[function(e,t){"use strict";function n(e){return"SELECT"===e.nodeName||"INPUT"===e.nodeName&&"file"===e.type}function r(e){var t=M.getPooled(P.change,w,e);E.accumulateTwoPhaseDispatches(t),R.batchedUpdates(o,t)}function o(e){y.enqueueEvents(e),y.processEventQueue()}function a(e,t){_=e,w=t,_.attachEvent("onchange",r)}function i(){_&&(_.detachEvent("onchange",r),_=null,w=null)}function s(e,t,n){return e===x.topChange?n:void 0}function u(e,t,n){e===x.topFocus?(i(),a(t,n)):e===x.topBlur&&i()}function c(e,t){_=e,w=t,T=e.value,N=Object.getOwnPropertyDescriptor(e.constructor.prototype,"value"),Object.defineProperty(_,"value",k),_.attachEvent("onpropertychange",p)}function l(){_&&(del
 ete _.value,_.detachEvent("onpropertychange",p),_=null,w=null,T=null,N=null)}function p(e){if("value"===e.propertyName){var t=e.srcElement.value;t!==T&&(T=t,r(e))}}function d(e,t,n){return e===x.topInput?n:void 0}function f(e,t,n){e===x.topFocus?(l(),c(t,n)):e===x.topBlur&&l()}function h(e){return e!==x.topSelectionChange&&e!==x.topKeyUp&&e!==x.topKeyDown||!_||_.value===T?void 0:(T=_.value,w)}function m(e){return"INPUT"===e.nodeName&&("checkbox"===e.type||"radio"===e.type)}function v(e,t,n){return e===x.topClick?n:void 0}var g=e("./EventConstants"),y=e("./EventPluginHub"),E=e("./EventPropagators"),C=e("./ExecutionEnvironment"),R=e("./ReactUpdates"),M=e("./SyntheticEvent"),b=e("./isEventSupported"),O=e("./isTextInputElement"),D=e("./keyOf"),x=g.topLevelTypes,P={change:{phasedRegistrationNames:{bubbled:D({onChange:null}),captured:D({onChangeCapture:null})},dependencies:[x.topBlur,x.topChange,x.topClick,x.topFocus,x.topInput,x.topKeyDown,x.topKeyUp,x.topSelectionChange]}},_=null,w=null
 ,T=null,N=null,I=!1;C.canUseDOM&&(I=b("change")&&(!("documentMode"in document)||document.documentMode>8));var S=!1;C.canUseDOM&&(S=b("input")&&(!("documentMode"in document)||document.documentMode>9));var k={get:function(){return N.get.call(this)},set:function(e){T=""+e,N.set.call(this,e)}},A={eventTypes:P,extractEvents:function(e,t,r,o){var a,i;if(n(t)?I?a=s:i=u:O(t)?S?a=d:(a=h,i=f):m(t)&&(a=v),a){var c=a(e,t,r);if(c){var l=M.getPooled(P.change,c,o);return E.accumulateTwoPhaseDispatches(l),l}}i&&i(e,t,r)}};t.exports=A},{"./EventConstants":16,"./EventPluginHub":18,"./EventPropagators":21,"./ExecutionEnvironment":22,"./ReactUpdates":77,"./SyntheticEvent":85,"./isEventSupported":125,"./isTextInputElement":127,"./keyOf":131}],8:[function(e,t){"use strict";var n=0,r={createReactRootIndex:function(){return n++}};t.exports=r},{}],9:[function(e,t){"use strict";function n(e){switch(e){case g.topCompositionStart:return E.compositionStart;case g.topCompositionEnd:return E.compositionEnd;case g
 .topCompositionUpdate:return E.compositionUpdate}}function r(e,t){return e===g.topKeyDown&&t.keyCode===h}function o(e,t){switch(e){case g.topKeyUp:return-1!==f.indexOf(t.keyCode);case g.topKeyDown:return t.keyCode!==h;case g.topKeyPress:case g.topMouseDown:case g.topBlur:return!0;default:return!1}}function a(e){this.root=e,this.startSelection=c.getSelection(e),this.startValue=this.getText()}var i=e("./EventConstants"),s=e("./EventPropagators"),u=e("./ExecutionEnvironment"),c=e("./ReactInputSelection"),l=e("./SyntheticCompositionEvent"),p=e("./getTextContentAccessor"),d=e("./keyOf"),f=[9,13,27,32],h=229,m=u.canUseDOM&&"CompositionEvent"in window,v=!m||"documentMode"in document&&document.documentMode>8&&document.documentMode<=11,g=i.topLevelTypes,y=null,E={compositionEnd:{phasedRegistrationNames:{bubbled:d({onCompositionEnd:null}),captured:d({onCompositionEndCapture:null})},dependencies:[g.topBlur,g.topCompositionEnd,g.topKeyDown,g.topKeyPress,g.topKeyUp,g.topMouseDown]},compositionSt
 art:{phasedRegistrationNames:{bubbled:d({onCompositionStart:null}),captured:d({onCompositionStartCapture:null})},dependencies:[g.topBlur,g.topCompositionStart,g.topKeyDown,g.topKeyPress,g.topKeyUp,g.topMouseDown]},compositionUpdate:{phasedRegistrationNames:{bubbled:d({onCompositionUpdate:null}),captured:d({onCompositionUpdateCapture:null})},dependencies:[g.topBlur,g.topCompositionUpdate,g.topKeyDown,g.topKeyPress,g.topKeyUp,g.topMouseDown]}};a.prototype.getText=function(){return this.root.value||this.root[p()]},a.prototype.getData=function(){var e=this.getText(),t=this.startSelection.start,n=this.startValue.length-this.startSelection.end;return e.substr(t,e.length-n-t)};var C={eventTypes:E,extractEvents:function(e,t,i,u){var c,p;if(m?c=n(e):y?o(e,u)&&(c=E.compositionEnd):r(e,u)&&(c=E.compositionStart),v&&(y||c!==E.compositionStart?c===E.compositionEnd&&y&&(p=y.getData(),y=null):y=new a(t)),c){var d=l.getPooled(c,i,u);return p&&(d.data=p),s.accumulateTwoPhaseDispatches(d),d}}};t.expo
 rts=C},{"./EventConstants":16,"./EventPropagators":21,"./ExecutionEnvironment":22,"./ReactInputSelection":57,"./SyntheticCompositionEvent":83,"./getTextContentAccessor":119,"./keyOf":131}],10:[function(e,t){"use strict";function n(e,t,n){e.insertBefore(t,e.childNodes[n]||null)}var r,o=e("./Danger"),a=e("./ReactMultiChildUpdateTypes"),i=e("./getTextContentAccessor"),s=e("./invariant"),u=i();r="textContent"===u?function(e,t){e.textContent=t}:function(e,t){for(;e.firstChild;)e.removeChild(e.firstChild);if(t){var n=e.ownerDocument||document;e.appendChild(n.createTextNode(t))}};var c={dangerouslyReplaceNodeWithMarkup:o.dangerouslyReplaceNodeWithMarkup,updateTextContent:r,processUpdates:function(e,t){for(var i,u=null,c=null,l=0;i=e[l];l++)if(i.type===a.MOVE_EXISTING||i.type===a.REMOVE_NODE){var p=i.fromIndex,d=i.parentNode.childNodes[p],f=i.parentID;s(d),u=u||{},u[f]=u[f]||[],u[f][p]=d,c=c||[],c.push(d)}var h=o.dangerouslyRenderMarkup(t);if(c)for(var m=0;m<c.length;m++)c[m].parentNode.rem
 oveChild(c[m]);for(var v=0;i=e[v];v++)switch(i.type){case a.INSERT_MARKUP:n(i.parentNode,h[i.markupIndex],i.toIndex);break;case a.MOVE_EXISTING:n(i.parentNode,u[i.parentID][i.fromIndex],i.toIndex);break;case a.TEXT_CONTENT:r(i.parentNode,i.textContent);break;case a.REMOVE_NODE:}}};t.exports=c},{"./Danger":13,"./ReactMultiChildUpdateTypes":63,"./getTextContentAccessor":119,"./invariant":124}],11:[function(e,t){"use strict";function n(e,t){return(e&t)===t}var r=e("./invariant"),o={MUST_USE_ATTRIBUTE:1,MUST_USE_PROPERTY:2,HAS_SIDE_EFFECTS:4,HAS_BOOLEAN_VALUE:8,HAS_NUMERIC_VALUE:16,HAS_POSITIVE_NUMERIC_VALUE:48,HAS_OVERLOADED_BOOLEAN_VALUE:64,injectDOMPropertyConfig:function(e){var t=e.Properties||{},a=e.DOMAttributeNames||{},s=e.DOMPropertyNames||{},u=e.DOMMutationMethods||{};e.isCustomAttribute&&i._isCustomAttributeFunctions.push(e.isCustomAttribute);for(var c in t){r(!i.isStandardName.hasOwnProperty(c)),i.isStandardName[c]=!0;var l=c.toLowerCase();if(i.getPossibleStandardName[l]=c,a.
 hasOwnProperty(c)){var p=a[c];i.getPossibleStandardName[p]=c,i.getAttributeName[c]=p}else i.getAttributeName[c]=l;i.getPropertyName[c]=s.hasOwnProperty(c)?s[c]:c,i.getMutationMethod[c]=u.hasOwnProperty(c)?u[c]:null;var d=t[c];i.mustUseAttribute[c]=n(d,o.MUST_USE_ATTRIBUTE),i.mustUseProperty[c]=n(d,o.MUST_USE_PROPERTY),i.hasSideEffects[c]=n(d,o.HAS_SIDE_EFFECTS),i.hasBooleanValue[c]=n(d,o.HAS_BOOLEAN_VALUE),i.hasNumericValue[c]=n(d,o.HAS_NUMERIC_VALUE),i.hasPositiveNumericValue[c]=n(d,o.HAS_POSITIVE_NUMERIC_VALUE),i.hasOverloadedBooleanValue[c]=n(d,o.HAS_OVERLOADED_BOOLEAN_VALUE),r(!i.mustUseAttribute[c]||!i.mustUseProperty[c]),r(i.mustUseProperty[c]||!i.hasSideEffects[c]),r(!!i.hasBooleanValue[c]+!!i.hasNumericValue[c]+!!i.hasOverloadedBooleanValue[c]<=1)}}},a={},i={ID_ATTRIBUTE_NAME:"data-reactid",isStandardName:{},getPossibleStandardName:{},getAttributeName:{},getPropertyName:{},getMutationMethod:{},mustUseAttribute:{},mustUseProperty:{},hasSideEffects:{},hasBooleanValue:{},hasNum
 ericValue:{},hasPositiveNumericValue:{},hasOverloadedBooleanValue:{},_isCustomAttributeFunctions:[],isCustomAttribute:function(e){for(var t=0;t<i._isCustomAttributeFunctions.length;t++){var n=i._isCustomAttributeFunctions[t];if(n(e))return!0}return!1},getDefaultValueForProperty:function(e,t){var n,r=a[e];return r||(a[e]=r={}),t in r||(n=document.createElement(e),r[t]=n[t]),r[t]},injection:o};t.exports=i},{"./invariant":124}],12:[function(e,t){"use strict";function n(e,t){return null==t||r.hasBooleanValue[e]&&!t||r.hasNumericValue[e]&&isNaN(t)||r.hasPositiveNumericValue[e]&&1>t||r.hasOverloadedBooleanValue[e]&&t===!1}var r=e("./DOMProperty"),o=e("./escapeTextForBrowser"),a=e("./memoizeStringOnly"),i=(e("./warning"),a(function(e){return o(e)+'="'})),s={createMarkupForID:function(e){return i(r.ID_ATTRIBUTE_NAME)+o(e)+'"'},createMarkupForProperty:function(e,t){if(r.isStandardName.hasOwnProperty(e)&&r.isStandardName[e]){if(n(e,t))return"";var a=r.getAttributeName[e];return r.hasBooleanVa
 lue[e]||r.hasOverloadedBooleanValue[e]&&t===!0?o(a):i(a)+o(t)+'"'}return r.isCustomAttribute(e)?null==t?"":i(e)+o(t)+'"':null},setValueForProperty:function(e,t,o){if(r.isStandardName.hasOwnProperty(t)&&r.isStandardName[t]){var a=r.getMutationMethod[t];if(a)a(e,o);else if(n(t,o))this.deleteValueForProperty(e,t);else if(r.mustUseAttribute[t])e.setAttribute(r.getAttributeName[t],""+o);else{var i=r.getPropertyName[t];r.hasSideEffects[t]&&""+e[i]==""+o||(e[i]=o)}}else r.isCustomAttribute(t)&&(null==o?e.removeAttribute(t):e.setAttribute(t,""+o))},deleteValueForProperty:function(e,t){if(r.isStandardName.hasOwnProperty(t)&&r.isStandardName[t]){var n=r.getMutationMethod[t];if(n)n(e,void 0);else if(r.mustUseAttribute[t])e.removeAttribute(r.getAttributeName[t]);else{var o=r.getPropertyName[t],a=r.getDefaultValueForProperty(e.nodeName,o);r.hasSideEffects[t]&&""+e[o]===a||(e[o]=a)}}else r.isCustomAttribute(t)&&e.removeAttribute(t)}};t.exports=s},{"./DOMProperty":11,"./escapeTextForBrowser":107,"
 ./memoizeStringOnly":133,"./warning":141}],13:[function(e,t){"use strict";function n(e){return e.substring(1,e.indexOf(" "))}var r=e("./ExecutionEnvironment"),o=e("./createNodesFromMarkup"),a=e("./emptyFunction"),i=e("./getMarkupWrap"),s=e("./invariant"),u=/^(<[^ \/>]+)/,c="data-danger-index",l={dangerouslyRenderMarkup:function(e){s(r.canUseDOM);for(var t,l={},p=0;p<e.length;p++)s(e[p]),t=n(e[p]),t=i(t)?t:"*",l[t]=l[t]||[],l[t][p]=e[p];var d=[],f=0;for(t in l)if(l.hasOwnProperty(t)){var h=l[t];for(var m in h)if(h.hasOwnProperty(m)){var v=h[m];h[m]=v.replace(u,"$1 "+c+'="'+m+'" ')}var g=o(h.join(""),a);for(p=0;p<g.length;++p){var y=g[p];y.hasAttribute&&y.hasAttribute(c)&&(m=+y.getAttribute(c),y.removeAttribute(c),s(!d.hasOwnProperty(m)),d[m]=y,f+=1)}}return s(f===d.length),s(d.length===e.length),d},dangerouslyReplaceNodeWithMarkup:function(e,t){s(r.canUseDOM),s(t),s("html"!==e.tagName.toLowerCase());var n=o(t,a)[0];e.parentNode.replaceChild(n,e)}};t.exports=l},{"./ExecutionEnvironmen
 t":22,"./createNodesFromMarkup":102,"./emptyFunction":105,"./getMarkupWrap":116,"./invariant":124}],14:[function(e,t){"use strict";var n=e("./keyOf"),r=[n({ResponderEventPlugin:null}),n({SimpleEventPlugin:null}),n({TapEventPlugin:null}),n({EnterLeaveEventPlugin:null}),n({ChangeEventPlugin:null}),n({SelectEventPlugin:null}),n({CompositionEventPlugin:null}),n({BeforeInputEventPlugin:null}),n({AnalyticsEventPlugin:null}),n({MobileSafariClickEventPlugin:null})];t.exports=r},{"./keyOf":131}],15:[function(e,t){"use strict";var n=e("./EventConstants"),r=e("./EventPropagators"),o=e("./SyntheticMouseEvent"),a=e("./ReactMount"),i=e("./keyOf"),s=n.topLevelTypes,u=a.getFirstReactDOM,c={mouseEnter:{registrationName:i({onMouseEnter:null}),dependencies:[s.topMouseOut,s.topMouseOver]},mouseLeave:{registrationName:i({onMouseLeave:null}),dependencies:[s.topMouseOut,s.topMouseOver]}},l=[null,null],p={eventTypes:c,extractEvents:function(e,t,n,i){if(e===s.topMouseOver&&(i.relatedTarget||i.fromElement))r
 eturn null;if(e!==s.topMouseOut&&e!==s.topMouseOver)return null;var p;if(t.window===t)p=t;else{var d=t.ownerDocument;p=d?d.defaultView||d.parentWindow:window}var f,h;if(e===s.topMouseOut?(f=t,h=u(i.relatedTarget||i.toElement)||p):(f=p,h=t),f===h)return null;var m=f?a.getID(f):"",v=h?a.getID(h):"",g=o.getPooled(c.mouseLeave,m,i);g.type="mouseleave",g.target=f,g.relatedTarget=h;var y=o.getPooled(c.mouseEnter,v,i);return y.type="mouseenter",y.target=h,y.relatedTarget=f,r.accumulateEnterLeaveDispatches(g,y,m,v),l[0]=g,l[1]=y,l}};t.exports=p},{"./EventConstants":16,"./EventPropagators":21,"./ReactMount":61,"./SyntheticMouseEvent":89,"./keyOf":131}],16:[function(e,t){"use strict";var n=e("./keyMirror"),r=n({bubbled:null,captured:null}),o=n({topBlur:null,topChange:null,topClick:null,topCompositionEnd:null,topCompositionStart:null,topCompositionUpdate:null,topContextMenu:null,topCopy:null,topCut:null,topDoubleClick:null,topDrag:null,topDragEnd:null,topDragEnter:null,topDragExit:null,topDrag
 Leave:null,topDragOver:null,topDragStart:null,topDrop:null,topError:null,topFocus:null,topInput:null,topKeyDown:null,topKeyPress:null,topKeyUp:null,topLoad:null,topMouseDown:null,topMouseMove:null,topMouseOut:null,topMouseOver:null,topMouseUp:null,topPaste:null,topReset:null,topScroll:null,topSelectionChange:null,topSubmit:null,topTextInput:null,topTouchCancel:null,topTouchEnd:null,topTouchMove:null,topTouchStart:null,topWheel:null}),a={topLevelTypes:o,PropagationPhases:r};t.exports=a},{"./keyMirror":130}],17:[function(e,t){var n=e("./emptyFunction"),r={listen:function(e,t,n){return e.addEventListener?(e.addEventListener(t,n,!1),{remove:function(){e.removeEventListener(t,n,!1)}}):e.attachEvent?(e.attachEvent("on"+t,n),{remove:function(){e.detachEvent("on"+t,n)}}):void 0},capture:function(e,t,r){return e.addEventListener?(e.addEventListener(t,r,!0),{remove:function(){e.removeEventListener(t,r,!0)}}):{remove:n}},registerDefault:function(){}};t.exports=r},{"./emptyFunction":105}],18:[f
 unction(e,t){"use strict";var n=e("./EventPluginRegistry"),r=e("./EventPluginUtils"),o=e("./accumulateInto"),a=e("./forEachAccumulated"),i=e("./invariant"),s={},u=null,c=function(e){if(e){var t=r.executeDispatch,o=n.getPluginModuleForEvent(e);o&&o.executeDispatch&&(t=o.executeDispatch),r.executeDispatchesInOrder(e,t),e.isPersistent()||e.constructor.release(e)}},l=null,p={injection:{injectMount:r.injection.injectMount,injectInstanceHandle:function(e){l=e},getInstanceHandle:function(){return l},injectEventPluginOrder:n.injectEventPluginOrder,injectEventPluginsByName:n.injectEventPluginsByName},eventNameDispatchConfigs:n.eventNameDispatchConfigs,registrationNameModules:n.registrationNameModules,putListener:function(e,t,n){i(!n||"function"==typeof n);var r=s[t]||(s[t]={});r[e]=n},getListener:function(e,t){var n=s[t];return n&&n[e]},deleteListener:function(e,t){var n=s[t];n&&delete n[e]},deleteAllListeners:function(e){for(var t in s)delete s[t][e]},extractEvents:function(e,t,r,a){for(var
  i,s=n.plugins,u=0,c=s.length;c>u;u++){var l=s[u];if(l){var p=l.extractEvents(e,t,r,a);p&&(i=o(i,p))}}return i},enqueueEvents:function(e){e&&(u=o(u,e))},processEventQueue:function(){var e=u;u=null,a(e,c),i(!u)},__purge:function(){s={}},__getListenerBank:function(){return s}};t.exports=p},{"./EventPluginRegistry":19,"./EventPluginUtils":20,"./accumulateInto":95,"./forEachAccumulated":110,"./invariant":124}],19:[function(e,t){"use strict";function n(){if(i)for(var e in s){var t=s[e],n=i.indexOf(e);if(a(n>-1),!u.plugins[n]){a(t.extractEvents),u.plugins[n]=t;var o=t.eventTypes;for(var c in o)a(r(o[c],t,c))}}}function r(e,t,n){a(!u.eventNameDispatchConfigs.hasOwnProperty(n)),u.eventNameDispatchConfigs[n]=e;var r=e.phasedRegistrationNames;if(r){for(var i in r)if(r.hasOwnProperty(i)){var s=r[i];o(s,t,n)}return!0}return e.registrationName?(o(e.registrationName,t,n),!0):!1}function o(e,t,n){a(!u.registrationNameModules[e]),u.registrationNameModules[e]=t,u.registrationNameDependencies[e]=t.ev
 entTypes[n].dependencies}var a=e("./invariant"),i=null,s={},u={plugins:[],eventNameDispatchConfigs:{},registrationNameModules:{},registrationNameDependencies:{},injectEventPluginOrder:function(e){a(!i),i=Array.prototype.slice.call(e),n()},injectEventPluginsByName:function(e){var t=!1;for(var r in e)if(e.hasOwnProperty(r)){var o=e[r];s.hasOwnProperty(r)&&s[r]===o||(a(!s[r]),s[r]=o,t=!0)}t&&n()},getPluginModuleForEvent:function(e){var t=e.dispatchConfig;if(t.registrationName)return u.registrationNameModules[t.registrationName]||null;for(var n in t.phasedRegistrationNames)if(t.phasedRegistrationNames.hasOwnProperty(n)){var r=u.registrationNameModules[t.phasedRegistrationNames[n]];if(r)return r}return null},_resetEventPlugins:function(){i=null;for(var e in s)s.hasOwnProperty(e)&&delete s[e];u.plugins.length=0;var t=u.eventNameDispatchConfigs;for(var n in t)t.hasOwnProperty(n)&&delete t[n];var r=u.registrationNameModules;for(var o in r)r.hasOwnProperty(o)&&delete r[o]}};t.exports=u},{"./
 invariant":124}],20:[function(e,t){"use strict";function n(e){return e===m.topMouseUp||e===m.topTouchEnd||e===m.topTouchCancel}function r(e){return e===m.topMouseMove||e===m.topTouchMove}function o(e){return e===m.topMouseDown||e===m.topTouchStart}function a(e,t){var n=e._dispatchListeners,r=e._dispatchIDs;if(Array.isArray(n))for(var o=0;o<n.length&&!e.isPropagationStopped();o++)t(e,n[o],r[o]);else n&&t(e,n,r)}function i(e,t,n){e.currentTarget=h.Mount.getNode(n);var r=t(e,n);return e.currentTarget=null,r}function s(e,t){a(e,t),e._dispatchListeners=null,e._dispatchIDs=null}function u(e){var t=e._dispatchListeners,n=e._dispatchIDs;if(Array.isArray(t)){for(var r=0;r<t.length&&!e.isPropagationStopped();r++)if(t[r](e,n[r]))return n[r]}else if(t&&t(e,n))return n;return null}function c(e){var t=u(e);return e._dispatchIDs=null,e._dispatchListeners=null,t}function l(e){var t=e._dispatchListeners,n=e._dispatchIDs;f(!Array.isArray(t));var r=t?t(e,n):null;return e._dispatchListeners=null,e._dis
 patchIDs=null,r}function p(e){return!!e._dispatchListeners}var d=e("./EventConstants"),f=e("./invariant"),h={Mount:null,injectMount:function(e){h.Mount=e}},m=d.topLevelTypes,v={isEndish:n,isMoveish:r,isStartish:o,executeDirectDispatch:l,executeDispatch:i,executeDispatchesInOrder:s,executeDispatchesInOrderStopAtTrue:c,hasDispatches:p,injection:h,useTouchEvents:!1};t.exports=v},{"./EventConstants":16,"./invariant":124}],21:[function(e,t){"use strict";function n(e,t,n){var r=t.dispatchConfig.phasedRegistrationNames[n];return m(e,r)}function r(e,t,r){var o=t?h.bubbled:h.captured,a=n(e,r,o);a&&(r._dispatchListeners=d(r._dispatchListeners,a),r._dispatchIDs=d(r._dispatchIDs,e))}function o(e){e&&e.dispatchConfig.phasedRegistrationNames&&p.injection.getInstanceHandle().traverseTwoPhase(e.dispatchMarker,r,e)}function a(e,t,n){if(n&&n.dispatchConfig.registrationName){var r=n.dispatchConfig.registrationName,o=m(e,r);o&&(n._dispatchListeners=d(n._dispatchListeners,o),n._dispatchIDs=d(n._dispatch
 IDs,e))}}function i(e){e&&e.dispatchConfig.registrationName&&a(e.dispatchMarker,null,e)}function s(e){f(e,o)}function u(e,t,n,r){p.injection.getInstanceHandle().traverseEnterLeave(n,r,a,e,t)}function c(e){f(e,i)}var l=e("./EventConstants"),p=e("./EventPluginHub"),d=e("./accumulateInto"),f=e("./forEachAccumulated"),h=l.PropagationPhases,m=p.getListener,v={accumulateTwoPhaseDispatches:s,accumulateDirectDispatches:c,accumulateEnterLeaveDispatches:u};t.exports=v},{"./EventConstants":16,"./EventPluginHub":18,"./accumulateInto":95,"./forEachAccumulated":110}],22:[function(e,t){"use strict";var n=!("undefined"==typeof window||!window.document||!window.document.createElement),r={canUseDOM:n,canUseWorkers:"undefined"!=typeof Worker,canUseEventListeners:n&&!(!window.addEventListener&&!window.attachEvent),canUseViewport:n&&!!window.screen,isInWorker:!n};t.exports=r},{}],23:[function(e,t){"use strict";var n,r=e("./DOMProperty"),o=e("./ExecutionEnvironment"),a=r.injection.MUST_USE_ATTRIBUTE,i=r.
 injection.MUST_USE_PROPERTY,s=r.injection.HAS_BOOLEAN_VALUE,u=r.injection.HAS_SIDE_EFFECTS,c=r.injection.HAS_NUMERIC_VALUE,l=r.injection.HAS_POSITIVE_NUMERIC_VALUE,p=r.injection.HAS_OVERLOADED_BOOLEAN_VALUE;if(o.canUseDOM){var d=document.implementation;n=d&&d.hasFeature&&d.hasFeature("http://www.w3.org/TR/SVG11/feature#BasicStructure","1.1")}var f={isCustomAttribute:RegExp.prototype.test.bind(/^(data|aria)-[a-z_][a-z\d_.\-]*$/),Properties:{accept:null,acceptCharset:null,accessKey:null,action:null,allowFullScreen:a|s,allowTransparency:a,alt:null,async:s,autoComplete:null,autoPlay:s,cellPadding:null,cellSpacing:null,charSet:a,checked:i|s,classID:a,className:n?a:i,cols:a|l,colSpan:null,content:null,contentEditable:null,contextMenu:a,controls:i|s,coords:null,crossOrigin:null,data:null,dateTime:a,defer:s,dir:null,disabled:a|s,download:p,draggable:null,encType:null,form:a,formAction:a,formEncType:a,formMethod:a,formNoValidate:s,formTarget:a,frameBorder:a,height:a,hidden:a|s,href:null,href
 Lang:null,htmlFor:null,httpEquiv:null,icon:null,id:i,label:null,lang:null,list:a,loop:i|s,manifest:a,marginHeight:null,marginWidth:null,max:null,maxLength:a,media:a,mediaGroup:null,method:null,min:null,multiple:i|s,muted:i|s,name:null,noValidate:s,open:null,pattern:null,placeholder:null,poster:null,preload:null,radioGroup:null,readOnly:i|s,rel:null,required:s,role:a,rows:a|l,rowSpan:null,sandbox:null,scope:null,scrolling:null,seamless:a|s,selected:i|s,shape:null,size:a|l,sizes:a,span:l,spellCheck:null,src:null,srcDoc:i,srcSet:a,start:c,step:null,style:null,tabIndex:null,target:null,title:null,type:null,useMap:null,value:i|u,width:a,wmode:a,autoCapitalize:null,autoCorrect:null,itemProp:a,itemScope:a|s,itemType:a,property:null},DOMAttributeNames:{acceptCharset:"accept-charset",className:"class",htmlFor:"for",httpEquiv:"http-equiv"},DOMPropertyNames:{autoCapitalize:"autocapitalize",autoComplete:"autocomplete",autoCorrect:"autocorrect",autoFocus:"autofocus",autoPlay:"autoplay",encType:"
 enctype",hrefLang:"hreflang",radioGroup:"radiogroup",spellCheck:"spellcheck",srcDoc:"srcdoc",srcSet:"srcset"}};t.exports=f},{"./DOMProperty":11,"./ExecutionEnvironment":22}],24:[function(e,t){"use strict";function n(e){u(null==e.props.checkedLink||null==e.props.valueLink)}function r(e){n(e),u(null==e.props.value&&null==e.props.onChange)}function o(e){n(e),u(null==e.props.checked&&null==e.props.onChange)}function a(e){this.props.valueLink.requestChange(e.target.value)}function i(e){this.props.checkedLink.requestChange(e.target.checked)}var s=e("./ReactPropTypes"),u=e("./invariant"),c={button:!0,checkbox:!0,image:!0,hidden:!0,radio:!0,reset:!0,submit:!0},l={Mixin:{propTypes:{value:function(e,t){return!e[t]||c[e.type]||e.onChange||e.readOnly||e.disabled?void 0:new Error("You provided a `value` prop to a form field without an `onChange` handler. This will render a read-only field. If the field should be mutable use `defaultValue`. Otherwise, set either `onChange` or `readOnly`.")},check
 ed:function(e,t){return!e[t]||e.onChange||e.readOnly||e.disabled?void 0:new Error("You provided a `checked` prop to a form field without an `onChange` handler. This will render a read-only field. If the field should be mutable use `defaultChecked`. Otherwise, set either `onChange` or `readOnly`.")},onChange:s.func}},getValue:function(e){return e.props.valueLink?(r(e),e.props.valueLink.value):e.props.value},getChecked:function(e){return e.props.checkedLink?(o(e),e.props.checkedLink.value):e.props.checked},getOnChange:function(e){return e.props.valueLink?(r(e),a):e.props.checkedLink?(o(e),i):e.props.onChange}};t.exports=l},{"./ReactPropTypes":70,"./invariant":124}],25:[function(e,t){"use strict";function n(e){e.remove()}var r=e("./ReactBrowserEventEmitter"),o=e("./accumulateInto"),a=e("./forEachAccumulated"),i=e("./invariant"),s={trapBubbledEvent:function(e,t){i(this.isMounted());var n=r.trapBubbledEvent(e,t,this.getDOMNode());this._localEventListeners=o(this._localEventListeners,n)},
 componentWillUnmount:function(){this._localEventListeners&&a(this._localEventListeners,n)}};t.exports=s},{"./ReactBrowserEventEmitter":30,"./accumulateInto":95,"./forEachAccumulated":110,"./invariant":124}],26:[function(e,t){"use strict";var n=e("./EventConstants"),r=e("./emptyFunction"),o=n.topLevelTypes,a={eventTypes:null,extractEvents:function(e,t,n,a){if(e===o.topTouchStart){var i=a.target;i&&!i.onclick&&(i.onclick=r)}}};t.exports=a},{"./EventConstants":16,"./emptyFunction":105}],27:[function(e,t){function n(e){if(null==e)throw new TypeError("Object.assign target cannot be null or undefined");for(var t=Object(e),n=Object.prototype.hasOwnProperty,r=1;r<arguments.length;r++){var o=arguments[r];if(null!=o){var a=Object(o);for(var i in a)n.call(a,i)&&(t[i]=a[i])}}return t}t.exports=n},{}],28:[function(e,t){"use strict";var n=e("./invariant"),r=function(e){var t=this;if(t.instancePool.length){var n=t.instancePool.pop();return t.call(n,e),n}return new t(e)},o=function(e,t){var n=this;
 if(n.instancePool.length){var r=n.instancePool.pop();return n.call(r,e,t),r}return new n(e,t)},a=function(e,t,n){var r=this;
+if(r.instancePool.length){var o=r.instancePool.pop();return r.call(o,e,t,n),o}return new r(e,t,n)},i=function(e,t,n,r,o){var a=this;if(a.instancePool.length){var i=a.instancePool.pop();return a.call(i,e,t,n,r,o),i}return new a(e,t,n,r,o)},s=function(e){var t=this;n(e instanceof t),e.destructor&&e.destructor(),t.instancePool.length<t.poolSize&&t.instancePool.push(e)},u=10,c=r,l=function(e,t){var n=e;return n.instancePool=[],n.getPooled=t||c,n.poolSize||(n.poolSize=u),n.release=s,n},p={addPoolingTo:l,oneArgumentPooler:r,twoArgumentPooler:o,threeArgumentPooler:a,fiveArgumentPooler:i};t.exports=p},{"./invariant":124}],29:[function(e,t){"use strict";var n=e("./ReactEmptyComponent"),r=e("./ReactMount"),o=e("./invariant"),a={getDOMNode:function(){return o(this.isMounted()),n.isNullComponentID(this._rootNodeID)?null:r.getNode(this._rootNodeID)}};t.exports=a},{"./ReactEmptyComponent":52,"./ReactMount":61,"./invariant":124}],30:[function(e,t){"use strict";function n(e){return Object.prototype
 .hasOwnProperty.call(e,h)||(e[h]=d++,l[e[h]]={}),l[e[h]]}var r=e("./EventConstants"),o=e("./EventPluginHub"),a=e("./EventPluginRegistry"),i=e("./ReactEventEmitterMixin"),s=e("./ViewportMetrics"),u=e("./Object.assign"),c=e("./isEventSupported"),l={},p=!1,d=0,f={topBlur:"blur",topChange:"change",topClick:"click",topCompositionEnd:"compositionend",topCompositionStart:"compositionstart",topCompositionUpdate:"compositionupdate",topContextMenu:"contextmenu",topCopy:"copy",topCut:"cut",topDoubleClick:"dblclick",topDrag:"drag",topDragEnd:"dragend",topDragEnter:"dragenter",topDragExit:"dragexit",topDragLeave:"dragleave",topDragOver:"dragover",topDragStart:"dragstart",topDrop:"drop",topFocus:"focus",topInput:"input",topKeyDown:"keydown",topKeyPress:"keypress",topKeyUp:"keyup",topMouseDown:"mousedown",topMouseMove:"mousemove",topMouseOut:"mouseout",topMouseOver:"mouseover",topMouseUp:"mouseup",topPaste:"paste",topScroll:"scroll",topSelectionChange:"selectionchange",topTextInput:"textInput",top
 TouchCancel:"touchcancel",topTouchEnd:"touchend",topTouchMove:"touchmove",topTouchStart:"touchstart",topWheel:"wheel"},h="_reactListenersID"+String(Math.random()).slice(2),m=u({},i,{ReactEventListener:null,injection:{injectReactEventListener:function(e){e.setHandleTopLevel(m.handleTopLevel),m.ReactEventListener=e}},setEnabled:function(e){m.ReactEventListener&&m.ReactEventListener.setEnabled(e)},isEnabled:function(){return!(!m.ReactEventListener||!m.ReactEventListener.isEnabled())},listenTo:function(e,t){for(var o=t,i=n(o),s=a.registrationNameDependencies[e],u=r.topLevelTypes,l=0,p=s.length;p>l;l++){var d=s[l];i.hasOwnProperty(d)&&i[d]||(d===u.topWheel?c("wheel")?m.ReactEventListener.trapBubbledEvent(u.topWheel,"wheel",o):c("mousewheel")?m.ReactEventListener.trapBubbledEvent(u.topWheel,"mousewheel",o):m.ReactEventListener.trapBubbledEvent(u.topWheel,"DOMMouseScroll",o):d===u.topScroll?c("scroll",!0)?m.ReactEventListener.trapCapturedEvent(u.topScroll,"scroll",o):m.ReactEventListener.t
 rapBubbledEvent(u.topScroll,"scroll",m.ReactEventListener.WINDOW_HANDLE):d===u.topFocus||d===u.topBlur?(c("focus",!0)?(m.ReactEventListener.trapCapturedEvent(u.topFocus,"focus",o),m.ReactEventListener.trapCapturedEvent(u.topBlur,"blur",o)):c("focusin")&&(m.ReactEventListener.trapBubbledEvent(u.topFocus,"focusin",o),m.ReactEventListener.trapBubbledEvent(u.topBlur,"focusout",o)),i[u.topBlur]=!0,i[u.topFocus]=!0):f.hasOwnProperty(d)&&m.ReactEventListener.trapBubbledEvent(d,f[d],o),i[d]=!0)}},trapBubbledEvent:function(e,t,n){return m.ReactEventListener.trapBubbledEvent(e,t,n)},trapCapturedEvent:function(e,t,n){return m.ReactEventListener.trapCapturedEvent(e,t,n)},ensureScrollValueMonitoring:function(){if(!p){var e=s.refreshScrollValues;m.ReactEventListener.monitorScrollValue(e),p=!0}},eventNameDispatchConfigs:o.eventNameDispatchConfigs,registrationNameModules:o.registrationNameModules,putListener:o.putListener,getListener:o.getListener,deleteListener:o.deleteListener,deleteAllListeners:
 o.deleteAllListeners});t.exports=m},{"./EventConstants":16,"./EventPluginHub":18,"./EventPluginRegistry":19,"./Object.assign":27,"./ReactEventEmitterMixin":54,"./ViewportMetrics":94,"./isEventSupported":125}],31:[function(e,t){"use strict";function n(e,t){this.forEachFunction=e,this.forEachContext=t}function r(e,t,n,r){var o=e;o.forEachFunction.call(o.forEachContext,t,r)}function o(e,t,o){if(null==e)return e;var a=n.getPooled(t,o);p(e,r,a),n.release(a)}function a(e,t,n){this.mapResult=e,this.mapFunction=t,this.mapContext=n}function i(e,t,n,r){var o=e,a=o.mapResult,i=!a.hasOwnProperty(n);if(i){var s=o.mapFunction.call(o.mapContext,t,r);a[n]=s}}function s(e,t,n){if(null==e)return e;var r={},o=a.getPooled(r,t,n);return p(e,i,o),a.release(o),r}function u(){return null}function c(e){return p(e,u,null)}var l=e("./PooledClass"),p=e("./traverseAllChildren"),d=(e("./warning"),l.twoArgumentPooler),f=l.threeArgumentPooler;l.addPoolingTo(n,d),l.addPoolingTo(a,f);var h={forEach:o,map:s,count:c};
 t.exports=h},{"./PooledClass":28,"./traverseAllChildren":140,"./warning":141}],32:[function(e,t){"use strict";var n=e("./ReactElement"),r=e("./ReactOwner"),o=e("./ReactUpdates"),a=e("./Object.assign"),i=e("./invariant"),s=e("./keyMirror"),u=s({MOUNTED:null,UNMOUNTED:null}),c=!1,l=null,p=null,d={injection:{injectEnvironment:function(e){i(!c),p=e.mountImageIntoNode,l=e.unmountIDFromEnvironment,d.BackendIDOperations=e.BackendIDOperations,c=!0}},LifeCycle:u,BackendIDOperations:null,Mixin:{isMounted:function(){return this._lifeCycleState===u.MOUNTED},setProps:function(e,t){var n=this._pendingElement||this._currentElement;this.replaceProps(a({},n.props,e),t)},replaceProps:function(e,t){i(this.isMounted()),i(0===this._mountDepth),this._pendingElement=n.cloneAndReplaceProps(this._pendingElement||this._currentElement,e),o.enqueueUpdate(this,t)},_setPropsInternal:function(e,t){var r=this._pendingElement||this._currentElement;this._pendingElement=n.cloneAndReplaceProps(r,a({},r.props,e)),o.enq
 ueueUpdate(this,t)},construct:function(e){this.props=e.props,this._owner=e._owner,this._lifeCycleState=u.UNMOUNTED,this._pendingCallbacks=null,this._currentElement=e,this._pendingElement=null},mountComponent:function(e,t,n){i(!this.isMounted());var o=this._currentElement.ref;if(null!=o){var a=this._currentElement._owner;r.addComponentAsRefTo(this,o,a)}this._rootNodeID=e,this._lifeCycleState=u.MOUNTED,this._mountDepth=n},unmountComponent:function(){i(this.isMounted());var e=this._currentElement.ref;null!=e&&r.removeComponentAsRefFrom(this,e,this._owner),l(this._rootNodeID),this._rootNodeID=null,this._lifeCycleState=u.UNMOUNTED},receiveComponent:function(e,t){i(this.isMounted()),this._pendingElement=e,this.performUpdateIfNecessary(t)},performUpdateIfNecessary:function(e){if(null!=this._pendingElement){var t=this._currentElement,n=this._pendingElement;this._currentElement=n,this.props=n.props,this._owner=n._owner,this._pendingElement=null,this.updateComponent(e,t)}},updateComponent:fun
 ction(e,t){var n=this._currentElement;(n._owner!==t._owner||n.ref!==t.ref)&&(null!=t.ref&&r.removeComponentAsRefFrom(this,t.ref,t._owner),null!=n.ref&&r.addComponentAsRefTo(this,n.ref,n._owner))},mountComponentIntoNode:function(e,t,n){var r=o.ReactReconcileTransaction.getPooled();r.perform(this._mountComponentIntoNode,this,e,t,r,n),o.ReactReconcileTransaction.release(r)},_mountComponentIntoNode:function(e,t,n,r){var o=this.mountComponent(e,n,0);p(o,t,r)},isOwnedBy:function(e){return this._owner===e},getSiblingByRef:function(e){var t=this._owner;return t&&t.refs?t.refs[e]:null}}};t.exports=d},{"./Object.assign":27,"./ReactElement":50,"./ReactOwner":65,"./ReactUpdates":77,"./invariant":124,"./keyMirror":130}],33:[function(e,t){"use strict";var n=e("./ReactDOMIDOperations"),r=e("./ReactMarkupChecksum"),o=e("./ReactMount"),a=e("./ReactPerf"),i=e("./ReactReconcileTransaction"),s=e("./getReactRootElementInContainer"),u=e("./invariant"),c=e("./setInnerHTML"),l=1,p=9,d={ReactReconcileTransa
 ction:i,BackendIDOperations:n,unmountIDFromEnvironment:function(e){o.purgeID(e)},mountImageIntoNode:a.measure("ReactComponentBrowserEnvironment","mountImageIntoNode",function(e,t,n){if(u(t&&(t.nodeType===l||t.nodeType===p)),n){if(r.canReuseMarkup(e,s(t)))return;u(t.nodeType!==p)}u(t.nodeType!==p),c(t,e)})};t.exports=d},{"./ReactDOMIDOperations":41,"./ReactMarkupChecksum":60,"./ReactMount":61,"./ReactPerf":66,"./ReactReconcileTransaction":72,"./getReactRootElementInContainer":118,"./invariant":124,"./setInnerHTML":136}],34:[function(e,t){"use strict";function n(e){var t=e._owner||null;return t&&t.constructor&&t.constructor.displayName?" Check the render method of `"+t.constructor.displayName+"`.":""}function r(e,t){for(var n in t)t.hasOwnProperty(n)&&D("function"==typeof t[n])}function o(e,t){var n=S.hasOwnProperty(t)?S[t]:null;L.hasOwnProperty(t)&&D(n===N.OVERRIDE_BASE),e.hasOwnProperty(t)&&D(n===N.DEFINE_MANY||n===N.DEFINE_MANY_MERGED)}function a(e){var t=e._compositeLifeCycleState
 ;D(e.isMounted()||t===A.MOUNTING),D(null==f.current),D(t!==A.UNMOUNTING)}function i(e,t){if(t){D(!g.isValidFactory(t)),D(!h.isValidElement(t));var n=e.prototype;t.hasOwnProperty(T)&&k.mixins(e,t.mixins);for(var r in t)if(t.hasOwnProperty(r)&&r!==T){var a=t[r];if(o(n,r),k.hasOwnProperty(r))k[r](e,a);else{var i=S.hasOwnProperty(r),s=n.hasOwnProperty(r),u=a&&a.__reactDontBind,p="function"==typeof a,d=p&&!i&&!s&&!u;if(d)n.__reactAutoBindMap||(n.__reactAutoBindMap={}),n.__reactAutoBindMap[r]=a,n[r]=a;else if(s){var f=S[r];D(i&&(f===N.DEFINE_MANY_MERGED||f===N.DEFINE_MANY)),f===N.DEFINE_MANY_MERGED?n[r]=c(n[r],a):f===N.DEFINE_MANY&&(n[r]=l(n[r],a))}else n[r]=a}}}}function s(e,t){if(t)for(var n in t){var r=t[n];if(t.hasOwnProperty(n)){var o=n in k;D(!o);var a=n in e;D(!a),e[n]=r}}}function u(e,t){return D(e&&t&&"object"==typeof e&&"object"==typeof t),_(t,function(t,n){D(void 0===e[n]),e[n]=t}),e}function c(e,t){return function(){var n=e.apply(this,arguments),r=t.apply(this,arguments);retur
 n null==n?r:null==r?n:u(n,r)}}function l(e,t){return function(){e.apply(this,arguments),t.apply(this,arguments)}}var p=e("./ReactComponent"),d=e("./ReactContext"),f=e("./ReactCurrentOwner"),h=e("./ReactElement"),m=(e("./ReactElementValidator"),e("./ReactEmptyComponent")),v=e("./ReactErrorUtils"),g=e("./ReactLegacyElement"),y=e("./ReactOwner"),E=e("./ReactPerf"),C=e("./ReactPropTransferer"),R=e("./ReactPropTypeLocations"),M=(e("./ReactPropTypeLocationNames"),e("./ReactUpdates")),b=e("./Object.assign"),O=e("./instantiateReactComponent"),D=e("./invariant"),x=e("./keyMirror"),P=e("./keyOf"),_=(e("./monitorCodeUse"),e("./mapObject")),w=e("./shouldUpdateReactComponent"),T=(e("./warning"),P({mixins:null})),N=x({DEFINE_ONCE:null,DEFINE_MANY:null,OVERRIDE_BASE:null,DEFINE_MANY_MERGED:null}),I=[],S={mixins:N.DEFINE_MANY,statics:N.DEFINE_MANY,propTypes:N.DEFINE_MANY,contextTypes:N.DEFINE_MANY,childContextTypes:N.DEFINE_MANY,getDefaultProps:N.DEFINE_MANY_MERGED,getInitialState:N.DEFINE_MANY_MER
 GED,getChildContext:N.DEFINE_MANY_MERGED,render:N.DEFINE_ONCE,componentWillMount:N.DEFINE_MANY,componentDidMount:N.DEFINE_MANY,componentWillReceiveProps:N.DEFINE_MANY,shouldComponentUpdate:N.DEFINE_ONCE,componentWillUpdate:N.DEFINE_MANY,componentDidUpdate:N.DEFINE_MANY,componentWillUnmount:N.DEFINE_MANY,updateComponent:N.OVERRIDE_BASE},k={displayName:function(e,t){e.displayName=t},mixins:function(e,t){if(t)for(var n=0;n<t.length;n++)i(e,t[n])},childContextTypes:function(e,t){r(e,t,R.childContext),e.childContextTypes=b({},e.childContextTypes,t)},contextTypes:function(e,t){r(e,t,R.context),e.contextTypes=b({},e.contextTypes,t)},getDefaultProps:function(e,t){e.getDefaultProps=e.getDefaultProps?c(e.getDefaultProps,t):t},propTypes:function(e,t){r(e,t,R.prop),e.propTypes=b({},e.propTypes,t)},statics:function(e,t){s(e,t)}},A=x({MOUNTING:null,UNMOUNTING:null,RECEIVING_PROPS:null}),L={construct:function(){p.Mixin.construct.apply(this,arguments),y.Mixin.construct.apply(this,arguments),this.st
 ate=null,this._pendingState=null,this.context=null,this._compositeLifeCycleState=null},isMounted:function(){return p.Mixin.isMounted.call(this)&&this._compositeLifeCycleState!==A.MOUNTING},mountComponent:E.measure("ReactCompositeComponent","mountComponent",function(e,t,n){p.Mixin.mountComponent.call(this,e,t,n),this._compositeLifeCycleState=A.MOUNTING,this.__reactAutoBindMap&&this._bindAutoBindMethods(),this.context=this._processContext(this._currentElement._context),this.props=this._processProps(this.props),this.state=this.getInitialState?this.getInitialState():null,D("object"==typeof this.state&&!Array.isArray(this.state)),this._pendingState=null,this._pendingForceUpdate=!1,this.componentWillMount&&(this.componentWillMount(),this._pendingState&&(this.state=this._pendingState,this._pendingState=null)),this._renderedComponent=O(this._renderValidatedComponent(),this._currentElement.type),this._compositeLifeCycleState=null;var r=this._renderedComponent.mountComponent(e,t,n+1);return t
 his.componentDidMount&&t.getReactMountReady().enqueue(this.componentDidMount,this),r}),unmountComponent:function(){this._compositeLifeCycleState=A.UNMOUNTING,this.componentWillUnmount&&this.componentWillUnmount(),this._compositeLifeCycleState=null,this._renderedComponent.unmountComponent(),this._renderedComponent=null,p.Mixin.unmountComponent.call(this)},setState:function(e,t){D("object"==typeof e||null==e),this.replaceState(b({},this._pendingState||this.state,e),t)},replaceState:function(e,t){a(this),this._pendingState=e,this._compositeLifeCycleState!==A.MOUNTING&&M.enqueueUpdate(this,t)},_processContext:function(e){var t=null,n=this.constructor.contextTypes;if(n){t={};for(var r in n)t[r]=e[r]}return t},_processChildContext:function(e){var t=this.getChildContext&&this.getChildContext();if(this.constructor.displayName||"ReactCompositeComponent",t){D("object"==typeof this.constructor.childContextTypes);for(var n in t)D(n in this.constructor.childContextTypes);return b({},e,t)}return 
 e},_processProps:function(e){return e},_checkPropTypes:function(e,t,r){var o=this.constructor.displayName;for(var a in e)if(e.hasOwnProperty(a)){var i=e[a](t,a,o,r);i instanceof Error&&n(this)}},performUpdateIfNecessary:function(e){var t=this._compositeLifeCycleState;if(t!==A.MOUNTING&&t!==A.RECEIVING_PROPS&&(null!=this._pendingElement||null!=this._pendingState||this._pendingForceUpdate)){var n=this.context,r=this.props,o=this._currentElement;null!=this._pendingElement&&(o=this._pendingElement,n=this._processContext(o._context),r=this._processProps(o.props),this._pendingElement=null,this._compositeLifeCycleState=A.RECEIVING_PROPS,this.componentWillReceiveProps&&this.componentWillReceiveProps(r,n)),this._compositeLifeCycleState=null;var a=this._pendingState||this.state;this._pendingState=null;var i=this._pendingForceUpdate||!this.shouldComponentUpdate||this.shouldComponentUpdate(r,a,n);i?(this._pendingForceUpdate=!1,this._performComponentUpdate(o,r,a,n,e)):(this._currentElement=o,thi
 s.props=r,this.state=a,this.context=n,this._owner=o._owner)}},_performComponentUpdate:function(e,t,n,r,o){var a=this._currentElement,i=this.props,s=this.state,u=this.context;this.componentWillUpdate&&this.componentWillUpdate(t,n,r),this._currentElement=e,this.props=t,this.state=n,this.context=r,this._owner=e._owner,this.updateComponent(o,a),this.componentDidUpdate&&o.getReactMountReady().enqueue(this.componentDidUpdate.bind(this,i,s,u),this)},receiveComponent:function(e,t){(e!==this._currentElement||null==e._owner)&&p.Mixin.receiveComponent.call(this,e,t)},updateComponent:E.measure("ReactCompositeComponent","updateComponent",function(e,t){p.Mixin.updateComponent.call(this,e,t);var n=this._renderedComponent,r=n._currentElement,o=this._renderValidatedComponent();if(w(r,o))n.receiveComponent(o,e);else{var a=this._rootNodeID,i=n._rootNodeID;n.unmountComponent(),this._renderedComponent=O(o,this._currentElement.type);var s=this._renderedComponent.mountComponent(a,e,this._mountDepth+1);p.B
 ackendIDOperations.dangerouslyReplaceNodeWithMarkupByID(i,s)}}),forceUpdate:function(e){var t=this._compositeLifeCycleState;D(this.isMounted()||t===A.MOUNTING),D(t!==A.UNMOUNTING&&null==f.current),this._pendingForceUpdate=!0,M.enqueueUpdate(this,e)},_renderValidatedComponent:E.measure("ReactCompositeComponent","_renderValidatedComponent",function(){var e,t=d.current;d.current=this._processChildContext(this._currentElement._context),f.current=this;try{e=this.render(),null===e||e===!1?(e=m.getEmptyComponent(),m.registerNullComponentID(this._rootNodeID)):m.deregisterNullComponentID(this._rootNodeID)}finally{d.current=t,f.current=null}return D(h.isValidElement(e)),e}),_bindAutoBindMethods:function(){for(var e in this.__reactAutoBindMap)if(this.__reactAutoBindMap.hasOwnProperty(e)){var t=this.__reactAutoBindMap[e];this[e]=this._bindAutoBindMethod(v.guard(t,this.constructor.displayName+"."+e))}},_bindAutoBindMethod:function(e){var t=this,n=e.bind(t);return n}},U=function(){};b(U.prototype
 ,p.Mixin,y.Mixin,C.Mixin,L);var F={LifeCycle:A,Base:U,createClass:function(e){var t=function(){};t.prototype=new U,t.prototype.constructor=t,I.forEach(i.bind(null,t)),i(t,e),t.getDefaultProps&&(t.defaultProps=t.getDefaultProps()),D(t.prototype.render);for(var n in S)t.prototype[n]||(t.prototype[n]=null);return g.wrapFactory(h.createFactory(t))},injection:{injectMixin:function(e){I.push(e)}}};t.exports=F},{"./Object.assign":27,"./ReactComponent":32,"./ReactContext":35,"./ReactCurrentOwner":36,"./ReactElement":50,"./ReactElementValidator":51,"./ReactEmptyComponent":52,"./ReactErrorUtils":53,"./ReactLegacyElement":59,"./ReactOwner":65,"./ReactPerf":66,"./ReactPropTransferer":67,"./ReactPropTypeLocationNames":68,"./ReactPropTypeLocations":69,"./ReactUpdates":77,"./instantiateReactComponent":123,"./invariant":124,"./keyMirror":130,"./keyOf":131,"./mapObject":132,"./monitorCodeUse":134,"./shouldUpdateReactComponent":138,"./warning":141}],35:[function(e,t){"use strict";var n=e("./Object.as
 sign"),r={current:{},withContext:function(e,t){var o,a=r.current;r.current=n({},a,e);try{o=t()}finally{r.current=a}return o}};t.exports=r},{"./Object.assign":27}],36:[function(e,t){"use strict";var n={current:null};t.exports=n},{}],37:[function(e,t){"use strict";function n(e){return o.markNonLegacyFactory(r.createFactory(e))}var r=e("./ReactElement"),o=(e("./ReactElementValidator"),e("./ReactLegacyElement")),a=e("./mapObject"),i=a({a:"a",abbr:"abbr",address:"address",area:"area",article:"article",aside:"aside",audio:"audio",b:"b",base:"base",bdi:"bdi",bdo:"bdo",big:"big",blockquote:"blockquote",body:"body",br:"br",button:"button",canvas:"canvas",caption:"caption",cite:"cite",code:"code",col:"col",colgroup:"colgroup",data:"data",datalist:"datalist",dd:"dd",del:"del",details:"details",dfn:"dfn",dialog:"dialog",div:"div",dl:"dl",dt:"dt",em:"em",embed:"embed",fieldset:"fieldset",figcaption:"figcaption",figure:"figure",footer:"footer",form:"form",h1:"h1",h2:"h2",h3:"h3",h4:"h4",h5:"h5",h
 6:"h6",head:"head",header:"header",hr:"hr",html:"html",i:"i",iframe:"iframe",img:"img",input:"input",ins:"ins",kbd:"kbd",keygen:"keygen",label:"label",legend:"legend",li:"li",link:"link",main:"main",map:"map",mark:"mark",menu:"menu",menuitem:"menuitem",meta:"meta",meter:"meter",nav:"nav",noscript:"noscript",object:"object",ol:"ol",optgroup:"optgroup",option:"option",output:"output",p:"p",param:"param",picture:"picture",pre:"pre",progress:"progress",q:"q",rp:"rp",rt:"rt",ruby:"ruby",s:"s",samp:"samp",script:"script",section:"section",select:"select",small:"small",source:"source",span:"span",strong:"strong",style:"style",sub:"sub",summary:"summary",sup:"sup",table:"table",tbody:"tbody",td:"td",textarea:"textarea",tfoot:"tfoot",th:"th",thead:"thead",time:"time",title:"title",tr:"tr",track:"track",u:"u",ul:"ul","var":"var",video:"video",wbr:"wbr",circle:"circle",defs:"defs",ellipse:"ellipse",g:"g",line:"line",linearGradient:"linearGradient",mask:"mask",path:"path",pattern:"pattern",poly
 gon:"polygon",polyline:"polyline",radialGradient:"radialGradient",rect:"rect",stop:"stop",svg:"svg",text:"text",tspan:"tspan"},n);t.exports=i},{"./ReactElement":50,"./ReactElementValidator":51,"./ReactLegacyElement":59,"./mapObject":132}],38:[function(e,t){"use strict";var n=e("./AutoFocusMixin"),r=e("./ReactBrowserComponentMixin"),o=e("./ReactCompositeComponent"),a=e("./ReactElement"),i=e("./ReactDOM"),s=e("./keyMirror"),u=a.createFactory(i.button.type),c=s({onClick:!0,onDoubleClick:!0,onMouseDown:!0,onMouseMove:!0,onMouseUp:!0,onClickCapture:!0,onDoubleClickCapture:!0,onMouseDownCapture:!0,onMouseMoveCapture:!0,onMouseUpCapture:!0}),l=o.createClass({displayName:"ReactDOMButton",mixins:[n,r],render:function(){var e={};for(var t in this.props)!this.props.hasOwnProperty(t)||this.props.disabled&&c[t]||(e[t]=this.props[t]);return u(e,this.props.children)}});t.exports=l},{"./AutoFocusMixin":2,"./ReactBrowserComponentMixin":29,"./ReactCompositeComponent":34,"./ReactDOM":37,"./ReactElemen
 t":50,"./keyMirror":130}],39:[function(e,t){"use strict";function n(e){e&&(g(null==e.children||null==e.dangerouslySetInnerHTML),g(null==e.style||"object"==typeof e.style))}function r(e,t,n,r){var o=d.findReactContainerForID(e);if(o){var a=o.nodeType===O?o.ownerDocument:o;C(t,a)}r.getPutListenerQueue().enqueuePutListener(e,t,n)}function o(e){_.call(P,e)||(g(x.test(e)),P[e]=!0)}function a(e){o(e),this._tag=e,this.tagName=e.toUpperCase()}var i=e("./CSSPropertyOperations"),s=e("./DOMProperty"),u=e("./DOMPropertyOperations"),c=e("./ReactBrowserComponentMixin"),l=e("./ReactComponent"),p=e("./ReactBrowserEventEmitter"),d=e("./ReactMount"),f=e("./ReactMultiChild"),h=e("./ReactPerf"),m=e("./Object.assign"),v=e("./escapeTextForBrowser"),g=e("./invariant"),y=(e("./isEventSupported"),e("./keyOf")),E=(e("./monitorCodeUse"),p.deleteListener),C=p.listenTo,R=p.registrationNameModules,M={string:!0,number:!0},b=y({style:null}),O=1,D={area:!0,base:!0,br:!0,col:!0,embed:!0,hr:!0,img:!0,input:!0,keygen:
 !0,link:!0,meta:!0,param:!0,source:!0,track:!0,wbr:!0},x=/^[a-zA-Z][a-zA-Z:_\.\-\d]*$/,P={},_={}.hasOwnProperty;a.displayName="ReactDOMComponent",a.Mixin={mountComponent:h.measure("ReactDOMComponent","mountComponent",function(e,t,r){l.Mixin.mountComponent.call(this,e,t,r),n(this.props);var o=D[this._tag]?"":"</"+this._tag+">";return this._createOpenTagMarkupAndPutListeners(t)+this._createContentMarkup(t)+o}),_createOpenTagMarkupAndPutListeners:function(e){var t=this.props,n="<"+this._tag;for(var o in t)if(t.hasOwnProperty(o)){var a=t[o];if(null!=a)if(R.hasOwnProperty(o))r(this._rootNodeID,o,a,e);else{o===b&&(a&&(a=t.style=m({},t.style)),a=i.createMarkupForStyles(a));var s=u.createMarkupForProperty(o,a);s&&(n+=" "+s)}}if(e.renderToStaticMarkup)return n+">";var c=u.createMarkupForID(this._rootNodeID);return n+" "+c+">"},_createContentMarkup:function(e){var t=this.props.dangerouslySetInnerHTML;if(null!=t){if(null!=t.__html)return t.__html}else{var n=M[typeof this.props.children]?this.p
 rops.children:null,r=null!=n?null:this.props.children;if(null!=n)return v(n);if(null!=r){var o=this.mountChildren(r,e);return o.join("")}}return""},receiveComponent:function(e,t){(e!==this._currentElement||null==e._owner)&&l.Mixin.receiveComponent.call(this,e,t)},updateComponent:h.measure("ReactDOMComponent","updateComponent",function(e,t){n(this._currentElement.props),l.Mixin.updateComponent.call(this,e,t),this._updateDOMProperties(t.props,e),this._updateDOMChildren(t.props,e)}),_updateDOMProperties:function(e,t){var n,o,a,i=this.props;for(n in e)if(!i.hasOwnProperty(n)&&e.hasOwnProperty(n))if(n===b){var u=e[n];for(o in u)u.hasOwnProperty(o)&&(a=a||{},a[o]="")}else R.hasOwnProperty(n)?E(this._rootNodeID,n):(s.isStandardName[n]||s.isCustomAttribute(n))&&l.BackendIDOperations.deletePropertyByID(this._rootNodeID,n);for(n in i){var c=i[n],p=e[n];if(i.hasOwnProperty(n)&&c!==p)if(n===b)if(c&&(c=i.style=m({},c)),p){for(o in p)!p.hasOwnProperty(o)||c&&c.hasOwnProperty(o)||(a=a||{},a[o]="")
 ;for(o in c)c.hasOwnProperty(o)&&p[o]!==c[o]&&(a=a||{},a[o]=c[o])}else a=c;else R.hasOwnProperty(n)?r(this._rootNodeID,n,c,t):(s.isStandardName[n]||s.isCustomAttribute(n))&&l.BackendIDOperations.updatePropertyByID(this._rootNodeID,n,c)}a&&l.BackendIDOperations.updateStylesByID(this._rootNodeID,a)},_updateDOMChildren:function(e,t){var n=this.props,r=M[typeof e.children]?e.children:null,o=M[typeof n.children]?n.children:null,a=e.dangerouslySetInnerHTML&&e.dangerouslySetInnerHTML.__html,i=n.dangerouslySetInnerHTML&&n.dangerouslySetInnerHTML.__html,s=null!=r?null:e.children,u=null!=o?null:n.children,c=null!=r||null!=a,p=null!=o||null!=i;null!=s&&null==u?this.updateChildren(null,t):c&&!p&&this.updateTextContent(""),null!=o?r!==o&&this.updateTextContent(""+o):null!=i?a!==i&&l.BackendIDOperations.updateInnerHTMLByID(this._rootNodeID,i):null!=u&&this.updateChildren(u,t)},unmountComponent:function(){this.unmountChildren(),p.deleteAllListeners(this._rootNodeID),l.Mixin.unmountComponent.call(t
 his)}},m(a.prototype,l.Mixin,a.Mixin,f.Mixin,c),t.exports=a},{"./CSSPropertyOperations":5,"./DOMProperty":11,"./DOMPropertyOperations":12,"./Object.assign":27,"./ReactBrowserComponentMixin":29,"./ReactBrowserEventEmitter":30,"./ReactComponent":32,"./ReactMount":61,"./ReactMultiChild":62,"./ReactPerf":66,"./escapeTextForBrowser":107,"./invariant":124,"./isEventSupported":125,"./keyOf":131,"./monitorCodeUse":134}],40:[function(e,t){"use strict";var n=e("./EventConstants"),r=e("./LocalEventTrapMixin"),o=e("./ReactBrowserComponentMixin"),a=e("./ReactCompositeComponent"),i=e("./ReactElement"),s=e("./ReactDOM"),u=i.createFactory(s.form.type),c=a.createClass({displayName:"ReactDOMForm",mixins:[o,r],render:function(){return u(this.props)},componentDidMount:function(){this.trapBubbledEvent(n.topLevelTypes.topReset,"reset"),this.trapBubbledEvent(n.topLevelTypes.topSubmit,"submit")}});t.exports=c},{"./EventConstants":16,"./LocalEventTrapMixin":25,"./ReactBrowserComponentMixin":29,"./ReactCompo
 siteComponent":34,"./ReactDOM":37,"./ReactElement":50}],41:[function(e,t){"use strict";var n=e("./CSSPropertyOperations"),r=e("./DOMChildrenOperations"),o=e("./DOMPropertyOperations"),a=e("./ReactMount"),i=e("./ReactPerf"),s=e("./invariant"),u=e("./setInnerHTML"),c={dangerouslySetInnerHTML:"`dangerouslySetInnerHTML` must be set using `updateInnerHTMLByID()`.",style:"`style` must be set using `updateStylesByID()`."},l={updatePropertyByID:i.measure("ReactDOMIDOperations","updatePropertyByID",function(e,t,n){var r=a.getNode(e);s(!c.hasOwnProperty(t)),null!=n?o.setValueForProperty(r,t,n):o.deleteValueForProperty(r,t)}),deletePropertyByID:i.measure("ReactDOMIDOperations","deletePropertyByID",function(e,t,n){var r=a.getNode(e);s(!c.hasOwnProperty(t)),o.deleteValueForProperty(r,t,n)}),updateStylesByID:i.measure("ReactDOMIDOperations","updateStylesByID",function(e,t){var r=a.getNode(e);n.setValueForStyles(r,t)}),updateInnerHTMLByID:i.measure("ReactDOMIDOperations","updateInnerHTMLByID",func
 tion(e,t){var n=a.getNode(e);u(n,t)}),updateTextContentByID:i.measure("ReactDOMIDOperations","updateTextContentByID",function(e,t){var n=a.getNode(e);r.updateTextContent(n,t)}),dangerouslyReplaceNodeWithMarkupByID:i.measure("ReactDOMIDOperations","dangerouslyReplaceNodeWithMarkupByID",function(e,t){var n=a.getNode(e);r.dangerouslyReplaceNodeWithMarkup(n,t)}),dangerouslyProcessChildrenUpdates:i.measure("ReactDOMIDOperations","dangerouslyProcessChildrenUpdates",function(e,t){for(var n=0;n<e.length;n++)e[n].parentNode=a.getNode(e[n].parentID);r.processUpdates(e,t)})};t.exports=l},{"./CSSPropertyOperations":5,"./DOMChildrenOperations":10,"./DOMPropertyOperations":12,"./ReactMount":61,"./ReactPerf":66,"./invariant":124,"./setInnerHTML":136}],42:[function(e,t){"use strict";var n=e("./EventConstants"),r=e("./LocalEventTrapMixin"),o=e("./ReactBrowserComponentMixin"),a=e("./ReactCompositeComponent"),i=e("./ReactElement"),s=e("./ReactDOM"),u=i.createFactory(s.img.type),c=a.createClass({displa
 yName:"ReactDOMImg",tagName:"IMG",mixins:[o,r],render:function(){return u(this.props)},componentDidMount:function(){this.trapBubbledEvent(n.topLevelTypes.topLoad,"load"),this.trapBubbledEvent(n.topLevelTypes.topError,"error")}});t.exports=c},{"./EventConstants":16,"./LocalEventTrapMixin":25,"./ReactBrowserComponentMixin":29,"./ReactCompositeComponent":34,"./ReactDOM":37,"./ReactElement":50}],43:[function(e,t){"use strict";function n(){this.isMounted()&&this.forceUpdate()}var r=e("./AutoFocusMixin"),o=e("./DOMPropertyOperations"),a=e("./LinkedValueUtils"),i=e("./ReactBrowserComponentMixin"),s=e("./ReactCompositeComponent"),u=e("./ReactElement"),c=e("./ReactDOM"),l=e("./ReactMount"),p=e("./ReactUpdates"),d=e("./Object.assign"),f=e("./invariant"),h=u.createFactory(c.input.type),m={},v=s.createClass({displayName:"ReactDOMInput",mixins:[r,a.Mixin,i],getInitialState:function(){var e=this.props.defaultValue;return{initialChecked:this.props.defaultChecked||!1,initialValue:null!=e?e:null}},r
 ender:function(){var e=d({},this.props);e.defaultChecked=null,e.defaultValue=null;var t=a.getValue(this);e.value=null!=t?t:this.state.initialValue;var n=a.getChecked(this);return e.checked=null!=n?n:this.state.initialChecked,e.onChange=this._handleChange,h(e,this.props.children)},componentDidMount:function(){var e=l.getID(this.getDOMNode());m[e]=this},componentWillUnmount:function(){var e=this.getDOMNode(),t=l.getID(e);delete m[t]},componentDidUpdate:function(){var e=this.getDOMNode();null!=this.props.checked&&o.setValueForProperty(e,"checked",this.props.checked||!1);var t=a.getValue(this);null!=t&&o.setValueForProperty(e,"value",""+t)},_handleChange:function(e){var t,r=a.getOnChange(this);r&&(t=r.call(this,e)),p.asap(n,this);var o=this.props.name;if("radio"===this.props.type&&null!=o){for(var i=this.getDOMNode(),s=i;s.parentNode;)s=s.parentNode;for(var u=s.querySelectorAll("input[name="+JSON.stringify(""+o)+'][type="radio"]'),c=0,d=u.length;d>c;c++){var h=u[c];if(h!==i&&h.form===i.
 form){var v=l.getID(h);f(v);var g=m[v];f(g),p.asap(n,g)}}}return t}});t.exports=v},{"./AutoFocusMixin":2,"./DOMPropertyOperations":12,"./LinkedValueUtils":24,"./Object.assign":27,"./ReactBrowserComponentMixin":29,"./ReactCompositeComponent":34,"./ReactDOM":37,"./ReactElement":50,"./ReactMount":61,"./ReactUpdates":77,"./invariant":124}],44:[function(e,t){"use strict";var n=e("./ReactBrowserComponentMixin"),r=e("./ReactCompositeComponent"),o=e("./ReactElement"),a=e("./ReactDOM"),i=(e("./warning"),o.createFactory(a.option.type)),s=r.createClass({displayName:"ReactDOMOption",mixins:[n],componentWillMount:function(){},render:function(){return i(this.props,this.props.children)}});t.exports=s},{"./ReactBrowserComponentMixin":29,"./ReactCompositeComponent":34,"./ReactDOM":37,"./ReactElement":50,"./warning":141}],45:[function(e,t){"use strict";function n(){this.isMounted()&&(this.setState({value:this._pendingValue}),this._pendingValue=0)}function r(e,t){if(null!=e[t])if(e.multiple){if(!Array
 .isArray(e[t]))return new Error("The `"+t+"` prop supplied to <select> must be an array if `multiple` is true.")}else if(Array.isArray(e[t]))return new Error("The `"+t+"` prop supplied to <select> must be a scalar value if `multiple` is false.")}function o(e,t){var n,r,o,a=e.props.multiple,i=null!=t?t:e.state.value,s=e.getDOMNode().options;if(a)for(n={},r=0,o=i.length;o>r;++r)n[""+i[r]]=!0;else n=""+i;for(r=0,o=s.length;o>r;r++){var u=a?n.hasOwnProperty(s[r].value):s[r].value===n;u!==s[r].selected&&(s[r].selected=u)}}var a=e("./AutoFocusMixin"),i=e("./LinkedValueUtils"),s=e("./ReactBrowserComponentMixin"),u=e("./ReactCompositeComponent"),c=e("./ReactElement"),l=e("./ReactDOM"),p=e("./ReactUpdates"),d=e("./Object.assign"),f=c.createFactory(l.select.type),h=u.createClass({displayName:"ReactDOMSelect",mixins:[a,i.Mixin,s],propTypes:{defaultValue:r,value:r},getInitialState:function(){return{value:this.props.defaultValue||(this.props.multiple?[]:"")}},componentWillMount:function(){this._
 pendingValue=null},componentWillReceiveProps:function(e){!this.props.multiple&&e.multiple?this.setState({value:[this.state.value]}):this.props.multiple&&!e.multiple&&this.setState({value:this.state.value[0]})
+},render:function(){var e=d({},this.props);return e.onChange=this._handleChange,e.value=null,f(e,this.props.children)},componentDidMount:function(){o(this,i.getValue(this))},componentDidUpdate:function(e){var t=i.getValue(this),n=!!e.multiple,r=!!this.props.multiple;(null!=t||n!==r)&&o(this,t)},_handleChange:function(e){var t,r=i.getOnChange(this);r&&(t=r.call(this,e));var o;if(this.props.multiple){o=[];for(var a=e.target.options,s=0,u=a.length;u>s;s++)a[s].selected&&o.push(a[s].value)}else o=e.target.value;return this._pendingValue=o,p.asap(n,this),t}});t.exports=h},{"./AutoFocusMixin":2,"./LinkedValueUtils":24,"./Object.assign":27,"./ReactBrowserComponentMixin":29,"./ReactCompositeComponent":34,"./ReactDOM":37,"./ReactElement":50,"./ReactUpdates":77}],46:[function(e,t){"use strict";function n(e,t,n,r){return e===n&&t===r}function r(e){var t=document.selection,n=t.createRange(),r=n.text.length,o=n.duplicate();o.moveToElementText(e),o.setEndPoint("EndToStart",n);var a=o.text.length,
 i=a+r;return{start:a,end:i}}function o(e){var t=window.getSelection&&window.getSelection();if(!t||0===t.rangeCount)return null;var r=t.anchorNode,o=t.anchorOffset,a=t.focusNode,i=t.focusOffset,s=t.getRangeAt(0),u=n(t.anchorNode,t.anchorOffset,t.focusNode,t.focusOffset),c=u?0:s.toString().length,l=s.cloneRange();l.selectNodeContents(e),l.setEnd(s.startContainer,s.startOffset);var p=n(l.startContainer,l.startOffset,l.endContainer,l.endOffset),d=p?0:l.toString().length,f=d+c,h=document.createRange();h.setStart(r,o),h.setEnd(a,i);var m=h.collapsed;return{start:m?f:d,end:m?d:f}}function a(e,t){var n,r,o=document.selection.createRange().duplicate();"undefined"==typeof t.end?(n=t.start,r=n):t.start>t.end?(n=t.end,r=t.start):(n=t.start,r=t.end),o.moveToElementText(e),o.moveStart("character",n),o.setEndPoint("EndToStart",o),o.moveEnd("character",r-n),o.select()}function i(e,t){if(window.getSelection){var n=window.getSelection(),r=e[c()].length,o=Math.min(t.start,r),a="undefined"==typeof t.en
 d?o:Math.min(t.end,r);if(!n.extend&&o>a){var i=a;a=o,o=i}var s=u(e,o),l=u(e,a);if(s&&l){var p=document.createRange();p.setStart(s.node,s.offset),n.removeAllRanges(),o>a?(n.addRange(p),n.extend(l.node,l.offset)):(p.setEnd(l.node,l.offset),n.addRange(p))}}}var s=e("./ExecutionEnvironment"),u=e("./getNodeForCharacterOffset"),c=e("./getTextContentAccessor"),l=s.canUseDOM&&document.selection,p={getOffsets:l?r:o,setOffsets:l?a:i};t.exports=p},{"./ExecutionEnvironment":22,"./getNodeForCharacterOffset":117,"./getTextContentAccessor":119}],47:[function(e,t){"use strict";function n(){this.isMounted()&&this.forceUpdate()}var r=e("./AutoFocusMixin"),o=e("./DOMPropertyOperations"),a=e("./LinkedValueUtils"),i=e("./ReactBrowserComponentMixin"),s=e("./ReactCompositeComponent"),u=e("./ReactElement"),c=e("./ReactDOM"),l=e("./ReactUpdates"),p=e("./Object.assign"),d=e("./invariant"),f=(e("./warning"),u.createFactory(c.textarea.type)),h=s.createClass({displayName:"ReactDOMTextarea",mixins:[r,a.Mixin,i],
 getInitialState:function(){var e=this.props.defaultValue,t=this.props.children;null!=t&&(d(null==e),Array.isArray(t)&&(d(t.length<=1),t=t[0]),e=""+t),null==e&&(e="");var n=a.getValue(this);return{initialValue:""+(null!=n?n:e)}},render:function(){var e=p({},this.props);return d(null==e.dangerouslySetInnerHTML),e.defaultValue=null,e.value=null,e.onChange=this._handleChange,f(e,this.state.initialValue)},componentDidUpdate:function(){var e=a.getValue(this);if(null!=e){var t=this.getDOMNode();o.setValueForProperty(t,"value",""+e)}},_handleChange:function(e){var t,r=a.getOnChange(this);return r&&(t=r.call(this,e)),l.asap(n,this),t}});t.exports=h},{"./AutoFocusMixin":2,"./DOMPropertyOperations":12,"./LinkedValueUtils":24,"./Object.assign":27,"./ReactBrowserComponentMixin":29,"./ReactCompositeComponent":34,"./ReactDOM":37,"./ReactElement":50,"./ReactUpdates":77,"./invariant":124,"./warning":141}],48:[function(e,t){"use strict";function n(){this.reinitializeTransaction()}var r=e("./ReactUpda
 tes"),o=e("./Transaction"),a=e("./Object.assign"),i=e("./emptyFunction"),s={initialize:i,close:function(){p.isBatchingUpdates=!1}},u={initialize:i,close:r.flushBatchedUpdates.bind(r)},c=[u,s];a(n.prototype,o.Mixin,{getTransactionWrappers:function(){return c}});var l=new n,p={isBatchingUpdates:!1,batchedUpdates:function(e,t,n){var r=p.isBatchingUpdates;p.isBatchingUpdates=!0,r?e(t,n):l.perform(e,null,t,n)}};t.exports=p},{"./Object.assign":27,"./ReactUpdates":77,"./Transaction":93,"./emptyFunction":105}],49:[function(e,t){"use strict";function n(){O.EventEmitter.injectReactEventListener(b),O.EventPluginHub.injectEventPluginOrder(s),O.EventPluginHub.injectInstanceHandle(D),O.EventPluginHub.injectMount(x),O.EventPluginHub.injectEventPluginsByName({SimpleEventPlugin:w,EnterLeaveEventPlugin:u,ChangeEventPlugin:o,CompositionEventPlugin:i,MobileSafariClickEventPlugin:p,SelectEventPlugin:P,BeforeInputEventPlugin:r}),O.NativeComponent.injectGenericComponentClass(m),O.NativeComponent.injectCom
 ponentClasses({button:v,form:g,img:y,input:E,option:C,select:R,textarea:M,html:N("html"),head:N("head"),body:N("body")}),O.CompositeComponent.injectMixin(d),O.DOMProperty.injectDOMPropertyConfig(l),O.DOMProperty.injectDOMPropertyConfig(T),O.EmptyComponent.injectEmptyComponent("noscript"),O.Updates.injectReconcileTransaction(f.ReactReconcileTransaction),O.Updates.injectBatchingStrategy(h),O.RootIndex.injectCreateReactRootIndex(c.canUseDOM?a.createReactRootIndex:_.createReactRootIndex),O.Component.injectEnvironment(f)}var r=e("./BeforeInputEventPlugin"),o=e("./ChangeEventPlugin"),a=e("./ClientReactRootIndex"),i=e("./CompositionEventPlugin"),s=e("./DefaultEventPluginOrder"),u=e("./EnterLeaveEventPlugin"),c=e("./ExecutionEnvironment"),l=e("./HTMLDOMPropertyConfig"),p=e("./MobileSafariClickEventPlugin"),d=e("./ReactBrowserComponentMixin"),f=e("./ReactComponentBrowserEnvironment"),h=e("./ReactDefaultBatchingStrategy"),m=e("./ReactDOMComponent"),v=e("./ReactDOMButton"),g=e("./ReactDOMForm"
 ),y=e("./ReactDOMImg"),E=e("./ReactDOMInput"),C=e("./ReactDOMOption"),R=e("./ReactDOMSelect"),M=e("./ReactDOMTextarea"),b=e("./ReactEventListener"),O=e("./ReactInjection"),D=e("./ReactInstanceHandles"),x=e("./ReactMount"),P=e("./SelectEventPlugin"),_=e("./ServerReactRootIndex"),w=e("./SimpleEventPlugin"),T=e("./SVGDOMPropertyConfig"),N=e("./createFullPageComponent");t.exports={inject:n}},{"./BeforeInputEventPlugin":3,"./ChangeEventPlugin":7,"./ClientReactRootIndex":8,"./CompositionEventPlugin":9,"./DefaultEventPluginOrder":14,"./EnterLeaveEventPlugin":15,"./ExecutionEnvironment":22,"./HTMLDOMPropertyConfig":23,"./MobileSafariClickEventPlugin":26,"./ReactBrowserComponentMixin":29,"./ReactComponentBrowserEnvironment":33,"./ReactDOMButton":38,"./ReactDOMComponent":39,"./ReactDOMForm":40,"./ReactDOMImg":42,"./ReactDOMInput":43,"./ReactDOMOption":44,"./ReactDOMSelect":45,"./ReactDOMTextarea":47,"./ReactDefaultBatchingStrategy":48,"./ReactEventListener":55,"./ReactInjection":56,"./ReactIn
 stanceHandles":58,"./ReactMount":61,"./SVGDOMPropertyConfig":78,"./SelectEventPlugin":79,"./ServerReactRootIndex":80,"./SimpleEventPlugin":81,"./createFullPageComponent":101}],50:[function(e,t){"use strict";var n=e("./ReactContext"),r=e("./ReactCurrentOwner"),o=(e("./warning"),{key:!0,ref:!0}),a=function(e,t,n,r,o,a){this.type=e,this.key=t,this.ref=n,this._owner=r,this._context=o,this.props=a};a.prototype={_isReactElement:!0},a.createElement=function(e,t,i){var s,u={},c=null,l=null;if(null!=t){l=void 0===t.ref?null:t.ref,c=null==t.key?null:""+t.key;for(s in t)t.hasOwnProperty(s)&&!o.hasOwnProperty(s)&&(u[s]=t[s])}var p=arguments.length-2;if(1===p)u.children=i;else if(p>1){for(var d=Array(p),f=0;p>f;f++)d[f]=arguments[f+2];u.children=d}if(e&&e.defaultProps){var h=e.defaultProps;for(s in h)"undefined"==typeof u[s]&&(u[s]=h[s])}return new a(e,c,l,r.current,n.current,u)},a.createFactory=function(e){var t=a.createElement.bind(null,e);return t.type=e,t},a.cloneAndReplaceProps=function(e,t
 ){var n=new a(e.type,e.key,e.ref,e._owner,e._context,t);return n},a.isValidElement=function(e){var t=!(!e||!e._isReactElement);return t},t.exports=a},{"./ReactContext":35,"./ReactCurrentOwner":36,"./warning":141}],51:[function(e,t){"use strict";function n(){var e=p.current;return e&&e.constructor.displayName||void 0}function r(e,t){e._store.validated||null!=e.key||(e._store.validated=!0,a("react_key_warning",'Each child in an array should have a unique "key" prop.',e,t))}function o(e,t,n){v.test(e)&&a("react_numeric_key_warning","Child objects should have non-numeric keys so ordering is preserved.",t,n)}function a(e,t,r,o){var a=n(),i=o.displayName,s=a||i,u=f[e];if(!u.hasOwnProperty(s)){u[s]=!0,t+=a?" Check the render method of "+a+".":" Check the renderComponent call using <"+i+">.";var c=null;r._owner&&r._owner!==p.current&&(c=r._owner.constructor.displayName,t+=" It was passed a child from "+c+"."),t+=" See http://fb.me/react-warning-keys for more information.",d(e,{component:s,c
 omponentOwner:c}),console.warn(t)}}function i(){var e=n()||"";h.hasOwnProperty(e)||(h[e]=!0,d("react_object_map_children"))}function s(e,t){if(Array.isArray(e))for(var n=0;n<e.length;n++){var a=e[n];c.isValidElement(a)&&r(a,t)}else if(c.isValidElement(e))e._store.validated=!0;else if(e&&"object"==typeof e){i();for(var s in e)o(s,e[s],t)}}function u(e,t,n,r){for(var o in t)if(t.hasOwnProperty(o)){var a;try{a=t[o](n,o,e,r)}catch(i){a=i}a instanceof Error&&!(a.message in m)&&(m[a.message]=!0,d("react_failed_descriptor_type_check",{message:a.message}))}}var c=e("./ReactElement"),l=e("./ReactPropTypeLocations"),p=e("./ReactCurrentOwner"),d=e("./monitorCodeUse"),f=(e("./warning"),{react_key_warning:{},react_numeric_key_warning:{}}),h={},m={},v=/^\d+$/,g={createElement:function(e){var t=c.createElement.apply(this,arguments);if(null==t)return t;for(var n=2;n<arguments.length;n++)s(arguments[n],e);if(e){var r=e.displayName;e.propTypes&&u(r,e.propTypes,t.props,l.prop),e.contextTypes&&u(r,e.co
 ntextTypes,t._context,l.context)}return t},createFactory:function(e){var t=g.createElement.bind(null,e);return t.type=e,t}};t.exports=g},{"./ReactCurrentOwner":36,"./ReactElement":50,"./ReactPropTypeLocations":69,"./monitorCodeUse":134,"./warning":141}],52:[function(e,t){"use strict";function n(){return u(i),i()}function r(e){c[e]=!0}function o(e){delete c[e]}function a(e){return c[e]}var i,s=e("./ReactElement"),u=e("./invariant"),c={},l={injectEmptyComponent:function(e){i=s.createFactory(e)}},p={deregisterNullComponentID:o,getEmptyComponent:n,injection:l,isNullComponentID:a,registerNullComponentID:r};t.exports=p},{"./ReactElement":50,"./invariant":124}],53:[function(e,t){"use strict";var n={guard:function(e){return e}};t.exports=n},{}],54:[function(e,t){"use strict";function n(e){r.enqueueEvents(e),r.processEventQueue()}var r=e("./EventPluginHub"),o={handleTopLevel:function(e,t,o,a){var i=r.extractEvents(e,t,o,a);n(i)}};t.exports=o},{"./EventPluginHub":18}],55:[function(e,t){"use s
 trict";function n(e){var t=l.getID(e),n=c.getReactRootIDFromNodeID(t),r=l.findReactContainerForID(n),o=l.getFirstReactDOM(r);return o}function r(e,t){this.topLevelType=e,this.nativeEvent=t,this.ancestors=[]}function o(e){for(var t=l.getFirstReactDOM(f(e.nativeEvent))||window,r=t;r;)e.ancestors.push(r),r=n(r);for(var o=0,a=e.ancestors.length;a>o;o++){t=e.ancestors[o];var i=l.getID(t)||"";m._handleTopLevel(e.topLevelType,t,i,e.nativeEvent)}}function a(e){var t=h(window);e(t)}var i=e("./EventListener"),s=e("./ExecutionEnvironment"),u=e("./PooledClass"),c=e("./ReactInstanceHandles"),l=e("./ReactMount"),p=e("./ReactUpdates"),d=e("./Object.assign"),f=e("./getEventTarget"),h=e("./getUnboundedScrollPosition");d(r.prototype,{destructor:function(){this.topLevelType=null,this.nativeEvent=null,this.ancestors.length=0}}),u.addPoolingTo(r,u.twoArgumentPooler);var m={_enabled:!0,_handleTopLevel:null,WINDOW_HANDLE:s.canUseDOM?window:null,setHandleTopLevel:function(e){m._handleTopLevel=e},setEnabled
 :function(e){m._enabled=!!e},isEnabled:function(){return m._enabled},trapBubbledEvent:function(e,t,n){var r=n;return r?i.listen(r,t,m.dispatchEvent.bind(null,e)):void 0},trapCapturedEvent:function(e,t,n){var r=n;return r?i.capture(r,t,m.dispatchEvent.bind(null,e)):void 0},monitorScrollValue:function(e){var t=a.bind(null,e);i.listen(window,"scroll",t),i.listen(window,"resize",t)},dispatchEvent:function(e,t){if(m._enabled){var n=r.getPooled(e,t);try{p.batchedUpdates(o,n)}finally{r.release(n)}}}};t.exports=m},{"./EventListener":17,"./ExecutionEnvironment":22,"./Object.assign":27,"./PooledClass":28,"./ReactInstanceHandles":58,"./ReactMount":61,"./ReactUpdates":77,"./getEventTarget":115,"./getUnboundedScrollPosition":120}],56:[function(e,t){"use strict";var n=e("./DOMProperty"),r=e("./EventPluginHub"),o=e("./ReactComponent"),a=e("./ReactCompositeComponent"),i=e("./ReactEmptyComponent"),s=e("./ReactBrowserEventEmitter"),u=e("./ReactNativeComponent"),c=e("./ReactPerf"),l=e("./ReactRootInde
 x"),p=e("./ReactUpdates"),d={Component:o.injection,CompositeComponent:a.injection,DOMProperty:n.injection,EmptyComponent:i.injection,EventPluginHub:r.injection,EventEmitter:s.injection,NativeComponent:u.injection,Perf:c.injection,RootIndex:l.injection,Updates:p.injection};t.exports=d},{"./DOMProperty":11,"./EventPluginHub":18,"./ReactBrowserEventEmitter":30,"./ReactComponent":32,"./ReactCompositeComponent":34,"./ReactEmptyComponent":52,"./ReactNativeComponent":64,"./ReactPerf":66,"./ReactRootIndex":73,"./ReactUpdates":77}],57:[function(e,t){"use strict";function n(e){return o(document.documentElement,e)}var r=e("./ReactDOMSelection"),o=e("./containsNode"),a=e("./focusNode"),i=e("./getActiveElement"),s={hasSelectionCapabilities:function(e){return e&&("INPUT"===e.nodeName&&"text"===e.type||"TEXTAREA"===e.nodeName||"true"===e.contentEditable)},getSelectionInformation:function(){var e=i();return{focusedElem:e,selectionRange:s.hasSelectionCapabilities(e)?s.getSelection(e):null}},restoreS
 election:function(e){var t=i(),r=e.focusedElem,o=e.selectionRange;t!==r&&n(r)&&(s.hasSelectionCapabilities(r)&&s.setSelection(r,o),a(r))},getSelection:function(e){var t;if("selectionStart"in e)t={start:e.selectionStart,end:e.selectionEnd};else if(document.selection&&"INPUT"===e.nodeName){var n=document.selection.createRange();n.parentElement()===e&&(t={start:-n.moveStart("character",-e.value.length),end:-n.moveEnd("character",-e.value.length)})}else t=r.getOffsets(e);return t||{start:0,end:0}},setSelection:function(e,t){var n=t.start,o=t.end;if("undefined"==typeof o&&(o=n),"selectionStart"in e)e.selectionStart=n,e.selectionEnd=Math.min(o,e.value.length);else if(document.selection&&"INPUT"===e.nodeName){var a=e.createTextRange();a.collapse(!0),a.moveStart("character",n),a.moveEnd("character",o-n),a.select()}else r.setOffsets(e,t)}};t.exports=s},{"./ReactDOMSelection":46,"./containsNode":99,"./focusNode":109,"./getActiveElement":111}],58:[function(e,t){"use strict";function n(e){retur
 n d+e.toString(36)}function r(e,t){return e.charAt(t)===d||t===e.length}function o(e){return""===e||e.charAt(0)===d&&e.charAt(e.length-1)!==d}function a(e,t){return 0===t.indexOf(e)&&r(t,e.length)}function i(e){return e?e.substr(0,e.lastIndexOf(d)):""}function s(e,t){if(p(o(e)&&o(t)),p(a(e,t)),e===t)return e;for(var n=e.length+f,i=n;i<t.length&&!r(t,i);i++);return t.substr(0,i)}function u(e,t){var n=Math.min(e.length,t.length);if(0===n)return"";for(var a=0,i=0;n>=i;i++)if(r(e,i)&&r(t,i))a=i;else if(e.charAt(i)!==t.charAt(i))break;var s=e.substr(0,a);return p(o(s)),s}function c(e,t,n,r,o,u){e=e||"",t=t||"",p(e!==t);var c=a(t,e);p(c||a(e,t));for(var l=0,d=c?i:s,f=e;;f=d(f,t)){var m;if(o&&f===e||u&&f===t||(m=n(f,c,r)),m===!1||f===t)break;p(l++<h)}}var l=e("./ReactRootIndex"),p=e("./invariant"),d=".",f=d.length,h=100,m={createReactRootID:function(){return n(l.createReactRootIndex())},createReactID:function(e,t){return e+t},getReactRootIDFromNodeID:function(e){if(e&&e.charAt(0)===d&&e.le
 ngth>1){var t=e.indexOf(d,1);return t>-1?e.substr(0,t):e}return null},traverseEnterLeave:function(e,t,n,r,o){var a=u(e,t);a!==e&&c(e,a,n,r,!1,!0),a!==t&&c(a,t,n,o,!0,!1)},traverseTwoPhase:function(e,t,n){e&&(c("",e,t,n,!0,!1),c(e,"",t,n,!1,!0))},traverseAncestors:function(e,t,n){c("",e,t,n,!0,!1)},_getFirstCommonAncestorID:u,_getNextDescendantID:s,isAncestorIDOf:a,SEPARATOR:d};t.exports=m},{"./ReactRootIndex":73,"./invariant":124}],59:[function(e,t){"use strict";function n(e,t){if("function"==typeof t)for(var n in t)if(t.hasOwnProperty(n)){var r=t[n];if("function"==typeof r){var o=r.bind(t);for(var a in r)r.hasOwnProperty(a)&&(o[a]=r[a]);e[n]=o}else e[n]=r}}var r=(e("./ReactCurrentOwner"),e("./invariant")),o=(e("./monitorCodeUse"),e("./warning"),{}),a={},i={};i.wrapCreateFactory=function(e){var t=function(t){return"function"!=typeof t?e(t):t.isReactNonLegacyFactory?e(t.type):t.isReactLegacyFactory?e(t.type):t};return t},i.wrapCreateElement=function(e){var t=function(t){if("function"
 !=typeof t)return e.apply(this,arguments);var n;return t.isReactNonLegacyFactory?(n=Array.prototype.slice.call(arguments,0),n[0]=t.type,e.apply(this,n)):t.isReactLegacyFactory?(t._isMockFunction&&(t.type._mockedReactClassConstructor=t),n=Array.prototype.slice.call(arguments,0),n[0]=t.type,e.apply(this,n)):t.apply(null,Array.prototype.slice.call(arguments,1))};return t},i.wrapFactory=function(e){r("function"==typeof e);var t=function(){return e.apply(this,arguments)};return n(t,e.type),t.isReactLegacyFactory=o,t.type=e.type,t},i.markNonLegacyFactory=function(e){return e.isReactNonLegacyFactory=a,e},i.isValidFactory=function(e){return"function"==typeof e&&e.isReactLegacyFactory===o},i.isValidClass=function(e){return i.isValidFactory(e)},i._isLegacyCallWarningEnabled=!0,t.exports=i},{"./ReactCurrentOwner":36,"./invariant":124,"./monitorCodeUse":134,"./warning":141}],60:[function(e,t){"use strict";var n=e("./adler32"),r={CHECKSUM_ATTR_NAME:"data-react-checksum",addChecksumToMarkup:funct
 ion(e){var t=n(e);return e.replace(">"," "+r.CHECKSUM_ATTR_NAME+'="'+t+'">')},canReuseMarkup:function(e,t){var o=t.getAttribute(r.CHECKSUM_ATTR_NAME);o=o&&parseInt(o,10);var a=n(e);return a===o}};t.exports=r},{"./adler32":96}],61:[function(e,t){"use strict";function n(e){var t=E(e);return t&&S.getID(t)}function r(e){var t=o(e);if(t)if(x.hasOwnProperty(t)){var n=x[t];n!==e&&(R(!s(n,t)),x[t]=e)}else x[t]=e;return t}function o(e){return e&&e.getAttribute&&e.getAttribute(D)||""}function a(e,t){var n=o(e);n!==t&&delete x[n],e.setAttribute(D,t),x[t]=e}function i(e){return x.hasOwnProperty(e)&&s(x[e],e)||(x[e]=S.findReactNodeByID(e)),x[e]}function s(e,t){if(e){R(o(e)===t);var n=S.findReactContainerForID(t);if(n&&g(n,e))return!0}return!1}function u(e){delete x[e]}function c(e){var t=x[e];return t&&s(t,e)?void(I=t):!1}function l(e){I=null,m.traverseAncestors(e,c);var t=I;return I=null,t}var p=e("./DOMProperty"),d=e("./ReactBrowserEventEmitter"),f=(e("./ReactCurrentOwner"),e("./ReactElement")
 ),h=e("./ReactLegacyElement"),m=e("./ReactInstanceHandles"),v=e("./ReactPerf"),g=e("./containsNode"),y=e("./deprecated"),E=e("./getReactRootElementInContainer"),C=e("./instantiateReactComponent"),R=e("./invariant"),M=e("./shouldUpdateReactComponent"),b=(e("./warning"),h.wrapCreateElement(f.createElement)),O=m.SEPARATOR,D=p.ID_ATTRIBUTE_NAME,x={},P=1,_=9,w={},T={},N=[],I=null,S={_instancesByReactRootID:w,scrollMonitor:function(e,t){t()},_updateRootComponent:function(e,t,n,r){var o=t.props;return S.scrollMonitor(n,function(){e.replaceProps(o,r)}),e},_registerComponent:function(e,t){R(t&&(t.nodeType===P||t.nodeType===_)),d.ensureScrollValueMonitoring();var n=S.registerContainer(t);return w[n]=e,n},_renderNewRootComponent:v.measure("ReactMount","_renderNewRootComponent",function(e,t,n){var r=C(e,null),o=S._registerComponent(r,t);return r.mountComponentIntoNode(o,t,n),r}),render:function(e,t,r){R(f.isValidElement(e));var o=w[n(t)];if(o){var a=o._currentElement;if(M(a,e))return S._updateR
 ootComponent(o,e,t,r);S.unmountComponentAtNode(t)}var i=E(t),s=i&&S.isRenderedByReact(i),u=s&&!o,c=S._renderNewRootComponent(e,t,u);return r&&r.call(c),c},constructAndRenderComponent:function(e,t,n){var r=b(e,t);return S.render(r,n)},constructAndRenderComponentByID:function(e,t,n){var r=document.getElementById(n);return R(r),S.constructAndRenderComponent(e,t,r)},registerContainer:function(e){var t=n(e);return t&&(t=m.getReactRootIDFromNodeID(t)),t||(t=m.createReactRootID()),T[t]=e,t},unmountComponentAtNode:function(e){var t=n(e),r=w[t];return r?(S.unmountComponentFromNode(r,e),delete w[t],delete T[t],!0):!1},unmountComponentFromNode:function(e,t){for(e.unmountComponent(),t.nodeType===_&&(t=t.documentElement);t.lastChild;)t.removeChild(t.lastChild)},findReactContainerForID:function(e){var t=m.getReactRootIDFromNodeID(e),n=T[t];return n},findReactNodeByID:function(e){var t=S.findReactContainerForID(e);return S.findComponentRoot(t,e)},isRenderedByReact:function(e){if(1!==e.nodeType)ret
 urn!1;var t=S.getID(e);return t?t.charAt(0)===O:!1},getFirstReactDOM:function(e){for(var t=e;t&&t.parentNode!==t;){if(S.isRenderedByReact(t))return t;t=t.parentNode}return null},findComponentRoot:function(e,t){var n=N,r=0,o=l(t)||e;for(n[0]=o.firstChild,n.length=1;r<n.length;){for(var a,i=n[r++];i;){var s=S.getID(i);s?t===s?a=i:m.isAncestorIDOf(s,t)&&(n.length=r=0,n.push(i.firstChild)):n.push(i.firstChild),i=i.nextSibling}if(a)return n.length=0,a}n.length=0,R(!1)},getReactRootID:n,getID:r,setID:a,getNode:i,purgeID:u};S.renderComponent=y("ReactMount","renderComponent","render",this,S.render),t.exports=S},{"./DOMProperty":11,"./ReactBrowserEventEmitter":30,"./ReactCurrentOwner":36,"./ReactElement":50,"./ReactInstanceHandles":58,"./ReactLegacyElement":59,"./ReactPerf":66,"./containsNode":99,"./deprecated":104,"./getReactRootElementInContainer":118,"./instantiateReactComponent":123,"./invariant":124,"./shouldUpdateReactComponent":138,"./warning":141}],62:[function(e,t){"use strict";func
 tion n(e,t,n){h.push({parentID:e,parentNode:null,type:c.INSERT_MARKUP,markupIndex:m.push(t)-1,textContent:null,fromIndex:null,toIndex:n})}function r(e,t,n){h.push({parentID:e,parentNode:null,type:c.MOVE_EXISTING,markupIndex:null,textContent:null,fromIndex:t,toIndex:n})}function o(e,t){h.push({parentID:e,parentNode:null,type:c.REMOVE_NODE,markupIndex:null,textContent:null,fromIndex:t,toIndex:null})}function a(e,t){h.push({parentID:e,parentNode:null,type:c.TEXT_CONTENT,markupIndex:null,textContent:t,fromIndex:null,toIndex:null})}function i(){h.length&&(u.BackendIDOperations.dangerouslyProcessChildrenUpdates(h,m),s())}function s(){h.length=0,m.length=0}var u=e("./ReactComponent"),c=e("./ReactMultiChildUpdateTypes"),l=e("./flattenChildren"),p=e("./instantiateReactComponent"),d=e("./shouldUpdateReactComponent"),f=0,h=[],m=[],v={Mixin:{mountChildren:function(e,t){var n=l(e),r=[],o=0;this._renderedChildren=n;for(var a in n){var i=n[a];if(n.hasOwnProperty(a)){var s=p(i,null);n[a]=s;var u=th
 is._rootNodeID+a,c=s.mountComponent(u,t,this._mountDepth+1);s._mountIndex=o,r.push(c),o++}}return r},updateTextContent:function(e){f++;var t=!0;try{var n=this._renderedChildren;for(var r in n)n.hasOwnProperty(r)&&this._unmountChildByName(n[r],r);this.setTextContent(e),t=!1}finally{f--,f||(t?s():i())}},updateChildren:function(e,t){f++;var n=!0;try{this._updateChildren(e,t),n=!1}finally{f--,f||(n?s():i())}},_updateChildren:function(e,t){var n=l(e),r=this._renderedChildren;if(n||r){var o,a=0,i=0;for(o in n)if(n.hasOwnProperty(o)){var s=r&&r[o],u=s&&s._currentElement,c=n[o];if(d(u,c))this.moveChild(s,i,a),a=Math.max(s._mountIndex,a),s.receiveComponent(c,t),s._mountIndex=i;else{s&&(a=Math.max(s._mountIndex,a),this._unmountChildByName(s,o));var f=p(c,null);this._mountChildByNameAtIndex(f,o,i,t)}i++}for(o in r)!r.hasOwnProperty(o)||n&&n[o]||this._unmountChildByName(r[o],o)}},unmountChildren:function(){var e=this._renderedChildren;for(var t in e){var n=e[t];n.unmountComponent&&n.unmountComp
 onent()}this._renderedChildren=null},moveChild:function(e,t,n){e._mountIndex<n&&r(this._rootNodeID,e._mountIndex,t)},createChild:function(e,t){n(this._rootNodeID,t,e._mountIndex)},removeChild:function(e){o(this._rootNodeID,e._mountIndex)},setTextContent:function(e){a(this._rootNodeID,e)},_mountChildByNameAtIndex:function(e,t,n,r){var o=this._rootNodeID+t,a=e.mountComponent(o,r,this._mountDepth+1);e._mountIndex=n,this.createChild(e,a),this._renderedChildren=this._renderedChildren||{},this._renderedChildren[t]=e},_unmountChildByName:function(e,t){this.removeChild(e),e._mountIndex=null,e.unmountComponent(),delete this._renderedChildren[t]}}};t.exports=v},{"./ReactComponent":32,"./ReactMultiChildUpdateTypes":63,"./flattenChildren":108,"./instantiateReactComponent":123,"./shouldUpdateReactComponent":138}],63:[function(e,t){"use strict";var n=e("./keyMirror"),r=n({INSERT_MARKUP:null,MOVE_EXISTING:null,REMOVE_NODE:null,TEXT_CONTENT:null});t.exports=r},{"./keyMirror":130}],64:[function(e,t)
 {"use strict";function n(e,t,n){var r=i[e];return null==r?(o(a),new a(e,t)):n===e?(o(a),new a(e,t)):new r.type(t)}var r=e("./Object.assign"),o=e("./invariant"),a=null,i={},s={injectGenericComponentClass:function(e){a=e},injectComponentClasses:function(e){r(i,e)}},u={createInstanceForTag:n,injection:s};t.exports=u},{"./Object.assign":27,"./invariant":124}],65:[function(e,t){"use strict";var n=e("./emptyObject"),r=e("./invariant"),o={isValidOwner:function(e){return!(!e||"function"!=typeof e.attachRef||"function"!=typeof e.detachRef)},addComponentAsRefTo:function(e,t,n){r(o.isValidOwner(n)),n.attachRef(t,e)},removeComponentAsRefFrom:function(e,t,n){r(o.isValidOwner(n)),n.refs[t]===e&&n.detachRef(t)},Mixin:{construct:function(){this.refs=n},attachRef:function(e,t){r(t.isOwnedBy(this));var o=this.refs===n?this.refs={}:this.refs;o[e]=t},detachRef:function(e){delete this.refs[e]}}};t.exports=o},{"./emptyObject":106,"./invariant":124}],66:[function(e,t){"use strict";function n(e,t,n){return
  n}var r={enableMeasure:!1,storedMeasure:n,measure:function(e,t,n){return n},injection:{injectMeasure:function(e){r.storedMeasure=e}}};t.exports=r},{}],67:[function(e,t){"use strict";function n(e){return function(t,n,r){t[n]=t.hasOwnProperty(n)?e(t[n],r):r}}function r(e,t){for(var n in t)if(t.hasOwnProperty(n)){var r=c[n];r&&c.hasOwnProperty(n)?r(e,n,t[n]):e.hasOwnProperty(n)||(e[n]=t[n])}return e}var o=e("./Object.assign"),a=e("./emptyFunction"),i=e("./invariant"),s=e("./joinClasses"),u=(e("./warning"),n(function(e,t){return o({},t,e)})),c={children:a,className:n(s),style:u},l={TransferStrategies:c,mergeProps:function(e,t){return r(o({},e),t)},Mixin:{transferPropsTo:function(e){return i(e._owner===this),r(e.props,this.props),e}}};t.exports=l},{"./Object.assign":27,"./emptyFunction":105,"./invariant":124,"./joinClasses":129,"./warning":141}],68:[function(e,t){"use strict";var n={};t.exports=n},{}],69:[function(e,t){"use strict";var n=e("./keyMirror"),r=n({prop:null,context:null,chil
 dContext:null});t.exports=r},{"./keyMirror":130}],70:[function(e,t){"use strict";function n(e){function t(t,n,r,o,a){if(o=o||C,null!=n[r])return e(n,r,o,a);var i=g[a];return t?new Error("Required "+i+" `"+r+"` was not specified in "+("`"+o+"`.")):void 0}var n=t.bind(null,!1);return n.isRequired=t.bind(null,!0),n}function r(e){function t(t,n,r,o){var a=t[n],i=h(a);if(i!==e){var s=g[o],u=m(a);return new Error("Invalid "+s+" `"+n+"` of type `"+u+"` "+("supplied to `"+r+"`, expected `"+e+"`."))}}return n(t)}function o(){return n(E.thatReturns())}function a(e){function t(t,n,r,o){var a=t[n];if(!Array.isArray(a)){var i=g[o],s=h(a);return new Error("Invalid "+i+" `"+n+"` of type "+("`"+s+"` supplied to `"+r+"`, expected an array."))}for(var u=0;u<a.length;u++){var c=e(a,u,r,o);if(c instanceof Error)return c}}return n(t)}function i(){function e(e,t,n,r){if(!v.isValidElement(e[t])){var o=g[r];return new Error("Invalid "+o+" `"+t+"` supplied to "+("`"+n+"`, expected a ReactElement."))}}return
  n(e)}function s(e){function t(t,n,r,o){if(!(t[n]instanceof e)){var a=g[o],i=e.name||C;return new Error("Invalid "+a+" `"+n+"` supplied to "+("`"+r+"`, expected instance of `"+i+"`."))}}return n(t)}function u(e){function t(t,n,r,o){for(var a=t[n],i=0;i<e.length;i++)if(a===e[i])return;var s=g[o],u=JSON.stringify(e);return new Error("Invalid "+s+" `"+n+"` of value `"+a+"` "+("supplied to `"+r+"`, expected one of "+u+"."))}return n(t)}function c(e){function t(t,n,r,o){var a=t[n],i=h(a);if("object"!==i){var s=g[o];return new Error("Invalid "+s+" `"+n+"` of type "+("`"+i+"` supplied to `"+r+"`, expected an object."))}for(var u in a)if(a.hasOwnProperty(u)){var c=e(a,u,r,o);if(c instanceof Error)return c}}return n(t)}function l(e){function t(t,n,r,o){for(var a=0;a<e.length;a++){var i=e[a];if(null==i(t,n,r,o))return}var s=g[o];return new Error("Invalid "+s+" `"+n+"` supplied to "+("`"+r+"`."))}return n(t)}function p(){function e(e,t,n,r){if(!f(e[t])){var o=g[r];return new Error("Invalid "+o
 +" `"+t+"` supplied to "+("`"+n+"`, expected a ReactNode."))}}return n(e)}function d(e){function t(t,n,r,o){var a=t[n],i=h(a);if("object"!==i){var s=g[o];return new Error("Invalid "+s+" `"+n+"` of type `"+i+"` "+("supplied to `"+r+"`, expected `object`."))}for(var u in e){var c=e[u];if(c){var l=c(a,u,r,o);if(l)return l}}}return n(t,"expected `object`")}function f(e){switch(typeof e){case"number":case"string":return!0;case"boolean":return!e;case"object":if(Array.isArray(e))return e.every(f);if(v.isValidElement(e))return!0;for(var t in e)if(!f(e[t]))return!1;return!0;default:return!1}}function h(e){var t=typeof e;return Array.isArray(e)?"array":e instanceof RegExp?"object":t}function m(e){var t=h(e);if("object"===t){if(e instanceof Date)return"date";if(e instanceof RegExp)return"regexp"}return t}var v=e("./ReactElement"),g=e("./ReactPropTypeLocationNames"),y=e("./deprecated"),E=e("./emptyFunction"),C="<<anonymous>>",R=i(),M=p(),b={array:r("array"),bool:r("boolean"),func:r("function"),
 number:r("number"),object:r("object"),string:r("string"),any:o(),arrayOf:a,element:R,instanceOf:s,node:M,objectOf:c,oneOf:u,oneOfType:l,shape:d,component:y("React.PropTypes","component","element",this,R),renderable:y("React.PropTypes","renderable","node",this,M)};t.exports=b},{"./ReactElement":50,"./ReactPropTypeLocationNames":68,"./deprecated":104,"./emptyFunction":105}],71:[function(e,t){"use strict";function n(){this.listenersToPut=[]}var r=e("./PooledClass"),o=e("./ReactBrowserEventEmitter"),a=e("./Object.assign");a(n.prototype,{enqueuePutListener:function(e,t,n){this.listenersToPut.push({rootNodeID:e,propKey:t,propValue:n})},putListeners:function(){for(var e=0;e<this.listenersToPut.length;e++){var t=this.listenersToPut[e];o.putListener(t.rootNodeID,t.propKey,t.propValue)}},reset:function(){this.listenersToPut.length=0},destructor:function(){this.reset()}}),r.addPoolingTo(n),t.exports=n},{"./Object.assign":27,"./PooledClass":28,"./ReactBrowserEventEmitter":30}],72:[function(e,t)
 {"use strict";function n(){this.reinitializeTransaction(),this.renderToStaticMarkup=!1,this.reactMountReady=r.getPooled(null),this.putListenerQueue=s.getPooled()}var r=e("./CallbackQueue"),o=e("./PooledClass"),a=e("./ReactBrowserEventEmitter"),i=e("./ReactInputSelection"),s=e("./ReactPutListenerQueue"),u=e("./Transaction"),c=e("./Object.assign"),l={initialize:i.getSelectionInformation,close:i.restoreSelection},p={initialize:function(){var e=a.isEnabled();return a.setEnabled(!1),e},close:function(e){a.setEnabled(e)}},d={initialize:function(){this.reactMountReady.reset()},close:function(){this.reactMountReady.notifyAll()}},f={initialize:function(){this.putListenerQueue.reset()},close:function(){this.putListenerQueue.putListeners()}},h=[f,l,p,d],m={getTransactionWrappers:function(){return h},getReactMountReady:function(){return this.reactMountReady},getPutListenerQueue:function(){return this.putListenerQueue},destructor:function(){r.release(this.reactMountReady),this.reactMountReady=nu
 ll,s.release(this.putListenerQueue),this.putListenerQueue=null}};c(n.prototype,u.Mixin,m),o.addPoolingTo(n),t.exports=n
+},{"./CallbackQueue":6,"./Object.assign":27,"./PooledClass":28,"./ReactBrowserEventEmitter":30,"./ReactInputSelection":57,"./ReactPutListenerQueue":71,"./Transaction":93}],73:[function(e,t){"use strict";var n={injectCreateReactRootIndex:function(e){r.createReactRootIndex=e}},r={createReactRootIndex:null,injection:n};t.exports=r},{}],74:[function(e,t){"use strict";function n(e){c(o.isValidElement(e));var t;try{var n=a.createReactRootID();return t=s.getPooled(!1),t.perform(function(){var r=u(e,null),o=r.mountComponent(n,t,0);return i.addChecksumToMarkup(o)},null)}finally{s.release(t)}}function r(e){c(o.isValidElement(e));var t;try{var n=a.createReactRootID();return t=s.getPooled(!0),t.perform(function(){var r=u(e,null);return r.mountComponent(n,t,0)},null)}finally{s.release(t)}}var o=e("./ReactElement"),a=e("./ReactInstanceHandles"),i=e("./ReactMarkupChecksum"),s=e("./ReactServerRenderingTransaction"),u=e("./instantiateReactComponent"),c=e("./invariant");t.exports={renderToString:n,re
 nderToStaticMarkup:r}},{"./ReactElement":50,"./ReactInstanceHandles":58,"./ReactMarkupChecksum":60,"./ReactServerRenderingTransaction":75,"./instantiateReactComponent":123,"./invariant":124}],75:[function(e,t){"use strict";function n(e){this.reinitializeTransaction(),this.renderToStaticMarkup=e,this.reactMountReady=o.getPooled(null),this.putListenerQueue=a.getPooled()}var r=e("./PooledClass"),o=e("./CallbackQueue"),a=e("./ReactPutListenerQueue"),i=e("./Transaction"),s=e("./Object.assign"),u=e("./emptyFunction"),c={initialize:function(){this.reactMountReady.reset()},close:u},l={initialize:function(){this.putListenerQueue.reset()},close:u},p=[l,c],d={getTransactionWrappers:function(){return p},getReactMountReady:function(){return this.reactMountReady},getPutListenerQueue:function(){return this.putListenerQueue},destructor:function(){o.release(this.reactMountReady),this.reactMountReady=null,a.release(this.putListenerQueue),this.putListenerQueue=null}};s(n.prototype,i.Mixin,d),r.addPool
 ingTo(n),t.exports=n},{"./CallbackQueue":6,"./Object.assign":27,"./PooledClass":28,"./ReactPutListenerQueue":71,"./Transaction":93,"./emptyFunction":105}],76:[function(e,t){"use strict";var n=e("./DOMPropertyOperations"),r=e("./ReactComponent"),o=e("./ReactElement"),a=e("./Object.assign"),i=e("./escapeTextForBrowser"),s=function(){};a(s.prototype,r.Mixin,{mountComponent:function(e,t,o){r.Mixin.mountComponent.call(this,e,t,o);var a=i(this.props);return t.renderToStaticMarkup?a:"<span "+n.createMarkupForID(e)+">"+a+"</span>"},receiveComponent:function(e){var t=e.props;t!==this.props&&(this.props=t,r.BackendIDOperations.updateTextContentByID(this._rootNodeID,t))}});var u=function(e){return new o(s,null,null,null,null,e)};u.type=s,t.exports=u},{"./DOMPropertyOperations":12,"./Object.assign":27,"./ReactComponent":32,"./ReactElement":50,"./escapeTextForBrowser":107}],77:[function(e,t){"use strict";function n(){h(O.ReactReconcileTransaction&&y)}function r(){this.reinitializeTransaction(),t
 his.dirtyComponentsLength=null,this.callbackQueue=c.getPooled(),this.reconcileTransaction=O.ReactReconcileTransaction.getPooled()}function o(e,t,r){n(),y.batchedUpdates(e,t,r)}function a(e,t){return e._mountDepth-t._mountDepth}function i(e){var t=e.dirtyComponentsLength;h(t===m.length),m.sort(a);for(var n=0;t>n;n++){var r=m[n];if(r.isMounted()){var o=r._pendingCallbacks;if(r._pendingCallbacks=null,r.performUpdateIfNecessary(e.reconcileTransaction),o)for(var i=0;i<o.length;i++)e.callbackQueue.enqueue(o[i],r)}}}function s(e,t){return h(!t||"function"==typeof t),n(),y.isBatchingUpdates?(m.push(e),void(t&&(e._pendingCallbacks?e._pendingCallbacks.push(t):e._pendingCallbacks=[t]))):void y.batchedUpdates(s,e,t)}function u(e,t){h(y.isBatchingUpdates),v.enqueue(e,t),g=!0}var c=e("./CallbackQueue"),l=e("./PooledClass"),p=(e("./ReactCurrentOwner"),e("./ReactPerf")),d=e("./Transaction"),f=e("./Object.assign"),h=e("./invariant"),m=(e("./warning"),[]),v=c.getPooled(),g=!1,y=null,E={initialize:fun
 ction(){this.dirtyComponentsLength=m.length},close:function(){this.dirtyComponentsLength!==m.length?(m.splice(0,this.dirtyComponentsLength),M()):m.length=0}},C={initialize:function(){this.callbackQueue.reset()},close:function(){this.callbackQueue.notifyAll()}},R=[E,C];f(r.prototype,d.Mixin,{getTransactionWrappers:function(){return R},destructor:function(){this.dirtyComponentsLength=null,c.release(this.callbackQueue),this.callbackQueue=null,O.ReactReconcileTransaction.release(this.reconcileTransaction),this.reconcileTransaction=null},perform:function(e,t,n){return d.Mixin.perform.call(this,this.reconcileTransaction.perform,this.reconcileTransaction,e,t,n)}}),l.addPoolingTo(r);var M=p.measure("ReactUpdates","flushBatchedUpdates",function(){for(;m.length||g;){if(m.length){var e=r.getPooled();e.perform(i,null,e),r.release(e)}if(g){g=!1;var t=v;v=c.getPooled(),t.notifyAll(),c.release(t)}}}),b={injectReconcileTransaction:function(e){h(e),O.ReactReconcileTransaction=e},injectBatchingStrate
 gy:function(e){h(e),h("function"==typeof e.batchedUpdates),h("boolean"==typeof e.isBatchingUpdates),y=e}},O={ReactReconcileTransaction:null,batchedUpdates:o,enqueueUpdate:s,flushBatchedUpdates:M,injection:b,asap:u};t.exports=O},{"./CallbackQueue":6,"./Object.assign":27,"./PooledClass":28,"./ReactCurrentOwner":36,"./ReactPerf":66,"./Transaction":93,"./invariant":124,"./warning":141}],78:[function(e,t){"use strict";var n=e("./DOMProperty"),r=n.injection.MUST_USE_ATTRIBUTE,o={Properties:{cx:r,cy:r,d:r,dx:r,dy:r,fill:r,fillOpacity:r,fontFamily:r,fontSize:r,fx:r,fy:r,gradientTransform:r,gradientUnits:r,markerEnd:r,markerMid:r,markerStart:r,offset:r,opacity:r,patternContentUnits:r,patternUnits:r,points:r,preserveAspectRatio:r,r:r,rx:r,ry:r,spreadMethod:r,stopColor:r,stopOpacity:r,stroke:r,strokeDasharray:r,strokeLinecap:r,strokeOpacity:r,strokeWidth:r,textAnchor:r,transform:r,version:r,viewBox:r,x1:r,x2:r,x:r,y1:r,y2:r,y:r},DOMAttributeNames:{fillOpacity:"fill-opacity",fontFamily:"font-fa
 mily",fontSize:"font-size",gradientTransform:"gradientTransform",gradientUnits:"gradientUnits",markerEnd:"marker-end",markerMid:"marker-mid",markerStart:"marker-start",patternContentUnits:"patternContentUnits",patternUnits:"patternUnits",preserveAspectRatio:"preserveAspectRatio",spreadMethod:"spreadMethod",stopColor:"stop-color",stopOpacity:"stop-opacity",strokeDasharray:"stroke-dasharray",strokeLinecap:"stroke-linecap",strokeOpacity:"stroke-opacity",strokeWidth:"stroke-width",textAnchor:"text-anchor",viewBox:"viewBox"}};t.exports=o},{"./DOMProperty":11}],79:[function(e,t){"use strict";function n(e){if("selectionStart"in e&&i.hasSelectionCapabilities(e))return{start:e.selectionStart,end:e.selectionEnd};if(window.getSelection){var t=window.getSelection();return{anchorNode:t.anchorNode,anchorOffset:t.anchorOffset,focusNode:t.focusNode,focusOffset:t.focusOffset}}if(document.selection){var n=document.selection.createRange();return{parentElement:n.parentElement(),text:n.text,top:n.boundi
 ngTop,left:n.boundingLeft}}}function r(e){if(!g&&null!=h&&h==u()){var t=n(h);if(!v||!p(v,t)){v=t;var r=s.getPooled(f.select,m,e);return r.type="select",r.target=h,a.accumulateTwoPhaseDispatches(r),r}}}var o=e("./EventConstants"),a=e("./EventPropagators"),i=e("./ReactInputSelection"),s=e("./SyntheticEvent"),u=e("./getActiveElement"),c=e("./isTextInputElement"),l=e("./keyOf"),p=e("./shallowEqual"),d=o.topLevelTypes,f={select:{phasedRegistrationNames:{bubbled:l({onSelect:null}),captured:l({onSelectCapture:null})},dependencies:[d.topBlur,d.topContextMenu,d.topFocus,d.topKeyDown,d.topMouseDown,d.topMouseUp,d.topSelectionChange]}},h=null,m=null,v=null,g=!1,y={eventTypes:f,extractEvents:function(e,t,n,o){switch(e){case d.topFocus:(c(t)||"true"===t.contentEditable)&&(h=t,m=n,v=null);break;case d.topBlur:h=null,m=null,v=null;break;case d.topMouseDown:g=!0;break;case d.topContextMenu:case d.topMouseUp:return g=!1,r(o);case d.topSelectionChange:case d.topKeyDown:case d.topKeyUp:return r(o)}}};
 t.exports=y},{"./EventConstants":16,"./EventPropagators":21,"./ReactInputSelection":57,"./SyntheticEvent":85,"./getActiveElement":111,"./isTextInputElement":127,"./keyOf":131,"./shallowEqual":137}],80:[function(e,t){"use strict";var n=Math.pow(2,53),r={createReactRootIndex:function(){return Math.ceil(Math.random()*n)}};t.exports=r},{}],81:[function(e,t){"use strict";var n=e("./EventConstants"),r=e("./EventPluginUtils"),o=e("./EventPropagators"),a=e("./SyntheticClipboardEvent"),i=e("./SyntheticEvent"),s=e("./SyntheticFocusEvent"),u=e("./SyntheticKeyboardEvent"),c=e("./SyntheticMouseEvent"),l=e("./SyntheticDragEvent"),p=e("./SyntheticTouchEvent"),d=e("./SyntheticUIEvent"),f=e("./SyntheticWheelEvent"),h=e("./getEventCharCode"),m=e("./invariant"),v=e("./keyOf"),g=(e("./warning"),n.topLevelTypes),y={blur:{phasedRegistrationNames:{bubbled:v({onBlur:!0}),captured:v({onBlurCapture:!0})}},click:{phasedRegistrationNames:{bubbled:v({onClick:!0}),captured:v({onClickCapture:!0})}},contextMenu:{p
 hasedRegistrationNames:{bubbled:v({onContextMenu:!0}),captured:v({onContextMenuCapture:!0})}},copy:{phasedRegistrationNames:{bubbled:v({onCopy:!0}),captured:v({onCopyCapture:!0})}},cut:{phasedRegistrationNames:{bubbled:v({onCut:!0}),captured:v({onCutCapture:!0})}},doubleClick:{phasedRegistrationNames:{bubbled:v({onDoubleClick:!0}),captured:v({onDoubleClickCapture:!0})}},drag:{phasedRegistrationNames:{bubbled:v({onDrag:!0}),captured:v({onDragCapture:!0})}},dragEnd:{phasedRegistrationNames:{bubbled:v({onDragEnd:!0}),captured:v({onDragEndCapture:!0})}},dragEnter:{phasedRegistrationNames:{bubbled:v({onDragEnter:!0}),captured:v({onDragEnterCapture:!0})}},dragExit:{phasedRegistrationNames:{bubbled:v({onDragExit:!0}),captured:v({onDragExitCapture:!0})}},dragLeave:{phasedRegistrationNames:{bubbled:v({onDragLeave:!0}),captured:v({onDragLeaveCapture:!0})}},dragOver:{phasedRegistrationNames:{bubbled:v({onDragOver:!0}),captured:v({onDragOverCapture:!0})}},dragStart:{phasedRegistrationNames:{bub
 bled:v({onDragStart:!0}),captured:v({onDragStartCapture:!0})}},drop:{phasedRegistrationNames:{bubbled:v({onDrop:!0}),captured:v({onDropCapture:!0})}},focus:{phasedRegistrationNames:{bubbled:v({onFocus:!0}),captured:v({onFocusCapture:!0})}},input:{phasedRegistrationNames:{bubbled:v({onInput:!0}),captured:v({onInputCapture:!0})}},keyDown:{phasedRegistrationNames:{bubbled:v({onKeyDown:!0}),captured:v({onKeyDownCapture:!0})}},keyPress:{phasedRegistrationNames:{bubbled:v({onKeyPress:!0}),captured:v({onKeyPressCapture:!0})}},keyUp:{phasedRegistrationNames:{bubbled:v({onKeyUp:!0}),captured:v({onKeyUpCapture:!0})}},load:{phasedRegistrationNames:{bubbled:v({onLoad:!0}),captured:v({onLoadCapture:!0})}},error:{phasedRegistrationNames:{bubbled:v({onError:!0}),captured:v({onErrorCapture:!0})}},mouseDown:{phasedRegistrationNames:{bubbled:v({onMouseDown:!0}),captured:v({onMouseDownCapture:!0})}},mouseMove:{phasedRegistrationNames:{bubbled:v({onMouseMove:!0}),captured:v({onMouseMoveCapture:!0})}},m
 ouseOut:{phasedRegistrationNames:{bubbled:v({onMouseOut:!0}),captured:v({onMouseOutCapture:!0})}},mouseOver:{phasedRegistrationNames:{bubbled:v({onMouseOver:!0}),captured:v({onMouseOverCapture:!0})}},mouseUp:{phasedRegistrationNames:{bubbled:v({onMouseUp:!0}),captured:v({onMouseUpCapture:!0})}},paste:{phasedRegistrationNames:{bubbled:v({onPaste:!0}),captured:v({onPasteCapture:!0})}},reset:{phasedRegistrationNames:{bubbled:v({onReset:!0}),captured:v({onResetCapture:!0})}},scroll:{phasedRegistrationNames:{bubbled:v({onScroll:!0}),captured:v({onScrollCapture:!0})}},submit:{phasedRegistrationNames:{bubbled:v({onSubmit:!0}),captured:v({onSubmitCapture:!0})}},touchCancel:{phasedRegistrationNames:{bubbled:v({onTouchCancel:!0}),captured:v({onTouchCancelCapture:!0})}},touchEnd:{phasedRegistrationNames:{bubbled:v({onTouchEnd:!0}),captured:v({onTouchEndCapture:!0})}},touchMove:{phasedRegistrationNames:{bubbled:v({onTouchMove:!0}),captured:v({onTouchMoveCapture:!0})}},touchStart:{phasedRegistra
 tionNames:{bubbled:v({onTouchStart:!0}),captured:v({onTouchStartCapture:!0})}},wheel:{phasedRegistrationNames:{bubbled:v({onWheel:!0}),captured:v({onWheelCapture:!0})}}},E={topBlur:y.blur,topClick:y.click,topContextMenu:y.contextMenu,topCopy:y.copy,topCut:y.cut,topDoubleClick:y.doubleClick,topDrag:y.drag,topDragEnd:y.dragEnd,topDragEnter:y.dragEnter,topDragExit:y.dragExit,topDragLeave:y.dragLeave,topDragOver:y.dragOver,topDragStart:y.dragStart,topDrop:y.drop,topError:y.error,topFocus:y.focus,topInput:y.input,topKeyDown:y.keyDown,topKeyPress:y.keyPress,topKeyUp:y.keyUp,topLoad:y.load,topMouseDown:y.mouseDown,topMouseMove:y.mouseMove,topMouseOut:y.mouseOut,topMouseOver:y.mouseOver,topMouseUp:y.mouseUp,topPaste:y.paste,topReset:y.reset,topScroll:y.scroll,topSubmit:y.submit,topTouchCancel:y.touchCancel,topTouchEnd:y.touchEnd,topTouchMove:y.touchMove,topTouchStart:y.touchStart,topWheel:y.wheel};for(var C in E)E[C].dependencies=[C];var R={eventTypes:y,executeDispatch:function(e,t,n){var o
 =r.executeDispatch(e,t,n);o===!1&&(e.stopPropagation(),e.preventDefault())},extractEvents:function(e,t,n,r){var v=E[e];if(!v)return null;var y;switch(e){case g.topInput:case g.topLoad:case g.topError:case g.topReset:case g.topSubmit:y=i;break;case g.topKeyPress:if(0===h(r))return null;case g.topKeyDown:case g.topKeyUp:y=u;break;case g.topBlur:case g.topFocus:y=s;break;case g.topClick:if(2===r.button)return null;case g.topContextMenu:case g.topDoubleClick:case g.topMouseDown:case g.topMouseMove:case g.topMouseOut:case g.topMouseOver:case g.topMouseUp:y=c;break;case g.topDrag:case g.topDragEnd:case g.topDragEnter:case g.topDragExit:case g.topDragLeave:case g.topDragOver:case g.topDragStart:case g.topDrop:y=l;break;case g.topTouchCancel:case g.topTouchEnd:case g.topTouchMove:case g.topTouchStart:y=p;break;case g.topScroll:y=d;break;case g.topWheel:y=f;break;case g.topCopy:case g.topCut:case g.topPaste:y=a}m(y);var C=y.getPooled(v,n,r);return o.accumulateTwoPhaseDispatches(C),C}};t.expo
 rts=R},{"./EventConstants":16,"./EventPluginUtils":20,"./EventPropagators":21,"./SyntheticClipboardEvent":82,"./SyntheticDragEvent":84,"./SyntheticEvent":85,"./SyntheticFocusEvent":86,"./SyntheticKeyboardEvent":88,"./SyntheticMouseEvent":89,"./SyntheticTouchEvent":90,"./SyntheticUIEvent":91,"./SyntheticWheelEvent":92,"./getEventCharCode":112,"./invariant":124,"./keyOf":131,"./warning":141}],82:[function(e,t){"use strict";function n(e,t,n){r.call(this,e,t,n)}var r=e("./SyntheticEvent"),o={clipboardData:function(e){return"clipboardData"in e?e.clipboardData:window.clipboardData}};r.augmentClass(n,o),t.exports=n},{"./SyntheticEvent":85}],83:[function(e,t){"use strict";function n(e,t,n){r.call(this,e,t,n)}var r=e("./SyntheticEvent"),o={data:null};r.augmentClass(n,o),t.exports=n},{"./SyntheticEvent":85}],84:[function(e,t){"use strict";function n(e,t,n){r.call(this,e,t,n)}var r=e("./SyntheticMouseEvent"),o={dataTransfer:null};r.augmentClass(n,o),t.exports=n},{"./SyntheticMouseEvent":89}],8
 5:[function(e,t){"use strict";function n(e,t,n){this.dispatchConfig=e,this.dispatchMarker=t,this.nativeEvent=n;var r=this.constructor.Interface;for(var o in r)if(r.hasOwnProperty(o)){var i=r[o];this[o]=i?i(n):n[o]}var s=null!=n.defaultPrevented?n.defaultPrevented:n.returnValue===!1;this.isDefaultPrevented=s?a.thatReturnsTrue:a.thatReturnsFalse,this.isPropagationStopped=a.thatReturnsFalse}var r=e("./PooledClass"),o=e("./Object.assign"),a=e("./emptyFunction"),i=e("./getEventTarget"),s={type:null,target:i,currentTarget:a.thatReturnsNull,eventPhase:null,bubbles:null,cancelable:null,timeStamp:function(e){return e.timeStamp||Date.now()},defaultPrevented:null,isTrusted:null};o(n.prototype,{preventDefault:function(){this.defaultPrevented=!0;var e=this.nativeEvent;e.preventDefault?e.preventDefault():e.returnValue=!1,this.isDefaultPrevented=a.thatReturnsTrue},stopPropagation:function(){var e=this.nativeEvent;e.stopPropagation?e.stopPropagation():e.cancelBubble=!0,this.isPropagationStopped=a.t
 hatReturnsTrue},persist:function(){this.isPersistent=a.thatReturnsTrue},isPersistent:a.thatReturnsFalse,destructor:function(){var e=this.constructor.Interface;for(var t in e)this[t]=null;this.dispatchConfig=null,this.dispatchMarker=null,this.nativeEvent=null}}),n.Interface=s,n.augmentClass=function(e,t){var n=this,a=Object.create(n.prototype);o(a,e.prototype),e.prototype=a,e.prototype.constructor=e,e.Interface=o({},n.Interface,t),e.augmentClass=n.augmentClass,r.addPoolingTo(e,r.threeArgumentPooler)},r.addPoolingTo(n,r.threeArgumentPooler),t.exports=n},{"./Object.assign":27,"./PooledClass":28,"./emptyFunction":105,"./getEventTarget":115}],86:[function(e,t){"use strict";function n(e,t,n){r.call(this,e,t,n)}var r=e("./SyntheticUIEvent"),o={relatedTarget:null};r.augmentClass(n,o),t.exports=n},{"./SyntheticUIEvent":91}],87:[function(e,t){"use strict";function n(e,t,n){r.call(this,e,t,n)}var r=e("./SyntheticEvent"),o={data:null};r.augmentClass(n,o),t.exports=n},{"./SyntheticEvent":85}],88
 :[function(e,t){"use strict";function n(e,t,n){r.call(this,e,t,n)}var r=e("./SyntheticUIEvent"),o=e("./getEventCharCode"),a=e("./getEventKey"),i=e("./getEventModifierState"),s={key:a,location:null,ctrlKey:null,shiftKey:null,altKey:null,metaKey:null,repeat:null,locale:null,getModifierState:i,charCode:function(e){return"keypress"===e.type?o(e):0},keyCode:function(e){return"keydown"===e.type||"keyup"===e.type?e.keyCode:0},which:function(e){return"keypress"===e.type?o(e):"keydown"===e.type||"keyup"===e.type?e.keyCode:0}};r.augmentClass(n,s),t.exports=n},{"./SyntheticUIEvent":91,"./getEventCharCode":112,"./getEventKey":113,"./getEventModifierState":114}],89:[function(e,t){"use strict";function n(e,t,n){r.call(this,e,t,n)}var r=e("./SyntheticUIEvent"),o=e("./ViewportMetrics"),a=e("./getEventModifierState"),i={screenX:null,screenY:null,clientX:null,clientY:null,ctrlKey:null,shiftKey:null,altKey:null,metaKey:null,getModifierState:a,button:function(e){var t=e.button;return"which"in e?t:2===t
 ?2:4===t?1:0},buttons:null,relatedTarget:function(e){return e.relatedTarget||(e.fromElement===e.srcElement?e.toElement:e.fromElement)},pageX:function(e){return"pageX"in e?e.pageX:e.clientX+o.currentScrollLeft},pageY:function(e){return"pageY"in e?e.pageY:e.clientY+o.currentScrollTop}};r.augmentClass(n,i),t.exports=n},{"./SyntheticUIEvent":91,"./ViewportMetrics":94,"./getEventModifierState":114}],90:[function(e,t){"use strict";function n(e,t,n){r.call(this,e,t,n)}var r=e("./SyntheticUIEvent"),o=e("./getEventModifierState"),a={touches:null,targetTouches:null,changedTouches:null,altKey:null,metaKey:null,ctrlKey:null,shiftKey:null,getModifierState:o};r.augmentClass(n,a),t.exports=n},{"./SyntheticUIEvent":91,"./getEventModifierState":114}],91:[function(e,t){"use strict";function n(e,t,n){r.call(this,e,t,n)}var r=e("./SyntheticEvent"),o=e("./getEventTarget"),a={view:function(e){if(e.view)return e.view;var t=o(e);if(null!=t&&t.window===t)return t;var n=t.ownerDocument;return n?n.defaultView
 ||n.parentWindow:window},detail:function(e){return e.detail||0}};r.augmentClass(n,a),t.exports=n},{"./SyntheticEvent":85,"./getEventTarget":115}],92:[function(e,t){"use strict";function n(e,t,n){r.call(this,e,t,n)}var r=e("./SyntheticMouseEvent"),o={deltaX:function(e){return"deltaX"in e?e.deltaX:"wheelDeltaX"in e?-e.wheelDeltaX:0},deltaY:function(e){return"deltaY"in e?e.deltaY:"wheelDeltaY"in e?-e.wheelDeltaY:"wheelDelta"in e?-e.wheelDelta:0},deltaZ:null,deltaMode:null};r.augmentClass(n,o),t.exports=n},{"./SyntheticMouseEvent":89}],93:[function(e,t){"use strict";var n=e("./invariant"),r={reinitializeTransaction:function(){this.transactionWrappers=this.getTransactionWrappers(),this.wrapperInitData?this.wrapperInitData.length=0:this.wrapperInitData=[],this._isInTransaction=!1},_isInTransaction:!1,getTransactionWrappers:null,isInTransaction:function(){return!!this._isInTransaction},perform:function(e,t,r,o,a,i,s,u){n(!this.isInTransaction());var c,l;try{this._isInTransaction=!0,c=!0,th
 is.initializeAll(0),l=e.call(t,r,o,a,i,s,u),c=!1}finally{try{if(c)try{this.closeAll(0)}catch(p){}else this.closeAll(0)}finally{this._isInTransaction=!1}}return l},initializeAll:function(e){for(var t=this.transactionWrappers,n=e;n<t.length;n++){var r=t[n];try{this.wrapperInitData[n]=o.OBSERVED_ERROR,this.wrapperInitData[n]=r.initialize?r.initialize.call(this):null}finally{if(this.wrapperInitData[n]===o.OBSERVED_ERROR)try{this.initializeAll(n+1)}catch(a){}}}},closeAll:function(e){n(this.isInTransaction());for(var t=this.transactionWrappers,r=e;r<t.length;r++){var a,i=t[r],s=this.wrapperInitData[r];try{a=!0,s!==o.OBSERVED_ERROR&&i.close&&i.close.call(this,s),a=!1}finally{if(a)try{this.closeAll(r+1)}catch(u){}}}this.wrapperInitData.length=0}},o={Mixin:r,OBSERVED_ERROR:{}};t.exports=o},{"./invariant":124}],94:[function(e,t){"use strict";var n=e("./getUnboundedScrollPosition"),r={currentScrollLeft:0,currentScrollTop:0,refreshScrollValues:function(){var e=n(window);r.currentScrollLeft=e.x,
 r.currentScrollTop=e.y}};t.exports=r},{"./getUnboundedScrollPosition":120}],95:[function(e,t){"use strict";function n(e,t){if(r(null!=t),null==e)return t;var n=Array.isArray(e),o=Array.isArray(t);return n&&o?(e.push.apply(e,t),e):n?(e.push(t),e):o?[e].concat(t):[e,t]}var r=e("./invariant");t.exports=n},{"./invariant":124}],96:[function(e,t){"use strict";function n(e){for(var t=1,n=0,o=0;o<e.length;o++)t=(t+e.charCodeAt(o))%r,n=(n+t)%r;return t|n<<16}var r=65521;t.exports=n},{}],97:[function(e,t){function n(e){return e.replace(r,function(e,t){return t.toUpperCase()})}var r=/-(.)/g;t.exports=n},{}],98:[function(e,t){"use strict";function n(e){return r(e.replace(o,"ms-"))}var r=e("./camelize"),o=/^-ms-/;t.exports=n},{"./camelize":97}],99:[function(e,t){function n(e,t){return e&&t?e===t?!0:r(e)?!1:r(t)?n(e,t.parentNode):e.contains?e.contains(t):e.compareDocumentPosition?!!(16&e.compareDocumentPosition(t)):!1:!1}var r=e("./isTextNode");t.exports=n},{"./isTextNode":128}],100:[function(e,t
 ){function n(e){return!!e&&("object"==typeof e||"function"==typeof e)&&"length"in e&&!("setInterval"in e)&&"number"!=typeof e.nodeType&&(Array.isArray(e)||"callee"in e||"item"in e)}function r(e){return n(e)?Array.isArray(e)?e.slice():o(e):[e]}var o=e("./toArray");t.exports=r},{"./toArray":139}],101:[function(e,t){"use strict";function n(e){var t=o.createFactory(e),n=r.createClass({displayName:"ReactFullPageComponent"+e,componentWillUnmount:function(){a(!1)},render:function(){return t(this.props)}});return n}var r=e("./ReactCompositeComponent"),o=e("./ReactElement"),a=e("./invariant");t.exports=n},{"./ReactCompositeComponent":34,"./ReactElement":50,"./invariant":124}],102:[function(e,t){function n(e){var t=e.match(c);return t&&t[1].toLowerCase()}function r(e,t){var r=u;s(!!u);var o=n(e),c=o&&i(o);if(c){r.innerHTML=c[1]+e+c[2];for(var l=c[0];l--;)r=r.lastChild}else r.innerHTML=e;var p=r.getElementsByTagName("script");p.length&&(s(t),a(p).forEach(t));for(var d=a(r.childNodes);r.lastChi
 ld;)r.removeChild(r.lastChild);return d}var o=e("./ExecutionEnvironment"),a=e("./createArrayFrom"),i=e("./getMarkupWrap"),s=e("./invariant"),u=o.canUseDOM?document.createElement("div"):null,c=/^\s*<(\w+)/;t.exports=r},{"./ExecutionEnvironment":22,"./createArrayFrom":100,"./getMarkupWrap":116,"./invariant":124}],103:[function(e,t){"use strict";function n(e,t){var n=null==t||"boolean"==typeof t||""===t;if(n)return"";var r=isNaN(t);return r||0===t||o.hasOwnProperty(e)&&o[e]?""+t:("string"==typeof t&&(t=t.trim()),t+"px")}var r=e("./CSSProperty"),o=r.isUnitlessNumber;t.exports=n},{"./CSSProperty":4}],104:[function(e,t){function n(e,t,n,r,o){return o}e("./Object.assign"),e("./warning");t.exports=n},{"./Object.assign":27,"./warning":141}],105:[function(e,t){function n(e){return function(){return e}}function r(){}r.thatReturns=n,r.thatReturnsFalse=n(!1),r.thatReturnsTrue=n(!0),r.thatReturnsNull=n(null),r.thatReturnsThis=function(){return this},r.thatReturnsArgument=function(e){return e},t.e
 xports=r},{}],106:[function(e,t){"use strict";var n={};t.exports=n},{}],107:[function(e,t){"use strict";function n(e){return o[e]}function r(e){return(""+e).replace(a,n)}var o={"&":"&amp;",">":"&gt;","<":"&lt;",'"':"&quot;","'":"&#x27;"},a=/[&><"']/g;t.exports=r},{}],108:[function(e,t){"use strict";function n(e,t,n){var r=e,a=!r.hasOwnProperty(n);if(a&&null!=t){var i,s=typeof t;i="string"===s?o(t):"number"===s?o(""+t):t,r[n]=i}}function r(e){if(null==e)return e;var t={};return a(e,n,t),t}{var o=e("./ReactTextComponent"),a=e("./traverseAllChildren");e("./warning")}t.exports=r},{"./ReactTextComponent":76,"./traverseAllChildren":140,"./warning":141}],109:[function(e,t){"use strict";function n(e){try{e.focus()}catch(t){}}t.exports=n},{}],110:[function(e,t){"use strict";var n=function(e,t,n){Array.isArray(e)?e.forEach(t,n):e&&t.call(n,e)};t.exports=n},{}],111:[function(e,t){function n(){try{return document.activeElement||document.body}catch(e){return document.body}}t.exports=n},{}],112:[
 function(e,t){"use strict";function n(e){var t,n=e.keyCode;return"charCode"in e?(t=e.charCode,0===t&&13===n&&(t=13)):t=n,t>=32||13===t?t:0}t.exports=n},{}],113:[function(e,t){"use strict";function n(e){if(e.key){var t=o[e.key]||e.key;if("Unidentified"!==t)return t}if("keypress"===e.type){var n=r(e);return 13===n?"Enter":String.fromCharCode(n)}return"keydown"===e.type||"keyup"===e.type?a[e.keyCode]||"Unidentified":""}var r=e("./getEventCharCode"),o={Esc:"Escape",Spacebar:" ",Left:"ArrowLeft",Up:"ArrowUp",Right:"ArrowRight",Down:"ArrowDown",Del:"Delete",Win:"OS",Menu:"ContextMenu",Apps:"ContextMenu",Scroll:"ScrollLock",MozPrintableKey:"Unidentified"},a={8:"Backspace",9:"Tab",12:"Clear",13:"Enter",16:"Shift",17:"Control",18:"Alt",19:"Pause",20:"CapsLock",27:"Escape",32:" ",33:"PageUp",34:"PageDown",35:"End",36:"Home",37:"ArrowLeft",38:"ArrowUp",39:"ArrowRight",40:"ArrowDown",45:"Insert",46:"Delete",112:"F1",113:"F2",114:"F3",115:"F4",116:"F5",117:"F6",118:"F7",119:"F8",120:"F9",121:"F1
 0",122:"F11",123:"F12",144:"NumLock",145:"ScrollLock",224:"Meta"};t.exports=n},{"./getEventCharCode":112}],114:[function(e,t){"use strict";function n(e){var t=this,n=t.nativeEvent;if(n.getModifierState)return n.getModifierState(e);var r=o[e];return r?!!n[r]:!1}function r(){return n}var o={Alt:"altKey",Control:"ctrlKey",Meta:"metaKey",Shift:"shiftKey"};t.exports=r},{}],115:[function(e,t){"use strict";function n(e){var t=e.target||e.srcElement||window;return 3===t.nodeType?t.parentNode:t}t.exports=n},{}],116:[function(e,t){function n(e){return o(!!a),p.hasOwnProperty(e)||(e="*"),i.hasOwnProperty(e)||(a.innerHTML="*"===e?"<link />":"<"+e+"></"+e+">",i[e]=!a.firstChild),i[e]?p[e]:null}var r=e("./ExecutionEnvironment"),o=e("./invariant"),a=r.canUseDOM?document.createElement("div"):null,i={circle:!0,defs:!0,ellipse:!0,g:!0,line:!0,linearGradient:!0,path:!0,polygon:!0,polyline:!0,radialGradient:!0,rect:!0,stop:!0,text:!0},s=[1,'<select multiple="true">',"</select>"],u=[1,"<table>","</table
 >"],c=[3,"<table><tbody><tr>","</tr></tbody></table>"],l=[1,"<svg>","</svg>"],p={"*":[1,"?<div>","</div>"],area:[1,"<map>","</map>"],col:[2,"<table><tbody></tbody><colgroup>","</colgroup></table>"],legend:[1,"<fieldset>","</fieldset>"],param:[1,"<object>","</object>"],tr:[2,"<table><tbody>","</tbody></table>"],optgroup:s,option:s,caption:u,colgroup:u,tbody:u,tfoot:u,thead:u,td:c,th:c,circle:l,defs:l,ellipse:l,g:l,line:l,linearGradient:l,path:l,polygon:l,polyline:l,radialGradient:l,rect:l,stop:l,text:l};t.exports=n},{"./ExecutionEnvironment":22,"./invariant":124}],117:[function(e,t){"use strict";function n(e){for(;e&&e.firstChild;)e=e.firstChild;return e}function r(e){for(;e;){if(e.nextSibling)return e.nextSibling;e=e.parentNode}}function o(e,t){for(var o=n(e),a=0,i=0;o;){if(3==o.nodeType){if(i=a+o.textContent.length,t>=a&&i>=t)return{node:o,offset:t-a};a=i}o=n(r(o))}}t.exports=o},{}],118:[function(e,t){"use strict";function n(e){return e?e.nodeType===r?e.documentElement:e.firstChild
 :null}var r=9;t.exports=n},{}],119:[function(e,t){"use strict";function n(){return!o&&r.canUseDOM&&(o="textContent"in document.documentElement?"textContent":"innerText"),o}var r=e("./ExecutionEnvironment"),o=null;t.exports=n},{"./ExecutionEnvironment":22}],120:[function(e,t){"use strict";function n(e){return e===window?{x:window.pageXOffset||document.documentElement.scrollLeft,y:window.pageYOffset||document.documentElement.scrollTop}:{x:e.scrollLeft,y:e.scrollTop}}t.exports=n},{}],121:[function(e,t){function n(e){return e.replace(r,"-$1").toLowerCase()}var r=/([A-Z])/g;t.exports=n},{}],122:[function(e,t){"use strict";function n(e){return r(e).replace(o,"-ms-")}var r=e("./hyphenate"),o=/^ms-/;t.exports=n},{"./hyphenate":121}],123:[function(e,t){"use strict";function n(e,t){var n;return n="string"==typeof e.type?r.createInstanceForTag(e.type,e.props,t):new e.type(e.props),n.construct(e),n}{var r=(e("./warning"),e("./ReactElement"),e("./ReactLegacyElement"),e("./ReactNativeComponent"))
 ;e("./ReactEmptyComponent")}t.exports=n},{"./ReactElement":50,"./ReactEmptyComponent":52,"./ReactLegacyElement":59,"./ReactNativeComponent":64,"./warning":141}],124:[function(e,t){"use strict";var n=function(e,t,n,r,o,a,i,s){if(!e){var u;if(void 0===t)u=new Error("Minified exception occurred; use the non-minified dev environment for the full error message and additional helpful warnings.");else{var c=[n,r,o,a,i,s],l=0;u=new Error("Invariant Violation: "+t.replace(/%s/g,function(){return c[l++]}))}throw u.framesToPop=1,u}};t.exports=n},{}],125:[function(e,t){"use strict";function n(e,t){if(!o.canUseDOM||t&&!("addEventListener"in document))return!1;var n="on"+e,a=n in document;if(!a){var i=document.createElement("div");i.setAttribute(n,"return;"),a="function"==typeof i[n]}return!a&&r&&"wheel"===e&&(a=document.implementation.hasFeature("Events.wheel","3.0")),a}var r,o=e("./ExecutionEnvironment");o.canUseDOM&&(r=document.implementation&&document.implementation.hasFeature&&document.imple
 mentation.hasFeature("","")!==!0),t.exports=n},{"./ExecutionEnvironment":22}],126:[function(e,t){function n(e){return!(!e||!("function"==typeof Node?e instanceof Node:"object"==typeof e&&"number"==typeof e.nodeType&&"string"==typeof e.nodeName))}t.exports=n},{}],127:[function(e,t){"use strict";function n(e){return e&&("INPUT"===e.nodeName&&r[e.type]||"TEXTAREA"===e.nodeName)}var r={color:!0,date:!0,datetime:!0,"datetime-local":!0,email:!0,month:!0,number:!0,password:!0,range:!0,search:!0,tel:!0,text:!0,time:!0,url:!0,week:!0};t.exports=n},{}],128:[function(e,t){function n(e){return r(e)&&3==e.nodeType}var r=e("./isNode");t.exports=n},{"./isNode":126}],129:[function(e,t){"use strict";function n(e){e||(e="");var t,n=arguments.length;if(n>1)for(var r=1;n>r;r++)t=arguments[r],t&&(e=(e?e+" ":"")+t);return e}t.exports=n},{}],130:[function(e,t){"use strict";var n=e("./invariant"),r=function(e){var t,r={};n(e instanceof Object&&!Array.isArray(e));for(t in e)e.hasOwnProperty(t)&&(r[t]=t);ret
 urn r};t.exports=r},{"./invariant":124}],131:[function(e,t){var n=function(e){var t;for(t in e)if(e.hasOwnProperty(t))return t;return null};t.exports=n},{}],132:[function(e,t){"use strict";function n(e,t,n){if(!e)return null;var o={};for(var a in e)r.call(e,a)&&(o[a]=t.call(n,e[a],a,e));return o}var r=Object.prototype.hasOwnProperty;t.exports=n},{}],133:[function(e,t){"use strict";function n(e){var t={};return function(n){return t.hasOwnProperty(n)?t[n]:t[n]=e.call(this,n)}}t.exports=n},{}],134:[function(e,t){"use strict";function n(e){r(e&&!/[^a-z0-9_]/.test(e))}var r=e("./invariant");t.exports=n},{"./invariant":124}],135:[function(e,t){"use strict";function n(e){return o(r.isValidElement(e)),e}var r=e("./ReactElement"),o=e("./invariant");t.exports=n},{"./ReactElement":50,"./invariant":124}],136:[function(e,t){"use strict";var n=e("./ExecutionEnvironment"),r=/^[ \r\n\t\f]/,o=/<(!--|link|noscript|meta|script|style)[ \r\n\t\f\/>]/,a=function(e,t){e.innerHTML=t};if(n.canUseDOM){var i=
 document.createElement("div");i.innerHTML=" ",""===i.innerHTML&&(a=function(e,t){if(e.parentNode&&e.parentNode.replaceChild(e,e),r.test(t)||"<"===t[0]&&o.test(t)){e.innerHTML=""+t;
+var n=e.firstChild;1===n.data.length?e.removeChild(n):n.deleteData(0,1)}else e.innerHTML=t})}t.exports=a},{"./ExecutionEnvironment":22}],137:[function(e,t){"use strict";function n(e,t){if(e===t)return!0;var n;for(n in e)if(e.hasOwnProperty(n)&&(!t.hasOwnProperty(n)||e[n]!==t[n]))return!1;for(n in t)if(t.hasOwnProperty(n)&&!e.hasOwnProperty(n))return!1;return!0}t.exports=n},{}],138:[function(e,t){"use strict";function n(e,t){return e&&t&&e.type===t.type&&e.key===t.key&&e._owner===t._owner?!0:!1}t.exports=n},{}],139:[function(e,t){function n(e){var t=e.length;if(r(!Array.isArray(e)&&("object"==typeof e||"function"==typeof e)),r("number"==typeof t),r(0===t||t-1 in e),e.hasOwnProperty)try{return Array.prototype.slice.call(e)}catch(n){}for(var o=Array(t),a=0;t>a;a++)o[a]=e[a];return o}var r=e("./invariant");t.exports=n},{"./invariant":124}],140:[function(e,t){"use strict";function n(e){return d[e]}function r(e,t){return e&&null!=e.key?a(e.key):t.toString(36)}function o(e){return(""+e).re
 place(f,n)}function a(e){return"$"+o(e)}function i(e,t,n){return null==e?0:h(e,"",0,t,n)}var s=e("./ReactElement"),u=e("./ReactInstanceHandles"),c=e("./invariant"),l=u.SEPARATOR,p=":",d={"=":"=0",".":"=1",":":"=2"},f=/[=.:]/g,h=function(e,t,n,o,i){var u,d,f=0;if(Array.isArray(e))for(var m=0;m<e.length;m++){var v=e[m];u=t+(t?p:l)+r(v,m),d=n+f,f+=h(v,u,d,o,i)}else{var g=typeof e,y=""===t,E=y?l+r(e,0):t;if(null==e||"boolean"===g)o(i,null,E,n),f=1;else if("string"===g||"number"===g||s.isValidElement(e))o(i,e,E,n),f=1;else if("object"===g){c(!e||1!==e.nodeType);for(var C in e)e.hasOwnProperty(C)&&(u=t+(t?p:l)+a(C)+p+r(e[C],0),d=n+f,f+=h(e[C],u,d,o,i))}}return f};t.exports=i},{"./ReactElement":50,"./ReactInstanceHandles":58,"./invariant":124}],141:[function(e,t){"use strict";var n=e("./emptyFunction"),r=n;t.exports=r},{"./emptyFunction":105}]},{},[1])(1)});
\ No newline at end of file
diff --git a/www/calendar-demo/spec/spec_helper.rb b/www/calendar-demo/spec/spec_helper.rb
new file mode 100644
index 0000000..885de9a
--- /dev/null
+++ b/www/calendar-demo/spec/spec_helper.rb
@@ -0,0 +1,6 @@
+ENV['RACK_ENV'] = 'test'
+require 'capybara/rspec'
+require 'capybara/poltergeist'
+require_relative '../app'
+Capybara.app = Sinatra::Application
+Capybara.javascript_driver = :poltergeist
diff --git a/www/calendar-demo/spec/static_spec.rb b/www/calendar-demo/spec/static_spec.rb
new file mode 100644
index 0000000..ccac376
--- /dev/null
+++ b/www/calendar-demo/spec/static_spec.rb
@@ -0,0 +1,10 @@
+require_relative 'spec_helper'
+
+feature 'static rendering' do
+  it 'should show Feb 2015' do
+    visit '/2015/02'
+
+    expect(page).to have_selector 'header', text: 'February 2015'
+    expect(page).to have_selector 'li', text: "Valentine's Day"
+  end
+end
diff --git a/www/calendar-demo/views/calendar.html.rb b/www/calendar-demo/views/calendar.html.rb
new file mode 100644
index 0000000..ef7d4df
--- /dev/null
+++ b/www/calendar-demo/views/calendar.html.rb
@@ -0,0 +1,15 @@
+require 'date'
+
+_html do
+  _base href: '..'
+  _link rel: 'stylesheet', href: 'css/calendar.css'
+
+  _div_ id: 'page'
+
+  _script src: 'js/react-0.12.2.min.js'
+  _script src: 'calendar.js'
+
+  _.render '#page' do
+    _Calendar year: @year, month: @month-1, items: @items
+  end
+end
diff --git a/www/calendar-demo/views/calendar.js.rb b/www/calendar-demo/views/calendar.js.rb
new file mode 100644
index 0000000..34d0ca3
--- /dev/null
+++ b/www/calendar-demo/views/calendar.js.rb
@@ -0,0 +1,72 @@
+class Calendar < React
+  def render
+    _section do
+      days = Date.new(@year, @month+1, 0).getDate()
+      start = Date.new(@year, @month).getDay()
+      months = %w(January February March April May June July August
+        September October November December)
+
+      _header "#{months[@month]} #{@year}"
+
+      _ol.calendar! do
+        for i in 1..start
+          _li.spacer
+        end
+
+        for i in 1..days
+          _li do
+            _div.day i
+            if @items[i]
+              _ul @items[i] do |item|
+                _li item
+              end
+            end
+          end
+        end
+      end
+    end
+  end
+
+  # copy Element properties to state
+  def componentWillMount()
+    this.setState(this.props)
+  end
+
+  def componentDidMount()
+    # listen for up/down keys
+    window.addEventListener(:keydown) do |event|
+      if event.keyCode == 37
+        self.setDate(Date.new(@year, @month-1), true)
+      elsif event.keyCode == 39
+        self.setDate(Date.new(@year, @month+1), true)
+      end
+    end
+
+    # back button support
+    history.replaceState({year: @year, month: @month}, 'title', location)
+    window.addEventListener(:popstate) do |event|
+      self.setDate(Date.new(event.state.year, event.state.month), false)
+    end
+  end
+
+  # change the page
+  def setDate(date, push)
+    @year = date.getYear()+1900
+    @month = date.getMonth()
+    @items = {}
+
+    if push
+      url = "#{@year}/#{@month < 9 ? "0#{@month+1}" : @month+1}"
+      history.pushState({year: @year, month: @month}, 'title', url)
+    end
+
+    # request a list of calendar items for this month
+    request = XMLHttpRequest.new()
+    request.open('GET', "#{window.location}.json", true)
+    def request.onreadystatechange()
+      return unless request.readyState == 4 and request.status == 200
+      @items = JSON.parse(request.responseText)
+    end
+    request.send()
+  end
+end
diff --git a/www/classic/board/agenda/README b/www/classic/board/agenda/README
new file mode 100644
index 0000000..01b4f53
--- /dev/null
+++ b/www/classic/board/agenda/README
@@ -0,0 +1,32 @@
+This is an Angular.js application making use of Wunderbar in the production of
+HTML and Ruby2JS in the production of JavaScript.
+
+  http://angularjs.org/
+  https://github.com/rubys/wunderbar#readme
+  https://github.com/rubys/ruby2js#readme
+
+What this means is that there is Model, View, Controller, and Router logic
+on the server, as well as Model, View, Controller, Router, and view helpers in
+the form of Filers on the Client.
+
+Additional server support logic can be found here:
+
+https://svn.apache.org/repos/infra/infrastructure/trunk/projects/whimsy/asf
+
+Basic Roadmap:
+
+  config.ru - integration with the web server (via Phusion Passenger)
+  main.rb - server controller and router (using Sinatra)
+  js - from a server perspective, more views.  From a client perspective:
+    app_._js:     client controller and router
+    filters._js:  client view helpers
+    services._js: client model
+    directives._js: client web components
+  json - server side of form (or button) processing
+  model - server side model
+  partials - HTML fragments
+  public - staticly served stylesheets
+  views - common HTML layout
+
+Touch 'tmp/restart.txt' whenever the app changes in order to restart the
+server.
diff --git a/www/classic/board/agenda/Rakefile b/www/classic/board/agenda/Rakefile
new file mode 100644
index 0000000..26e7eac
--- /dev/null
+++ b/www/classic/board/agenda/Rakefile
@@ -0,0 +1,107 @@
+#
+# Runs end-to-end tests of the agenda tool using test data
+#
+# Prerequisites:
+#   npm install -g protractor
+#   web-manager update
+#   JDK
+#   phantomjs
+
+# while under development, use tip version of ruby2js
+$:.unshift '/home/rubys/git/ruby2js/lib'
+
+file 'test/work' do
+  mkdir_p 'test/work'
+end
+
+file 'test/work/repository' => 'test/work' do
+  unless File.exist? 'test/work/repository/format'
+    system 'svnadmin create test/work/repository'
+  end
+end
+
+file 'test/work/board' => 'test/work/repository' do
+  Dir.chdir('test/work') do
+    system "svn co file:///#{Dir.pwd}/repository board"
+    cp Dir['../data/*.txt'], 'board'
+    Dir.chdir('board') {system 'svn add *.txt; svn commit -m "initial commit"'}
+  end
+end
+
+file 'test/work/data' => 'test/work' do
+  mkdir_p 'test/work/data'
+end
+
+task 'test/work/specs' do
+  mkdir_p 'test/work/specs' unless Dir.exist? 'test/work/specs'
+
+  Dir['test/specs/*.rb'].each do |source|
+    dest = source.sub('test/specs/', 'test/work/specs/').sub(/\.rb$/, '.js')
+    unless File.exist?(dest) and File.mtime(dest) >= File.mtime(source)
+      require 'ruby2js/filter/minitest-jasmine'
+      begin
+        js = Ruby2JS.convert(File.read(source))
+        File.open(dest, 'w') { |file| file.write js }
+      rescue Parser::SyntaxError => error
+        location = error.diagnostic.location.to_s.sub('__SOURCE__', source)
+        STDERR.puts "#{location} #{error}"
+        fail 'Syntax Error'
+      end
+    end
+  end
+
+  Dir['test/work/specs/*.js'].each do |target|
+    source = target.sub('test/work/specs/', 'test/specs/').sub(/\.js$/, '.rb')
+    rm_rf target unless File.exist?(source)
+  end
+end
+
+task :work => ['test/work/board', 'test/work/data', 'test/work/specs']
+
+task :test => :work do
+  require 'net/http'
+  require 'socket'
+  port = TCPServer.open('127.0.0.1', 0) { |server| server.addr[1] }
+
+  begin
+    # start the test server (puma)
+    pid = fork do
+      STDOUT.reopen('/dev/null')
+      require 'rack/handler/puma'
+      ENV['RACK_ENV'] = 'test'
+      server = Rack::Builder.new {eval(File.read('config.ru'))}
+      Rack::Handler::Puma.run(server, Port: port)
+    end
+
+    # wait for server
+    100.times do
+      sleep 0.2
+      begin
+        status = Net::HTTP.get_response('localhost','/',port).code
+        break if %(200 302 404 500).include? status
+      rescue Errno::ECONNREFUSED, Errno::ETIMEDOUT
+      end
+    end
+
+    # run the tests
+    ENV['REMOTE_USER'] = 'rubys'
+    Dir.chdir 'test' do
+      system "protractor --browser=phantomjs --specs=work/specs/*.js " +
+        "--baseUrl=http://localhost:#{port}"
+    end
+
+  ensure
+    # stop the test server
+    begin
+      Process.kill "INT", pid
+      Timeout::timeout(5) { Process.wait pid }
+    rescue Timeout::Error
+      Process.kill "KILL", pid
+      Process.wait pid
+    end
+  end
+end
+
+task :clobber do
+  rm_rf 'test/work'
+end
diff --git a/www/classic/board/agenda/config.ru b/www/classic/board/agenda/config.ru
new file mode 100644
index 0000000..2068724
--- /dev/null
+++ b/www/classic/board/agenda/config.ru
@@ -0,0 +1,9 @@
+require File.expand_path('../main.rb', __FILE__)
+
+require 'whimsy/asf/rack'
+
+# https://svn.apache.org/repos/infra/infrastructure/trunk/projects/whimsy/asf/rack.rb
+use ASF::Auth::MembersAndOfficers
+use ASF::HTTPS_workarounds
+
+run Sinatra::Application
diff --git a/www/classic/board/agenda/helpers/string.rb b/www/classic/board/agenda/helpers/string.rb
new file mode 100644
index 0000000..d188220
--- /dev/null
+++ b/www/classic/board/agenda/helpers/string.rb
@@ -0,0 +1,45 @@
+# reflow string support
+class String
+  def word_wrap(text, line_width=80)
+    text.split("\n").collect do |line|
+      line.length > line_width ? 
+        line.gsub(/(.{1,#{line_width}})(\s+|$)/, "\\1\n").strip : line
+    end * "\n"
+  end
+
+  def reflow(indent, len)
+    strip.split(/\n\s*\n/).map {|line|
+      line.gsub!(/\s+/, ' ')
+      line.strip!
+      word_wrap(line, len).gsub(/^/, ' '*indent)
+    }.join("\n\n")
+  end
+
+  # replace matched expressions with the result of the block being called
+  def mreplace regexp, &block
+    matches = []
+    offset = 0
+    while self[offset..-1] =~ regexp
+      matches << [offset, $~]
+      offset += $~.end($~.size - 1)
+    end
+    raise 'unmatched' if matches.empty?
+
+    matches.reverse.each do |offset, match|
+      slice = self[offset...-1]
+      send = (1...match.size).map {|i| slice[match.begin(i)...match.end(i)]}
+      if send.length == 1
+        recv = block.call(send.first)
+        self[offset+match.begin(1)...offset+match.end(1)] = recv
+      else
+        recv = block.call(*send)
+        next unless recv
+        (1...match.size).map {|i| [match.begin(i), match.end(i), i-1]}.sort.
+          reverse.each do |start, fin, i|
+          self[offset+start...offset+fin] = recv[i]
+        end
+      end
+    end
+    self
+  end
+end
diff --git a/www/classic/board/agenda/js/app._js b/www/classic/board/agenda/js/app._js
new file mode 100644
index 0000000..70579f8
--- /dev/null
+++ b/www/classic/board/agenda/js/app._js
@@ -0,0 +1,954 @@
+#!/usr/bin/ruby
+
+# main application, consisting of a router and a number of controllers
+
+module Angular::AsfBoardAgenda
+  use :AsfBoardServices, :AsfBoardFilters, :AsfBoardDirectives
+
+  $locationProvider.html5Mode(true).hashPrefix('!')
+
+  # route request based on fragment identifier
+  case $routeProvider
+  when '/help'
+    templateUrl '../partials/help.html'
+    controller :Help
+
+  when '/'
+    templateUrl '../partials/index.html'
+    controller :Index
+
+  when '/queue'
+    templateUrl '../partials/pending.html'
+    controller :PendingItems
+
+  when '/comments'
+    templateUrl '../partials/comments.html'
+    controller :Comments
+
+  when '/queue/:qsection'
+    templateUrl '../partials/section.html'
+    controller :Section
+
+  when '/shepherd/queue/:sqsection'
+    templateUrl '../partials/section.html'
+    controller :Section
+
+  when '/shepherd/:name'
+    templateUrl '../partials/shepherd.html'
+    controller :Shepherd
+
+  when '/search'
+    templateUrl '../partials/search.html'
+    controller :Search
+
+  when '/:section'
+    templateUrl '../partials/section.html'
+    controller :Section
+
+  else
+    redirectTo '/'
+  end
+
+  controller :Layout do
+    @toc = Agenda.index
+    @item = {}
+    @next = nil
+    @prev = nil
+    @search = {text: ''}
+
+    def layout(vars)
+      Actions.reset() unless vars.item and @item.title == vars.item.title
+      @buttons = Actions.buttons
+
+      @next = nil
+      @prev = nil
+
+      if vars.item === undefined
+        @item = {}
+        @title = ''
+      else
+        @item = vars.item
+        @title = vars.item.title
+        @next = vars.item.next unless vars.hasOwnProperty(:next)
+        @prev = vars.item.prev unless vars.hasOwnProperty(:prev)
+      end
+
+      @title = vars.title unless vars.title === undefined
+      @next = vars.next unless vars.next === undefined
+      @prev = vars.prev unless vars.prev === undefined
+
+      @next_href = @next.href if @next
+      @prev_href = @prev.href if @prev
+
+      @next_href = vars.next_href unless vars.next_href === undefined
+      @prev_href = vars.prev_href unless vars.prev_href === undefined
+
+      @user = Data.get('availid')
+
+      if Data.get('initials')
+        $rootScope.mode ||= :director
+      elsif %w(clr jcarman).include? @user
+        $rootScope.mode ||= :secretary
+      else
+        $rootScope.mode ||= :guest
+      end
+
+      @firstname = Data.get('firstname')
+    end
+
+    # toggle info display
+    def infoToggle()
+      @info = (@info ? nil : 'open')
+    end
+
+    def queued
+      Pending.count
+    end
+
+    # prefetch roster info
+    if $location.host() == 'whimsy.apache.org'
+      $http.get("/roster/json/ldap").success {}
+    end
+  end
+
+  # controller for the index page
+  controller :Index do
+    Minutes.get()
+    @agenda = Agenda.get()
+    @agenda_file = Data.get('agenda')
+
+    title = @agenda_file[/\d+_\d+_\d+/].gsub(/_/,'-')
+
+    agendas = ~'#agendas li'.to_a.map {|li| li.textContent.trim()}
+    index = agendas.indexOf(@agenda_file)
+    agendas = agendas.map do |text|
+      text = text[/\d+_\d+_\d+/].gsub(/_/,'-')
+      {href: "../#{text}/", title: text}
+    end
+
+    help = {href: 'help', title: 'Help'}
+    $scope.layout title: title, next: agendas[index+1] || help,
+      prev: agendas[index-1] || help
+    Actions.add 'refresh-button'
+
+    @forms = Actions.forms
+    watch Minutes.complete + Agenda.stop do
+      if Agenda.stop and Date.new().getTime() < Agenda.stop
+        Actions.add 'special-order-button' unless Minutes.complete
+      end
+
+      if $rootScope.mode == :secretary
+        if Minutes.posted.include? @agenda_file.sub('_agenda_', '_minutes_')
+          Actions.add 'publish-minutes-button', 'publish-minutes.html'
+        elsif Minutes.complete
+          Actions.add 'draft-minutes-button', 'draft-minutes.html'
+        end
+      end
+    end
+  end
+
+  # controller for the help page
+  controller :Help do
+    $scope.layout title: 'Help'
+
+    def set_mode(mode)
+      $rootScope.mode = mode
+    end
+  end
+
+  # controller for the pending pages
+  controller :PendingItems do
+    @agenda = Agenda.get()
+    @pending = Pending.get()
+    firstname = Data.get('firstname')
+
+    $scope.layout title: 'Queued approvals and comments',
+      prev: ({title: 'Shepherd', href: "shepherd/#{firstname}"} if firstname)
+
+    Actions.add 'refresh-button'
+
+    @q_approvals = []
+    @q_rejected = []
+    @q_ready = []
+    @q_comments = []
+    watch 'pending.update + agenda.update' do
+      @q_approvals.clear()
+      @q_rejected.clear()
+      @agenda.each do |item|
+        @q_approvals << item if @pending.approved.include? item.attach
+        @q_rejected  << item if @pending.rejected.include? item.attach
+      end
+
+      comments = @pending.comments
+      initials = Data.get('initials')
+      @q_comments.clear()
+      @q_ready.clear()
+      @agenda.each do |item|
+        if comments[item.attach]
+          item.comment = comments[item.attach]
+          @q_comments << item
+        end
+
+        unless @q_approvals.include? item or @q_rejected.include? item
+          @q_ready << item if item.ready and not item.approved.include? initials
+        end
+      end
+    end
+
+    watch 'q_comments.length + q_approvals.length' do |after, before|
+      Actions.add 'commit-button' if after > 0
+
+      message = []
+
+      if @q_approvals.length > 0 and @q_approvals.length <= 6
+        message << "Approve #{
+          @q_approvals.map {|item| item.title}.join(', ')}"
+      elsif @q_approvals.length > 1
+        message << "Approve #{ @q_approvals.length} reports"
+      end
+
+      if @q_comments.length > 0 and @q_comments.length <= 6
+        message << "Comment on #{
+          @q_comments.map {|item| item.title}.join(', ')}"
+      elsif @q_comments.length > 1
+        message << "Comment on #{ @q_comments.length} reports"
+      end
+
+      @commit_message = message.join("\n")
+    end
+  end
+
+  controller :Commit do
+    def commit()
+      data = {message: @commit_message}
+
+      @disabled = true
+      $http.post('../json/commit', data).success { |response|
+        Agenda.put response.agenda
+        Pending.put response.pending
+      }.error { |data|
+        $log.error data.exception + "\n" + data.backtrace.join("\n")
+        alert data.exception
+      }.finally {
+        ~'#commit-form'.modal(:hide)
+        @disabled = false
+      }
+    end
+  end
+
+  # controller for the comments pages
+  controller :Comments do
+    firstname = Data.get('firstname')
+    $scope.layout title: "Comments",
+      prev: {title: 'Search', href: 'search'},
+      next: ({title: 'Shepherd', href: "shepherd/#{firstname}"} if firstname)
+    @agenda = Agenda.get()
+    @pending = Pending.get()
+    @toggle = false
+
+    watch 'agenda.update + pending.update' do
+      $rootScope.any_seen = !@pending.seen.keys().empty?
+    end
+
+    on :toggleComments do |event, state|
+      @toggle = state
+    end
+
+    # make comment split filter available as a function
+    csplit = filter(:csplit)
+
+    Actions.add 'mark-seen-button'
+    Actions.add 'toggle-seen-button'
+
+    # produce a stable list of visible comments
+    $rootScope.any_visible = false
+    $rootScope.any_hidden = false
+    def visible_comments
+      $rootScope.any_hidden = false
+      @visible ||= []
+      result = []
+      @agenda.each do |item|
+        show = []
+        seen = csplit(@pending.seen[item.attach])
+
+        csplit(item.comments).each do |comment|
+          if seen.include?(comment) and not @toggle
+            $rootScope.any_hidden = true
+          elsif comment.trim()
+            show << comment 
+          end
+        end
+
+        unless show.empty?
+          result << {title: item.title, href: item.href, comments: show} 
+        end
+      end
+
+      angular.copy result, @visible unless angular.equals(result, @visible)
+      $rootScope.any_visible = (not @visible.empty?)
+      @visible
+    end
+  end
+
+  controller :MarkSeen do
+    @undo = nil
+    @label = 'mark seen'
+    @disabled = false
+    def click()
+      @disabled = true
+
+      # gather up the comments
+      if @undo
+        seen = @undo
+      else
+        seen = {}
+        Agenda.get().each do |item|
+          seen[item.attach] = item.comments if item.comments
+        end
+      end
+
+      data = { seen: seen, agenda: Data.get('agenda') }
+
+      $http.post('../json/markseen', data).success { |response|
+        if @undo
+          @undo = nil
+          @label = 'mark seen'
+        else
+          @undo = angular.copy(Pending.get().seen)
+          @label = 'undo mark'
+        end
+
+        Pending.put response
+      }.error { |data|
+        $log.error data.exception + "\n" + data.backtrace.join("\n")
+        alert data.exception
+      }.finally {
+        @disabled = false
+      }
+    end
+  end
+
+  controller :ToggleComments do
+    @label = 'show'
+    def click()
+      broadcast! :toggleComments, (@label == 'show')
+      @label = (@label == 'show' ? 'hide' : 'show')
+    end
+  end
+
+  # controller for the shepherd pages
+  controller :Shepherd do
+    @agenda = Agenda.get()
+    @name = $routeParams.name
+    $scope.layout title: "Shepherded By #{@name}",
+      prev: {title: 'Comments', href: 'comments'},
+      next: {title: 'Queue', href: 'queue'}
+
+    watch 'agenda.update' do
+      @agenda.each do |item|
+        if item.title == 'Action Items'
+          @actions = item
+          @assigned = item.text.split("\n\n").select do |item|
+            item =~ /^\* *#{$routeParams.name}/m
+          end
+        end
+      end
+    end
+  end
+
+  controller :Comment do
+    @text = {draft: @comment, base: @comment}
+    $rootScope.comment_text = @text
+
+    def save(comment)
+      data = {attach: @item.attach, initials: @initials, comment: comment,
+        agenda: Data.get('agenda')}
+
+      $http.post('../json/comment', data).success { |response|
+        Pending.put response
+        @text = {draft: comment, base: comment}
+      }.error { |data|
+        $log.error data.exception + "\n" + data.backtrace.join("\n")
+        alert data.exception
+      }.finally {
+        ~'#comment-form'.modal(:hide)
+      }
+    end
+  end
+
+  controller :PostReport do
+    @disabled = false
+    @report = @item.report || @item.text
+    if @item.title == 'President'
+      @report.sub! /\s*Additionally, please see Attachments \d through \d\./, ''
+    end
+    @baseline = @report
+    @digest = @item.digest
+
+    watch @item.digest do |value|
+      if value != @digest 
+        @digest = value
+        unless ~'.modal-open'.empty? or @disabled or @updated
+          @disabled = true
+          alert 'Edit Conflict'
+        end
+        @updated = false
+      end
+    end
+
+    if @post_button_text == 'edit report'
+      @message = "Edit #{@item.title} Report"
+    elsif @post_button_text == 'edit resolution'
+      @message = "Edit #{@item.title} Resolution"
+    else
+      @message = "Post #{@item.title} Report"
+    end
+
+    def reflow()
+      indent = (@item.attach =~ /^4/ ? '        ' : '')
+      @report = Flow.text(@report, indent)
+    end
+
+    def cancel()
+      ~'#post-report-form'.modal(:hide)
+      @report = @baseline
+      @disabled = false
+    end
+
+    def save()
+      data = {attach: @item.attach, report: @report, agenda: Data.get('agenda'),
+        message: @message, digest: @digest}
+
+      data.fulltitle = @item.fulltitle if @item.fulltitle
+
+      @disabled = true
+      $http.post('../json/post', data).success { |response|
+        Agenda.put response
+        @updated = true
+      }.error { |data|
+        $log.error data.exception + "\n" + data.backtrace.join("\n")
+        alert data.exception
+      }.finally {
+        ~'#post-report-form'.modal(:hide)
+        @disabled = false
+      }
+    end
+
+    watch @report do |value|
+      if value and value.split("\n").any? {|line| line.length > 80}
+        @reflow_class = 'btn-danger'
+      else
+        @reflow_class = 'btn-default'
+      end
+    end
+  end
+
+  controller :DraftMinutes do
+    @date = Data.get('agenda')[/\d+_\d+_\d+/]
+    @draft = Minutes.draft
+    @message ||= "Draft minutes for #{@date.gsub('_', '-')}"
+
+    # fetch a current draft
+    def draftMinutes()
+      $http.get("../text/draft/#{@date}").then do |response|
+        @draft[@date] = response.data
+      end
+    end
+
+    def save()
+      minutes = Data.get('agenda').sub('_agenda_', '_minutes_')
+      data = {minutes: minutes, message: @message, draft: @draft[@date]}
+
+      @disabled = true
+      $http.post('../json/draft', data).success { |response|
+        Minutes.posted << minutes
+      }.error { |data|
+        $log.error data.exception + "\n" + data.backtrace.join("\n")
+        alert data.exception
+      }.finally {
+        ~'#draft-minutes-form'.modal(:hide)
+        @disabled = false
+      }
+    end
+  end
+
+  controller :PublishMinutes do
+    months = %w(January February March April May June July August September
+      October November December)
+
+    def formatDate(date)
+      date = Date.new(date.gsub('_', '/'))
+      return "#{date.getDate()} #{months[date.getMonth()]} #{date.getYear()+1900}"
+    end
+
+    def summarize(agenda, date)
+      result = "- [#{$scope.formatDate(date)}]" +
+              "(../records/minutes/#{date[0..3]}/board_minutes_#{date}.txt)\n"
+      agenda.each do |item|
+        if item.attach =~ /^7\w$/
+          result += "    * #{item.title.
+            gsub(/(.{1,76})(\s+|$)/, "$1\n      ").
+            gsub(/ +$/, '')}"
+        end
+      end
+      return result
+    end
+
+    def publishMinutes()
+      if @item.attach
+        date = @item.text[/board_minutes_(\d+_\d+_\d+)\.txt/, 1]
+        if date
+          $http.get("../#{date.gsub('_', '-')}.json").success { |response|
+            broadcast! :pubSummary, $scope.summarize(response, date), date
+          }
+        end
+      else
+        date = Data.get('agenda')[/\d+_\d+_\d+/]
+        broadcast! :pubSummary, $scope.summarize(Agenda.get(), date), date
+      end
+    end
+
+    on :pubSummary do |event, summary, date|
+      @summary = summary
+      @date = date
+      @message = "Publish #{$scope.formatDate(date)} minutes"
+    end
+
+    def save()
+      minutes = "board_minutes_#{@date}.txt"
+      data = {date: @date, minutes: minutes, message: @message, 
+        summary: @summary}
+
+      @disabled = true
+      $http.post('../json/publish', data).success { |response|
+        index = Minutes.posted.indexOf(minutes)
+        Minutes.posted.slice(index, 1) if index > -1
+        window.open('https://cms.apache.org/www/publish', '_blank').focus()
+      }.error { |data|
+        $log.error data.exception + "\n" + data.backtrace.join("\n")
+        alert data.exception
+      }.finally {
+        ~'#publish-minutes-form'.modal(:hide)
+        @disabled = false
+      }
+    end
+  end
+
+  controller :SpecialOrder do
+    @title = ''
+
+    def save()
+      data = {attach: '7?', title: @title, report: @report,
+        agenda: Data.get('agenda')}
+
+      @disabled = true
+      $http.post('../json/post', data).success { |response|
+        Agenda.put response
+      }.error { |data|
+        $log.error data.exception + "\n" + data.backtrace.join("\n")
+        alert data.exception
+      }.finally {
+        ~'#special-order-form'.modal(:hide)
+        @disabled = false
+        @title = @report = ''
+      }
+    end
+  end
+
+  controller :Refresh do
+    @disabled = false
+    def click()
+      data = {agenda: Data.get('agenda')}
+
+      @disabled = true
+      $http.post('../json/refresh', data).success { |response|
+        Agenda.put response
+      }.error { |data|
+        $log.error data.exception + "\n" + data.backtrace.join("\n")
+        alert data.exception
+      }.finally {
+        @disabled = false
+      }
+    end
+  end
+
+  controller :Attend do
+    def attend_label
+      if @item.people[@user] and @item.people[@user].attending
+        'regrets'
+      else
+        'attend'
+      end
+    end
+
+    def click()
+      if @attend_label == 'regrets'
+        data = {action: 'regrets', name: @item.people[@user].name}
+      else
+        data = {action: 'attend', userid: @user}
+      end
+
+      data.agenda = Data.get('agenda')
+
+      @disabled = true
+      $http.post('../json/attend', data).success { |response|
+        Agenda.put response
+      }.error { |data|
+        $log.error data.exception + "\n" + data.backtrace.join("\n")
+        alert data.exception
+      }.finally {
+        @disabled = false
+      }
+    end
+  end
+
+  controller :Approve do
+    def approve_label
+      if Pending.approved.include? @item.attach
+        'unapprove'
+      elsif Actions.control
+        'reject'
+      else
+        'approve'
+      end
+    end
+
+    def click()
+      data = {attach: @item.attach, request: self.approve_label,
+        initials: Data.get('initials'), agenda: Data.get('agenda')}
+
+      $http.post('../json/approve', data).success { |response|
+        Pending.put response
+      }.error { |data|
+        $log.error data.exception + "\n" + data.backtrace.join("\n")
+        alert data.exception
+      }
+    end
+  end
+
+  # Secretary take minutes
+  controller :Minute do
+    rollcall =  @minutes['Roll Call'] || @agenda[1].text
+    pattern = Regexp.new('\n   ( [a-z]*[A-Z][a-zA-Z]*\.?)+', 'g')
+    @attendees = []
+    while (match=pattern.exec(rollcall)) do
+      @attendees << match[0].sub(/^\s+/, '').split(' ').first
+    end
+    @attendees.sort!()
+
+    if @minutes[@item.title]
+      @text = {base: @minutes[@item.title]}
+    elsif @item.title == 'Roll Call'
+      @text = {base: @item.text}
+      @text.base.sub! /^ASF members[\s\S]*?\n\n/m, '' # remove 1st paragraph
+      @text.base.gsub! /\s*\(expected.*?\)/, '' # remove (expected...)
+    elsif @item.title == 'Action Items'
+      @text = {base: @item.text}
+    else
+      @text = {base: ''}
+    end
+
+    @text.draft ||= @text.base
+
+    @previous_meeting = (@item.attach =~ /^3\w/)
+
+    def save(text = @text.draft)
+      data = {title: @item.title, text: text, agenda: Data.get('agenda')}
+
+      $http.post('../json/minute', data).success { |response|
+        @text.base = @text.draft = text
+        Minutes.put response
+      }.error { |data|
+        $log.error data.exception + "\n" + data.backtrace.join("\n")
+        alert data.exception
+      }.finally {
+        ~'#minute-form'.modal(:hide)
+      }
+    end
+
+    @ai = {assignee: '', text: ''}
+    @ai.assignee = @item.shepherd.split(' ').first if @item.shepherd
+    unless @item.report or @item.text
+      @ai.text = "pursue a report for #{@item.title}" 
+    end
+
+    def add_ai()
+      @text.draft = @text.draft.sub(/\s+$/, '') + "\n\n" if @text.draft
+      @text.draft = (@text.draft || '') +
+        Flow.comment(@ai.text, "@#{@ai.assignee}")
+      @ai.text = ''
+    end
+  end
+
+  # Secretary take vote
+  controller :Vote do
+    rollcall =  @minutes['Roll Call'] || @agenda[1].text
+    @directors = rollcall[/Directors.*Present:\n\n((.*\n)*?)\n/,1].
+      sub(/\n$/, '')
+
+    if (Date.new().getMonth() + @item.attach.charCodeAt(1)) % 2
+      @votetype = "Roll call"
+    else
+      @votetype = "Reverse roll call"
+      @directors = @directors.split("\n").reverse().join("\n")
+    end
+
+    @fulltitle = @item.fulltitle || @item.title
+    text = $scope['$parent'].text
+    @text = {base: text, draft: text}
+
+    def save(text = @text.draft)
+      data = {title: @item.title, text: text, agenda: Data.get('agenda')}
+
+      $http.post('../json/minute', data).success { |response|
+        Minutes.put response
+        @text = {base: text, draft: text}
+      }.error { |data|
+        $log.error data.exception + "\n" + data.backtrace.join("\n")
+        alert data.exception
+      }.finally {
+        ~'#vote-form'.modal(:hide)
+      }
+    end
+  end
+
+  # Secretary timestamp for Call to Order and Adjournment
+  controller :Timestamp do
+    def click()
+      data = {title: @item.title, action: 'timestamp', agenda: Data.get('agenda')}
+
+      $http.post('../json/minute', data).success { |response|
+        Minutes.put response
+      }.error { |data|
+        $log.error data.exception + "\n" + data.backtrace.join("\n")
+        alert data.exception
+      }
+    end
+  end
+
+  # controller for the section pages
+  controller :Section do
+    @forms = Actions.forms
+    @agenda = Agenda.get()
+    @initials = Data.get('initials')
+    @minutes = Minutes.get()
+    @cflow = Flow.comment
+    @tflow = Flow.text
+    @actions = Agenda.actions
+
+    # fetch section from the route parameters
+    section = $routeParams.section || $routeParams.qsection ||
+      $routeParams.sqsection
+
+    # find agenda item, add relevant buttons
+    watch 'agenda.update' do
+      item = @agenda.find {|item| item.href == section}
+      if item
+        if $routeParams.section
+          $scope.layout item: item
+        elsif $routeParams.qsection
+          $scope.layout item: item,
+            prev: item.qprev,
+            prev_href: (item.qprev ? item.qprev.qhref : nil),
+            next: item.qnext,
+            next_href: (item.qnext ? item.qnext.qhref : nil)
+        else
+          $scope.layout item: item,
+            prev: item.sqprev,
+            prev_href: (item.sqprev ? item.sqprev.sqhref : nil),
+            next: item.sqnext,
+            next_href: (item.sqnext ? item.sqnext.sqhref : nil)
+        end
+
+        unless Date.new().getTime() > Agenda.stop
+          unless item.comments === undefined
+            Actions.add 'comment-button', 'comment.html'
+          end
+
+          if item.attach =~ /^(\d|7?[A-Z]+|4[A-Z])$/
+            if item.missing
+              $rootScope.post_button_text = 'post report'
+              @post_form_title = 'Post report'
+            elsif item.attach =~ /^7\w/
+              $rootScope.post_button_text = 'edit resolution'
+              @post_form_title = 'Edit resolution'
+            else
+              $rootScope.post_button_text = 'edit report'
+              @post_form_title = 'Edit report'
+            end
+            Actions.add 'post-button', 'post.html'
+          end
+
+          if @mode==:director and (item.report or item.text)
+            if item.approved and not item.approved.include? @initials
+              Actions.add 'approve-button'
+            end
+          end
+
+          if item.title == 'Roll Call' and not @minutes['Roll Call']
+            Actions.add 'attend-button'
+          end
+        end
+
+        if item.title == 'Action Items'
+          def item.new_actions
+            Minutes.new_actions
+          end
+        elsif item.attach =~ /^3[A-Z]$/
+          date = item.text[/board_minutes_(\d+_\d+_\d+)\.txt/, 1]
+          if date
+            $http.get("../text/minutes/#{date}").success { |response|
+              @minute_text = response
+            }
+          end
+        elsif item.title == 'Adjournment' and @mode == :secretary
+          @todo = TODO.get()
+        end
+
+      else
+        $scope.layout item: {title: 'not found'}
+      end
+    end
+
+    watch @agenda.update + Minutes.status do
+      if @mode == :secretary
+        item = @agenda.find {|item| item.href == section}
+        if item and Minutes.ready
+          if item.attach =~ /^7\w$/
+            Actions.add 'vote-button', 'vote.html'
+          elsif item.attach =~ /^3\w$/
+            Actions.add 'minute-button', 'minute.html'
+            if @minutes[@item.title] == 'approved' and 
+              Minutes.posted.include? @item.text[/board_minutes_\w+\.txt/]
+              Actions.add 'publish-minutes-button', 'publish-minutes.html'
+            else
+              Actions.remove 'publish-minutes-button'
+            end
+          elsif ['Call to order', 'Adjournment'].include? item.title
+            if @minutes[item.title]
+              Actions.remove 'timestamp-button'
+              Actions.add 'minute-button', 'minute.html'
+
+              if Minutes.complete 
+                Actions.add 'draft-minutes-button', 'draft-minutes.html'
+              end
+            else
+              Actions.add 'timestamp-button'
+            end
+          else
+            Actions.add 'minute-button', 'minute.html'
+          end
+
+          minute_file = Data.get('agenda').sub('_agenda_', '_minutes_')
+          if Minutes.posted.include? minute_file
+            Actions.remove 'minute-button'
+            Actions.remove 'draft-minutes-button'
+          end
+        end
+      end
+    end
+
+    @pending = Pending.get()
+    watch 'pending.update + agenda.update' do
+      @comment = @pending.comments[@item.attach]
+      $rootScope.comment_label =
+        (@comment && @comment.length > 0 ? 'edit comment' : 'add comment')
+    end
+
+    watch @minutes[@item.title] do |value|
+      @text = value
+      $rootScope.minute_label =
+        (@text && @text.length > 0 ? 'edit minutes' : 'add minutes')
+    end
+
+    def link(resolution)
+      link = nil
+      @agenda.each do |item|
+        link = item.href if item.title == resolution
+      end
+      return link
+    end
+
+    def pmc_report
+      @item.attach.match(/^[A-Z][A-Z]?$/)
+    end
+
+    firstname = Data.get('firstname')
+    def mailto_class
+      @item.shepherd.split(' ').first == firstname ? 'btn-primary' : 'btn-link'
+    end
+
+    def mailto()
+      destination = "mailto:#{@item.chair_email}" +
+        "?cc=private@#{@item.mail_list}.apache.org,board@apache.org"
+
+      if @item.missing
+        subject = "Missing #{@item.title} Board Report"
+        body = "Dear #{@item.owner},\n\nThe board report for " +
+          "#{@item.title} has not yet been submitted for this " +
+          "month's board meeting. If you're unable to get " +
+          "it in by twenty-four hours before meeting time, " +
+          "please plan to report next month.\n\nThanks."
+
+        $rootScope.comment_text.draft ||= 'Reminder email sent'
+        ~'#comment-form'.modal(:show)
+      else
+        subject = "#{@item.title} Board Report"
+        body = @item.comments
+      end
+
+      $window.location = destination +
+        "&subject=#{encodeURIComponent(subject)}" +
+        "&body=#{encodeURIComponent(body)}"
+    end
+  end
+
+  controller :Search do
+    @agenda = Agenda.get()
+    $scope.layout title: "Search", next: {title: 'Comments', href: 'comments'}
+    Actions.add 'refresh-button'
+
+    @search.text = $location.search().q || ''
+    @results = []
+
+    def message
+      if @agenda.length == 0
+        'Loading...'
+      elsif @search.text.length < 3
+        'Please enter at least three characters'
+      elsif @results.length == 0
+        'No matches'
+      end
+    end
+
+    def find_matches()
+      history = @results
+      matches = []
+      if @search.text.length > 2
+        search = @search.text.downcase()
+        @agenda.each do |item|
+          text = item.text || item.report
+          if text and text.downcase().include? search
+            snippets = []
+            text.split(/\n\s*\n/).each do |paragraph|
+              snippets << paragraph if paragraph.downcase().include? search
+            end
+
+            match = {item: item, snippets: snippets}
+            matches <<
+              (history.find {|prev| angular.equals(prev, match)} || match)
+          end
+        end
+      end
+
+      # For some reason `angular.copy matches, @matches` produces
+      # "Maximum call stack size exceeded"
+      @results.clear()
+      angular.extend @results, matches
+    end
+
+    watch @search.text + @agenda.update do
+      $scope.find_matches()
+    end
+  end
+end
diff --git a/www/classic/board/agenda/js/directives._js b/www/classic/board/agenda/js/directives._js
new file mode 100644
index 0000000..f94f98b
--- /dev/null
+++ b/www/classic/board/agenda/js/directives._js
@@ -0,0 +1,142 @@
+#!/usr/bin/ruby
+
+# define filters used in views to help with formatting
+
+module Angular::AsfBoardDirectives
+  # dynamically resize main to leave room for header and footer
+  directive :main do
+    restrict :E
+    def link(scope, element, attr)
+      watch ~'header.navbar'.css(:height) do |value|
+        element.css(marginTop: value)
+      end
+
+      watch ~'footer.navbar'.css(:height) do |value|
+        element.css(marginBottom: value)
+      end
+    end
+  end
+
+  # link traversal via left/right keys
+  directive :body do
+    restrict :E
+    def link(scope, element, attr)
+      element.find('*[autofocus]').focus()
+
+      element.keyup do |event|
+        if Actions.control != event.ctrlKey
+          Actions.control = event.ctrlKey
+          digest()
+        end
+      end
+
+      element.keydown do |event|
+        if Actions.control != event.ctrlKey
+          Actions.control = event.ctrlKey
+          digest()
+        end
+
+        return unless ~('.modal-open').empty? and ~('#search-text').empty?
+        return if event.metaKey or event.ctrlKey
+
+        if event.keyCode == 37 # '<-'
+          ~"a[rel='prev']".click
+          return false
+        elsif event.keyCode == 39 # '->'
+          ~"a[rel='next']".click
+          return false
+        elsif event.keyCode == 13 # enter
+          ~"a.default".click
+          return false
+        elsif event.keyCode == 'C'.ord
+          ~"#comments"[0].scrollIntoView()
+          return false
+        elsif event.keyCode == 'I'.ord
+          ~"#info".click
+          return false
+        elsif event.keyCode == 'N'.ord
+          ~"#nav".click
+          return false
+        elsif event.keyCode == 'A'.ord
+          ~"#agenda".click
+          return false
+        elsif event.keyCode == 'Q'.ord
+          ~"#queue".click
+          return false
+        elsif event.keyCode == 'S'.ord
+          ~"#shepherd".click
+          return false
+        elsif event.shiftKey and event.keyCode == 191 # "?"
+          ~"#help".click
+          return false
+        elsif event.keyCode == 'R'.ord
+          ~'#clock'.show
+          Pending.get()
+          data = {agenda: Data.get('agenda')}
+          $http.post('../json/refresh', data).success do |response|
+            Agenda.put response
+            $route.reload()
+            ~'#clock'.hide
+          end
+          return false
+        end
+      end
+    end
+  end
+
+  # construct full Bootstrap modal dialog from a minimal structure
+  directive :modalDialog do
+    restrict :E
+    replace true
+
+    def template(element, attrs)
+      # detach h4 elements and buttons
+      h4 = element.find('h4').detach()
+      buttons = element.children('button').addClass('btn').detach()
+
+      # add form-control attributes
+      element.children('input, textarea').addClass('form-control')
+
+      # build label elements from label attributes, wrap in a form-group
+      element.find('*[label]').each! do |index, node|
+        ~node.wrap(_div.form_group)
+        ~node.before(_label ~node.attr('label'), for: ~node.attr('id'))
+      end
+
+      # build bootstrap dialog
+      dialog = _div.modal.fade tabindex: -1 do
+        _div.modal_dialog do
+          _div.modal_content do
+            _div.modal_header do
+              _button.close "\u00d7", type: 'button', data_dismiss: 'modal'
+
+              # move h4 class attribute to header; replace with 'modal-title'
+              ~this.addClass(h4.attr(:class)) if h4.attr(:class)
+              ~this.append(h4.attr(class: 'modal-title'))
+            end
+
+            _div.modal_body do
+              # move remaining nodes to the body
+              ~this.append(element.children())
+            end
+
+            _div.modal_footer do
+              # move buttons to the footer
+              ~this.append(buttons)
+            end
+          end
+        end
+      end
+
+      # return dialog as html
+      return dialog[0].outerHTML
+    end
+
+    def link(scope, element, attr)
+      # implement autofocus
+      element.on('shown.bs.modal') do
+        element.find('*[autofocus]').focus()
+      end
+    end
+  end
+end
diff --git a/www/classic/board/agenda/js/filters._js b/www/classic/board/agenda/js/filters._js
new file mode 100644
index 0000000..2cbed37
--- /dev/null
+++ b/www/classic/board/agenda/js/filters._js
@@ -0,0 +1,249 @@
+#!/usr/bin/ruby
+
+# define filters used in views to help with formatting
+
+module Angular::AsfBoardFilters
+
+  # determine the color of banners for a given agenda item
+  filter :color do |item|
+    if not item.title
+      return 'blank'
+    elsif item.warnings
+      return 'missing'
+    elsif item.missing
+      return 'missing'
+    elsif Pending.rejected.include? item.attach
+      return 'missing'
+    elsif item.approved
+      if item.approved.length < 5
+        return 'ready'
+      elsif item.comments
+        return 'commented'
+      else
+        return 'reviewed'
+      end
+    elsif item.text or item.report
+      return 'available'
+    elsif item.text === undefined
+      return 'missing'
+    else
+      return 'reviewed'
+    end
+  end
+
+  # define regular expressions and constants used in converting an item
+  # to HTML
+
+  def escapeRegExp(string)
+    # https://developer.mozilla.org/en/docs/Web/JavaScript/Guide/Regular_Expressions
+    return string.gsub(/([.*+?^=!:${}()|\[\]\/\\])/, "\\$1");
+  end 
+
+  uri_in_text = Regexp.new(/(^|[\s.:;?\-\]<\(])
+    (https?:\/\/[-\w;\/?:@&=+$.!~*'()%,#]+[\w\/])
+    (?=$|[\s.:,?\-\[\]&\)])/x, "g")
+
+  escape_html = Regexp.new('[&<>]', 'g')
+  escape_replacement = {'&' => '&amp;', '<' => '&lt;', '>' => '&gt;'}
+
+  private_sections =
+    Regexp.new('^([ \t]*)(&lt;private&gt;(?:\n|.)*?&lt;/private&gt;)(\s*)$',
+    'mig')
+
+  jira_issue =
+    Regexp.new(/(^|\s|\()([A-Z][A-Z0-9]+)-([1-9][0-9]*)([.,;:\s)]|$)/, 'g')
+
+  # convert an agenda item into HTML
+  filter :html do |item|
+    text = (typeof(item) === "string" ? item : item.text || item.report)
+
+    # start by escaping everything
+    if text and text != ''
+      text.gsub!(escape_html) {|c| escape_replacement[c]}
+    elsif item.text === undefined
+      if Agenda.get().length == 0
+        text = '<em>Loading...</em>'
+      else
+        text = '<em>Missing</em>'
+      end
+    else
+      text = '<em>Empty</em>'
+    end
+
+    # highlight private sections
+    text.gsub! private_sections, '<div class="private">$1$2</div>'
+
+    # link to board minutes
+    text.gsub! /board_minutes_(\d+)_\d+_\d+\.txt/ do |match, year|
+      if Data.drafts.include? match
+        link = "https://svn.apache.org/repos/private/foundation/board/#{match}"
+      else
+        link = "http://apache.org/foundation/records/minutes/#{year}/#{match}"
+      end
+      "<a href='#{link}'>#{match}</a>"
+    end
+
+    # convert textual links into hyperlinks
+    text.gsub! uri_in_text do |match, pre, link|
+      text = link
+      text.sub!(%r{http://www.timeanddate.com/worldclock/fixedtime.html\?iso=(\d{4})(\d\d)(\d\d)T(\d\d)(\d\d).*}, '$1-$2-$3T$4:$5Z')
+      "#{pre}<a href='#{link}'>#{text}</a>"
+    end
+
+    # Show Call to Order time in local time
+    if item.timestamp
+      text.sub! /\n(\s+)(Other Time Zones:.*)/ do |match, spaces, text|
+        localtime = Date.new(item.timestamp).toLocaleString()
+        "\n#{spaces}<span class='hilite'>Local Time: #{localtime}</span>#{spaces}#{text}"
+      end
+    end
+
+    roster = 'https://whimsy.apache.org/roster/committer/'
+
+    # replace ids with committer links
+    if item.people
+      for id in item.people
+        person = item.people[id]
+
+        # email addresses in 'Establish' resolutions
+        text.gsub! /(\(|&lt;)(#{id})( at |@|\))/ do |m, pre, id, post|
+          if person.icla
+            "#{pre}<a href='#{roster}#{id}'>#{id}</a>#{post}"
+          else
+            "#{pre}<a class='missing' href='#{roster}?q=#{person.name}'>" +
+              "#{id}</a>#{post}"
+          end
+        end
+
+        # names
+        if person.icla or item.title == 'Roll Call'
+          text.sub! /#{escapeRegExp(person.name)}/, 
+            "<a href='#{roster}#{id}'>#{person.name}</a>"
+        end
+
+        # highlight potentially misspelled names
+        if person.icla and not person.icla == person.name
+          names = person.name.split(/\s+/)
+          iclas = person.icla.split(/\s+/)
+          ok = false
+          ok ||= names.all? {|part| iclas.any? {|icla| icla.include? part}}
+          ok ||= iclas.all? {|part| names.any? {|name| name.include? part}}
+          if item.title =~ /^Establish/ and not ok
+            text.gsub! /#{escapeRegExp("#{id}'>#{person.name}")}/,
+              "?q=#{encodeURIComponent(person.name)}'>" +
+              "<span class='commented'>#{person.name}</span>"
+          else
+            text.gsub! /#{escapeRegExp(person.name)}/, 
+              "<a href='#{roster}#{id}'>#{person.name}</a>"
+          end
+        end
+
+        # put members names in bold
+        if person.member
+          text.gsub! /#{escapeRegExp(person.name)}/, "<b>#{person.name}</b>"
+        end
+      end
+
+      # treat any unmatched names in Roll Call as misspelled
+      if item.title == 'Roll Call'
+        text.gsub! /(\n\s{4})([A-Z].*)/ do |match, space, name|
+          "#{space}<a class='commented' href='#{roster}?q=#{name}'>#{name}</a>"
+        end
+      end
+
+      if item.title =~ /^Change/
+        text.gsub! /heretofore\sappointed\s(\w.*)\sto/ do |match, name|
+          match.gsub name, 
+            "<a class='missing' href='#{roster}?q=#{name}'>#{name}</a>"
+        end
+        text.gsub! /recommend\s(\w.*)\sas/ do |match, name|
+          match.gsub name, 
+            "<a class='missing' href='#{roster}?q=#{name}'>#{name}</a>"
+        end
+      end
+    end
+
+    # expand president's attachments
+    match = text.match(/Additionally, please see Attachments (\d) through (\d)/)
+    if match
+      agenda = Agenda.get()
+      for i in 0...agenda.length
+        next unless agenda[i].attach =~ /^\d$/
+        if agenda[i].attach >= match[1] and agenda[i].attach <= match[2]
+          text += "\n  #{agenda[i].attach}. " +
+            "<a #{ agenda[i].report.empty? ? 'class="pres-missing" ' : ''}" +
+            "href='#{agenda[i].href}'>#{agenda[i].title}</a>"
+        end
+      end
+    end
+
+    if item.title == 'Action Items'
+      text.gsub! /Status:\s*?(\n\n|$)/, 
+        "<span class='missing'>Status:</span>$1"
+    end
+
+    # link to JIRA issues
+    text.gsub! jira_issue do |m, pre, jira, issue, post|
+      if JIRA.exist jira
+        return "#{pre}<a target='_self' " +
+          "href='https://issues.apache.org/jira/browse/#{jira}-#{issue}'>" +
+          "#{jira}-#{issue}</a>#{post}"
+      else
+        return "#{pre}#{jira}-#{issue}#{post}"
+      end
+    end
+
+    # return the resulting HTML
+    return $sce.trustAsHtml(text)
+  end
+
+  filter :hilight do |text, search|
+    if text and text != ''
+      text.gsub!(escape_html) {|c| escape_replacement[c]}
+      
+      search = search.text.gsub(escape_html) {|c| escape_replacement[c]}
+      text.gsub! /#{search}/i do |match|
+        "<span class='hilite'>#{match}</span>"
+      end
+    end
+
+    return $sce.trustAsHtml(text)
+  end
+
+  filter :approved do |agenda, pending|
+    approved = []
+    agenda.each do |item|
+      approved << item if pending.approved.include? item.attach
+    end
+    return approved
+  end
+
+  filter :comments do |agenda, pending|
+    comments = []
+    agenda.each do |item|
+      if pending.comments[item.attach]
+        item.comment = pending.comments[item.attach]
+        comments.push(item)
+      end
+    end
+    return comments
+  end
+
+  filter :csplit do |text|
+    comments = []
+    return comments if text === undefined
+
+    comment = ''
+    text.split("\n").each do |line|
+      if line =~ /^\S/
+        comments << comment unless comment.empty?
+        comment = line
+      else
+        comment += "\n" + line
+      end
+    end
+
+    comments << comment unless comment.empty?
+    return comments
+  end
+end
diff --git a/www/classic/board/agenda/js/services._js b/www/classic/board/agenda/js/services._js
new file mode 100644
index 0000000..eeadb48
--- /dev/null
+++ b/www/classic/board/agenda/js/services._js
@@ -0,0 +1,434 @@
+#!/usr/bin/ruby
+
+module Angular::AsfBoardServices
+
+  # The Agenda "service" maintains an agenda as an array of hash objects.
+  # Care is taken to never replace arrays, but rather to empty and refill
+  # existing arrays so that Angular.js's two way bindings will cause views
+  # to be updated.  A separate 'update' property is maintained to facilitate
+  # watches for major updates.
+
+  class Agenda
+    @@index = []
+    @@actions = {}
+
+    # (re)-fetch agenda from server
+    def self.refresh()
+      @@agenda ||= []
+      @@agenda.update ||= 0
+      $http.get("../#{Data.date}.json").success do |result, status|
+        Agenda.put(result) unless status==304 and @@index.length>0
+      end
+    end
+
+    # Replace the agenda, relinking and reindexing as we go.
+    def self.put(agenda)
+      # add forward and back links to entries in the agenda
+      prev = nil
+      agenda.each do |item, index|
+        agenda[index] = item = Agenda.new(item)
+        prev.next = item if prev
+        item.prev = prev
+        prev = item
+      end
+
+      # remove president attachments from the normal flow
+      agenda.each do |pres|
+        match = pres.report and pres.report.
+          match(/Additionally, please see Attachments (\d) through (\d)/)
+        next unless match
+
+        first = last = nil
+        agenda.each do |item|
+          first = item if item.attach == match[1]
+          item.shepherd ||= pres.shepherd if first and !last
+          last  = item if item.attach == match[2]
+        end
+
+        if first and last
+          first.prev.next = last.next
+          last.next.prev = first.prev
+          last.next.index = first.index
+          first.index = nil
+          last.next = pres
+          first.prev = pres
+        end
+      end
+
+      # add index entries to @@index, extract start and stop times
+      @@index.clear()
+      agenda.each do |item|
+        @@index << item if item.index
+        @@start = item.timestamp if item.title == 'Call to order'
+        @@stop  = item.timestamp if item.title == 'Adjournment'
+      end
+
+      @@agenda.replace agenda
+
+      actions = self.find('Action Items')
+      angular.copy actions.actions, @@actions if actions and actions.actions
+
+      @@agenda.update += 1
+    end
+
+    # retrieve agenda (fetching if necessary)
+    def self.get()
+      self.refresh() unless @@agenda
+
+      unless @@update or Date.new().getTime() > Agenda.stop
+        @@update = interval 10_000 do
+          Agenda.refresh()
+        end
+      end
+
+      return @@agenda
+    end
+
+    # return back a list of index entries
+    def self.index
+      return @@index
+    end
+
+    def self.start
+      @@start
+    end
+
+    def self.stop
+      @@stop
+    end
+
+    def self.find(title)
+      return unless @@agenda
+      match = nil
+      @@agenda.each do |item|
+        match = item if item.title == title
+      end
+      return match
+    end
+
+    def self.actions
+      @@actions
+    end
+
+    def initialize(item)
+      angular.copy item, self
+    end
+
+    def href
+      self.title.gsub(/[^a-zA-Z0-9]+/, '-')
+    end
+
+    def qhref
+      "queue/#{self.href}"
+    end
+
+    def ready
+      return false unless self.approved
+      return false unless self.report or self.text
+      return false if self.approved.include? Data.get('initials')
+      return false if Pending.rejected.include? self.attach
+      return true
+    end
+
+    def qnext
+      link = self.next
+      while link and not link.ready
+        link = link.next
+      end
+      return link
+    end
+
+    def qprev
+      link = self.prev
+      while link and not link.ready
+        link = link.prev
+      end
+      return link
+    end
+
+    def sqhref
+      "shepherd/queue/#{self.href}"
+    end
+
+    def sqnext
+      shepherd = self.shepherd.split(' ')[0]
+      link = self.next
+      while link and link.shepherd
+        return link if link.shepherd.split(' ')[0] == shepherd
+        link = link.next
+      end
+    end
+
+    def sqprev
+      shepherd = self.shepherd.split(' ')[0]
+      link = self.prev
+      while link and link.shepherd
+        return link if link.shepherd.split(' ')[0] == shepherd
+        link = link.prev
+      end
+    end
+  end
+
+  # This class represents "pending" Director actions, such as approvals
+  # and comments.  It also keeps track of rejected reports and seen comments.
+  class Pending
+    @@list = {comments: {}, approved: [], rejected: [], seen: {}, update: 0}
+
+    def self.refresh()
+      $http.get("../json/pending").success do |result|
+        Pending.put result if result.agenda == Data.get('agenda')
+      end
+
+      @@fetched = true
+      return @@list
+    end
+
+    def self.get()
+      self.refresh() unless @@fetched
+      return @@list
+    end
+
+    def self.put(value)
+      angular.copy value.approved, @@list.approved if value.approved
+      angular.copy value.rejected, @@list.rejected if value.rejected
+      angular.copy value.comments, @@list.comments if value.comments
+      angular.copy value.seen, @@list.seen         if value.seen
+      @@list.update += 1
+    end
+
+    def self.count
+      @@list.comments.keys().length + @@list.approved.keys().length
+    end
+
+    def self.approved
+      self.refresh() unless @@fetched
+      @@list.approved
+    end
+
+    def self.rejected
+      self.refresh() unless @@fetched
+      @@list.rejected
+    end
+  end
+
+  class Minutes
+    @@index = {}
+    @@draft = {}
+    @@update = nil
+    @@ready = 0
+    @@posted = Data.get('drafts').split(' ')
+
+    def self.get()
+      if @@date != Data.date
+        @@fetched = false
+        $interval.cancel(@@update) if @@update
+      end
+
+      unless @@fetched and (Date.new().getTime()-@@fetched) < 10_000
+        @@fetched = Date.new().getTime()
+        @@date = Data.date
+
+        $http.get("../json/minutes/#{@@date}").success do |result, status|
+          if status != 304 or @@index.keys().length == 0
+            angular.copy result, @@index
+          end
+          @@ready = true
+        end
+      end
+
+      unless @@update or @@fetched<Agenda.start or @@fetched>Agenda.stop
+        @@update = interval 10_000 do
+          Minutes.get()
+        end
+      end
+
+      return @@index
+    end
+
+    def self.put(minutes)
+      angular.copy minutes, @@index
+    end
+
+    def self.new_actions
+      Minutes.get()
+      @@actions ||= []
+      actions = []
+      for title in @@index
+        minutes = @@index[title] + "\n\n"
+        pattern = RegExp.new('^(?:@|AI\s+)(\w+):?\s+([\s\S]*?)(\n\n|$)', 'gm')
+        match = pattern.exec(minutes)
+        while match
+          text = match[2].gsub(/\n/, ' ')
+          indent = match[1].gsub(/./, ' ') + '    '
+          item = Agenda.find(title)
+          actions << self.find_action(title, (item.href if item),
+            Flow.comment(text, "* #{match[1]}", indent));
+          match = pattern.exec(minutes)
+        end
+      end
+      @@actions.replace(actions)
+      @@actions
+    end
+
+    def self.find_action(title, link, text)
+      match = @@actions.find do |action|
+        action.title == title and action.link == link and action.text == text
+      end
+      return match || {title: title, link: link, text: text}
+    end
+
+    def self.ready
+      @@ready
+    end
+
+    def self.complete
+      @@index['Adjournment'] ? 1 : 0
+    end
+
+    def self.draft
+      @@draft
+    end
+
+    def self.posted
+      @@posted
+    end
+
+    def self.status
+      Minutes.ready + Minutes.complete + Minutes.posted.length
+    end
+  end
+
+  class JIRA
+    @@fetched = false
+    @@projects = []
+    def self.exist(name)
+      if not @@fetched
+        @@fetched = true
+        ~'#clock'.show
+        $http.get('../json/jira').success do |result|
+          @@projects.replace result
+          ~'#clock'.hide
+        end
+      end
+
+      return @@projects.include? name
+    end
+  end
+
+  class Data
+    def self.get(name)
+      main = document.querySelector("main[data-#{name}]")
+      return main && main.attributes["data-#{name}"].value
+    end
+
+    def self.date
+      Data.get('agenda')[/(\d+_\d+_\d+)/,1].gsub('_', '-')
+    end
+
+    def self.drafts
+      Data.get('drafts').split(' ')
+    end
+  end
+
+
+  class Flow
+    # reflow comment
+    def self.comment(comment, initials, indent='    ')
+      lines = comment.split("\n")
+      len = 71 - indent.length
+      for i in 0...lines.length
+        lines[i] = (i == 0 ? initials + ': ' : "#{indent} ") + lines[i].
+          gsub(/(.{1,#{len}})( +|$\n?)|(.{1,#{len}})/, "$1$3\n#{indent}").
+          trim()
+      end
+      return lines.join("\n")
+    end
+
+    # reflow text
+    def self.text(text, indent='')
+      # join consecutive lines (making exception for <markers> like <private>)
+      text.gsub! /([^\s>])\n(\w)/, '$1 $2'
+
+      # reflow each line
+      lines = text.split("\n")
+      len = 78 - indent.length
+      for i in 0...lines.length
+        indent = lines[i].match(/( *)(.?.?)(.*)/m)
+
+        if indent[1] == '' or indent[3] == ''
+          # not indented (or short) -> split
+          lines[i] = lines[i].
+            gsub(/(.{1,#{len}})( +|$\n?)|(.{1,#{len}})/, "$1$3\n").
+            sub(/[\n\r]+$/, '')
+        else
+          # preserve indentation.  indent[2] is the 'bullet' (if any) and is
+          # only to be placed on the first line.
+          n = 76 - indent[1].length;
+          lines[i] = indent[3].
+            gsub(/(.{1,#{n}})( +|$\n?)|(.{1,#{n}})/, indent[1] + "  $1$3\n").
+            sub(indent[1] + '  ', indent[1] + indent[2]).
+            sub(/[\n\r]+$/, '')
+        end
+      end
+
+      return lines.join("\n")
+    end
+  end
+
+  class Actions
+    @@buttons = []
+    @@forms = []
+
+    def self.control=(value)
+      @@control = value
+    end
+
+    def self.control
+      @@control
+    end
+
+    def self.reset()
+      @@buttons.clear()
+      @@forms.clear()
+    end
+
+    def self.buttons
+      @@buttons
+    end
+
+    def self.forms
+      @@forms
+    end
+
+    def self.add button, form
+      @@buttons << button unless @@buttons.include? button
+      if form
+         form = "../partials/#{form}" 
+        @@forms << form unless @@forms.include? form
+      end
+    end
+
+    def self.remove button
+      index = @@buttons.indexOf(button)
+      @@buttons.splice(index, 1) if index > -1
+    end
+  end
+
+  class TODO
+    @@update = 0
+    @@agenda = Agenda.get()
+    @@list = {add: [], remove: []}
+
+    def self.get()
+      if @@agenda.update > @@update
+        $http.get("../json/secretary_todos/#{Data.date}").success do |result, status|
+          unless status==304 and !@@list.keys.empty?
+            angular.copy result, @@list unless angular.equals result, @@list
+          end
+        end
+      end
+
+      return @@list
+    end
+  end
+end
diff --git a/www/classic/board/agenda/json/approve._json b/www/classic/board/agenda/json/approve._json
new file mode 100644
index 0000000..6ce0f18
--- /dev/null
+++ b/www/classic/board/agenda/json/approve._json
@@ -0,0 +1,30 @@
+#
+# Pre-app approval of an agenda item by a Director
+#
+
+pending = Pending.get(env.user)
+pending['initials'] = @initials
+
+approved = pending['approved']
+rejected = pending['rejected']
+
+if pending['agenda'] != @agenda
+  approved.clear
+  rejected.clear
+  pending['seen'].clear
+  pending['comments'].clear
+  pending['agenda'] = @agenda
+end
+
+if @request == 'approve'
+  approved << @attach unless approved.include? @attach
+  rejected.delete @attach
+elsif @request == 'reject'
+  rejected << @attach unless rejected.include? @attach
+else
+  approved.delete @attach
+end
+
+Pending.put(env.user, pending)
+
+_! pending
diff --git a/www/classic/board/agenda/json/attend._json b/www/classic/board/agenda/json/attend._json
new file mode 100644
index 0000000..c7cc976
--- /dev/null
+++ b/www/classic/board/agenda/json/attend._json
@@ -0,0 +1,95 @@
+unless @name
+  @name = ASF::Person.find(@userid).public_name
+end
+
+agenda_file = "#{FOUNDATION_BOARD}/#{@agenda}"
+
+File.open(agenda_file, 'r') do |file|
+  file.flock(File::LOCK_EX)
+  `svn cleanup #{File.dirname(agenda_file)}`
+  `svn up #{agenda_file}`
+  `svn revert #{agenda_file}`
+
+  agenda = File.read(agenda_file)
+
+  directors = agenda[/^ +Directors.*?:\n\n.*?\n\n +Directors.*?:\n\n.*?\n\n/m]
+  officers = agenda[/^ +Executive.*?:\n\n.*?\n\n +Executive.*?:\n\n.*?\n\n/m]
+  guests = agenda[/^ +Guests.*?:\n\n.*?\n\n/m]
+
+  if directors.include? @name
+
+    updated = directors.sub /^ .*#{@name}.*?\n/, ''
+
+    if @action == 'regrets'
+      updated[/Absent:\n\n.*?\n()\n/m, 1] = "        #{@name}\n"
+      updated.sub! /:\n\n +none\n/, ":\n\n"
+      updated.sub! /Present:\n\n\n/, "Present:\n\n        none\n\n"
+    else
+      updated[/Present:\n\n.*?\n()\n/m, 1] = "        #{@name}\n"
+      updated.sub! /Absent:\n\n\n/, "Absent:\n\n        none\n\n"
+
+      # sort Directors
+      updated.sub!(/Present:\n\n(.*?)\n\n/m) do |match|
+        before=$1
+        after=before.split("\n").sort_by {|name| name.split.rotate(-1)}
+        match.sub(before, after.join("\n"))
+      end
+    end
+
+    agenda.sub! directors, updated
+
+  elsif officers.include? @name
+
+    updated = officers.sub /^ .*#{@name}.*?\n/, ''
+
+    if @action == 'regrets'
+      updated[/Absent:\n\n.*?\n()\n/m, 1] = "        #{@name}\n"
+      updated.sub! /:\n\n +none\n/, ":\n\n"
+      updated.sub! /Present:\n\n\n/, "Present:\n\n        none\n\n"
+    else
+      updated[/Present:\n\n.*?\n()\n/m, 1] = "        #{@name}\n"
+      updated.sub! /Absent:\n\n\n/, "Absent:\n\n        none\n\n"
+    end
+
+    agenda.sub! officers, updated
+
+  elsif @action == 'regrets'
+
+    updated = guests.sub /^ .*#{@name}.*?\n/, ''
+    updated.sub! /:\n\n\n/, ":\n\n        none\n"
+
+    agenda.sub! guests, updated
+
+  elsif not guests.include? @name
+
+    updated = guests.sub /\n\Z/, "\n        #{@name}\n"
+    updated.sub! /:\n\n +none\n/, ":\n\n"
+
+    agenda.sub! guests, updated
+
+  end
+
+  File.open(agenda_file, 'w') {|file| file.write(agenda)}
+
+  if @action == 'regrets'
+    message = "Regrets for the meeting."
+  else
+    message = "I plan to attend the meeting."
+  end
+
+  commit = ['svn', 'commit', '-m', message, agenda_file,
+    '--no-auth-cache', '--non-interactive']
+
+  if env.password
+    commit += ['--username', env.user, '--password', env.password]
+  end
+
+  require 'shellwords'
+  output = `#{Shellwords.join(commit).untaint} 2>&1`
+  if $?.exitstatus != 0
+    _.error (output.empty? ? 'svn commit failed' : output)
+    raise Exception.new('svn commit failed')
+  end
+
+  _! ASF::Board::Agenda.parse(File.read(agenda_file))
+end
diff --git a/www/classic/board/agenda/json/comment._json b/www/classic/board/agenda/json/comment._json
new file mode 100644
index 0000000..a81f2fa
--- /dev/null
+++ b/www/classic/board/agenda/json/comment._json
@@ -0,0 +1,19 @@
+#
+# Add comments to an agenda item
+#
+
+pending = Pending.get(env.user)
+pending['initials'] = @initials
+pending['agenda'] = @agenda
+
+comments = pending['comments']
+
+if not @comment or @comment.strip.empty?
+  comments.delete @attach
+else
+  comments[@attach] = @comment
+end
+
+Pending.put(env.user, pending)
+
+_! pending
diff --git a/www/classic/board/agenda/json/commit._json b/www/classic/board/agenda/json/commit._json
new file mode 100644
index 0000000..931c4fc
--- /dev/null
+++ b/www/classic/board/agenda/json/commit._json
@@ -0,0 +1,106 @@
+#
+# Bulk apply comments and pre-approvals to agenda file
+#
+
+# apply comments to an agenda file
+def apply_comments(agenda_file, updates)
+  agenda = File.read(agenda_file)
+  approved = updates['approved']
+  comments = updates['comments']
+  initials = updates['initials']
+
+  patterns = {
+   '' => /
+     ^\s{7}See\sAttachment\s\s?(\w+)[^\n]*?\s+
+     \[\s[^\n]*\s*approved:\s*?(.*?)
+     \s*comments:(.*?)\n\s{9}\]
+     /mx,
+
+   '3' => /
+     ^\s{4}(\w)\.\sThe\smeeting\sof.*?
+     \[\s[^\n]*\s*approved:\s*?(.*?)
+     \s*comments:(.*?)\n\s{9}\]
+     /mx,
+
+   '4' => /
+     ^\s{4}(\w)\.\sPresident\s\[.*?
+     \[\s*comments:()(.*?)\n\s{9}\]
+     /mx,
+  }
+
+  patterns.each do |prefix, pattern|
+    agenda.gsub!(pattern) do |match|
+      attachment, approvals = prefix + $1, $2
+
+      if approved.include? attachment
+        approvals = approvals.strip.split(/(?:,\s*|\s+)/)
+        if approvals.include? initials
+          # do nothing
+        elsif approvals.empty?
+          match[/approved:(\s*)\n/, 1] = " #{initials}"
+        else
+          match[/approved:.*?()\n/, 1] = ", #{initials}"
+        end
+      end
+
+      if comments.include? attachment
+        width = 79-13-initials.length
+        text = comments[attachment].reflow(13+initials.length, width)
+        text[/ *(#{' '*(initials.length+2)})/,1] = "#{initials}: "
+        match[/\n()\s{9}\]/,1] = "#{text}\n"
+      end
+
+      match
+    end
+  end
+
+  File.open(agenda_file, 'w') {|file| file.write(agenda)}
+end
+
+user = env.user
+user = user.dup.untaint if user =~ /\A\w+\Z/
+updates = YAML.load_file("#{MINUTES_WORK}/#{user}.yml")
+
+agenda = updates['agenda']
+agenda = agenda.dup.untaint if agenda =~ /\Aboard_agenda_[\d_]+\.txt\Z/
+agenda_file = "#{FOUNDATION_BOARD}/#{agenda}"
+
+if __FILE__ == $0
+  # for testing purposes
+  require 'whimsy/asf'
+  MINUTES_WORK = '/var/tools/data'
+  apply_comments(agenda_file, updates)
+  `svn diff #{agenda_file}`
+else
+  File.open(agenda_file, 'r') do |file|
+    file.flock(File::LOCK_EX)
+    `svn cleanup #{File.dirname(agenda_file)}`
+    `svn up #{agenda_file}`
+    `svn revert #{agenda_file}`
+
+    apply_comments(agenda_file, updates)
+
+    commit = ['svn', 'commit', '-m', @message, agenda_file,
+      '--no-auth-cache', '--non-interactive']
+
+    if env.password
+      commit += ['--username', env.user, '--password', env.password]
+    end
+
+    require 'shellwords'
+    output = `#{Shellwords.join(commit).untaint} 2>&1`
+    if $?.exitstatus != 0
+      _.error (output.empty? ? 'svn commit failed' : output)
+      raise Exception.new('svn commit failed')
+    end
+
+    pending = Pending.get(env.user)
+    File.rename "#{MINUTES_WORK}/#{user}.yml", "#{MINUTES_WORK}/#{user}.bak"
+    pending['approved'].clear
+    pending['comments'].clear
+    Pending.put(env.user, pending)
+
+    _pending pending
+    _agenda ASF::Board::Agenda.parse(File.read(agenda_file))
+  end
+end
diff --git a/www/classic/board/agenda/json/draft._json b/www/classic/board/agenda/json/draft._json
new file mode 100644
index 0000000..11b7f5b
--- /dev/null
+++ b/www/classic/board/agenda/json/draft._json
@@ -0,0 +1,31 @@
+#
+# commit draft minutes to SVN
+#
+
+minutes_file = "#{FOUNDATION_BOARD}/#{@minutes}"
+minutes_file.untaint if @minutes =~ /^board_minutes_\d+_\d+_\d+.txt$/
+
+unless File.exist? minutes_file
+  agenda_file = minutes_file.sub('_minutes_', '_agenda_')
+  `svn cp #{agenda_file} #{minutes_file}` if File.exist? agenda_file
+
+  File.open(minutes_file, 'w') { |file| file.write @draft }
+
+  `svn add #{minutes_file}` unless File.exist? agenda_file
+
+  commit = ['svn', 'commit', '-m', @message, minutes_file,
+    '--no-auth-cache', '--non-interactive']
+
+  if env.password
+    commit += ['--username', env.user, '--password', env.password]
+  end
+
+  require 'shellwords'
+  output = `#{Shellwords.join(commit).untaint} 2>&1`
+  if $?.exitstatus != 0
+    _.error (output.empty? ? 'svn commit failed' : output)
+    raise Exception.new('svn commit failed')
+  end
+
+  _! Dir.chdir(FOUNDATION_BOARD) {@drafts = Dir['board_minutes_*.txt'].sort}
+end
diff --git a/www/classic/board/agenda/json/jira._json b/www/classic/board/agenda/json/jira._json
new file mode 100644
index 0000000..766e6bf
--- /dev/null
+++ b/www/classic/board/agenda/json/jira._json
@@ -0,0 +1,8 @@
+uri = URI.parse('https://issues.apache.org/jira/rest/api/2/project')
+http = Net::HTTP.new(uri.host, uri.port)
+http.use_ssl = true
+http.verify_mode = OpenSSL::SSL::VERIFY_NONE
+request = Net::HTTP::Get.new(uri.request_uri)
+
+response = http.request(request)
+_! JSON.parse(response.body).map {|project| project['key']}
diff --git a/www/classic/board/agenda/json/markseen._json b/www/classic/board/agenda/json/markseen._json
new file mode 100644
index 0000000..a06c71e
--- /dev/null
+++ b/www/classic/board/agenda/json/markseen._json
@@ -0,0 +1,12 @@
+#
+# Mark a set of comments as seen
+#
+
+pending = Pending.get(env.user)
+
+pending['agenda'] = @agenda
+pending['seen'] = @seen
+
+Pending.put(env.user, pending)
+
+_! pending
diff --git a/www/classic/board/agenda/json/minute._json b/www/classic/board/agenda/json/minute._json
new file mode 100644
index 0000000..2f7c75e
--- /dev/null
+++ b/www/classic/board/agenda/json/minute._json
@@ -0,0 +1,30 @@
+#
+# Add secretarial minutes to a given agenda item
+#
+
+@minutes = @agenda.sub('_agenda_', '_minutes_')
+minutes_file = "#{MINUTES_WORK}/#{@minutes.sub('.txt', '.yml')}"
+minutes_file.untaint if @minutes =~ /^board_minutes_\d+-\d+-\d+\.txt$/
+
+if File.exist? minutes_file
+  minutes = YAML.load_file(minutes_file)
+else
+  minutes = {}
+end
+
+if @action == 'timestamp'
+  # commented out as tzinfo is broken on ruby 1.9.3p0 on whimsy
+  # date = @agenda[/\d+_\d+_\d+/].gsub('_', '-')
+  # zone = Time.parse("#{date} PST").dst? ? '-07:00' : '-08:00'
+  month = @agenda[/\d+_(\d+)_\d+/, 1].to_i
+  zone = ((2..9).include? month) ? '-07:00' : '-08:00'
+  @text = Time.now.getlocal(zone).strftime('%-l:%M')
+end
+
+minutes[@title] = @text
+
+File.open(minutes_file, 'w') do |file|
+  file.write YAML.dump(minutes)
+end
+
+_! minutes
diff --git a/www/classic/board/agenda/json/post._json b/www/classic/board/agenda/json/post._json
new file mode 100644
index 0000000..df7a9d7
--- /dev/null
+++ b/www/classic/board/agenda/json/post._json
@@ -0,0 +1,88 @@
+#
+# edit exiting / post new report
+#
+
+user = env.user
+
+agenda_file = "#{FOUNDATION_BOARD}/#{@agenda}"
+
+File.open(agenda_file, 'r') do |file|
+  file.flock(File::LOCK_EX)
+  `svn cleanup #{File.dirname(agenda_file)}`
+  `svn up #{agenda_file}`
+  `svn revert #{agenda_file}`
+
+  agenda = File.read(agenda_file)
+  @report.sub! /\s*\Z/, ''
+
+  if @attach == '7?'
+    # new special order
+
+    # adjust indentation
+    indent = @report.scan(/^ +/).min
+    @report.gsub!(/^#{indent}/, '') if indent
+    @report.gsub!(/^(\S)/, '       \1')
+
+    # add order letter to title
+    order = 'A'
+    ASF::Board::Agenda.parse(agenda).map {|section| section[:attach]}.
+      select {|attach| attach =~ /^7\w/}.length.times {order.succ!}
+    title = "    #{order}. #{@title}\n\n"
+
+    # insert into agenda
+    agenda[/\n() 8\. Discussion Items/, 1] = "#{title}#{@report}\n\n"
+
+    @message = "Post Special Order 7#{order}: #{@title}"
+  else
+    item = ASF::Board::Agenda.parse(agenda).find {|item| item[:attach]==@attach}
+
+    if not item
+      raise Exception.new("Attachment #{@attach.inspect} not found")
+    elsif @digest != item['digest']
+      raise Exception.new("Merge conflict")
+    end
+
+    spacing = "\n\n"
+
+    if @attach =~ /^4\w/
+      pattern = /(\n\n    #{@attach[-1]}\. #{item['title']} \[.*?\]).*?\n\n(    [B-Z]\.| 5\.)/m
+      @report.gsub! /^(.)/, '       \1'
+    elsif @attach =~ /^7\w/
+      pattern = /(^\s+#{@attach[-1]}\.\s+#{@fulltitle})\n.*?\n( {1,6}\w\.)/m
+      @report.gsub! /^(.)/, '       \1'
+    else
+      pattern = /(---\nAttachment #{@attach}:.*?\[.*?\])\n.*?\n(-{40})/m
+      spacing = "\n\n\n"
+    end
+
+    spacing = "" if @report.empty?
+
+    # President report has a custom footer - retain it
+    if item['title'] == 'President' and agenda[pattern]
+      footer = agenda[pattern][/\n\n(\s+Additionally.*?)\s+\w\.\Z/m, 1]
+      @report += "\n\n#{footer}" if footer
+    end
+
+    if not agenda.sub!(pattern) { "#{$1}\n\n#{@report}#{spacing}#{$2}" }
+      raise Exception.new('report merge failed')
+    end
+  end
+
+  File.open(agenda_file, 'w') {|file| file.write(agenda)}
+
+  commit = ['svn', 'commit', '-m', @message, agenda_file,
+    '--no-auth-cache', '--non-interactive']
+
+  if env.password
+    commit += ['--username', env.user, '--password', env.password]
+  end
+
+  require 'shellwords'
+  output = `#{Shellwords.join(commit).untaint} 2>&1`
+  if $?.exitstatus != 0
+    _.error (output.empty? ? 'svn commit failed' : output)
+    raise Exception.new('svn commit failed')
+  end
+
+  _! ASF::Board::Agenda.parse(File.read(agenda_file))
+end
diff --git a/www/classic/board/agenda/json/publish._json b/www/classic/board/agenda/json/publish._json
new file mode 100755
index 0000000..4cadfbc
--- /dev/null
+++ b/www/classic/board/agenda/json/publish._json
@@ -0,0 +1,115 @@
+#
+# Publish approved minutes on the public web site
+#
+
+require 'date'
+require 'whimsy/asf/svn'
+
+CONTENT = 'asf/infrastructure/site/trunk/content'
+BOARD_SITE = ASF::SVN["#{CONTENT}/foundation/board"]
+MINUTES = ASF::SVN["#{CONTENT}/foundation/records/minutes"]
+BOARD_PRIVATE = ASF::SVN['private/foundation/board']
+CALENDAR = "#{BOARD_SITE}/calendar.mdtext"
+
+# update from svn
+[MINUTES, BOARD_SITE, BOARD_PRIVATE].each do |dir| 
+  Dir.chdir(dir) {`svn cleanup`; `svn up`}
+end
+
+calendar = File.read(CALENDAR)
+
+# clean up summary
+@summary = @summary.gsub(/\r\n/,"\n").sub(/\s+\Z/,'') + "\n"
+
+# extract date and year from minutes
+@date.untaint if @date =~ /^\d+_\d+_\d+$/
+date = Date.parse(@date.gsub('_', '-'))
+year = date.year
+fdate = date.strftime("%d %B %Y")
+
+# add year header
+unless calendar.include? "##{year}"
+  calendar[/^()#.*Board meeting minutes #/,1] =
+    "# #{year} Board meeting minutes # {##{year}}\n\n"
+end
+
+# add summary
+if calendar.include? "\n- [#{fdate}]"
+  calendar.sub! /\n-\s+\[#{fdate}\].*?(\n[-#])/m, "\n" + @summary + '\1'
+else
+  calendar[/# #{year} Board meeting minutes #.*\n()/,1] = "\n" + @summary
+end
+
+# remove from calendar
+calendar.sub! /^(\s*-\s+#{fdate}\s*\n)/, ''
+
+#Commit the Minutes
+Dir.chdir MINUTES do
+  unless Dir.exist? year.to_s
+    _.system "mkdir #{year}"
+    _.system "svn add #{year}"
+  end
+
+  if not File.exist? "#{year}/board_minutes_#{@date}.txt"
+    _.system "cp #{BOARD_PRIVATE}/board_minutes_#{@date}.txt #{year}"
+    _.system "svn add #{year}/board_minutes_#{@date}.txt"
+
+    _.system [
+      'svn', 'commit', '-m', @message, year.to_s,
+      ['--no-auth-cache', '--non-interactive'],
+      (['--username', env.user, '--password', env.password] if env.password)
+    ]
+
+    File.unlink 'svn-commit.tmp' if File.exist? 'svn-commit.tmp'
+
+    unless `svn st`.empty?
+      raise "svn failure #{MINUTES}"
+    end
+  end
+end
+
+# Update the Calendar
+Dir.chdir BOARD_SITE do
+  if File.read(CALENDAR) != calendar
+    File.open(CALENDAR, 'w') {|fh| fh.write calendar}
+
+    _.system [
+      'svn', 'commit', '-m', @message, File.basename(CALENDAR),
+      ['--no-auth-cache', '--non-interactive'],
+      (['--username', env.user, '--password', env.password] if env.password)
+    ]
+
+    unless `svn st`.empty?
+      raise "svn failure #{BOARD_SITE}"
+    end
+  end
+end
+
+# Clean up board directory
+Dir.chdir BOARD_PRIVATE do
+  updated = false
+
+  if File.exist? "board_minutes_#{@date}.txt"
+    _.system "svn rm board_minutes_#{@date}.txt"
+    updated = true
+  end
+  
+  if File.exist? "board_agenda_#{@date}.txt"
+    _.system "svn mv board_agenda_#{@date}.txt archived_agendas"
+    updated = true
+  end
+
+  if updated
+    _.system [
+      'svn', 'commit', '-m', @message,
+      ['--no-auth-cache', '--non-interactive'],
+      (['--username', env.user, '--password', env.password] if env.password)
+    ]
+
+    unless `svn st`.empty?
+      raise "svn failure: #{BOARD_PRIVATE}"
+    end
+  end
+end
+
+_! Dir.chdir(BOARD_PRIVATE) {@drafts = Dir['board_minutes_*.txt'].sort}
diff --git a/www/classic/board/agenda/json/refresh._json b/www/classic/board/agenda/json/refresh._json
new file mode 100644
index 0000000..0238766
--- /dev/null
+++ b/www/classic/board/agenda/json/refresh._json
@@ -0,0 +1,17 @@
+#
+# Refresh agenda from svn server
+#
+
+Dir.chdir( FOUNDATION_BOARD ) do
+  `svn cleanup`
+  `svn up`
+
+  file = params[:agenda]
+
+  if Dir['board_agenda_*.txt'].include? file
+    _! AGENDA_CACHE.parse(file.dup.untaint)[:parsed]
+  else
+    throw :agenda_not_found
+  end
+end
+
diff --git a/www/classic/board/agenda/json/todos._json b/www/classic/board/agenda/json/todos._json
new file mode 100644
index 0000000..2a30887
--- /dev/null
+++ b/www/classic/board/agenda/json/todos._json
@@ -0,0 +1,42 @@
+#
+# Secretary post-meeting todo list
+#
+
+agenda = "board_agenda_#{params[:file].gsub('-', '_')}.txt"
+agenda.untaint if params[:file] =~ /^\d+-\d+\d+/
+cache = AGENDA_CACHE[agenda]
+
+transitioning = {}
+establish = {}
+terminate = {}
+
+Dir.chdir(FOUNDATION_BOARD) do
+  cache = AGENDA_CACHE.parse(agenda) if cache[:mtime] != File.mtime(agenda)
+end
+
+if cache and cache[:parsed]
+  cache[:parsed].each do |item|
+    next unless item[:attach] =~ /^7\w$/
+    if item['title'] =~ /^Change .*? Chair$/
+      item['people'].keys.each do |person|
+        transitioning[ASF::Person.find(person)] = item['title']
+      end
+    elsif item['title'] =~ /^Establish\s*(.*?)\s*$/
+      establish[$1] = item['title']
+      transitioning[ASF::Person.find(item['chair'])] = item['title']
+    elsif item['title'] =~ /^Terminate\s*(.*?)\s*$/
+      terminate[$1] = item['title']
+    end
+  end
+end
+
+add = transitioning.keys - ASF.pmc_chairs
+remove = ASF.pmc_chairs - ASF::Committee.list.map(&:chair) - transitioning.keys
+
+_add add.map {|person| {id: person.id, name: person.public_name, 
+  resolution: transitioning[person]}}
+_remove remove.map {|person| {id: person.id, name: person.public_name}}
+_establish establish.map {|name, resolution| {name: name, 
+  resolution: resolution}}
+_terminate terminate.map {|name, resolution| {name: name, 
+  resolution: resolution}}
diff --git a/www/classic/board/agenda/main.rb b/www/classic/board/agenda/main.rb
new file mode 100755
index 0000000..9d4e73d
--- /dev/null
+++ b/www/classic/board/agenda/main.rb
@@ -0,0 +1,148 @@
+#!/usr/bin/ruby
+
+#
+# Server side router/controllers
+#
+
+require 'whimsy/asf/agenda'
+
+require 'wunderbar/sinatra'
+require 'wunderbar/bootstrap/theme'
+require 'wunderbar/angularjs/route'
+require 'wunderbar/jquery/filter'
+require 'wunderbar/underscore'
+require 'wunderbar/backtick'
+require 'ruby2js/filter/functions'
+
+require 'yaml'
+require 'net/http'
+require_relative 'helpers/string'
+
+if ENV['RACK_ENV'] == 'test'
+  FOUNDATION_BOARD = 'test/work/board'
+  MINUTES_WORK = 'test/work/data'
+else
+  FOUNDATION_BOARD = ASF::SVN['private/foundation/board']
+  MINUTES_WORK = '/var/tools/data'
+end
+
+require_relative 'model/pending'
+require_relative 'model/draft'
+
+set :views, File.dirname(__FILE__)
+
+get '/' do
+  agenda = Dir.chdir(FOUNDATION_BOARD) {Dir['board_agenda_*.txt'].sort.last}
+  redirect to("/#{agenda[/\d+_\d+_\d+/].gsub('_', '-')}/")
+end
+
+get %r{/(\d\d\d\d-\d\d-\d\d)/(.*)} do |date, path|
+  Dir.chdir(FOUNDATION_BOARD) {@agendas = Dir['board_agenda_*.txt'].sort}
+  Dir.chdir(FOUNDATION_BOARD) {@drafts = Dir['board_minutes_*.txt'].sort}
+  @base = env['REQUEST_URI'].chomp(path)
+  @agenda = "board_agenda_#{date.gsub('-','_')}.txt"
+  _html :'views/main'
+end
+
+get '/js/:file.js' do
+  _js :"js/#{params[:file]}"
+end
+
+get '/partials/:file.html' do
+  _html :"partials/#{params[:file]}"
+end
+
+get '/json/jira' do
+  _json :'/json/jira'
+end
+
+get '/json/pending' do
+  _json do
+    _! Pending.get(env.user)
+  end
+end
+
+get '/json/secretary_todos/:file' do
+  _json :'/json/todos'
+end
+
+
+post '/json/:file' do
+  _json :"json/#{params[:file]}"
+end
+
+# aggressively cache agenda
+AGENDA_CACHE = Hash.new(mtime: 0)
+def AGENDA_CACHE.parse(file)
+  self[file] = {
+    mtime: File.mtime(file),
+    parsed: ASF::Board::Agenda.parse(File.read(file))
+  }
+end
+
+get %r{(\d\d\d\d-\d\d-\d\d).json} do |file|
+  file = "board_agenda_#{file.gsub('-','_')}.txt"
+  _json do
+    Dir.chdir(FOUNDATION_BOARD) do
+      if Dir['board_agenda_*.txt'].include? file
+        file = file.dup.untaint
+        if AGENDA_CACHE[file][:mtime] != File.mtime(file)
+          AGENDA_CACHE.parse file
+        end
+        last_modified AGENDA_CACHE[file][:mtime]
+        _! AGENDA_CACHE[file][:parsed]
+      end
+    end
+  end
+end
+
+# aggressively cache minutes
+MINUTE_CACHE = Hash.new(mtime: 0)
+def MINUTE_CACHE.parse(file)
+  self[file] = {
+    mtime: File.mtime(file),
+    parsed: YAML.load_file(file)
+  }
+end
+
+get '/json/minutes/:file' do |file|
+  file = "board_minutes_#{file.gsub('-','_')}.yml".untaint
+  _json do
+    Dir.chdir(MINUTES_WORK) do
+      if Dir['board_minutes_*.yml'].include? file
+        last_modified File.mtime(file)
+        _! MINUTE_CACHE.parse(file)[:parsed]
+      end
+    end
+  end
+end
+
+get '/text/minutes/:file' do |file|
+  file = "board_minutes_#{file.gsub('-','_')}.txt".untaint
+  _text do
+    Dir.chdir(FOUNDATION_BOARD) do
+      if Dir['board_minutes_*.txt'].include? file
+        last_modified File.mtime(file)
+        _ File.read(file)
+      else
+        halt 404
+      end
+    end
+  end
+end
+
+get '/text/draft/:file' do |file|
+  agenda = "board_agenda_#{file.gsub('-','_')}.txt".untaint
+  minutes = MINUTES_WORK + '/' + 
+    agenda.sub('_agenda_','_minutes_').sub('.txt','.yml')
+
+  _text do
+    Dir.chdir(FOUNDATION_BOARD) do
+      if Dir['board_agenda_*.txt'].include?(agenda) and File.exist? minutes
+        _ Minutes.draft(agenda, minutes)
+      else
+        halt 404
+      end
+    end
+  end
+end
diff --git a/www/classic/board/agenda/model/draft.rb b/www/classic/board/agenda/model/draft.rb
new file mode 100755
index 0000000..fa0f77f
--- /dev/null
+++ b/www/classic/board/agenda/model/draft.rb
@@ -0,0 +1,195 @@
+#!/usr/bin/ruby1.9.1
+require 'yaml'
+require 'whimsy/asf'
+
+class String
+end
+
+class Minutes
+  def self.draft(agenda_txt, minutes_yaml)
+    minutes = File.read(agenda_txt)
+    @@notes = YAML.load_file(minutes_yaml) rescue {}
+
+    minutes.mreplace(/\n\s1.\sCall\sto\sorder\n+(.*?:)\n\n
+                     ((?:^\s{12}[^\n]*\n)+\n)
+                     (.*?)\n\n\s2.\sRoll\sCall/mx) do |meeting, number, backup|
+      start = notes('Call to order') || '??:??'
+      meeting.gsub! "is scheduled", "was scheduled"
+      meeting.gsub! "will begin as", "began at"
+      meeting.gsub! "soon thereafter that", "#{start} when"
+      meeting.gsub! "quorum is", "quorum was"
+      meeting.gsub! "will be", "was"
+      meeting.gsub! /:\z/, "."
+      backup.gsub! "will be", "was"
+      [meeting.reflow(4,64), '', backup.reflow(4, 68)]
+    end
+
+    minutes.sub! /^ +ASF members are welcome to attend board meetings.*?\n\n/m,
+      ''
+
+    minutes.mreplace(/\n\s2.\sRoll\sCall\n\n
+                     (.*?)\n\n+\s3.\sMinutes
+                     /mx) do |rollcall|
+      if notes('Roll Call')
+        notes('Roll Call').gsub(/\r\n/,"\n").gsub(/\n*\Z/,'').
+          gsub(/^([^\n])/, '    \1')
+      else
+        rollcall.gsub(/ \(expected.*?\)/, '')
+      end
+    end
+
+    minutes.mreplace(/\n\s3.\sMinutes\sfrom\sprevious\smeetings\n\n
+                     (.*?\n\n)
+                     \s4.\sExecutive\sOfficer\sReports
+                     /mx) do |prior_minutes|
+      prior_minutes.mreplace(/\n\s+(\w)\.\sThe\smeeting\sof\s(.*?)\n.*?\n
+                             (\s{7}\[.*?\])\n\n
+                     /mx) do |attach, title, pub_minutes|
+        notes = notes(title)
+        if notes and !notes.empty?
+          notes = 'Approved by General Consent.' if notes == 'approved'
+          notes = 'Tabled.' if notes == 'tabled'
+          [attach, title, notes.reflow(7,62)]
+        else
+          [attach, title, '       Tabled.']
+        end
+      end
+    end
+
+    minutes.mreplace(/\n\s4.\sExecutive\sOfficer\sReports\n
+                     (\n.*?\n\n)
+                     \s5.\sAdditional\sOfficer\sReports
+                     /mx) do |reports|
+      reports.mreplace(/\n\s\s\s\s(\w)\.\s(.*?)\[.*?\](.*?)
+                     ()(?:\n+\s\s\s\s\w\.|\n\n\z)
+                     /mx) do |section, title, report, comments|
+        notes = notes(title)
+        if notes and !notes.empty?
+          [section, title, report, "\n\n" + notes.reflow(7,62)]
+        elsif report.strip.empty?
+          [section, title, report, "\n\n       No report was submitted."]
+        else
+          [section, title, report, ""]
+        end
+      end
+    end
+
+    minutes.mreplace(/\n\s5.\sAdditional\sOfficer\sReports\n
+                     (\n.*?\n\n)
+                     \s7.\sSpecial\sOrders
+                     /mx) do |reports|
+      reports.mreplace(/
+        \n\s\s\s\s\s?(\w+)\.\s([^\n]*?)   # section, title
+        \[([^\n]+)\]\n\n                  # owners
+        \s{7}See\s\s?Attachment\s\s?(\w+)[^\n]* # attach (title)
+        (\s+\[\s.*?approved:\s*?.*?       # approved
+        \s*comments:.*?\n\s{9}\])         # comments
+      /mx) do |section, title, owners, attach, comments|
+        notes = notes(title.sub('VP of','').strip)
+        if notes and !notes.empty?
+          comments = "\n\n" + notes.to_s.reflow(7,62)
+        else
+          comments = ''
+        end
+        [section, title, owners, attach, comments]
+      end
+    end
+
+    minutes.mreplace(/\n\s7.\sSpecial\sOrders\n
+                     (.*?)
+                     \n\s8.\sDiscussion\sItems
+                     /mx) do |reports|
+      break if reports.empty?
+      reports.mreplace(/\n\s\s\s\s(\w)\.(.*?)\n(.*?)()\s+(?:\s*\n\s\s\s\s\w\.|\z)
+                     /mx) do |section, title, order, comments|
+        order.sub! /\n       \[.*?\n         +\]\n/m, ''
+        notes = notes(title.strip)
+        if !notes or notes.empty? or notes.strip == 'tabled'
+          notes = "was tabled."
+        elsif notes == 'unanimous'
+          notes = "was approved by Unanimous Vote of the directors present."
+        end
+        notes = "Special Order 7#{section}, #{title}, " + notes
+        order += "\n" unless order =~ /\n\Z/
+        [section, title, order, "\n" + notes.reflow(7,62)]
+      end
+    end
+
+    minutes.mreplace(/
+      ^((?:\s[89]|\s9|1\d)\.)\s
+      (.*?)\n
+      (.*?)
+      (?=\n[\s1]\d\.|\n===)
+    /mx) do |attach, title, comments|
+      notes = notes(title)
+
+      if notes and !notes.empty?
+        if title =~ /Action Items/
+          comments = notes.gsub(/\r\n/,"\n").gsub(/^/,'    ')
+        elsif title =~ /Discussion Items/
+          comments = notes.gsub(/^/,'    ')+ "\n"
+        elsif title == 'Adjournment'
+          if notes =~ /^1[01]:\d\d/
+            comments = "\n    Adjourned at #{notes} a.m. (Pacific)\n"
+          elsif notes =~ /^\d\d:\d\d/
+            comments = "\n    Adjourned at #{notes} p.m. (Pacific)\n"
+          else
+            comments += "\n" + notes.to_s.reflow(4,68) + "\n"
+          end
+        else
+          comments += "\n" + notes.to_s.reflow(4,68) + "\n"
+        end
+      elsif title == 'Adjournment'
+        comments = "\n    Adjourned at ??:?? a.m. (Pacific)\n"
+      end
+      [attach, title, comments]
+    end
+
+    missing = minutes.scan(/^Attachment (\w\w?):.*\s*\n---/).flatten
+    missing.each do |attach|
+      minutes.sub! /^(\s+)See Attachment #{attach}$/, '\1No report was submitted.'
+    end
+
+    minutes.sub! 'Minutes (in Subversion) are found under the URL:',
+      'Published minutes can be found at:'
+
+    minutes.sub! 'https://svn.apache.org/repos/private/foundation/board/',
+      'http://www.apache.org/foundation/board/calendar.html'
+
+    minutes[/^() 5. Additional Officer Reports/,1] =
+      "    Executive officer reports approved as submitted by General Consent.\n\n"
+
+    minutes[/^() 6. Committee Reports/,1] =
+      "    Additional officer reports approved as submitted by General Consent.\n\n"
+
+    minutes[/^() 7. Special Orders/,1] =
+      "    Committee reports approved as submitted by General Consent.\n\n"
+
+    minutes.sub! 'Meeting Agenda', 'Meeting Minutes'
+    minutes.sub! /^End of agenda/, 'End of minutes'
+
+    minutes.gsub! /^\s*<private>.*?<\/private>\s*?\n/mi, ''
+    minutes.gsub! /\n( *)\[ comments:.*?\n\1 ? ?\]/m, ''
+
+    minutes
+  end
+
+  def self.notes(index)
+    index = index.strip
+    index.sub! /^Report from the VP of /, ''
+    index.sub! /^Report from the /, ''
+    index.sub! /^Status report for the /, ''
+    index.sub! /^Resolution to /, ''
+    index.sub! /^Apache /, ''
+    index.sub! /\sTeam$/, ''
+    index.sub! /\sCommittee$/, ''
+    index.sub! /\sthe\s/, ' '
+    index.sub! /\sApache\s/, ' '
+    index.sub! /\sCommittee\s/, ' '
+    index.sub! /\sProject$/, ''
+    index.sub! /\sPMC$/, ''
+    index.sub! /\sProject\s/, ' '
+  
+    @@notes[index]
+  end
+end
diff --git a/www/classic/board/agenda/model/pending.rb b/www/classic/board/agenda/model/pending.rb
new file mode 100644
index 0000000..88f4960
--- /dev/null
+++ b/www/classic/board/agenda/model/pending.rb
@@ -0,0 +1,24 @@
+class Pending
+  def self.update_file(user)
+    "#{MINUTES_WORK}/#{user}.yml".untaint if user =~ /\A\w+\Z/
+  end
+
+  def self.get(user)
+    file = update_file(user)
+    response = (File.exist?(file) ? YAML.load_file(file) : {})
+
+    # provide empty defaults
+    response['approved'] ||= []
+    response['rejected'] ||= []
+    response['comments'] ||= {} 
+    response['seen']     ||= {}
+
+    response
+  end
+
+  def self.put(user, update)
+    File.open(update_file(user), 'w') do |file|
+      file.write YAML.dump(update)
+    end
+  end
+end
diff --git a/www/classic/board/agenda/partials/comment._html b/www/classic/board/agenda/partials/comment._html
new file mode 100644
index 0000000..5ee0117
--- /dev/null
+++ b/www/classic/board/agenda/partials/comment._html
@@ -0,0 +1,16 @@
+_modal_dialog.comment_form! ng_controller: 'Comment' do
+  _h4.commented 'Enter a comment'
+
+  _input.comment_initials! placeholder: 'initials',
+    ng_model: 'initials', label: 'Initials'
+
+  _textarea.comment_text! :autofocus, rows: 5,
+    placeholder: 'comment', ng_model: 'text.draft', label: 'Comment'
+
+  _button.btn_default 'Cancel', type: 'button', data_dismiss: 'modal',
+    ng_click: 'text.draft = text.base'
+  _button.btn_warning 'Delete', type: 'button', ng_click: 'text.draft = ""',
+    ng_show: 'text.draft'
+  _button.btn_primary 'Save', type: 'button', ng_click: "save(text.draft)",
+    ng_disabled: 'text.draft == text.base'
+end
diff --git a/www/classic/board/agenda/partials/comments._html b/www/classic/board/agenda/partials/comments._html
new file mode 100755
index 0000000..366f2fb
--- /dev/null
+++ b/www/classic/board/agenda/partials/comments._html
@@ -0,0 +1,24 @@
+_p ng_if: '!any_visible' do
+  _em 'No new comments', ng_if: '!toggle'
+  _em 'No comments', ng_if: 'toggle'
+end
+ 
+_div ng_repeat: 'section in visible_comments' do
+  _h3 do
+    _a '{{ section.title }}', ng_href: "{{ section.href }}"
+  end
+
+  _pre.comment ng_bind_html: 'comment | html', 
+    ng_repeat: 'comment in section.comments'
+end
+
+_ng_template.mark_seen_button! do
+  _button.btn.btn_primary '{{ label }}', ng_click: 'click()',
+    ng_controller: 'MarkSeen', ng_disabled: 'disabled',
+    ng_show: 'any_visible || undo'
+end
+
+_ng_template.toggle_seen_button! do
+  _button.btn.btn_primary '{{ label }} seen', ng_click: 'click()',
+    ng_controller: 'ToggleComments', ng_show: 'any_hidden || !toggle'
+end
diff --git a/www/classic/board/agenda/partials/commit._html b/www/classic/board/agenda/partials/commit._html
new file mode 100644
index 0000000..ce99f36
--- /dev/null
+++ b/www/classic/board/agenda/partials/commit._html
@@ -0,0 +1,11 @@
+_modal_dialog.commit_form! ng_controller: 'Commit' do
+  _h4.blank 'Commit message'
+
+  _textarea.commit_text! :autofocus, rows: 5,
+    placeholder: 'commit', ng_model: 'commit_message',
+    ng_disabled: 'disabled', label: 'Commit message'
+
+  _button.btn_default 'Close', type: 'button', data_dismiss: 'modal'
+  _button.btn_primary 'Submit', type: 'button', ng_click: "commit()",
+     ng_disabled: 'disabled'
+end
diff --git a/www/classic/board/agenda/partials/draft-minutes._html b/www/classic/board/agenda/partials/draft-minutes._html
new file mode 100644
index 0000000..0e37b7a
--- /dev/null
+++ b/www/classic/board/agenda/partials/draft-minutes._html
@@ -0,0 +1,13 @@
+_modal_dialog.draft_minutes_form!.wide_form ng_controller: 'DraftMinutes' do
+  _h4.commented 'Commit Draft Minutes to SVN'
+
+  _textarea.minutes_text! :autofocus, rows: 17, label: 'Draft minutes', 
+    ng_model: 'draft[date]', ng_disabled: 'disabled'
+
+  _input.message label: 'Commit message', ng_model: 'message',
+    ng_disabled: 'disabled'
+
+  _button.btn_default 'Close', type: 'button', data_dismiss: 'modal'
+  _button.btn_primary 'Submit', type: 'button', ng_click: "save()",
+    ng_disabled: 'disabled || (title == "") || (report == "")'
+end
diff --git a/www/classic/board/agenda/partials/help._html b/www/classic/board/agenda/partials/help._html
new file mode 100644
index 0000000..5844d80
--- /dev/null
+++ b/www/classic/board/agenda/partials/help._html
@@ -0,0 +1,58 @@
+_div.col_xs_12 do
+  _h3 'Keyboard shortcuts'
+  _dl.dl_horizontal do
+    _dt 'left arrow'
+    _dd 'previous page'
+
+    _dt 'right arrow'
+    _dd 'next page'
+
+    _dt 'enter'
+    _dd 'On Shepherd and Queue pages, go to the first report listed'
+
+    _dt 'C'
+    _dd 'Scroll to comment section (if any)'
+
+    _dt 'I'
+    _dd 'Toggle Info dropdown'
+
+    _dt 'N'
+    _dd 'Toggle Navigation dropdown'
+
+    _dt 'A'
+    _dd 'Navigate to the overall agenda page'
+
+    _dt 'Q'
+    _dd 'Show queued approvals/comments'
+
+    _dt 'S'
+    _dd 'Show shepherded items (and action items)'
+
+    _dt 'ctrl'
+    _dd do
+      _ << 'On report pages, changes <b>approve</b> buttons to <b>reject</b>'
+    end
+
+    _dt '?'
+    _dd 'Help (this page)'
+  end
+
+  _h3 'Color Legend'
+  _ul do
+    _li.missing 'Report missing or has formatting errors'
+    _li.available 'Report present, not eligible for pre-reviews'
+    _li.ready 'Report present, ready for (more) review(s)'
+    _li.reviewed 'Report has sufficient pre-approvals'
+    _li.commented 'Report has been approved, with comments'
+  end
+
+  _h3 'Mode', ng_if: 'user == "rubys"'
+  _form.mode! ng_if: 'user == "rubys"' do
+    %w(secretary director guest).each do |mode|
+      _div do
+        _input mode.capitalize, type: 'radio', name: 'mode', value: mode, 
+          ng_model: 'mode', ng_change: 'set_mode(mode)'
+      end
+    end
+  end
+end
diff --git a/www/classic/board/agenda/partials/index._html b/www/classic/board/agenda/partials/index._html
new file mode 100755
index 0000000..cd56fa4
--- /dev/null
+++ b/www/classic/board/agenda/partials/index._html
@@ -0,0 +1,54 @@
+_header do
+  _h1 'ASF Board Agenda'
+end
+
+_table_.table_bordered ng_controller: 'Index' do
+  _thead do
+    _tr do
+      _th 'Attach'
+      _th 'Title'
+      _th 'Owner'
+      _th 'Shepherd'
+    end
+
+    _tr ng_if: 'agenda.length == 0' do
+      _td.missing 'Loading...', colspan: 4
+    end
+  end
+
+  _tbody_ do
+    _tr ng_repeat: 'item in agenda', class: '{{ item | color }}' do
+      _td '{{ item.attach }}'
+      _td! do
+        _a '{{ item.title }}', ng_href: "{{item.href}}"
+      end
+      _td '{{ item.owner }}'
+      _td '{{ item.shepherd }}'
+    end
+  end
+end
+
+_ng_template.refresh_button! do
+  _button.btn.btn_primary 'refresh', ng_controller: 'Refresh',
+    ng_click: 'click()', ng_disabled: 'disabled'
+end
+
+_ng_template.special_order_button! do
+  _button.btn.btn_primary 'post special order', ng_controller: 'SpecialOrder',
+    data_target: '#special-order-form', data_toggle: 'modal'
+end
+
+_ng_template.draft_minutes_button! do
+  _button.btn.btn_primary 'draft minutes', ng_controller: 'DraftMinutes',
+    data_target: '#draft-minutes-form', data_toggle: 'modal',
+    ng_click: 'draftMinutes()'
+end
+
+_ng_template.publish_minutes_button! do
+  _button.btn.btn_primary 'publish minutes', ng_controller: 'PublishMinutes',
+    data_target: '#publish-minutes-form', data_toggle: 'modal',
+    ng_click: 'publishMinutes()'
+end
+
+# Include forms
+_ng_include src: 'form', ng_repeat: 'form in forms'
diff --git a/www/classic/board/agenda/partials/minute._html b/www/classic/board/agenda/partials/minute._html
new file mode 100644
index 0000000..3b1c497
--- /dev/null
+++ b/www/classic/board/agenda/partials/minute._html
@@ -0,0 +1,42 @@
+_modal_dialog.minute_form!.wide_form ng_controller: 'Minute' do
+  _h4.commented 'Minutes'
+
+  _section ng_if: '!item.comments' do
+    _textarea.minute_text!.form_control :autofocus, rows: 17,
+      placeholder: 'minutes', ng_model: 'text.draft'
+  end
+
+  _section ng_if: 'item.comments' do
+    _textarea.minute_text!.form_control :autofocus, rows: 12,
+      placeholder: 'minutes', ng_model: 'text.draft'
+
+    _h3 'Comments'
+    _div.minute_comments! do
+      _pre.comment ng_bind_html: 'comment | html', 
+        ng_repeat: 'comment in item.comments | csplit'
+    end
+  end
+
+  # action items
+  _div.row style: 'margin-top: 1em', ng_if: 'item.comments !== undefined' do
+    _button.btn.btn_sm.btn_info.col_md_offset_1.col_md_1 '+ AI', 
+      ng_click: 'add_ai()', ng_disabled: '!ai.assignee || !ai.text'
+    _label.col_md_2 do
+      _select ng_options: 'name for name in attendees', ng_model: 'ai.assignee'
+    end
+    _textarea.col_md_7 ng_model: 'ai.text', rows: 1
+  end
+
+  _button.btn_default 'Cancel', type: 'button', data_dismiss: 'modal',
+    ng_click: 'text.draft = text.base'
+  _button.btn_warning 'Delete', type: 'button', ng_click: 'text = ""',
+    ng_show: 'text.base'
+  _button.btn_primary 'Save', type: 'button', 
+    ng_click: "save(text.draft)", ng_disabled: 'text.base == text.draft'
+  _button.btn_warning 'Tabled', type: 'button', 
+    ng_click: "save('tabled')", ng_disabled: 'text.draft',
+    ng_show: 'previous_meeting'
+  _button.btn_success 'Approved', type: 'button', 
+    ng_click: "save('approved')", ng_disabled: 'text.draft',
+    ng_show: 'previous_meeting'
+end
diff --git a/www/classic/board/agenda/partials/pending._html b/www/classic/board/agenda/partials/pending._html
new file mode 100644
index 0000000..06e2b0f
--- /dev/null
+++ b/www/classic/board/agenda/partials/pending._html
@@ -0,0 +1,54 @@
+_div.col_xs_12 do
+  _h4 'Approvals'
+  _p.col_xs_12 do
+    _span! ng_repeat: 'item in q_approvals' do
+      _a '{{ item.title }}', ng_href: '{{ item.qhref }}'
+      _span ', ', ng_if: '!$last'
+    end
+    _em 'None.' , ng_if: '!q_approvals || q_approvals.length == 0'
+  end
+
+  _h4 'Rejected', ng_if: 'q_rejected.length > 0'
+  _p.col_xs_12 do
+    _span! ng_repeat: 'item in q_rejected' do
+      _a '{{ item.title }}', ng_href: '{{ item.qhref }}'
+      _span ', ', ng_if: '!$last'
+    end
+  end
+
+  _h4 'Comments'
+  _dl.dl_horizontal ng_repeat: 'item in q_comments' do
+    _dt do
+      _a '{{ item.title }}', ng_href: '{{ item.href }}'
+    end
+    _dd do
+      _p '{{ p }}', ng_repeat: 'p in item.comment.split("\n\n")'
+    end
+  end
+  _p.col_xs_12 ng_if: 'q_comments.length == 0' do
+    _em 'None.'
+  end
+
+  _div.row.col_xs_12(ng_if: 'q_ready.length > 0') { _hr }
+  _h4 'Ready for review', ng_if: 'q_ready.length > 0'
+  _p.col_xs_12 do
+    _span! ng_repeat: 'item in q_ready' do
+      _a '{{ item.title }}', ng_href: '{{ item.qhref }}',
+        ng_class: '{default: $first}'
+      _span ', ', ng_if: '!$last'
+    end
+  end
+
+end
+
+_ng_template.refresh_button! do
+  _button.btn.btn_primary 'refresh', ng_controller: 'Refresh',
+    ng_click: 'click()', ng_disabled: 'disabled'
+end
+
+_ng_template.commit_button! do
+  _button.btn.btn_primary 'commit', 
+    data_target: '#commit-form', data_toggle: 'modal'
+end
+
+_ng_include src: "'../partials/commit.html'"
diff --git a/www/classic/board/agenda/partials/post._html b/www/classic/board/agenda/partials/post._html
new file mode 100644
index 0000000..39ea0ee
--- /dev/null
+++ b/www/classic/board/agenda/partials/post._html
@@ -0,0 +1,15 @@
+_modal_dialog.post_report_form!.wide_form ng_controller: 'PostReport' do
+  _h4.commented '{{post_form_title}}'
+
+  _textarea.report_text! :autofocus, rows: 17, label: 'Report', 
+    placeholder: 'report', ng_model: 'report', ng_disabled: 'disabled'
+
+  _input.message label: 'Commit message', ng_model: 'message',
+    ng_disabled: 'disabled'
+
+  _button.btn_default 'Cancel', type: 'button', ng_click: "cancel()"
+  _button 'Reflow', type: 'button', ng_click: "reflow()",
+    ng_disabled: 'disabled', class: '{{reflow_class}}'
+  _button.btn_primary 'Submit', type: 'button', ng_click: "save()",
+    ng_disabled: 'disabled || (report == baseline)'
+end
diff --git a/www/classic/board/agenda/partials/publish-minutes._html b/www/classic/board/agenda/partials/publish-minutes._html
new file mode 100644
index 0000000..561daa7
--- /dev/null
+++ b/www/classic/board/agenda/partials/publish-minutes._html
@@ -0,0 +1,13 @@
+_modal_dialog.publish_minutes_form!.wide_form ng_controller: 'PublishMinutes' do
+  _h4.commented 'Publish Minutes onto the ASF web site'
+
+  _textarea.summary_text! :autofocus, rows: 10, label: 'Minutes summary', 
+    ng_model: 'summary', ng_disabled: 'disabled'
+
+  _input.message label: 'Commit message', ng_model: 'message',
+    ng_disabled: 'disabled'
+
+  _button.btn_default 'Close', type: 'button', data_dismiss: 'modal'
+  _button.btn_primary 'Submit', type: 'button', ng_click: "save()",
+    ng_disabled: 'disabled || (title == "") || (report == "")'
+end
diff --git a/www/classic/board/agenda/partials/search._html b/www/classic/board/agenda/partials/search._html
new file mode 100644
index 0000000..4b2f85f
--- /dev/null
+++ b/www/classic/board/agenda/partials/search._html
@@ -0,0 +1,20 @@
+_div.search do
+  _label 'Search:', for: 'search_text'
+  _input.search_text! :autofocus, ng_model: 'search.text'
+end
+
+_p '{{ message }}', ng_if: 'message'
+
+_section ng_repeat: 'match in results' do
+  _h4! do
+    _a '{{ match.item.title }}', ng_href: "{{match.item.href}}"
+  end
+
+  _pre ng_bind_html: 'snippet | hilight:search', 
+    ng_repeat: 'snippet in match.snippets'
+end
+
+_ng_template.refresh_button! do
+  _button.btn.btn_primary 'refresh', ng_controller: 'Refresh',
+    ng_click: 'click()', ng_disabled: 'disabled'
+end
diff --git a/www/classic/board/agenda/partials/section._html b/www/classic/board/agenda/partials/section._html
new file mode 100644
index 0000000..f82dbfd
--- /dev/null
+++ b/www/classic/board/agenda/partials/section._html
@@ -0,0 +1,136 @@
+_ul.missing ng_if: 'item.warnings' do
+  _li '{{ warning }}', ng_repeat: 'warning in item.warnings'
+end
+
+_section.flexbox do
+  _section do
+    _pre.report ng_bind_html: 'item | html'
+
+    _section.minutes! ng_if: 'minute_text' do
+      _pre '{{ minute_text }}'
+    end
+  end
+
+  _section do
+    _section ng_if: 'actions[item.title]' do
+      _h3 'Action Items'
+      _pre.comment '{{action}}', ng_repeat: 'action in actions[item.title]'
+    end
+
+    _section ng_if: 'item.comments' do
+      _h3.comments! 'Comments'
+      _pre.comment ng_bind_html: 'comment | html', 
+	ng_repeat: 'comment in item.comments | csplit'
+    end
+
+    _section ng_if: 'comment' do
+      _h3 'Pending Comment'
+      _pre.comment '{{ cflow(comment, initials) }}'
+    end
+
+    _section.reminder ng_if: '(item.missing || item.comments || comment) && pmc_report' do
+      _button.btn 'send email', ng_click: 'mailto()',
+	ng_class: 'mailto_class'
+    end
+
+    _section.new_actions! ng_if: 'item.new_actions.length > 0' do
+      _h3.comments! 'Action Items Captured During the Meeting'
+      _span ng_repeat: 'action in item.new_actions' do
+	_pre.report '{{ action.text }}'
+	_a '[ {{ action.title }} ]', ng_href: '{{ action.link }}#minutes'
+      end
+    end
+
+    _section.minutes! ng_if: 'minutes[item.title]' do
+      _h3 'Minutes'
+      _pre '{{ tflow(minutes[item.title]) }}'
+    end
+  end
+
+  _section ng_if: 'item.title == "Adjournment" && todo' do
+    _h3 'Post Meeting actions (beta)'
+    _p 'Add to pmc-chairs:', ng_if: 'todo.add.length > 0'
+    _ul do
+      _li ng_repeat: 'person in todo.add' do
+	_a '{{ person.id }}', 
+	  href: 'https://whimsy.apache.org/roster/committer/{{ person.id }}'
+	_ '({{ person.name }})'
+	_span ng_if: 'minutes[person.resolution]' do
+	  _ '-'
+	  _a '{{minutes[person.resolution]}}', 
+	    href: '{{link(person.resolution)}}'
+	end
+      end
+    end
+    _p 'Remove from pmc-chairs:', ng_if: 'todo.remove.length > 0'
+    _ul do
+      _li ng_repeat: 'person in todo.remove' do
+	_a '{{ person.id }}', 
+	  href: 'https://whimsy.apache.org/roster/committer/{{ person.id }}'
+	_ '({{ person.name }})'
+      end
+    end
+    _a 'Establish pmcs:', ng_if: 'todo.establish.length > 0',
+      href: 'https://infra.apache.org/officers/tlpreq'
+    _ul do
+      _li ng_repeat: 'podling in todo.establish' do
+	_span '{{podling.name}}'
+	_span ng_if: 'minutes[podling.resolution]' do
+	  _ '-'
+	  _a '{{minutes[podling.resolution]}}', 
+	    href: '{{link(podling.resolution)}}'
+	end
+      end
+    end
+  end
+end
+
+_ng_template.post_button! do
+  _button.btn.btn_primary '{{ post_button_text }}', 
+    data_target: '#post-report-form', data_toggle: 'modal'
+end
+
+_ng_template.comment_button! do
+  _button.btn.btn_primary '{{ comment_label }}', 
+    data_target: '#comment-form', data_toggle: 'modal'
+end
+
+_ng_template.approve_button! do
+  _button.btn.btn_primary '{{ approve_label }}', ng_controller: 'Approve',
+    ng_click: 'click()'
+end
+
+_ng_template.attend_button! do
+  _button.btn.btn_primary '{{ attend_label }}', ng_controller: 'Attend',
+    ng_click: 'click()', ng_disabled: 'disabled'
+end
+
+_ng_template.minute_button! do
+  _button.btn.btn_primary '{{ minute_label }}', 
+    data_target: '#minute-form', data_toggle: 'modal'
+end
+
+_ng_template.vote_button! do
+  _button.btn.btn_primary 'vote', 
+    data_target: '#vote-form', data_toggle: 'modal'
+end
+
+_ng_template.timestamp_button! do
+  _button.btn.btn_primary 'timestamp', ng_controller: 'Timestamp',
+    ng_click: 'click()'
+end
+
+_ng_template.draft_minutes_button! do
+  _button.btn.btn_primary 'draft minutes', ng_controller: 'DraftMinutes',
+    data_target: '#draft-minutes-form', data_toggle: 'modal',
+    ng_click: 'draftMinutes()'
+end
+
+_ng_template.publish_minutes_button! do
+  _button.btn.btn_primary 'publish minutes', ng_controller: 'PublishMinutes',
+    data_target: '#publish-minutes-form', data_toggle: 'modal',
+    ng_click: 'publishMinutes()'
+end
+
+# Include forms
+_ng_include src: 'form', ng_repeat: 'form in forms'
diff --git a/www/classic/board/agenda/partials/shepherd._html b/www/classic/board/agenda/partials/shepherd._html
new file mode 100755
index 0000000..e6e17f7
--- /dev/null
+++ b/www/classic/board/agenda/partials/shepherd._html
@@ -0,0 +1,21 @@
+_div ng_repeat: 'item in agenda | filter: {shepherd: name}' do
+  _h3 class: '{{ item | color }}' do
+    _a '{{ item.title }}', ng_href: "{{item.sqhref}}",
+      ng_class: '{default: $first}'
+  end
+
+  _pre.comment ng_bind_html: 'comment | html', 
+    ng_repeat: 'comment in item.comments | csplit',
+    ng_if: 'item.comments'
+end
+
+_em.col_xs_12 'No items assigned.', 
+  ng_show: '(agenda | filter: {shepherd: name}).length == 0'
+
+_div ng_if: 'assigned.length > 0' do
+  _h3 class: '{{ actions | color }}' do
+    _a '{{ actions.title }}', ng_href: "{{actions.href}}"
+  end
+
+  _pre '{{ assigned.join("\n\n") }}'
+end
diff --git a/www/classic/board/agenda/partials/special_order._html b/www/classic/board/agenda/partials/special_order._html
new file mode 100644
index 0000000..0f410f5
--- /dev/null
+++ b/www/classic/board/agenda/partials/special_order._html
@@ -0,0 +1,13 @@
+_modal_dialog.special_order_form! ng_controller: 'SpecialOrder' do
+  _h4.commented 'Add Special Order'
+
+  _input.message label: 'title', ng_model: 'title',
+    ng_disabled: 'disabled'
+
+  _textarea.report_text! :autofocus, rows: 17, label: 'resolution', 
+    placeholder: 'resolution', ng_model: 'report', ng_disabled: 'disabled'
+
+  _button.btn_default 'Close', type: 'button', data_dismiss: 'modal'
+  _button.btn_primary 'Submit', type: 'button', ng_click: "save()",
+    ng_disabled: 'disabled || (title == "") || (report == "")'
+end
diff --git a/www/classic/board/agenda/partials/vote._html b/www/classic/board/agenda/partials/vote._html
new file mode 100644
index 0000000..023721c
--- /dev/null
+++ b/www/classic/board/agenda/partials/vote._html
@@ -0,0 +1,24 @@
+_modal_dialog.vote_form!.wide_form ng_controller: 'Vote' do
+  _h4.commented 'Vote'
+
+  _p do
+    _ '{{ votetype }} vote on the matter of'
+    _em '{{ fulltitle }}'
+  end
+
+  _pre '{{ directors }}'
+
+  _textarea.vote_text! :autofocus, rows: 4,
+    placeholder: 'minutes', ng_model: 'text.draft'
+
+  _button.btn_default 'Cancel', type: 'button', data_dismiss: 'modal',
+    ng_click: 'text.draft = text.base'
+  _button.btn_warning 'Delete', type: 'button', ng_click: 'save("")',
+    ng_show: 'text.base'
+  _button.btn_primary 'Save', type: 'button', ng_click: "save(text.draft)",
+    ng_disabled: 'text.draft == text.base'
+  _button.btn_warning 'Tabled', type: 'button', 
+    ng_click: "save('tabled')", ng_disabled: 'text.draft'
+  _button.btn_success 'Unanimous', type: 'button', 
+    ng_click: "save('unanimous')", ng_disabled: 'text.draft'
+end
diff --git a/www/classic/board/agenda/public/stylesheets/app.css b/www/classic/board/agenda/public/stylesheets/app.css
new file mode 100644
index 0000000..6c72b8d
--- /dev/null
+++ b/www/classic/board/agenda/public/stylesheets/app.css
@@ -0,0 +1,220 @@
+#notice, ._stdout {color: green}
+._stderr {color: red}
+._stdin {font-weight: bold; margin-top: 1em}
+footer {text-align: center}
+footer ul {list-style-type: none; padding: 0}
+a {color: #000}
+.shell {border: 1px solid black;  border-radius: 1em; margin: 0 25%}
+.private {background-color: #CCC; border: 1px solid #444; color: #000}
+
+/* row colors */
+.blank      {background-color: #DDD !important}
+.missing    {background-color: #F88 !important}
+.ready      {background-color: #FC8 !important}
+.available  {background-color: #BFB !important}
+.reviewed   {background-color: #8F8 !important}
+.commented  {background-color: #FD6 !important}
+
+.pres-missing {color: #F00}
+
+/* sidebar */
+aside {float: right} 
+aside ul {margin: 0}
+aside li {list-style: none}
+
+/* next/back links */
+.backlink {float: left; min-width: 9em}
+.nextlink {float: right; min-width: 9em}
+.backlink:before {content: "<< "}
+.nextlink:after  {content: " >>"}
+
+/* action items */
+.ai {background-color: yellow}
+
+/* make the header an eye catcher */
+h1, h2.subtitle {
+  line-height: 2em;
+  text-align: center;
+  text-transform: capitalize;
+  clear: both
+}
+
+/* center the table */
+table {
+  margin-left: auto;
+  margin-right: auto
+}
+
+td:first-child {
+  text-align: center
+}
+
+.buttons {
+  margin-top: 1em;
+  text-align: center
+}
+
+.buttons div, .buttons form {
+  display: inline
+}
+
+form label {
+  display: block; margin-top: 0.5em
+}
+
+#comment_popup label {
+  display: inline;
+}
+
+#comment_popup input {
+  margin-bottom: 0.5em;
+}
+
+pre.report {
+  padding-left: 2em;
+  overflow: auto;
+  word-wrap: normal;
+  white-space: pre;
+}
+
+main pre {
+  font-family: monospace;
+  color: #000;
+}
+
+pre a {
+  color: #008;
+}
+
+pre#approved {
+  padding: 10px;
+}
+
+input[type=submit] {
+  border-radius: 1em;
+  background-color: #FFC;
+}
+
+.uptodate {
+  background-color: #7cfc00 !important
+}
+
+.stale {
+  background-color: #dc143c !important
+}
+
+.comment {
+  margin-top: 0;
+  margin-bottom: 0;
+  padding-top: 0;
+  padding-bottom: 0.1;
+  padding-left: 2em;
+}
+
+.comments button, #paste_report { 
+  color: #000; 
+  background-color: #F90; 
+  border-radius: 0.5em
+}
+
+#paste_popup, #comment_popup {
+  display: none
+}
+
+#paste_popup textarea {
+  font-family: monospace;
+  font-size: small
+}
+
+.nav .dl-horizontal dt {
+  width: 7em
+}
+
+.nav .dl-horizontal dd {
+  margin-left: 8em;
+  width: 14em
+}
+
+pre {
+  background-color: #FFF;
+  border: none
+}
+
+footer .btn {
+  margin-top: 7px;
+  height: 100%;
+  vertical-align: middle
+}
+
+.modal-header {
+  border-top-left-radius: 6px;
+  border-top-right-radius: 6px
+}
+
+.modal-body {
+  background-color: white
+}
+
+body {
+  overflow-y: scroll
+}
+
+#clock {
+  display: none
+}
+
+.navbar-fixed-top .label-danger {
+  margin-top: 1em
+}
+
+.navbar-fixed-top .label-danger a {
+  padding: 0.3em
+}
+
+main hr {
+  border-style: solid;
+  border-width: 1px;
+  border-color: #DDD;
+}
+
+@media screen and (min-width: 768px) {
+  .wide-form .modal-dialog {
+    width: 80%;
+  }
+  .wide-form .modal-footer {
+    margin-top: 0  
+  }
+}
+
+#new-actions pre {
+  margin-bottom: 0
+}
+
+#new-actions a {
+  margin-left: 6em 
+}
+
+.search {padding-top: 1em}
+.hilite {background-color: #FF6}
+
+#minute-comments {
+  max-height: 9em;
+  overflow: auto;
+}
+
+.reminder button {
+  margin-left: 3em;
+}
+
+@media only screen and (min-width: 1200px) {
+  .flexbox {
+    display: flex;
+    flex-direction: row;
+    flex-wrap: wrap;
+  }
+
+  .flexbox > section {
+    justify-content: flex-start;
+    min-width: 48%;
+  }
+}
diff --git a/www/classic/board/agenda/test/data/board_agenda_2014_02_19.txt b/www/classic/board/agenda/test/data/board_agenda_2014_02_19.txt
new file mode 100644
index 0000000..d51da60
--- /dev/null
+++ b/www/classic/board/agenda/test/data/board_agenda_2014_02_19.txt
@@ -0,0 +1,3963 @@
+                    The Apache Software Foundation
+
+                  Board of Directors Meeting Agenda
+
+                            February 19, 2014
+
+
+ 1. Call to order
+
+    The meeting is scheduled for 10:30am (Pacific) and will begin as
+    soon thereafter that a sufficient attendance to constitute a
+    quorum is recognized by the chairman.  The meeting will be held
+    via teleconference, hosted by Doug Cutting and Cloudera:
+
+            International   : +1-650-479-3208
+            U.S. Toll-Free  : +1-877-668-4493
+            Other Toll-Free : http://s.apache.org/globalcallin
+            Access Code     : 2329 5771
+
+    IRC #asfboard on irc.freenode.net will be used for backup
+    purposes.
+
+ 2. Roll Call
+
+    ASF members are welcome to attend board meetings. Please
+    add your name under "guests" below, or just join the call and
+    announce your presence during the roll call at the beginning
+    of the meeting.
+
+    Directors (expected to be) Present:
+
+        Shane Curcuru
+        Doug Cutting
+        Bertrand Delacretaz
+        Roy T. Fielding
+        Jim Jagielski
+        Chris Mattmann
+        Brett Porter
+        Greg Stein
+
+    Directors (expected to be) Absent:
+
+        Sam Ruby
+
+    Executive Officers (expected to be) Present:
+
+        Ross Gardler
+        Rich Bowen
+        Craig L Russell
+
+    Executive Officers (expected to be) Absent:
+
+        none
+
+    Guests (expected):
+
+        Sean Kelly
+        Daniel Gruno
+        Phil Steitz
+        Jake Farrell
+        Marvin Humphrey
+        David Nalley
+        Noah Slater
+
+ 3. Minutes from previous meetings
+
+    Minutes (in Subversion) are found under the URL:
+
+        https://svn.apache.org/repos/private/foundation/board/
+
+    A. The meeting of January 15, 2014
+
+       See: board_minutes_2014_01_15.txt
+
+       [ approved: sr, cm, jj, sc, bp
+         comments:
+           clr: I've updated the minutes to reflect unanimous
+               approval for the increase.
+         ]
+
+ 4. Executive Officer Reports
+
+    A. Chairman [Brett]
+
+       The main topic of discussion on the board list over the last month has
+       been release practices. As it progressed, it was good to see that
+       ongoing operational concerns were handled separately from discussion
+       about how to do more frequent releases within the bounds of current
+       ASF policy. Releasing open source software to the public is one of the
+       most fundamental things we do, so it is important that it is handled
+       diligently.
+
+       We're getting closer to the time where we need to prepare for the
+       Annual Members Meeting, so I've started to canvas dates. Currently the
+       first week of June seems the most feasible, but I've included a
+       discussion item in the agenda to decide.
+
+       The ASF received an invitation to participate in the "2014 Future of
+       Open Source Survey", which Sally has taken forward with the PMCs.
+
+    B. President [Ross]
+
+      An extremely busy month for me personally which has kept me away from
+      many of my ASF duties.
+   
+      The EA contract was renewed as previously agreed. A new renewal date has
+      been entered into the calendar. With Melissa's help we are in the
+      processes of updating our Director records with CSC. Please note that
+      Melissa is now providing an approximate breakdown of her time. As is
+      appropriate Melissa is in full control of her time allocation, this new
+      reporting is intended only to inform the board for budget monitoring as
+      requested.
+
+      ApacheCon proceeds thanks to continuing significant effort from Rich.
+      Due to my personal issues this month I have not been as helpful as I had
+      hoped but it seems Rich has, as always, taken it in his stride. See the
+      EVP report for more detail.
+   
+      I am yet to make significant progress on reporting budget vs actuals.
+      The treasurer has provided some initial data exports but I have been
+      unable to find the time to process it. Since I need to create a new
+      budget for the following year I propose to build this reporting into a
+      new spreadsheet that I develop during the preparation of this budget.
+   
+      Trademarks remains very busy and Shane has indicated that he is falling
+      behind a little. I have encouraged Shane to continue to work with
+      Melissa to identify areas in which she can help. I also note that an
+      Member has also offered to help.
+   
+      Fundraising is also progressing well though it is notable that this is
+      taking up a reasonable chunk of both Sally's and Melissa's time. Like
+      trademarks we need to acknowledge this role is not one that a volunteer
+      can be expected to fill. Unlike Trademarks though VP Fundraising appears
+      to have been able to find sufficient tasks that can be handled by
+      contractors. I believe this is mainly due to the less legally sensitive
+      domain. However, I grow increasingly concerned that more support from
+      Officers in managing key sponsor relations is necessary.
+       
+      <private>
+      maj
+      </private>
+   
+      Marketing progresses with its usual rhythm. No exceptional items to
+      reports.
+   
+      Infra also reports nothing exceptional this month. I do note the ongoing
+      improvement of GitHub integration at the specific request of committers.
+   
+      I engaged with the Cordova PMC with respect to their release process.
+      Initially this engagement was only as a member attempting to help them
+      understand the lay of the land. However at the request of a number of
+      Directors and Infra I subsequently made a formal request (cc board@ and
+      infra-private@) to ensure releases after 2.8.1 are formally voted upon.
+      Joe has been working with the PMC to define a suitable process which
+      does not introduce unnecessary work. I will conduct any necessary sanity
+      checks with the board to ensure the final solution is acceptable. For
+      now the PMC has acknowledged the need to address this issue (see Cordova
+      report) and Joe reports that he is satisfied with progress to date.
+   
+      TAC has, once again, failed to submit a report (and due to my own
+      lateness they have not had a prompt from me). However, Melissa reports
+      progress has been made towards planning for ApacheCon.
+   
+      Additionally, please see Attachments 1 through 6.
+
+       [ comments:
+         ]
+
+    C. Treasurer [Chris]
+
+       The Treasurer's Office processed repayment for some items related 
+       to the Dublin Meetup and also processed payment to NASDAQ Global
+       Newswire in coordination with VP Press, Marketing and the President.
+
+       The Treasurer and the President identified how a statement of actuals could 
+       be provided to the President quarterly.
+
+       Over the past month, the office has periodically provided information 
+       to the EA on sponsors and their incoming payments.
+
+       We have processed a payment to the EA and set up her new payment 
+       amount to reflect her updated contract and raise.
+
+       The Office dealt with an inquiry from the Apache OOo PMC regarding 
+       reimbursements for FOSDEM 2014.
+
+       We are actively coordinating with Virtual, Inc. to obtain a quote 
+       for their financial services.
+
+       We are working with EA and Nick Burch to handle wire transfer for 
+       initial payments for TAC flights for ACNA 2014.
+
+       Income and Expenses
+
+       Current Balances:
+
+         Wells Fargo Business Checking:     914,191.62
+         Wells Fargo Savings:               287,864.39
+         PayPal:                            100,404.09
+         ----------------------------    ----------
+              Total                    $  1,302,460.10 
+
+       Income Summary:
+
+         Lockbox                             50,737.49
+         Fundraising                         10,965.00
+         ----------------------------    ----------
+              Total                    $     61,702.49
+
+       Expense Summary:
+
+                 Category                  Amount
+         ----------------------------    ----------
+             EA                               3,462.00
+             Trademarks                       2,613.75
+             Sysadmin                        31,100.00
+             misc expense                       578.29
+             ASF credit card - Sam Ruby          37.44
+             ASF credit card - Justin Erenkrantz 50.00
+             Press                           11,545.45
+             Dublin Meetup                       25.44
+             PayPal                          45,312.20
+         ----------------------------    ----------
+              Total                    $     94,724.57
+
+
+    D. Secretary [Craig]
+
+       January was an average month after the December doldrums.  There 
+       were 60 iclas and three cclas received and filed. 
+
+       The board subscription list received some overdue maintenance. 
+       LDAP subscriptions to pmc-chairs have been synchronized with PMC 
+       chairs in committee-info.txt. All but three PMC chairs are 
+       subscribed to board.
+
+
+    E. Executive Vice President [Rich]
+
+        ApacheCon North America 2014 will be held in Denver Colorado,
+        April 7-9, with tutorials and a co-located Cloudstack event to
+        follow on the 10th and 11th.
+
+        Since the last meeting, the ApacheCon call for papers has come
+        and gone, and we have, as of Monday, February 17th, selected a
+        schedule of talks for the event, and notified the selected
+        speakers. We are still receiving answers back from those
+        speakers and adjusting the schedule for the people who have
+        declined, or want their talks moved to avoid other conflicts.
+
+        Members of the Apache community were amazingly helpful in the
+        process of selecting the content, and I think we have a really
+        solid schedule for this event.
+
+        As compared to years past, the conference will have much more
+        content, with 10 tracks on Monday and Tuesday, and 9 on
+        Wednesday, and the Cloudstack Collaboration Conference on
+        Thursday and Friday. Additionally we have a day and a half
+        of tutorials, and numerous evening events.
+
+        It is now LF's responsibility to market the event and draw in
+        the registrations. I expect to have a report on registrations
+        for the next board meeting. The lead time is very short, and
+        they have their work cut out for them. Any way that we can help
+        promote the event will be important to augment their effort.
+
+        Meanwhile, we are looking at venues in Europe for November, with
+        Budapest and Rome being considered. And we are also very
+        tentatively looking at the possibility of doing an event in
+        Brazil, although that is unlikely to be in this calendar year.
+
+    F. Vice Chairman [Greg]
+
+       Nothing to report for this month.
+
+ 5. Additional Officer Reports
+
+    A. VP of W3C Relations [Andy Seaborne / Chris]
+
+       See Attachment 7
+
+       [ approved: sr, jj, sc, cm, rf, bd, bp
+         comments:
+         ]
+
+    B. Apache Legal Affairs Committee [Jim Jagielski]
+
+       See Attachment 8
+
+       [ approved: jj, sc, cm, rf, bd, bp
+         comments:
+         ]
+
+    C. Apache Security Team Project [Mark Cox / Brett]
+
+       See Attachment 9
+
+       [ approved: sr, jj, sc, cm, rf, bd, bp
+         comments:
+         ]
+
+ 6. Committee Reports
+
+    A. Apache Abdera Project [Ant Elder / Shane]
+
+       See Attachment A
+
+       [ Abdera.
+         approved:
+         comments:
+           bp: reported in Jan after missing Nov, Dec
+         ]
+
+    B. Apache Ambari Project [Yusaku Sako / Doug]
+
+       See Attachment B
+
+       [ Ambari.
+         approved: sr, jj, sc, cm, rf, bd, bp
+         comments:
+         ]
+
+    C. Apache Ant Project [Conor MacNeill / Bertrand]
+
+       See Attachment C
+
+       [ Ant.
+         approved: sr, jj, sc, cm, rf, bd, bp
+         comments:
+         ]
+
+    D. Apache Buildr Project [Alex Boisvert / Roy]
+
+       See Attachment D
+
+       [ Buildr.
+         approved:
+         comments:
+           rf: no report received; sent request for next month
+         ]
+
+    E. Apache Cassandra Project [Jonathan Ellis / Greg]
+
+       See Attachment E
+
+       [ Cassandra.
+         approved: sr, jj, sc, cm, rf, bd, bp, gs
+         comments:
+           gs: we would also like to know the date of the last addition to the
+               PMC.
+         ]
+
+    F. Apache Clerezza Project [Hasan Hasan / Jim]
+
+       See Attachment F
+
+       [ Clerezza.
+         approved: sr, jj, sc, cm, rf, bd, bp
+         comments:
+         ]
+
+    G. Apache Click Project [Malcolm Edgar / Chris]
+
+       See Attachment G
+
+       [ Click.
+         approved:
+         comments:
+           bp: I still have the action item here
+         ]
+
+    H. Apache Cocoon Project [Thorsten Scherler / Jim]
+
+       See Attachment H
+
+       [ Cocoon.
+         approved: jj, sc, cm, rf, bd, bp
+         comments:
+         ]
+
+    I. Apache Community Development Project [Luciano Resende / Roy]
+
+       See Attachment I
+
+       [ Community Development.
+         approved:
+         comments:
+           rf: no report received; sent request for next month
+         ]
+
+    J. Apache Continuum Project [Brent Atkinson / Bertrand]
+
+       See Attachment J
+
+       [ Continuum.
+         approved:
+         comments:
+           bd: No report received
+         ]
+
+    K. Apache CouchDB Project [Jan Lehnardt / Shane]
+
+       See Attachment K
+
+       [ CouchDB.
+         approved: sr, jj, sc, cm, rf, bd, bp
+         comments:
+         ]
+
+    L. Apache Creadur Project [Robert Burrell Donkin / Brett]
+
+       See Attachment L
+
+       [ Creadur.
+         approved:
+         comments:
+           bp: I have followed up the missing report earlier
+         ]
+
+    M. Apache DeltaSpike Project [Mark Struberg / Greg]
+
+       See Attachment M
+
+       [ DeltaSpike.
+         approved: sr, jj, sc, cm, rf, bd, bp, gs
+         comments:
+         ]
+
+    N. Apache DirectMemory Project [Raffaele P. Guidi / Doug]
+
+       See Attachment N
+
+       [ DirectMemory.
+         approved:
+         comments:
+           bp: has asked to report next month
+         ]
+
+    O. Apache Empire-db Project [Francis De Brabandere / Chris]
+
+       See Attachment O
+
+       [ Empire-db.
+         approved: sr, jj, sc, rf, bd
+         comments:
+           cm: Please list date of last PMC/committer addition
+         ]
+
+    P. Apache Etch Project [Martin Veith / Roy]
+
+       See Attachment P
+
+       [ Etch.
+         approved: sr, jj, sc, cm, rf, bd, bp
+         comments:
+         ]
+
+    Q. Apache Flume Project [Arvind Prabhakar / Doug]
+
+       See Attachment Q
+
+       [ Flume.
+         approved: sr, jj, sc, cm, rf, bd, bp
+         comments:
+         ]
+
+    R. Apache Forrest Project [David Crossley / Bertrand]
+
+       See Attachment R
+
+       [ Forrest.
+         approved: sr, jj, sc, cm, rf, bd, bp
+         comments:
+         ]
+
+    S. Apache Giraph Project [Avery Ching / Greg]
+
+       See Attachment S
+
+       [ Giraph.
+         approved:
+         comments:
+         ]
+
+    T. Apache Gora Project [Lewis John McGibbney / Brett]
+
+       See Attachment T
+
+       [ Gora.
+         approved: sr, jj, sc, cm, rf, bd, bp
+         comments:
+         ]
+
+    U. Apache Hama Project [Edward J. Yoon / Jim]
+
+       See Attachment U
+
+       [ Hama.
+         approved: sr, jj, sc, cm, rf, bd, bp
+         comments:
+         ]
+
+    V. Apache Helix Project [Kishore Gopalakrishna / Shane]
+
+       See Attachment V
+
+       [ Helix.
+         approved: sr, jj, sc, cm, rf, bd, bp
+         comments:
+               jj: Last addition of committers and/or members?
+           cm: What Jim said :)
+         ]
+
+    W. Apache HTTP Server Project [Eric Covener / Jim]
+
+       See Attachment W
+
+       [ HTTP Server.
+         approved: sr, jj, sc, cm, rf, bd, bp
+         comments:
+           cm: Please list dates of last PMC/committer additions. Thanks!
+         ]
+
+    X. Apache HttpComponents Project [Asankha Perera / Bertrand]
+
+       See Attachment X
+
+       [ HttpComponents.
+         approved: sr, jj, sc, cm, rf, bd, bp
+         comments:
+         ]
+
+    Y. Apache Incubator Project [Marvin Humphrey / Doug]
+
+       See Attachment Y
+
+       [ Incubator.
+         approved: sr, sc, cm, rf, bp, bd
+         comments:
+         ]
+
+    Z. Apache jclouds Project [Andrew Bayer / Roy]
+
+       See Attachment Z
+
+       [ jclouds.
+         approved: sr, jj, sc, cm, rf, bd, bp
+         comments:
+         ]
+
+    AA. Apache jUDDI Project [Kurt Stam / Greg]
+
+       See Attachment AA
+
+       [ jUDDI.
+         approved: sc, cm, rf, bd, bp, gs
+         comments:
+         ]
+
+    AB. Apache Kafka Project [Jun Rao / Brett]
+
+       See Attachment AB
+
+       [ Kafka.
+         approved: sr, jj, sc, cm, rf, bd, bp
+         comments:
+               jj: Last addition of committers and/or members?
+           cm: What Jim said :)
+         ]
+
+    AC. Apache Lenya Project [Richard Frovarp / Shane]
+
+       See Attachment AC
+
+       [ Lenya.
+         approved: sr, jj, sc, gs
+         comments:
+         ]
+
+    AD. Apache Libcloud Project [Tomaz Muraus / Chris]
+
+       See Attachment AD
+
+       [ Libcloud.
+         approved: sr, jj, sc, cm, rf, bd, bp
+         comments:
+         ]
+
+    AE. Apache Logging Project [Christian Grobmeier / Bertrand]
+
+       See Attachment AE
+
+       [ Logging.
+         approved: sr, jj, sc, cm, rf, bd, bp
+         comments:
+         ]
+
+    AF. Apache ManifoldCF Project [Karl Wright / Roy]
+
+       See Attachment AF
+
+       [ ManifoldCF.
+         approved: sr, jj, sc, cm, rf, bd, bp
+         comments:
+         ]
+
+    AG. Apache Marmotta Project [Jakob Frank / Doug]
+
+       See Attachment AG
+
+       [ Marmotta.
+         approved: sr, jj, sc, cm, rf, bd, bp
+         comments:
+         ]
+
+    AH. Apache Mesos Project [Benjamin Hindman / Shane]
+
+       See Attachment AH
+
+       [ Mesos.
+         approved: sc, cm, rf, bd, jj, bp
+         comments:
+           cm: Congrats on the baby for Yan, what a great present (in addition
+               to his committership! :) )
+         ]
+
+    AI. Apache Oltu Project [Antonio Sanso / Jim]
+
+       See Attachment AI
+
+       [ Oltu.
+         approved: sc, cm, rf, bd, jj, bp
+         comments:
+           cm: Please list dates of last PMC/committer addition. Also feel free
+               to identify the names too. Thanks!
+         ]
+
+    AJ. Apache Onami Project [Simone Tripodi / Greg]
+
+       See Attachment AJ
+
+       [ Onami.
+         approved: sr, jj, sc, cm, rf, bp, bd
+         comments:
+           sr: "there have not been three new releases"? Seems oddly specific
+               about the number of releases that haven't happened. :)
+           cm: typo?
+         ]
+
+    AK. Apache Oozie Project [Mohammad Islam / Chris]
+
+       See Attachment AK
+
+       [ Oozie.
+         approved: sr, jj, sc, cm, rf, bp, bd
+         comments:
+               jj: Last addition of committers and/or members?
+           cm: What Jim said :)
+         ]
+
+    AL. Apache OpenJPA Project [Pinaki Poddar / Brett]
+
+       See Attachment AL
+
+       [ OpenJPA.
+         approved: sc, cm, rf, jj, bp, bd
+         comments:
+           cm: Please list date of last release. Please list date of last
+               PMC/committer additions. Thanks!
+         ]
+
+    AM. Apache Perl Project [Philippe M. Chiasson / Bertrand]
+
+       See Attachment AM
+
+       [ Perl.
+         approved: sr, jj, sc, cm, rf, bd, bp
+         comments:
+               jj: Last addition of committers and/or members?
+           cm: What Jim said :)
+         ]
+
+    AN. Apache POI Project [Yegor Kozlov / Shane]
+
+       See Attachment AN
+
+       [ POI.
+         approved: sc, cm, rf, jj, bp, bd
+         comments:
+           cm: Please list date of last PMC/committer addition. Thanks!
+         ]
+
+    AO. Apache Qpid Project [Gordon Sim / Roy]
+
+       See Attachment AO
+
+       [ Qpid.
+         approved: sr, jj, sc, cm, rf, bp, bd
+         comments:
+               jj: Last addition of committers and/or members?
+           cm: What Jim said :)
+         ]
+
+    AP. Apache River Project [Greg Trasuk / Brett]
+
+       See Attachment AP
+
+       [ River.
+         approved: sr, jj, sc, cm, rf, bp, bd
+         comments:
+         ]
+
+    AQ. Apache Roller Project [Dave Johnson / Doug]
+
+       See Attachment AQ
+
+       [ Roller.
+         approved: sc, cm, rf, jj, bp, bd
+         comments:
+         ]
+
+    AR. Apache Santuario Project [Colm O hEigeartaigh / Jim]
+
+       See Attachment AR
+
+       [ Santuario.
+         approved: sr, jj, sc, cm, rf, bp, bd
+         comments:
+         ]
+
+    AS. Apache SIS Project [Adam Estrada / Chris]
+
+       See Attachment AS
+
+       [ SIS.
+         approved: sc, cm, rf, jj, bp, bd
+         comments:
+           cm: Please list dates of last releases. Please list dates of last
+               PMC/committer additions.
+         ]
+
+    AT. Apache Subversion Project [Greg Stein]
+
+       See Attachment AT
+
+       [ Subversion.
+         approved: gs, bd
+         comments:
+           rf: Dude!
+         ]
+
+    AU. Apache Syncope Project [Francesco Chicchiricco / Greg]
+
+       See Attachment AU
+
+       [ Syncope.
+         approved: sr, jj, sc, cm, rf, bp, bd, gs
+         comments:
+         ]
+
+    AV. Apache Turbine Project [Thomas Vandahl / Bertrand]
+
+       See Attachment AV
+
+       [ Turbine.
+         approved: sr, jj, sc, cm, rf, bd, bp
+         comments:
+         ]
+
+    AW. Apache Tuscany Project [Jean-Sebastien Delfino / Brett]
+
+       See Attachment AW
+
+       [ Tuscany.
+         approved: sr, jj, sc, cm, rf, bp, bd
+         comments:
+         ]
+
+    AX. Apache Velocity Project [Nathan Bubna / Chris]
+
+       See Attachment AX
+
+       [ Velocity.
+         approved:
+         comments:
+         ]
+
+    AY. Apache Xalan Project [Steven J. Hathaway / Shane]
+
+       See Attachment AY
+
+       [ Xalan.
+         approved: sr, sc, cm, rf, jj, bp, bd
+         comments:
+           cm: Please list dates of last PMC/committer addition. Thanks!
+         ]
+
+    AZ. Apache Xerces Project [Michael Glavassevich / Jim]
+
+       See Attachment AZ
+
+       [ Xerces.
+         approved: sc, cm, rf, jj, bp, bd
+         comments:
+         ]
+
+    BA. Apache XML Graphics Project [Chris Bowditch / Roy]
+
+       See Attachment BA
+
+       [ XML Graphics.
+         approved: sr, sc, cm, rf, jj, bp, bd
+         comments:
+         ]
+
+    BB. Apache Cordova Project [Brian LeRoux / Greg]
+
+       See Attachment BB
+
+       [ Cordova.
+         approved: sr, sc, cm, rf, jj, bp, bd, gs
+         comments:
+         ]
+
+    BC. Apache OpenOffice Project special report [Andrea Pescetti / Doug]
+
+       See Attachment BC
+
+       [ OpenOffice.
+         approved: sr, sc, cm, rf, jj, bp, bd, gs
+         comments:
+         ]
+
+ 7. Special Orders
+ 
+    A. Establish the Apache Open Climate Workbench Project
+
+       WHEREAS, the Board of Directors deems it to be in the best interests of
+       the Foundation and consistent with the Foundation's purpose to
+       establish a Project Management Committee charged with the creation and
+       maintenance of open-source software, for distribution at no charge to
+       the public, related to the preparation, evaluation and analysis of
+       massive climate remote sensing and model output data.
+
+       NOW, THEREFORE, BE IT RESOLVED, that a Project Management Committee
+       (PMC), to be known as the "Apache Open Climate Workbench Project", be
+       and hereby is established pursuant to Bylaws of the Foundation; and be
+       it further
+
+       RESOLVED, that the Apache Open Climate Workbench Project be and hereby
+       is responsible for the creation and maintenance of software related to
+       preparation, evaluation and analysis of massive climate remote sensing
+       and model output data; and be it further
+
+       RESOLVED, that the office of "Vice President, Apache Open Climate
+       Workbench", be and hereby is created, the person holding such office to
+       serve at the direction of the Board of Directors as the chair of the
+       Apache Open Climate Workbench Project, and to have primary
+       responsibility for management of the projects within the scope of
+       responsibility of the Apache Open Climate Workbench Project; and be it
+       further
+
+       RESOLVED, that the persons listed immediately below be and hereby are
+       appointed to serve as the initial members of the Apache Open Climate
+       Workbench Project:
+
+       * Andrew Hart <ah...@apache.org>
+       * Maziyar Boustani <bo...@apache.org>
+       * Christopher Douglas <cd...@apache.org>
+       * Chris Jack <cj...@apache.org>
+       * Dan Crichton <cr...@apache.org>
+       * Denis Nadeau <dn...@apache.org>
+       * estani <es...@apache.org>
+       * Cameron Goodale <go...@apache.org>
+       * Alex Goodman <go...@apache.org>
+       * Huikyo Lee <hu...@apache.org>
+       * Jason Peter Evans <ja...@apache.org>
+       * Jinwon Kim <jk...@apache.org>
+       * Michael Joyce <jo...@apache.org>
+       * Laura Carriere <lc...@apache.org>
+       * Lluis Fita Borrell <lf...@apache.org>
+       * Luca Cinquini <lu...@apache.org>
+       * Chris Mattmann <ma...@apache.org>
+       * Nick Kew <ni...@apache.org>
+       * Paul Loikith <pl...@apache.org>
+       * Paul Michael Ramirez <pr...@apache.org>
+       * Paul Zimdars <pz...@apache.org>
+       * M. V. S. Rama Rao <ra...@apache.org>
+       * J Sanjay <sa...@apache.org>
+       * Shakeh Khudikyan <sk...@apache.org>
+       * Suresh Marru <sm...@apache.org>
+       * Duane Waliser <wa...@apache.org>
+       * Kim Whitehall <wh...@apache.org>
+
+       NOW, THEREFORE, BE IT FURTHER RESOLVED, that Michael Joyce be appointed
+       to the office of Vice President, Apache Open Climate Workbench, to
+       serve in accordance with and subject to the direction of the Board of
+       Directors and the Bylaws of the Foundation until death, resignation,
+       retirement, removal or disqualification, or until a successor is
+       appointed; and be it further
+
+       RESOLVED, that the Apache Open Climate Workbench Project be and hereby
+       is tasked with the migration and rationalization of the Apache
+       Incubator Open Climate Workbench podling; and be it further
+
+       RESOLVED, that all responsibilities pertaining to the Apache Incubator
+       Open Climate Workbench podling encumbered upon the Apache Incubator
+       Project are hereafter discharged.     
+     
+    B. Change the Apache Incubator Project Chair
+
+       WHEREAS, the Board of Directors heretofore appointed Marvin Humphrey
+       to the office of Vice President, Apache Incubator, and
+
+       WHEREAS, the Board of Directors is in receipt of the resignation of
+       Marvin Humphrey from the office of Vice President, Apache Incubator,
+       and
+
+       WHEREAS, the Project Management Committee of the Apache Incubator
+       project has chosen by vote to recommend Roman Shaposhnik as the
+       successor to the post;
+
+       NOW, THEREFORE, BE IT RESOLVED, that Marvin Humphrey is relieved and
+       discharged from the duties and responsibilities of the office of Vice
+       President, Apache Incubator, and
+
+       BE IT FURTHER RESOLVED, that Roman Shaposhnik be and hereby is
+       appointed to the office of Vice President, Apache Incubator, to serve
+       in accordance with and subject to the direction of the Board of
+       Directors and the Bylaws of the Foundation until death, resignation,
+       retirement, removal or disqualification, or until a successor is
+       appointed.
+
+    C. Establish the Apache Spark Project
+
+       WHEREAS, the Board of Directors deems it to be in the best interests
+       of the Foundation and consistent with the Foundation's purpose to
+       establish a Project Management Committee charged with the creation
+       and maintenance of open-source software, for distribution at no
+       charge to the public, related to fast and flexible large-scale data
+       analysis on clusters.
+       
+       NOW, THEREFORE, BE IT RESOLVED, that a Project Management Committee
+       (PMC), to be known as the "Apache Spark Project", be and hereby is
+       established pursuant to Bylaws of the Foundation; and be it further
+       
+       RESOLVED, that the Apache Spark Project be and hereby is responsible
+       for the creation and maintenance of software related to fast and
+       flexible large-scale data analysis on clusters; and be it further
+
+       RESOLVED, that the office of "Vice President, Apache Spark" be and
+       hereby is created, the person holding such office to serve at the
+       direction of the Board of Directors as the chair of the Apache Spark
+       Project, and to have primary responsibility for management of the
+       projects within the scope of responsibility of the Apache Spark
+       Project; and be it further
+       
+       RESOLVED, that the persons listed immediately below be and hereby are
+       appointed to serve as the initial members of the Apache Spark Project:
+        
+       * Mosharaf Chowdhury <mo...@apache.org> 
+       * Jason Dai <ja...@apache.org> 
+       * Tathagata Das <td...@apache.org> 
+       * Ankur Dave <an...@apache.org> 
+       * Aaron Davidson <ad...@apache.org> 
+       * Thomas Dudziak <to...@apache.org> 
+       * Robert Evans <bo...@apache.org>
+       * Thomas Graves <tg...@apache.org> 
+       * Andy Konwinski <an...@apache.org>
+       * Stephen Haberman <st...@apache.org> 
+       * Mark Hamstra <ma...@apache.org> 
+       * Shane Huang <sh...@apache.org> 
+       * Ryan LeCompte <ry...@apache.org> 
+       * Haoyuan Li <ha...@apache.org>
+       * Sean McNamara <sm...@apache.org> 
+       * Mridul Muralidharan <mr...@apache.org> 
+       * Kay Ousterhout <ka...@apache.org>
+       * Nick Pentreath <ml...@apache.org> 
+       * Imran Rashid <ir...@apache.org>
+       * Charles Reiss <wo...@apache.org> 
+       * Josh Rosen <jo...@apache.org>
+       * Prashant Sharma <pr...@apache.org> 
+       * Ram Sriharsha <ha...@apache.org>
+       * Shivaram Venkataraman <sh...@apache.org> 
+       * Patrick Wendell <pw...@apache.org> 
+       * Andrew Xia <xi...@apache.org> 
+       * Reynold Xin <rx...@apache.org> 
+       * Matei Zaharia <ma...@apache.org>
+        
+       NOW, THEREFORE, BE IT FURTHER RESOLVED, that Matei Zaharia be
+       appointed to the office of Vice President, Apache Spark, to serve
+       in accordance with and subject to the direction of the Board of
+       Directors and the Bylaws of the Foundation until death, resignation,
+       retirement, removal or disqualification, or until a successor is
+       appointed; and be it further
+       
+       RESOLVED, that the Apache Spark Project be and hereby is tasked
+       with the migration and rationalization of the Apache Incubator Spark
+       podling; and be it further
+       
+       RESOLVED, that all responsibilities pertaining to the Apache Incubator
+       Spark podling encumbered upon the Apache Incubator Project are
+       hereafter discharged. 
+
+    D. Establish the Apache Knox Project
+
+       WHEREAS, the Board of Directors deems it to be in the best
+       interests of the Foundation and consistent with the Foundation's
+       purpose to establish a Project Management Committee charged with
+       the creation and maintenance of open-source software, for
+       distribution at no charge to the public, related to secure access
+       for Apache Hadoop clusters.
+
+       NOW, THEREFORE, BE IT RESOLVED, that a Project Management Committee
+       (PMC), to be known as the "Apache Knox Project" be and hereby is
+       established pursuant to Bylaws of the Foundation; and be it further
+
+       RESOLVED, that the Apache Knox Project be and hereby is responsible
+       for the creation and maintenance of software related to secure
+       access for Apache Hadoop clusters; and be it further
+
+       RESOLVED, that the office of "Vice President, Apache Knox", be
+       and hereby is created, the person holding such office to serve
+       at the direction of the Board of Directors as the chair of the
+       Apache Knox Project, and to have primary responsibility for
+       management of the projects within the scope of responsibility
+       of the Apache Knox Project; and be it further
+
+       RESOLVED, that the persons listed immediately below be and hereby
+       are appointed to serve as the initial members of the Apache Knox
+       Project:
+
+      * Christopher Douglas <cd...@apache.org> 
+      * Chris Mattmann <ma...@apache.org> 
+      * Devaraj Das <dd...@apache.org> 
+      * Dilli Dorai <di...@apache.org>  
+      * Alan Gates <ga...@apache.org> 
+      * John Speidel <js...@apache.org> 
+      * Kevin Minder <km...@apache.org>
+      * Larry McCay <lm...@apache.org> 
+      * Mahadev Konar <ma...@apache.org>
+      * Owen O'Malley <om...@apache.org>  
+      * Sumit Mohanty <sm...@apache.org>
+      * Tom Beerbower <tb...@apache.org>  
+      * Thomas White <to...@apache.org> 
+      * Venkatesh Seetharam <ve...@apache.org>
+
+      NOW, THEREFORE, BE IT FURTHER RESOLVED, that Kevin Minder be appointed
+      to the office of Vice President, Apache Knox, to serve in accordance
+      with and subject to the direction of the Board of Directors and the
+      Bylaws of the Foundation until death, resignation, retirement,
+      removal or disqualification, or until a successor is appointed; and
+      be it further
+
+      RESOLVED, that the Apache Knox Project be and hereby is tasked with
+      the migration and rationalization of the Apache Incubator Knox
+      podling; and be it further
+
+      RESOLVED, that all responsibilities pertaining to the Apache Incubator
+      Knox podling encumbered upon the Apache Incubator Project are
+      hereafter discharged.
+
+ 8. Discussion Items
+
+    A. Select a date for the Annual Members Meeting
+
+       What availability do other directors and executive officers have?
+
+ 9. Review Outstanding Action Items
+
+    * Greg: email to multiple PMCs to ask for dates on releases.
+          Status: Brett can roll this in with note about committee records
+
+    * Roy: Update the guidance for releases to forbid shipping binary
+           dependencies within a source package unless their source is also
+           included (see board_minutes_2012_04_18.txt) and communicate to
+           committers.
+          Status: still not done
+
+    * Greg: discuss "extras" issue with OpenOffice PMC and see if there is
+            anything to be done at the "ASF level"
+          Status:
+
+    * Chris: follow up on bringing on new committers and PMC members to DB
+          Status:
+
+    * Brett: follow up with Click regarding the Attic or rebooting
+          Status: still not done
+
+    * Jim: Ask Any23 PMC if they are ready to switch chairs
+          Status: PMC pinged.
+
+    * Brett: Remind PMCs to check their committee records
+          Status: tracking, but message still not done
+
+    * Doug: to pursue a report for Helix
+          Status: report received
+
+    * Brett: to pursue a report for jclouds
+          Status: report received
+
+    * Greg: ask about "pending discussion by the PMC" by JMeter
+          Status:
+
+    * Doug: pursue a report for Mesos
+          Status: report was received
+
+    * Chris: pursue a report for OpenJPA
+          Status: report received
+
+    * Bertrand: inconsistency with last committer in TomEE report
+          Status: TomEE PMC confirms last committer was Nov 2013, all good.
+
+    * Greg: ask for an out-of-band report for next month for Web Services
+          Status:
+
+10. Unfinished Business
+
+11. New Business
+
+12. Announcements
+
+13. Adjournment
+
+    Scheduled to adjourn by 12:00pm (Pacific)
+
+
+============
+ATTACHMENTS:
+============
+
+-----------------------------------------
+Attachment 1: Report from the Executive Assistant  [Melissa Warnkin]
+
+Daily monitoring of all email activity (ea@, fundraising@, trademarks@,
+treasurer@, comdev@, and board@) and following-up with appropriate personnel
+
+    ApacheCon:  70% (includes TAC)
+        Very busy month; progressing well - Rich will provide more information
+        Placed a reorder for the "Ask Me" pins and stickers (half of which is
+          being sent directly from the vendor to Michael Stehmann in Germany
+          for OOO's 2014 events, as well as for distributing amongst others in
+          the EU.  By doing so, this will reduce our shipping costs
+          tremendously). 
+        Researched items for our giveaways (will be placing an order within a
+          week or so)
+        Sent email for a volunteer to edit the website to update the ApacheCon
+          info at the top right of all pages (still reflects Portland info)
+        Sent email for volunteer to create the Speaker Slide Template
+
+    TAC:
+
+        Initial preparations made so we can proceed immediately with the
+          planning on Feb 10 after the judges make their decision
+
+    Fundraising:  25%
+
+        Updated "Thanks" page on website
+        Sent letter to Craigslist acknowledging their payment
+        Call w/Upayavira on Jan 22 to discuss pending renewals and upcoming
+          renewals.  We will be having bi-weekly calls starting on Feb 6
+        Continuing to follow-up on renewals sent out
+        Sent quote to Produban (per their request) for Silver renewal (not due
+          until Aug 1)
+        Sally (per Upayavira's request) reached out to the Platinum sponsors
+          regarding their renewal and approached the subject of the proposed
+          new "Diamond" level
+
+    Misc:  5%
+        Sorted FedEx invoice for a shipment sent to Lewis McGibbney and
+          committed to svn for processing
+        Prepared package to Michael Stehmann for FOSDEM (Rich graciously
+          agreed to take with him so we could avoid the $176+ in shipping
+          costs...thanks again, Rich!!)
+        Completed the annual report questionnaire received from CSC.  Sent to
+          Ross for review of a couple of missing bits of information
+        Contract renewal - signed on Jan 20
+        Weekly status calls with Ross and Rich
+
+
+-----------------------------------------
+Attachment 2: Report from the VP of Brand Management  [Shane Curcuru]
+
+This was a very busy month on trademarks@, and there are a number of 
+open questions still being worked on.  There have also been a number of 
+good discussions about clarifying our policies - both for PMCs as well 
+as for third parties - and about improving the Project Independence 
+guidelines.
+
+Incubator PMC and trademarks@ was contacted by a third party about our 
+use of the Apache Sentry name for our security-related product.  
+Discussions are continuing.
+
+My two talks on Brand Management were accepted for ApacheCon Denver, and 
+also one brand talk at the following CloudStack Collab that week. Phew!
+
+The Apache Hadoop PMC created trademarks@hadoop.a.o privately archived 
+mailing list; plans are to use it for better coordination of various 
+Hadoop-related brand policing.
+
+Met with counsel for the CLOUDSTACK matter, and met with a representative 
+from UKFast to work on a settlement to ensure our registration in the EU 
+can continue and to ensure that UKFast recognizes our marks.
+
+<private>
+Heghlu'meH QaQ jajvam
+</private>
+
+
+-----------------------------------------
+Attachment 3: Report from the VP of Fundraising  [Upayavira]
+
+At the request of Upayavira, this month’s report is being written by Melissa.
+
+Melissa has been continuing to follow-up on the renewals that have been sent
+out.  As a result of her persistence, some that we thought were “dead”, she
+has revived.
+
+We have received a Bronze payment from Cerner.  
+
+As of the writing of this, we’re awaiting an update from the Treasurer’s
+office on any new payments.
+
+Melissa has reached out to Sam to request the Tax#/EIN# be added to the quotes
+and invoices.
+
+Facebook has sent a Supplier ACH Enrollment Form, which Melissa has completed
+and sent off to them.
+
+In the process of adding “thank yous” to individual donors on the “Thanks”
+page of the website.
+
+<private>
+lojmIt yIpoSmoH!
+</private>
+
+The renewals for Yahoo! and Citrix will be going out soon, as they are up for
+renewal the first week of April.
+
+Although we’ve been making great progress, it’s clear that we still have a lot
+of work ahead of us.   I’ve (me, Melissa) actually been contemplating a better
+invoicing/accounting system to keep track of this.  I think it would be in our
+best interest if we purchase an invoicing/accounting system.  We might have to
+pay for a program, but it would be totally worth it in the long run.
+
+
+-----------------------------------------
+Attachment 4: Report from the VP of Marketing and Publicity  [Sally Khudairi]
+
+I. Budget: we remain on schedule and under budget. All vendor payments have
+been processed on time with thanks to the Treasurer and Operations teams.
+
+II. Fundraising/Branding/Marketing liaison: no meetings are planned. Sally
+Khudairi completed Sponsor renewal outreach activities for several
+organizations, and has secured confirmation from select Platinum-level
+Sponsors.
+
+III. Press Releases: the following formal announcement was issued via the
+newswire service, ASF Foundation Blog, and announce@apache.org:
+
+- 11 January 2014: The Apache Software Foundation Announces Release of #Apache™
+  #SpamAssassin™ 3.4.0
+
+IV. Informal Announcements: six newsworthy items were announced on @TheASF; one
+new post was made on the @ApacheCon Twitter feed. No new posts were made on
+"TheApacheFoundation" account on YouTube.
+
+V. Future Announcements: one project milestone announcement is planned to take
+place by the end of the month. PMCs wishing to announce major project news, as
+well as podlings ready to graduate from the Incubator, are welcome to contact
+Sally at <pr...@apache.org> for more information. Kindly provide at least
+2-weeks' notice for proper planning and execution.
+
+VI. Media Relations: we responded to 9 media requests, and 2 notifications for
+industry award submissions. The ASF received 1,519 press clips over this time
+period, vs. last month's clip count of 422.
+
+VII. Analyst Relations: we responded to 2 analyst queries. Apache was mentioned
+in 17 reports by Gartner, 7 write-ups by GigaOM, 13 reports by Yankee Group,
+and 3 reports by IDC.
+
+VIII. ApacheCon liaison: Sally is liaising with the ApacheCon producer, with
+particular focus on communications and sponsor outreach.
+
+IX. (Non-ASF) Industry Events and Outreach liaison: Sally continues
+coordinating award nominations for a few Apache projects, as well as liaising
+with the ASF's presence at several conferences and virtual events.
+
+X. Newswire accounts: we have renewed our pre-paid press release agreement with
+NASDAQ GlobeNewswire, and have 17 in our account through the end of the
+calendar year. We also have 9 remaining pre-paid press releases on the
+PRNewswire account through May 2014, as well as ongoing distribution donated by
+Pressat with no pre-established termination timeframe.
+
+
+-----------------------------------------
+Attachment 5: Report from the VP of Infrastructure  [Sam Ruby]
+
+
+New Karma:
+==========
+
+
+Finances:
+==========
+
+
+Board Action Items:
+===================
+
+
+Short Term Priorities:
+======================
+
+* Look into mac build slaves.
+
+
+* Converge on git.apache.org migration to eris. (Step 1 is merge git ->
+  git-wip on tyr) (opinions?)
+
+* Investigate / negotiate external code-signing capability, currently in talks
+  under NDA. INFRA-3991 is tracking the status, and a Webex call has taken
+  place.
+
+* Complete nagios-to-circonus migration for monitoring.
+
+* Continue to experiment with weekly team meetings via google hangout.
+
+* Explore the possibility of revamping the infra documents to have a more 
+  intuitive feel about them, improve readability.
+
+* Confluence Upgrade. Upgrade from 5.0.3 to latest. Hopefully will be less
+  painful this time around.  (Support case closed, nothing useful came from it
+  other than check the logs.)
+
+* Port tlp creation scripts over to new json-based design on whimsy.
+
+* Ensure all contractors are participating in on-call situations, minimally by
+  requiring cell-phone notification (via SMS, twitter, etc) for all circonus
+  alarms.
+
+* Explore better integration with GitHub that allows us to retain the same
+  information on the mailing list, so that vital discussions are recorded as
+  having taken place in the right places (if it didn't happen on the ML...).
+
+Long Range Priorities:
+======================
+
+* Choose a suitable technology for continued buildout of our virtual
+  hosting infra.  Right now we are on VMWare but it no longer is gratis
+  software for the ASF.
+
+* Continue gradually replacing gear we no longer have any hardware warranty
+  support for.
+
+* Formulate an effective process and surrounding policy documentation for
+  fulfilling the DMCA safe harbor provisions as they relate to Apache services.
+
+* Institute egress filtering on all mission-critical service hosts.
+  <private>
+  nuqjatlh?
+  </private>
+
+
+General Activity:
+=================
+
+* Migrated dist.apache.org from backups of thor to eris.  Unfortunately a
+  dozen commits were naturally lost in the process.  Thanks to TRACI.NET for
+  providing additional bandwidth for this purpose.
+  <private>
+  qaStaH nuq?
+  </private>
+
+* Jira: Jira is now runnning on Apache Tomcat 8.0.0 (rather than 7.0.x). While
+  running on 8.0.x is unsupported by Atlassian, this is providing valuable
+  feedback to the Tomcat community. To mitigate the risk of running an
+  unsupported configuration, Jira is being monitored more closely than usual for
+  any problems and there is a plan in place to rollback to 7.0.x if necessary.
+
+* At the behest of committers, we have started working on a stronger
+  implementation of GitHub services, including 'vanity plates' for all Apache
+  committers on GitHub.  A method of interacting with GitHub Pull Requests and
+  comments has been completed, that both interacts with the GitHub interface
+  and retains all messages on the local mailing lists and JIRA instances for
+  record keeping. At the time of writing, we have 367 committers on the Apache
+  team on GitHub. We have made a blog entry about this at
+  http://s.apache.org/asfgithub which seems to have reached many projects
+  already.  Furthermore, the Incubator has been involved in the development of
+  this, and are thus also aware of its existence and use cases.
+
+* The new SSL wildcard was obtained from Thawte earlier this month, and will
+  be rolled out to services very soon. Thanks to jimjag this got the business
+  end of the deal done so we could actually get the cert in before the incumbent
+  expires.
+
+* All remaining SVN repos have now been upgraded to 1.8.
+
+* Resurrected thor (mail-search) after soliciting help from SMS for on-site
+  repairs.
+
+* Amended release policy to provide rationale and spent time explaining the new
+  section to members@.  See http://www.apache.org/dev/release#why
+
+* Work with Cordova on processing their historical releases to comport with
+  policy.
+
+
+-----------------------------------------
+Attachment 6: Report from the Apache Travel Assistance Committee  [Gavin McDonald]
+
+We had 26 applications submitted this time. Of those, based on the judges
+recommendations, the committee chose to accept 15 of these. Considering the
+tight timescales we've been compressed into, those numbers are actually
+pretty good.
+
+All 15 sucessful applicants have accepted, and we now have an almost
+complete set of flight / hotel / conference / dates / etc requirements from
+everyone. We're working with the travel agent to find the cheapest sensible
+flights for everyone, probably about half have been finalised now, rest
+expected soon. As with past conferences, we're booking non-refundable and
+non-changable tickets, and we're self-insuring for the event of someone not
+getting a visa or similar. We're ensuring everyone has their own travel
+insurance to cover medical costs especially, but also ideally cancellations
+in case they're ill or similar.
+
+We've 5 applicants who need to apply for visas, so these are our top
+priority.
+
+We have however hit a snag with getting the wire transfer to the Travel
+Agent, so she can ticket the flights we're happy with. We think we'll
+probably be fine to wait until early next week to ticket most flights, but
+for next time it'd be good if more people were able to approve transfers
+with the bank. If the delay looks set to increase, we'll just put more (or
+perhaps even all) on credit cards.
+
+On a related money note, only Gav and Melissa have access to
+/repos/private/financials/Bills/ to submit or track invoices. It would be
+good if all of the Travel Assisstance Committee could be given access too,
+since we do generate a fair number each year.
+
+-----------------------------------------
+Attachment 7: Report from the VP of W3C Relations  [Andy Seaborne]
+
+Nothing to report this month.
+
+-----------------------------------------
+Attachment 8: Report from the Apache Legal Affairs Committee  [Jim Jagielski]
+
+Relatively slow but steady month. No progress yet on Creative Commons
+(CC-BY 4.0) issue. Geir has offered to help regarding conversations
+with Oracle related to TCK access (renewals as well as new ones).
+We are operating under the understanding that we still can test against
+expired TCKs in the meantime.
+
+
+-----------------------------------------
+Attachment 9: Report from the Apache Security Team Project  [Mark Cox]
+
+There continues to be a steady stream of reports of various kinds
+arriving at security@ in Jan. These continue to be dealt with by
+the security team.
+
+Some effort was made this month to start to chase some old issues
+which we forwarded to projects but were there was no visible progress.
+One of these was escalated to the board after the reporter had no
+response for 6 months (the discussion was ongoing at the time of this
+report, but in general the difficulty is where a PMC does not have
+complete technical coverage of the project, in these cases we should
+make sure the PMC build a separate security team of the folks who can
+handle issues.  This is in no way an ASF-only issue, we see exactly
+the same problems with other upstreams including Linux kernel etc.)
+
+Jan 2014
+
+1 Security vulnerability question, but not a vulnerability report
+4 Phishing/spam/proxy/attacks point to site "powered by Apache"
+5 Vulnerability reports to security@apache.org
+       1 [cordova]
+       1 [directory]
+       1 [roller]
+       1 [archiva]
+       1 [shiro]
+10 Vulnerability reports to projects own security lists
+       2 [tomcat]
+       2 [camel]
+       2 [struts]
+       1 [cloudstack]
+       2 [aoo]
+       1 [hadoop]
+
+-----------------------------------------
+Attachment A: Report from the Apache Abdera Project  [Ant Elder]
+
+
+-----------------------------------------
+Attachment B: Report from the Apache Ambari Project  [Yusaku Sako]
+
+Apache Ambari simplifies provisioning, managing, and monitoring of Apache
+Hadoop clusters.
+Since the last report in Jan 2013, Ambari released 1.4.3 which included
+resolution of 238 JIRAs.
+
+Mailing Lists:
+  * user@ambari.apache.org: 201 subscribers (+6 since last report)
+  * dev@ambari.apache.org: 126 subscribers (-1 since last report)
+
+Releases:
+  * 2014-01-21  1.4.3
+  * 2014-01-03  1.4.2
+  * 2013-10-21  1.4.1
+  * 1.4.4 release vote underway
+
+Committers:
+  * 2013-12-23  Added Jeff Sposetti
+
+PMC:
+  * 2013-11-20  Added 37 initial PMC members upon establishing TLP
+
+Issues:
+  * There are no board-level issues at this time.
+
+-----------------------------------------
+Attachment C: Report from the Apache Ant Project  [Conor MacNeill]
+
+Apache Ant is a Java based build tool along with associated tools. It
+consists of 4 main projects:
+
+   - Ant core and libraries (Antlibs)
+   - Ivy - Ant based dependency manager
+   - IvyDE - Eclipse plugin to integrate Ivy into Eclipse
+   - EasyAnt - Ant and Ivy toolbox to support build processes
+
+o Release Status
+
+Core
+---------
+Ant 1.9.3 was released on December 29, 2013
+
+Ant Compress Antlib 1.4 was released on January 29th 2014
+
+Ivy
+-------
+Ivy 2.3.0 was released on January 21, 2013
+Ivy-DE 2.2.0 was released on November 22, 2013
+
+A release candidate has been proposed for Ivy 2.4.0 but is not yet available.
+
+EasyAnt
+-------------
+The current release is still from the Incubator
+0.9-Incubating.
+
+o Committers and PMC
+
+Jean-Louis Boudart was added to the PMC on Dec 6th, 2013
+
+Charles Duffy was made a committer on Dec 8th, 2013.
+
+o Community
+
+No issues.
+
+-----------------------------------------
+Attachment D: Report from the Apache Buildr Project  [Alex Boisvert]
+
+
+-----------------------------------------
+Attachment E: Report from the Apache Cassandra Project  [Jonathan Ellis]
+
+Cassandra is a distributed database providing massive scalability,
+high performance, and high availability.
+
+Releases:
+
+2.0.3  25 Nov 13
+1.2.12 25 Nov 13
+1.2.13 20 Dec 13
+2.0.4  30 Dec 13
+1.2.14  3 Feb 14
+
+Development:
+
+Work on 2.1 continues.  User-defined types [1] and collection indexing [2]
+are complete, and internal optimization is ongoing: we have added a persistent,
+atomic b-tree that saves 60% heap space compared to SnapTreeMap [3].
+
+Community:
+
+The January 2014 Cassandra Summit Japan [4] [5] saw about 100 attendees, a small
+increase over December 2012.  About 2/3 of the audience were running Cassandra
+in production.  There was widespread agreement that the English language
+is the largest barrier to Cassandra use in Japan, and growth will not take off
+until Japanese documentation is available.
+
+Mikhail Stepura was added as committer 16 Jan 2014.
+
+[1] https://issues.apache.org/jira/browse/CASSANDRA-5590
+[2] https://issues.apache.org/jira/browse/CASSANDRA-4511
+[3] https://git-wip-us.apache.org/repos/asf?p=cassandra.git;a=tree;f=src/java/org/apache/cassandra/utils/btree;h=20bf514a69d2ba368adea16388670b7b2ee257bf;hb=HEAD
+[4] http://b-rabbit.jp/cassandra/cstk2014/
+[5] http://d.hatena.ne.jp/oranie/20140127/1390798275
+
+
+-----------------------------------------
+Attachment F: Report from the Apache Clerezza Project  [Hasan Hasan]
+
+DESCRIPTION
+Apache Clerezza is an OSGi-based modular application and a set of components 
+(bundles) for building RESTFul Semantic Web applications and services.
+
+ISSUES FOR THE BOARD
+There are no issues requiring board attention at this time.
+
+RELEASE
+Latest release (partial-release-20130710) was created on 10.07.2013
+
+ACTIVITY
+Various improvements and bug fixes in source codes including:
+
+- Storage Provider:
+  - Integration of Virtuoso: improved bnode handling, improved handling of 
+    very long literals and literals with non-ascii characters
+- SPARQL
+  - Bug fix of SPARQL PreParser
+  - Improved SPARQL engine by acquiring read locks to prevent Concurrent 
+    Modification Exception
+  - Replaced deprecated TcManager method for SPARQL queries
+- Improved error reporting in processing InfoDiscobit
+- Improved graph management (added delete graph functionality)
+- New editor to fix webpage, support graph assert/revoke in various 
+  serializations in editor backend
+- Improved JenaSerializerProvider to get a readlock before serializing graphs
+- Fixed encoding issue with SRenderlets/XmlResult
+- Continue creation of various Karaf features and Sling Launcher 
+  PartialBundleLists to ease usage of Clerezza functionalities in other projects
+
+COMMUNITY
+Latest change was addition of a new committer and PMC member on 16.08.2013
+
+INFRASTRUCTURE
+- Source codes have been migrated to Git
+- Jenkins configuration fixed
+- Webpages require update. Minor update to the download section as requested by
+  sebb@apache.org has been made (removing link to snapshot version)
+
+-----------------------------------------
+Attachment G: Report from the Apache Click Project  [Malcolm Edgar]
+
+
+-----------------------------------------
+Attachment H: Report from the Apache Cocoon Project  [Thorsten Scherler]
+
+Apache Cocoon 3 is a major rewrite of Cocoon 2.2. Like Cocoon 2 it
+is based around the concept of pipelines and sitemaps and it is
+very similar to Cocoon 2.2 in many respects but is slimmed down and
+designed to be easily used with Java code (= no frameworks required!).
+On top of this, Cocoon 3 has the goal of becoming the best available
+platform for RESTful webservices and web applications.
+
+Issues needing board attention:
+ None.
+
+Changes in the PMC membership:
+ None.
+ Last modified: 2012/10/21 (change of PMC chair)
+
+Community
+
+Traffic on users and devs list continues be light. Some users asked about
+different issues in the different versions of cocoon. Various devs attended
+the questions and provided solutions. David Crossley pointed out that I was
+not subscribed to the board mailing which I fixed. Further I updated
+irs-disclosures.txt to my best knowledge however Simone had not been in this
+doc so I used a approx. date.
+
+Releases
+
+2.1 has been released on 2013/03/20.
+
+
+Development
+None
+
+
+Security issues reported:
+ None.
+
+Progress of the project:
+
+ We need to release a new version of cocoon 3 and cocoon 2.2 but still no
+committer has stepped up yet to do so.
+
+
+-----------------------------------------
+Attachment I: Report from the Apache Community Development Project  [Luciano Resende]
+
+
+-----------------------------------------
+Attachment J: Report from the Apache Continuum Project  [Brent Atkinson]
+
+
+-----------------------------------------
+Attachment K: Report from the Apache CouchDB Project  [Jan Lehnardt]
+
+Apache CouchDB is a database that uses JSON for documents, JavaScript for
+MapReduce queries, and regular HTTP for an API.
+
+Releases
+
+  No releases in this time period.
+
+  Release has been blocked on a number of issues, but is actively being
+  worked on.
+
+
+Recent Activity
+
+ - Number of the core devs met in Vienna to discuss the pending merges.
+ - Finalising the merge of Benoit Chesneau’s rcouch fork.
+ - Working on the BigCouch merge from Cloudant.
+ - Created a replication list to discuss specific replication topics.
+ - New marketing list about to be created for new marketing team.
+ - Confluence wiki set up, and migration being planned.
+ - Review Board instance set up, and discussion about review ongoing.
+ - Translation work going well.
+ - Community-provided packages added for Ubuntu Precise and upcoming
+   Trusty release.
+ - Community
+
+
+Including the following additions, CouchDB has 31 committers and
+9 PMC members.
+
+New committers:
+
+  Nick North
+
+No new PMC members. Most recent PMC addition Nov 9th, 2012.
+
+
+Mailing list stats:
+
+announce
+ - 151 subscribers (+20)
+ - 1 message since May (-1)
+
+user
+ - 1405 subscribers (-26)
+ - 1086 messages since May (+280)
+
+erlang
+ - 154 subscribers (+8)
+ - 14 messages since May (-8)
+
+dev
+ - 602 subscribers (-4)
+ - 1977 messages since May (+1097)
+
+commits
+ - 104 subscribers (-1)
+ - 2735 messages since May (+1694)
+
+l10n
+ - 31 subscribers (+10)
+ - 207 messages since May (+104)
+
+replication
+ - 47 subscribers
+ - 35 messages since May
+
+
+Issues
+
+None.
+
+
+-----------------------------------------
+Attachment L: Report from the Apache Creadur Project  [Robert Burrell Donkin]
+
+
+-----------------------------------------
+Attachment M: Report from the Apache DeltaSpike Project  [Mark Struberg]
+
+
+
+Apache DeltaSpike is a portable JSR-299 CDI
+(Contexts and Dependency Injection for Java) Extension library
+which contains lots of useful tools and helpers
+which are missing in the CDI core spec.
+
+DeltaSpike is not a CDI-container itself, but a portable
+Extension library which can run on all CDI-containers!
+
+DeltaSpike is tested and runs on many Java EE Servers 
+like Apache TomEE, Red Hat JBoss Application Server, 
+JBoss Wildfly, Oracle WebLogic, Oracle Glassfish, IBM WebSphere, and also
+on simple Servlet containers like Apache Tomcat or Jetty in combination
+with either JBoss Weld or Apache OpenWebBeans.
+
+Project Status:
+Bugfixing goes on in the current code base.
+Community is stable and active.
+Gerhard Petracek will present DeltaSpike on the JavaLand conference.
+
+Releases:
+last release: deltaspike-0.5 on 2013-09-11.
+
+As the JSF-integration module is now pretty much production 
+ready we will probably ship 1.0 pretty soon.
+
+Community:
+Last Committer: Thomas Andraschko (tandraschko) on 2013-12-14
+Mailing list activity was high and we had many different committers
+contributing to our jsf module improvements.
+
+Issues:
+There are no issues requiring board attention at this time.
+
+
+-----------------------------------------
+Attachment N: Report from the Apache DirectMemory Project  [Raffaele P. Guidi]
+
+
+-----------------------------------------
+Attachment O: Report from the Apache Empire-db Project  [Francis De Brabandere]
+
+Apache Empire-db is a relational database abstraction layer that allows
+developers to take a more SQL-centric approach in application
+development than traditional ORM frameworks. Its focus is to allow
+highly efficient database operations in combination with a maximum of
+compile-time-safety and DBMS independence.
+
+Progress of the project
+
+The last three months have been quite calm, nothing specific to mention.
+
+Changes in committers or PMC members
+
+There have been no changes in committers or PMC members during the last 
+months.
+
+Issues
+
+There are no issues that require the board's attention at this time.
+
+Releases
+
+NONE
+
+-----------------------------------------
+Attachment P: Report from the Apache Etch Project  [Martin Veith]
+
+Apache Etch is a cross-platform, language- and transport-independent
+RPC-like framework for building and consuming network services.
+
+BOARD ISSUES 
+There are no Board-level issues at this time. 
+
+RELEASES 
+* Apache Etch 1.3.0 was released on September 26, 2013. 
+
+ACTIVITY 
+* We have had some users on the lists but activity on the mailing list
+  is still rather low.
+* We got some patches for the cpp-binding from external contributors which have
+  been merged.
+
+COMMITTERS OR PMC MEMBERS CHANGE 
+* No changes regarding PMC or committers composition since graduation 
+  in January 2013. 
+* Our committer and user base is still quite small. We were able to get
+  exactly three PMC votes for the last release.
+
+
+-----------------------------------------
+Attachment Q: Report from the Apache Flume Project  [Arvind Prabhakar]
+
+DESCRIPTION
+
+Apache Flume is a distributed, reliable, and available system for
+efficiently collecting, aggregating, and moving large amounts of log
+data to scalable data storage systems such as Apache Hadoop's HDFS.
+
+RELEASES
+* The last release of Flume was version 1.4.0, released on July
+2, 2013.
+* Discussions around the next release are currently underway.
+
+CURRENT ACTIVITY
+* Development activity continues with steady stream of issues being
+logged and resolved.
+* A total of 76 issues have been filed, and 37 issues have been
+resolved between the period starting November 2, 2013 and January 29,
+2014.
+* Approximately 1135 messages were exchanged on the dev list in the
+past three months, while a total of 289 were exchanged on the user
+list in this period.
+
+COMMUNITY
+* Wolfgang Hoschek and Roshan Naik were added as committers to the
+project on September 24, 2013.
+* No new additions were made to the PMC on the project since it
+graduated from Incubator.
+* Currently there are:
+- Total of 226 subscribers to the developer list
+- Total of 523 subscribers to the user list
+- Total of 24 committers
+- Total of 20 PMC members
+
+ISSUES
+* There are no issues requiring board attention at this time.
+
+-----------------------------------------
+Attachment R: Report from the Apache Forrest Project  [David Crossley]
+
+Apache Forrest mission is software for generation of aggregated multi-channel
+documentation maintaining a separation of content and presentation.
+
+Issues needing board attention:
+  None.
+
+Changes in the PMC membership:
+  None.
+  Last modified: 2013-04-08
+  Most recent addition: 2009-06-09
+
+New committers:
+  None.
+  Most recent addition: 2009-06-09
+
+General status:
+  The most recent release is 0.9 on 2011-02-07.
+
+  No activity on the user mail list.
+
+  The only activity on the dev mail list was me doing a few issue tracker
+  comments to show people some easy things that they could do to help the
+  project to move forward.
+
+  We received a request from a maintainer endeavouring to enable the Homebrew
+  package manager to handle Forrest, beyond their current workaround. I did
+  explain to our project what needs to happen. There has been no response.
+
+  The project was asked to review our situation regarding the recently
+  revised branding guidelines. No-one commented that they have done so.
+
+  At this quarter, eight PMC members responded to my draft report. This
+  confirms that there are sufficient people hanging around for us to
+  potentially be able to make a decision or encourage new contributors.
+
+  The draft report did re-start a small discussion on private@ list about the
+  state of the project. People were reminded about the outcome of the last
+  time that this arose, i.e. it is okay for the project to be quiet, as long
+  as it is still able to make decisions. People were asked to make effort on
+  the dev mail list, and to assist with project tasks, and reminded about the
+  need for a release.
+
+Security issues reported:
+  None.
+
+Progress of the project:
+  Enabled per-project configuration of Cocoon error handling.
+
+  Updated our JSch supporting product.
+
+
+-----------------------------------------
+Attachment S: Report from the Apache Giraph Project  [Avery Ching]
+
+
+-----------------------------------------
+Attachment T: Report from the Apache Gora Project  [Lewis John McGibbney]
+
+The Apache Gora open source framework provides an in-memory data model and
+persistence for big data. Gora supports persisting to column stores, key
+value stores, document stores and RDBMSs, and analyzing the data with
+extensive Apache Hadoop MapReduce support.
+
+Project Releases
+
+The last release of Gora (0.3) was on 8th May 2013.
+
+Overall Project Activity since last report
+
+Project activity has been good. We've received a number of 
+contributions from non-pmc/committers which is really positive.
+Work is ongoing on GORA_94 a branch of the trunk code which 
+focuses on a long-overdue upgrade of our legacy Avro 
+dependencies from 1.3.3 to 1.7.X. As this is a major
+undertaking therefore once this is addressed we will 
+be pushing a release candidate for 0.4.
+
+When were the last committers or PMC members elected?
+
+Apostolos Giannakidis as PMC member and committer
+on 2014-01-17 (yyy-mm-dd). 
+
+How has the community developed since the last report?
+
+Shadowing overall project activity the community mailing
+lists and Jira have seen contributions from new faces
+and new names.
+This is very positive for the project showing that 
+people are not only using Gora but are keen to engage in
+development.
+Mailing list numbers are as follows
+user@:    from 49 --> 57
+dev@:     from 60 --> 64
+commits@  from NA --> 26
+
+Changes to PMC & Committers
+
+Apostolos Giannakidis joined as PMC member and committer
+on 2014-01-17 (yyy-mm-dd). Apostolos is the second GSoC
+student who has been VOTE'd by the Gora PMC to join our 
+ranks. Sebb kept us on our toes during the board@ 
+72hr NOTICE period so thank you to himn for that.
+
+PMC and Committer diversity
+
+We currently have committers from a wide variety of Apache projects
+including, Nutch, Tika, OODT, Camel, Solr, Accumulo, Whirr, Hadoop,
+Any23 & HBase (this is not an exhaustive list).
+
+
+-----------------------------------------
+Attachment U: Report from the Apache Hama Project  [Edward J. Yoon]
+
+Apache Hama is a BSP (Bulk Synchronous Parallel) computing framework
+on top of HDFS (Hadoop Distributed File System) for massive scientific
+computations such as matrix, graph and network algorithms.
+
+Releases
+
+The last release of Hama (0.6.3) was on 11th October 2013.
+
+Overall Project Activity since last report
+
+Traffic on the lists is stable, and we're continuously receiving
+contributions and questions from new users and committers. Developers
+are working on scalability issues.
+
+When were the last committers or PMC members elected?
+
+The last PMC addition: Aug 4, 2013
+The last committer addition: Sep 9, 2013
+
+How has the community developed since the last report?
+
+No significant difference since the last report.
+
+dev@ subscribers: from 94 -> 97 (+3 since last report)
+user@ subscribers: from 173 -> 176 (+3 since last report)
+
+
+-----------------------------------------
+Attachment V: Report from the Apache Helix Project  [Kishore Gopalakrishna]
+
+Apache Helix is a generic cluster management framework used to build
+distributed systems and provides automatic partition management, fault
+tolerance and elasticity.
+
+Development
+===========
+
+Fixed minor bugs and added new features.
+- Initial provisioning work to integrate with Resource managers like YARN and
+  Mesos
+- Controller pipeline performance improvements.
+- Task framework for tasks associated with resources
+- Design and initial code for monitoring with Helix
+- Atomic API to support admin operations like cluster creation etc.
+- 150 new JIRAS since last report.
+- 220 issues resolved.
+
+- Redesigned website. Added version specific docs.
+- Completed most of the work related to graduation
+
+Community
+=========
+- 550+ emails on the dev list
+- 100+ emails on the user list
+
+Releases
+=========
+
+- Released 0.6.2 with critical bug fixes and security patches. [Stable]
+- Released 0.7.0 with new high level api. [Alpha]
+- Plan to release 0.7.x stable version.
+
+
+-----------------------------------------
+Attachment W: Report from the Apache HTTP Server Project  [Eric Covener]
+
+Project Description
+===================
+The Apache HTTP Server Project is an effort to develop and maintain an
+open-source HTTP server for modern operating systems.
+
+Issues for the Board
+====================
+There are no outstanding issues that require the board's attention.
+
+Releases
+========
+We've had one maintenance release of each in-service stream
+sinc the last reporting period:
+
+* 2.2.26 was released Nov 18, 2013
+* 2.4.7 was released Nov 25, 2013
+
+Bug reports
+===========
+185 bugs had activity, 81 new, 90 resolved.
+
+Community
+=====================
+Yann Ylavic and Mike Mrumph were accepted as
+new committers.
+
+IRC and mailing list activity is steady.
+
+Development activity is relatively low.  There has been a
+hint of interest in SPDY and HTTP/2.0 and how we could
+adjust our architecture.
+
+A few interesting netcraft posts came out in this period,
+but not much community discussion on them yet.
+
+
+-----------------------------------------
+Attachment X: Report from the Apache HttpComponents Project  [Asankha Perera]
+
+The Apache HttpComponents project is responsible for creating and 
+maintaining a toolset of low level Java components focused on HTTP 
+and associated protocols.
+
+Status
+- Overall the project remains active.
+
+Releases
+- HttpComponents 4.3.1 GA was released on the 28th of December 2013
+- HttpClient 4.3.2 GA was released on the 21st of January 2014
+
+Community
+- Gary Gregory <ggregory at apache.org> was voted into the PMC on the 
+  27th of Jan 2014.
+
+- The community remains small but active, but has good user 
+  interaction on the mailing lists 
+
+
+-----------------------------------------
+Attachment Y: Report from the Apache Incubator Project  [Marvin Humphrey]
+
+The Apache Incubator is the entry path into the ASF for projects and
+codebases wishing to become part of the Foundation's efforts.
+
+There are 36 podlings currently under incubation.
+
+* Community
+
+  New IPMC members:
+
+    Suresh Srinivas
+    Carl Steinbach
+
+  People who left the IPMC:
+
+    Dennis Lundberg
+
+* New Podlings
+
+    (None)
+
+* Graduations
+
+  The board has motions for the following:
+
+    Open Climate Workbench
+
+  At time of writing, graduation votes were underway for the following:
+
+    Knox
+    Spark
+
+* Releases
+
+  The following releases were made since the last Incubator report:
+
+    Jan 21 Apache Metamodel 4.0.0-incubating
+
+  It took 9 days for the third IPMC vote to arrive.
+
+    Release                             RC VOTE start  Third IMPC +1   Days
+    -----------------------------------------------------------------------
+    Apache Metamodel 4.0.0-incubating   Dec 12         Dec 21      9
+
+* IP Clearance
+
+  * Salesforce donated the code for Phoenix, an open source SQL query engine
+    for Apache HBase, a NoSQL data store. It is accessed as a JDBC driver
+    and enables querying and managing HBase tables using SQL. 
+
+* Miscellaneous
+
+  * The issue of how best to integrate with GitHub is a recurring topic of
+    discussion.  Infra added a new feature -- forwarding of comments on pull
+    requests to dev lists -- which was well received.  However, as GitHub's
+    interface is an external commercial service rather than something we run
+    on our own hardware, it is difficult to ensure that communications
+    will be archived, requiring additional vigilance from PMCs.
+
+  * A proposal for Hoya, an application to deploy and manage existing
+    distributed applications in a YARN cluster, was discussed at length but
+    has not yet been voted on.
+
+-------------------- Summary of podling reports --------------------
+
+* Still getting started at the Incubator
+
+    DataFu
+
+* Not yet ready to graduate
+
+  No release:
+
+    Hadoop Development Tools
+    log4cxx2
+    Phoenix
+    Usergrid
+
+  Community growth:
+
+    Blur
+    Tez
+    Twill
+
+  Low activity:
+
+    Droids
+
+* Ready to graduate
+
+    Open Climate Workbench
+    Knox
+
+* Did not report, expected next month
+
+    BatchEE
+    DeviceMap
+    NPanday
+    Sirona
+
+----------------------------------------------------------------------
+                       Table of Contents
+Blur
+DataFu
+DeviceMap
+Droids
+Hadoop Development Tools
+Knox
+log4cxx2
+Open Climate Workbench
+Phoenix
+Tez
+Twill
+Usergrid
+
+----------------------------------------------------------------------
+
+--------------------
+
+Blur
+
+Blur is a search platform capable of searching massive amounts of data
+in a cloud computing environment.
+
+Blur has been incubating since 2012-07-24.
+
+Three most important issues to address in the move towards graduation:
+
+  1. We received the Trademark assign document from trademarks@ and are
+     pursuing getting it signed by Near Infinity.
+  2. Another Release
+  3. Another Release
+
+Any issues that the Incubator PMC (IPMC) or ASF Board wish/need to be
+aware of?
+
+  No.
+
+How has the community developed since the last report?
+
+  We continue to be small but active.
+  - Subscriptions: user@ - 54[+3]; dev@ - 61[+1]
+
+How has the project developed since the last report?
+
+  The majority of effort has been around bug fixes that were
+  needed.  The code is now solid and tested at scale now so we anticipate a
+  bug fix release soon.
+
+Date of last release:
+
+  2013-10-09
+
+When were the last committers or PMC members elected?
+
+  2013-08-30
+
+Signed-off-by:
+
+  [ ](blur) Doug Cutting
+  [X](blur) Patrick Hunt
+  [X](blur) Tim Williams
+
+--------------------
+DataFu
+
+DataFu provides a collection of Hadoop MapReduce jobs and functions in
+higher level languages based on it to perform data analysis. It provides
+functions for common statistics tasks (e.g. quantiles, sampling), PageRank,
+stream sessionization, and set and bag operations. DataFu also provides
+Hadoop jobs for incremental data processing in MapReduce.
+
+DataFu has been incubating since 2014-01-05.
+
+Three most important issues to address in the move towards graduation:
+
+  1. Building ASF community
+  2. Release
+  3. Remaining incubator paperwork
+
+Any issues that the Incubator PMC (IPMC) or ASF Board wish/need to be
+aware of?
+
+  None.
+
+How has the community developed since the last report?
+
+  Since initial incubation, have received contributions from two new
+  contributors.
+
+How has the project developed since the last report?
+
+  First report.  Have obtained all the necessary infra (git/jira/wiki,etc).
+  Thirty JIRAs have been opened, 14 have been closed.  Active discussion on
+  mailing list as to community development, etc.
+
+Date of last release:
+
+  None. First month of incubation.
+
+When were the last committers or PMC members elected?
+
+  None. First month of incubation.
+
+Signed-off-by:
+
+  [ ](datafu) Ashutosh Chauhan
+  [X](datafu) Roman Shaposhnik
+  [ ](datafu) Ted Dunning
+
+Shepherd/Mentor notes:
+
+  Dave Fisher (wave):
+
+    New community to the incubator just getting started. Good guidance from
+    Mentors. Needs Apache trademark attribution on site. Should have links
+    to Mailing lists on the site.
+
+--------------------
+DeviceMap
+
+Shepherd/Mentor notes:
+
+  Marvin Humphrey (marvin):
+
+    A draft report was posted to the DeviceMap mailing list on Friday
+    February 7th for review, but it was never added to the official report.
+
+--------------------
+Droids
+
+Droids aims to be an intelligent standalone robot framework that allows to
+create and extend existing droids (robots).
+
+Droids has been incubating since 2008-10-09.
+
+Three most important issues to address in the move towards graduation:
+
+  1. Activity
+
+Any issues that the Incubator PMC (IPMC) or ASF Board wish/need to be
+aware of?
+
+  None, beside the real low traffic on mailing list and source code commits.
+
+How has the community developed since the last report?
+
+  No changes to community.
+
+How has the project developed since the last report?
+
+  The project has been very quiet / dormant for the past half year.
+
+Date of last release:
+
+  2012-10-15
+
+When were the last committers or PMC members elected?
+
+  2012-05-07
+
+Signed-off-by:
+
+  [X](droids) Thorsten Scherler
+  [X](droids) Richard Frovarp
+
+Shepherd/Mentor notes:
+
+  John Ament (johndament):
+
+    Droids is a long standing podling, with a robust code base but without
+    much need for frequent releases.  I think graduating into an existing
+    TLP (not their own TLP) would be a good resolution, it helps avoid some
+    of the over head of many binding votes to carry on while still
+    maintaining an area to work in.  The people working on droids were fast
+    to respond and give feedback on what's happening, but like is mentioned
+    the list is not very active (in the past 6 months, the main
+    conversations going on were around status of the project).
+
+--------------------
+Hadoop Development Tools
+
+Eclipse based tools for developing applications on the Hadoop platform
+
+Hadoop Development Tools has been incubating since 2012-11-09.
+
+  1. we have to finish the release of version 0.0.1, the main issue being
+     resolving source and binary license and notice files.
+  2. we have to define and implement an effective approach to manage the
+     "client connections" to multiple clusters.
+  3. Build Community
+
+Any issues that the Incubator PMC (IPMC) or ASF Board wish/need to be
+aware of?
+
+ - None
+
+How has the community developed since the last report?
+
+ - Srimanth Gunturi joined as committer and PPMC member
+
+How has the project developed since the last report?
+
+ - Two additional 0.0.1 release candidates as we worked through issues
+ - Jenkins job setup
+
+Date of last release:
+
+ - None
+
+When were the last committers or PMC members elected?
+
+ - November 2013
+
+Signed-off-by:
+
+  [ ](hadoopdevelopmenttools) Suresh Marru
+  [ ](hadoopdevelopmenttools) Chris Mattmann
+  [X](hadoopdevelopmenttools) Roman Shaposhnik
+
+Shepherd/Mentor notes:
+
+  Dave Fisher (wave):
+
+    I don't see any on dev list activity since their release in November was
+    held up due to dependency issues and LICENSE issues.
+
+    Are these guys talking somewhere else?
+
+--------------------
+Knox
+
+Knox Gateway is a system that provides a single point of secure access for
+Apache Hadoop clusters.
+
+Knox has been incubating since 2013-02-22.
+
+Three most important issues to address in the move towards graduation:
+
+  1. Expand community to include more diverse committers.
+  2. Review and complete all graduation readiness items.
+  3. Begin the process!
+
+Any issues that the Incubator PMC (IPMC) or ASF Board wish/need to be aware
+of?
+
+  1. None
+
+How has the community developed since the last report?
+
+  1. Two new committers added.
+  2. More user questions on user list trickling in.
+
+How has the project developed since the last report?
+
+  1. Internally agreed to being graduation processes.
+  2. Working toward a 0.4.0 release.
+  3. A few IP issues found and resolved.
+  4. Resolved 142(+42) of 242(+52) total issues currently in JIRA.
+
+Date of last release:
+
+  0.3.0: 2013-10-13
+
+When were the last committers or PMC members elected?
+
+  2013-12-19: Added Vladimir Tkhir as new committer
+  2013-12-19: Added Maksim Kononenko as new committer
+
+Signed-off-by:
+
+  [ ](knox) Owen O'Malley
+  [X](knox) Chris Douglas
+  [ ](knox) Mahadev Konar
+  [X](knox) Alan Gates
+  [ ](knox) Devaraj Das
+  [ ](knox) Chris Mattmann
+  [X](knox) Tom White
+
+--------------------
+log4cxx2
+
+Logging for C++
+
+log4cxx2 has been incubating since 2013-12-09.
+
+Three most important issues to address in the move towards graduation:
+
+  1. We probably need to decide what's an acceptable platform/compiler
+     list, sort out any remaining hiccups, and then move towards a
+     release.
+  2. We need to publish the project site with updated content to
+     reflect the new status and fix documentation bugs.
+  3. We need to make a broader use of the ASF infrastructure
+     (notably the CI, as well as improved management of the Jira
+     site - notably with triaging), and establish a roadmap for
+     the next releases.
+
+Any issues that the Incubator PMC (IPMC) or ASF Board wish/need to be
+aware of?
+
+  We are stuck on INFRA-7209 and how to properly publish the project
+  site.
+
+How has the community developed since the last report?
+
+  The committers are still getting acquainted with each other and the
+  foundation. There have been some discussions about how to develop
+  within the team of committers already, like using a CI, how
+  to deal with issues regarding a changelog, which fixes should be
+  covered by our first incubation release etc.
+  Moderation of the list seems to work, there were some support
+  requests which were answered and problems introduced by commits on
+  trunk discussed.
+
+How has the project developed since the last report?
+
+  Some known bugs were fixed already and available patches applied,
+  which is work in progress for the new release. It has been suggested
+  to schedule most of the remaining available patches for an upcoming
+  release of 0.11.0 to include as much content which has been provided
+  over the years as possible.
+
+Date of last release:
+
+  2008-04-03 was the official, pre-incubation 0.10.0
+
+  Many post-0.10.0 commits exist on trunk which we intend to get out
+  as 0.11.x.
+
+When were the last committers or PMC members elected?
+
+  N/A
+
+Signed-off-by:
+
+  [X](log4cxx2) Christian Grobmeier
+  [ ](log4cxx2) Scott Deboy
+
+--------------------
+Open Climate Workbench
+
+Shepherd/Mentor notes:
+
+  Justin Mclean (jmclean):
+
+    Report not submitted. Project is up for graduation at board meeting.
+
+--------------------
+Phoenix
+
+Phoenix is an open source SQL query engine for Apache HBase, a NoSQL data
+store.  It is accessed as a JDBC driver and enables querying and managing
+HBase tables using SQL.
+
+Phoenix has been incubating since 12/11/2013.
+
+Three most important issues to address in the move towards graduation:
+
+  1) Perform initial release out of apache incubator followed up quickly
+     by two new releases
+  2) Make our customers successful and prove value of Phoenix+HBase over
+     other alternatives
+  3) Attract new committers to the project
+
+Any issues that the Incubator PMC (IPMC) or ASF Board wish/need to be
+aware of?
+
+The below is informational for the IPMC (no need to forward the board):
+
+  We've been waiting for our Github issues to be imported into our Apache
+  JIRA but it is taking a while. We're considering doing the import
+  ourselves, as we're starting to see duplicate JIRAs and continue to have
+  to point users back to our old Github issues.
+  [[https://issues.apache.org/jira/browse/INFRA-7179|INFRA-7179]]
+
+How has the community developed since the last report?
+
+We've cut over from our former Github-based open source project to
+our new Apache home and dev and user lists are busy.
+
+No new committers.
+
+How has the project developed since the last report?
+
+ * Apache Brand Management has ok'd our name of Apache Phoenix [1]
+ * IP Clearance is nearly complete: software grant has been
+   submitted and acknowledged. Vote is underway and will close
+   on 2/8.  IP-CLEARANCE note has been posted on general.
+ * Reviewing proposed release on dev list and if all looks good,
+   will start a vote for our first release next week.
+ * Working in parallel toward a new 3.0.0 release as well.
+
+Date of last release:
+
+ No release yet.
+
+When were the last committers or PMC members elected?
+
+ No new committers or PMC members.
+
+
+1. https://issues.apache.org/jira/browse/PODLINGNAMESEARCH-44?filter=-2
+
+Signed-off-by:
+
+  [x](phoenix) Lars Hofhansl
+  [X](phoenix) Andrew Purtell
+  [X](phoenix) Devaraj Das
+  [ ](phoenix) Enis Soztutar
+  [X](phoenix) Steven Noels
+
+--------------------
+Tez
+
+Tez is an effort to develop a generic application framework which can be
+used to process arbitrarily complex data-processing tasks and also a
+re-usable set of data-processing primitives which can be used by other
+projects.
+
+Tez has been incubating since 2013-02-24.
+
+Three most important issues to address in the move towards graduation:
+
+  1. Growing the community
+  2.
+  3.
+
+Any issues that the Incubator PMC (IPMC) or ASF Board wish/need to be
+aware of?
+
+  None at this time.
+
+How has the community developed since the last report?
+
+  No new PPMC members or committers added since the last report. We have had
+  interest from both new users and contributors via mailing lists and JIRA.
+  The Hive project recently merged its native support for Tez into their
+  trunk branch. The Pig community is also working on integrating  Tez and we
+  have seen various JIRAs filed as well as some patches from Pig developers.
+
+How has the project developed since the last report?
+
+  Since the first week of November, 2013 (last report), we have had around
+  180+ jiras filed and 130+ jiras resolved. We made the first release of Tez
+  ( version 0.2.0 ) in the first week of December, 2013. There is currently
+  ongoing work to make Tez work on a secure Hadoop cluster, after which we
+  plan to do a 0.3.0 release.
+
+Date of last release:
+
+  2013-12-03
+
+When were the last committers or PMC members elected?
+
+  At project incubation. No new PPMC members or committers added since the
+  last report.
+
+Signed-off-by:
+
+  [ ](tez) Alan Gates
+  [ ](tez) Arun Murthy
+  [X](tez) Chris Douglas
+  [ ](tez) Chris Mattmann
+  [x](tez) Jakob Homan
+  [ ](tez) Owen O'Malley
+
+--------------------
+Twill
+
+Twill is an abstraction over Apache Hadoop® YARN to reduce the complexity of
+developing distributed applications.
+
+Twill has been incubating since 2013-11-14.
+
+Top three items to resolve before graduation:
+
+  - More committers from different organizations.
+  - Regular Releases.
+  - Increase adoption.
+
+Any issues that the Incubator PMC (IPMC) or ASF Board wish/need to be
+aware of?
+
+  - None at this time.
+
+How has the community developed since the last report?
+
+  - Activity on the dev list up from 141 messages in December to 173
+    in January.
+  - Subscribers to the dev list up from 24 to 31.
+  - One new contributor in January.
+
+How has the project developed since the last report?
+
+  - IP clearance was completed.
+  - Web site is up and running.
+  - First release is currently under vote on the incubator list.
+
+Date of last release:
+
+  - First release is under vote and expected to happen 2/6/14.
+
+What are the plans for the next period?
+  - Establish a cadence of monthly releases
+  - Engage more members of the community to contribute actively
+  - Improve documentation and website
+
+When were the last committers or PMC members elected?
+
+  - No new committers since incubation.
+
+Signed-off-by:
+
+  [ ](twill) Vinod K
+  [ ](twill) Arun C Murthy
+  [X](twill) Tom White
+  [X](twill) Patrick Hunt
+  [ ](twill) Andrei Savu
+
+Shepherd/Mentor notes:
+
+  Roman Shaposhnik (rvs):
+
+    A brand new community off to a good start
+
+--------------------
+Usergrid
+
+Usergrid is an open-source Backend-as-a-Service (“BaaS” or “mBaaS”) composed
+of an integrated distributed NoSQL database, application layer and client
+tier with SDKs for developers looking to rapidly build web and/or mobile
+applications.
+
+Usergrid has been incubating since 2013-10-03.
+
+Three most important issues to address in the move towards graduation:
+
+  1. Learning the Apache Way
+  2. Growing a diverse community
+  3. Getting project infrastructure and codebase setup at Apache
+
+Any issues that the Incubator PMC (IPMC) or ASF Board wish/need to be
+aware of?
+
+  - None at this time
+
+How has the community developed since the last report?
+
+  - A couple of new names have appeared on dev@usergrid which is positive.
+
+How has the project developed since the last report?
+
+  - Have imported JIRA issues from pre-Apache project JIRA
+  - Work is continuing on a new "Core Persistence" module
+  - Almost done with Java package renaming to org.apache.usergrid
+
+Date of last release:
+
+  - No releases yet.
+
+When were the last committers or PMC members elected?
+
+  - Alex Karasulu, January 13, 2014
+
+Signed-off-by:
+
+  [ ] (snoopdave) Dave Johnson
+  [X] (jfarrell) Jake Farrell
+  [X] (jim) Jim Jagielski
+  [X] (lewismc) Lewis John Mcgibbney
+  [ ] (lresende) Luciano Resende
+
+
+-----------------------------------------
+Attachment Z: Report from the Apache jclouds Project  [Andrew Bayer]
+
+A cloud agnostic library that enables developers to access a variety of
+supported cloud providers using one API.
+
+Project Status
+--------------
+
+jclouds was confirmed as a TLP in October 2013 and has carried out two
+successful releases (1.6.3 and 1.7.0) since then. The developer and user
+community is active, with a sustained number of improvements being contributed
+by users. The PMC has recently discussed how to encourage some of these users
+to become committers and is actively reaching out to grow the committer base.
+
+Community
+---------
+
+''When was the last committer voted in?''
+
+2013-08-08 (Zack Shoylev)
+
+''When was the last PMC member added?''
+
+2013-04-29 (initial composition of the PMC when jclouds entered the incubator)
+
+There is regular activity on both the user and dev lists. Responses to
+questions are generally fast, with multiple community members contributing.
+
+Community Objectives
+--------------------
+
+What are the projects main plans and expectations for the community in the
+next period?
+
+ * Growing the committer base by encouraging regular contributors
+ * Encouraging involvement and contributions by vendors of supported providers
+ * Improving the user and new developer experience through revamped
+   documentation
+ * "Freshening up" the project's image via a new site design
+ * Finishing ongoing architectural changes in preparation for the next major
+   version
+
+Releases
+--------
+
+Have there been any releases from the project in the last quarter?
+
+ * 1.6.3 (2013-11-30)
+ * 1.7.0 (2013-12-23)
+ * 1.7.1 (2014-02-11)
+
+
+-----------------------------------------
+Attachment AA: Report from the Apache jUDDI Project  [Kurt Stam]
+
+jUDDI (pronounced "Judy") is an open source Java implementation of the
+Universal Description, Discovery, and Integration (UDDI v3) specification for
+(Web) Services. The jUDDI project includes Scout. Scout is an implementation
+of the JSR 93 - Java API for XML Registries 1.0 (JAXR). 
+
+jUDDI 
+- Very low traffic on the mailing lists this quarter.
+- Release 3.2.0. For full announcement see
+  http://apachejuddi.blogspot.com/2014/02/juddi-320-released-now-with-full-gui.html. 
+
+Scout 
+- No release this period, not really any development took place.
+- Very low volume of JAXR related questions on the mailing list. 
+
+Last PMC addition and new committer April 3, 2013 (Alex O'Ree)
+Last Release jUDDI-3.2.0, Feb 5, 2014
+There are no issues that require the boards attention at this time.
+
+
+-----------------------------------------
+Attachment AB: Report from the Apache Kafka Project  [Jun Rao]
+
+Apache Kafka is a distributed pub/sub system for efficiently collecting and
+delivering a large number of messages to both offline and online systems.
+
+Development
+===========
+We released Kafka 0.8.0 and have since improved existing admin tools. An 0.8.1
+release branch has been created and we intend to release 0.8.1 in a few weeks.
+We are actively working on a new version of the producer client, which
+provides better performance and a cleaner api. After that, we expect to
+rewrite the consumer client for the same reasons.
+
+Community
+===========
+Lots of activities in the mailing list. kafka-user has 538, 461, 436 emails in
+Jan, Dec and Nov, respectively (slightly less than 582 in Oct). kafka-dev has
+540, 509, 540 emails in Jan, Dec and Nov (slightly less than 581 in Oct). At
+least one Kafka talk is submitted to ApacheCon 2014. We last elected two
+committers in Oct. 2013.
+
+Releases
+===========
+0.8.0 was released on Dec 3, 2013.
+
+-----------------------------------------
+Attachment AC: Report from the Apache Lenya Project  [Richard Frovarp]
+
+The Apache Lenya CMS is a Cocoon based XML/XHTML content management
+system.
+
+Issues:
+
+No board level issues at this time.
+
+Development:
+
+No new releases this quarter.
+Last release: 2.0.4 on 2011-03-14
+
+Community:
+
+Last change to community was PMC addition in October 2011.
+
+
+-----------------------------------------
+Attachment AD: Report from the Apache Libcloud Project  [Tomaz Muraus]
+
+Libcloud is a Python library that abstracts away the differences among
+multiple cloud provider APIs.
+
+Issues
+
+There are no issues that require the board's attention at this time.
+
+Releases
+
+- Libcloud 0.14.0 has been released on January 22nd, 2014
+- Libcloud 0.13.3 (security release) has been released on December 31st, 2013
+- Libcloud 0.14.0-beta3 has been released on November 25th, 2013
+
+Community
+
+- Brian Curtin joined as a committer on November 25th, 2013
+- Latest PMC addition - John Carr On August 4th, 2013
+- I (Tomaz Muraus) have attended CloudStack Collaboration conference in
+  Amsterdam in November where we had good collaboration with CloudStack
+  people
+
+Miscellaneous
+
+- We have launched a new website -
+  https://libcloud.apache.org/blog/2014/01/23/welcome-to-the-new-website.html
+- We have issued a security release for CVE-2013-6480
+  (https://libcloud.apache.org/security.html#CVE-2013-6480) in December. The
+  security release was out on the same day that the security issue has been
+  reported.
+
+
+-----------------------------------------
+Attachment AE: Report from the Apache Logging Project  [Christian Grobmeier]
+
+The Apache Logging Services Project creates and maintains open-
+source software related to the logging of application behavior.
+
+Currently there are no issues, which require the board’s attention.
+
+
+- Community
+
+Log4j 2 remains a very active project. The overall
+community is healthy and friendly. We expect to add new committers in the 
+coming weeks.
+
+Log4j2 talks were submitted to the ApacheCon US CFP.
+
+Log4cxx returned to the incubator and was active for a few weeks.
+
+A Chainsaw release is currently blocked because we don't have
+access to a code signing certificate. We consider this very
+important for Chainsaw. Our Infra request showed that
+other projects need access to that certificate as well, like:
+OpenOffice, jUDDI, Tomcat.
+
+The ticket is unresolved since 05/Oct/2011:
+https://issues.apache.org/jira/browse/INFRA-3991 
+
+In general, the project is healthy and growing.
+
+- Project Branding Requirements
+
+All components meet the branding requirements, except Chainsaw. 
+We are still planning for a new Chainsaw release.
+
+- Last three community changes
+
+ * Remko Popma joined the PMC on Sep 28 2013.
+ * Dominik Psenner joined the PMC on Jun 03 2013.
+ * Nick Williams joined as a Committer on May 11 2013.
+
+- Releases
+
+ * Log4j Extras 1.2.17 (Oct 20, 2013)
+ * Log4j 2.0-beta9 (Sep 21, 2013)
+ * Log4net 1.2.12 (Sep 13, 2013)
+    
+- Subproject summaries
+
+Log4j 2: Very active. We are discussing a new beta or release
+candidate and the GA release.
+
+Log4j 1: Almost no activity.
+
+Log4net: Less active, but healthy and maintained.
+
+Log4cxx: Returned to the incubator, very active since then.
+
+Log4php: Less activity.
+
+Chainsaw: The ticket INFRA-3991 is blocking a new release: 
+    https://issues.apache.org/jira/browse/INFRA-3991
+
+
+-----------------------------------------
+Attachment AF: Report from the Apache ManifoldCF Project  [Karl Wright]
+
+Project description
+==============
+
+ManifoldCF is an effort to provide an open source framework for connecting
+source content repositories like Microsoft Sharepoint and EMC Documentum, to
+target repositories or indexes, such as Apache Solr, OpenSearchServer or
+ElasticSearch. ManifoldCF also defines a security model for target
+repositories that permits them to enforce source-repository security
+policies.
+
+Releases
+========
+
+ManifoldCF graduated from the Apache Incubator on May 16, 2012.  Since then,
+there have been five major releases, including a 1.4 release on October 28,
+2013, and a point release 1.4.1 on November 16, 2014.  A new major release
+(1.5) is being voted on at this time.
+
+Committers and PMC membership
+========================
+
+The last committer and PMC member we signed up was Minoru Osuka (minoru), on
+January 10, 2013.  We voted in a new committer and PMC member in May, but he
+declined to accept the committership due to his company's policies.  Other
+contributors have been approached, but have also declined to accept
+consideration for possible committership. The most recent of these
+encounters took place in September.
+
+We are still not entirely sure why people who are obviously interested and to
+some degree committed to the project seem unwilling to become full committers.
+I suspect that corporate restrictions make this a challenge in some cases.
+Also, we seem to be interacting more with contractors than with employees
+recently, and it may well be that contractors have less interest in a
+long-standing relationship with our project.  Nevertheless, we have rumors of
+significant contributions being prepared by at least three individuals; if any
+of these contributions are made, then we will likely offer the individuals
+involved committerships.
+
+Mailing list activity
+==============
+
+Mailing list has been active, with a wide range of topics.  Most of our
+connectors now have significant use cases and constituencies.  Dev list
+comments centered around voting, extensions to the SharePoint connector,
+people looking for integration advice, etc.  ManifoldCF also participated in
+Google Summer of Code, and MCF committers mentored one student developer
+through end of September 2013.
+
+External contributions and even committer contributions have been significant
+this quarter, despite heavy workload among most of the committer community.
+
+I am unaware of any mailing-list question that has gone unanswered.
+
+Outstanding issues
+==================
+
+None.
+
+Branding
+========
+
+We have reviewed the site branding guidelines and believe we are now
+compliant with these, with the possible exception of (TM) signs in logos
+from other Apache products that don't have any such marks.  We have
+not yet scheduled time to address this issue.
+
+
+-----------------------------------------
+Attachment AG: Report from the Apache Marmotta Project  [Jakob Frank]
+
+Apache Marmotta, an Open Platform for Linked Data.
+
+Apache Marmotta was founded in December 2012 and has graduated from
+the Incubator in November 2013.
+
+The first maintenance release (3.0.1) was published this month, the
+next major release is currently blocked by an incompatible transitive
+dependency (LGPL).
+
+Traffic on the lists is stable. Especially users@marmotta.a.o shows
+promising engagement, we are receiving contributions from users after
+questions on the list.
+
+Subscribers to the projects mailing list:
+    dev@marmotta.a.o: 60 subscribers (+2 since last report, 2014-01)
+  users@marmotta.a.o: 66 subscribers (+5 since last report, 2014-01)
+
+
+Releases
+  2014-01-21 (3.0.1)
+  2013-10-03 (3.1.0-incubating)
+
+Committers & PMC
+  Raffaele Palmieri (committer&PMC, 2013-05-21)
+  Peter Ansell (committer&PMC, 2013-06-24)
+
+Issues for the Board
+  There are no Board-level issues at this time.
+
+
+-----------------------------------------
+Attachment AH: Report from the Apache Mesos Project  [Benjamin Hindman]
+
+Apache Mesos is a cluster manager that provides resource sharing and
+isolation across cluster applications.
+
+## General ##
+
+The state of the project seems healthy, lots of releases (5 since the
+last board report) and continued adoption plus mailing list and
+development contributions.
+
+## Releases ##
+
+ * Apache Mesos 0.14.0 (2013-10-09)
+ * Apache Mesos 0.14.1 (2013-10-09)
+ * Apache Mesos 0.14.2 (2013-11-03)
+ * Apache Mesos 0.15.0 (2013-11-25)
+ * Apache Mesos 0.16.0 (2013-01-23)
+
+## Community ##
+
+ * Added 2 new committers and PMC members:
+    Jie Yu (jieyu) on 2013-01-25
+    Yan Xu (shortly after becoming a committer he had a baby so he
+            hasn't gotten an Apache account yet!)
+
+ * 164/117 created/resolved JIRA issues in last 90 days.
+ * 78/49 created/resolved JIRA issues in last 30 days.
+
+ * 115 messages to user@mesos.apache.org (January - February), with
+   2188 messages to dev@mesos.apache.org (a lot of which is from
+   Review Board and JIRA).
+
+ * Sharethrough hosted a hackathon in their SF office on February 14.
+
+ * Red Hat announced that Mesos has been officially accepted into
+   their distribution channel.
+
+ * A large refactor to the isolation and containerization mechanisms
+   in Mesos has driven multiple open source code contributions from
+   new contributors which we're very excited about.
+
+## Issues ##
+
+There are no issues requiring board attention at this time.
+
+
+-----------------------------------------
+Attachment AI: Report from the Apache Oltu Project  [Antonio Sanso]
+
+DESCRIPTION
+
+Oltu is a project to develop a Java library which provides an API
+specification for, and an unconditionally compliant implementation of the
+OAuth v2.0 specifications. OAuth is a mechanism that allows users to
+authenticate and authorise access by another party to resources they control
+while avoiding the need to share their username and password credentials.
+
+MILESTONES
+
+org.apache.oltu.commons 1.0 and org.apache.oltu.jose 1.0 were released on February 7th.
+
+CURRENT ACTIVITY
+
+The core part of the project related to 'The OAuth 2.0 Authorization
+Framework' (RFC 6749) is pretty stable due the fact RFC 6749 is now a
+standard.
+
+New parts of the OAuth specification family (JOSE) have been released this
+month. Soon we will release a stable version 1.0 of OAuth core.
+
+Users activity is growing slowly but steadily (the user@ mailing list has
+got new messages from potential new users)
+
+COMMUNITY
+
+PMC composition has not changed since graduation
+We have voted one new committer since graduation
+
+ISSUES
+
+There are no issues requiring board attention at this time.
+
+
+-----------------------------------------
+Attachment AJ: Report from the Apache Onami Project  [Simone Tripodi]
+
+DESCRIPTION
+
+Apache Onami is a project focused on the development and maintenance
+of a set of Google Guice extensions not provided out of the box by the
+library itself nor the Google developers team, such as integration
+with 3rd part frameworks or extra functionalities.
+
+MILESTONES
+
+Since last report, there have not been three new releases.
+
+CURRENT ACTIVITY
+
+Development activity is quite healthy, Onami-Persist proposal has been
+accepted and contributed, currently in the Onami Sandbox.
+
+COMMUNITY
+
+PMC composition has not changed since graduation.
+Users community is quite silent, development is not really active due to
+committers engagment in other projects.
+
+ISSUES
+
+There are no issues requiring board attention at this time.
+
+
+-----------------------------------------
+Attachment AK: Report from the Apache Oozie Project  [Mohammad Islam]
+DESCRIPTION
+ 
+Apache Oozie is a system for managing and scheduling
+workflows that run different types of Hadoop jobs 
+(such as MapReduce, Pig, Hive and Sqoop) as well as 
+system specific jobs (such as Java programs and shell scripts).
+ 
+RELEASES
+* Last release was Apache Oozie version 4.0.0,
+ released on AUG/30/2013. No new release since last report.
+* Apache Oozie version 4.0.1 is WIP
+ 
+CURRENT ACTIVITY
+* Development activity continues as can be seen from the
+following JIRA report:  http://s.apache.org/t9c (since
+last report, Nov 2013)
+ 
+COMMUNITY
+ 
+* PMC composition has not changed since last report.
+ 
+* Committers composition has not changed since last report.
+ 
+* Currently there are:
+- Total of 338  (+24) subscribers to the user list
+- Total of 115 (-1) subscribers to the developer list
+- Total of 14 committers
+- Total of 12 PMC members
+ 
+ISSUES
+ 
+* There are no issues requiring board attention at this
+time.
+
+-----------------------------------------
+Attachment AL: Report from the Apache OpenJPA Project  [Pinaki Poddar]
+
+There are no items requiring board attention at this time.
+
+* Highlights
+   Apache OpenJPA provides POJO persistence for stand-alone JSE, JEE   
+   container and many other lightweight frameworks, such as Tomcat,  
+   TomEE, Spring or OSGi.
+   
+* Community
+
+   Work has started on implementation of new features for JPA 2.1. 
+   
+   Support for Java 7 has been incorporated. 
+
+   Mailing lists continue to be active and many applications are
+   migrating from other vendors to OpenJPA. 
+
+   The developer community had maintained the codebase stable, 
+   supported for previous releases and backported resolved defects. 
+   
+   
+    
+* Governance
+
+    We continue to monitor contributors for possible committers and
+    PMC members. 
+
+* Releases
+
+
+-----------------------------------------
+Attachment AM: Report from the Apache Perl Project  [Philippe M. Chiasson]
+
+
+-- mod_perl 1.0 --
+
+The mod_perl 1.x is a maintenance track designed to work with httpd
+1.3.x.
+
+No new mod_perl 1.x releases since the last report.
+
+--- mod_perl 2.0 --
+
+mod_perl 2.X is designed to work with all httpd 2.X branches.
+
+Work to fully support httpd-2.4 is moving along.
+
+--- Apache-Test --
+
+Apache-Test provides a framework which allows module writers to write
+test suites than can query a running mod_perl enabled server.  It is
+used by mod_perl, httpd and several third party applications, and
+includes support for Apache modules written in C, mod_perl, PHP
+and Parrot.
+
+Apache-Test 1.38 was released on August 6th, 2012
+
+No new Apache-Test releases since the last report.
+
+--- Apache-SizeLimit --
+
+Apache-SizeLimit is a popular component in most mod_perl production
+environments.  It is used to kill off large httpd child processes
+based on various environmental triggers.
+
+No new Apache-SizeLimit releases since the last report.
+
+--- Apache-Bootstrap --
+
+Apache-Bootstrap is a framework to make it easier to build perl
+module distributions for different mod_perl versions.  It encapsulates
+code developed over the years by mod_perl developers to make
+maintaining Apache::* and Apache2::* modules in the same distribution easy.
+
+No new Apache-Bootstrap releases since the last report.
+
+
+--- Apache-Reload --
+
+Apache-Reload is a popular component in most mod_perl development
+environments, used to refresh compiled code in the perl interpreter
+without completely restarting httpd.
+
+Apache-Reload 0.12 was released on March 31st, 2012
+
+No new Apache-Reload releases since the last report.
+
+
+-- Apache-DBI --
+
+Apache-DBI is a popular component in many mod_perl deployments. It
+is used to provide transparent database connection pooling to clients
+using DBI.
+
+Apache-DBI 1.12 was released on June 12nd, 2013
+
+No new Apache-DBI releases since the last report.
+
+-- Development --
+
+mod_perl continues to be a healthy development community, though
+as a mature and stable product development moves at a naturally
+slower pace than in years past.  Bugs are found and discussed and
+applied with due consideration for our production userbase.
+
+Work on the http-2.4 branch is ongoing and we are getting closer to
+being able to merge it to trunk and make an official release supporting httpd
+2.4
+
+-- Users --
+
+The mod_perl users list is seeing steady activity, with a growing interest
+in seeing the httpd-2.4 work complete.
+
+Patches and bug reports are few, but keep on coming.
+
+
+-- PMC --
+
+No noteworthy PMC events happened since the last report.
+
+
+-----------------------------------------
+Attachment AN: Report from the Apache POI Project  [Yegor Kozlov]
+
+Apache POI is a Java library for reading and writing Microsoft Office file
+formats.
+
+
+Releases
+--------
+Version 3.10-FINAL was released on 8th February 2014
+
+
+Community
+---------
+
+ Andreas Beeker (kiwiwings) has been voted in as a POI committer/PMC member
+
+
+Project Status
+---------
+
+Apache POI continues to be an active project, both in terms of
+community and development. Traffic on the mailing lists has been 
+steady in the last 3 months.
+
+Most patches are applied without much delay.
+
+General Comments
+----------------
+There are no issues that require Board attention.
+
+
+-----------------------------------------
+Attachment AO: Report from the Apache Qpid Project  [Gordon Sim]
+
+Apache Qpid™ is a project focused on creating software based on the
+Advanced Message Queuing Protocol (AMQP), currently providing a
+protocol engine library, message brokers written in C++ and Java, and
+client libraries for C++, Java (including JMS), .Net, Python, Perl and
+Ruby.
+
+* Releases:
+
+Qpid Proton 0.6 was released on 16th January.
+
+Qpid Dispatch Router 0.1 was released on 17th January.
+
+The Qpid 0.26 release vote has concluded (we have changed the
+publishing process we useand publication is currently waiting on
+infra-7201, but should be complete soon). The previous Qpid release
+(0.24) was in 7th Sep, 2013.
+
+* Community:
+
+The main developer and user lists continue to be active. JIRAs are
+being raised and addressed.
+
+No new committers were added since last report (November 2013). The
+last committer added was Pavel Moravec on 30th Aug, 2013. The last PMC
+members to be added were Andrew Stitcher, Chuck Rolke, Justin Ross and
+Keith Wall, who were originally voted in during September 2011. It was
+brought to our attention however that there was no record of
+notification to - or acknowledgement from, as at that time required -
+the board at that time. This was rectified by a vote in Dec 2013 and
+an acknowledgement was received from Jim Jagielski.
+
+* Development Highlights:
+
+AMQP 1.0 continues to be an area of activity as issues are reported
+(often in conjunction with other AMQP 1.0 implementations) and fixed.
+
+Development is underway on a new AMQP 1.0 based JMS client, in line
+with the JMS Mapping being developed at OASIS.
+
+The existing JMS over 1.0 client and the java broker now support
+WebSockets, tracking the specification for that being developed at
+OASIS.
+
+Though not part of Qpid per se, an AMQP based NMS implementation
+(using qpid::messaging under the covers) has been developed in
+conjunction with the ActiveMQ project, increasing options for
+interoperability between the two projects.
+
+Dispatch Router added support for both competing and non-competing
+patterns, based on patterns specified in the configuration file. (Will
+be part of 0.2 release). The Dispatch Router is tracking the
+specification development for AMQP management.
+
+Proton Messenger added support for dynamic nodes. (Included in 0.6
+release). Some ideas have also been discussed to simplify using the
+Proton engine API, namely adding an event-oriented interface and some
+generic container support.
+
+* Issues:
+
+There are no items requiring board attention at this time.
+
+
+-----------------------------------------
+Attachment AP: Report from the Apache River Project  [Greg Trasuk]
+
+Apache River is a Java-based Service Oriented Architecture, implementing
+the Jini Specification and Jini Technology Starter Kit originally
+donated by Sun Microsystems.
+
+ISSUES FOR THE BOARD
+
+There are no board-level issues at this time
+
+RELEASES
+
+Apache River 2.2.2 was released on November 18, 2013
+Apache River 2.2.1 was released on May 2, 2013.
+
+COMMUNITY
+
+No new committers have been added since Nov of 2011.
+We hope that with releases coming on a more regular basis, user interest will
+pick up, and with it we will attract more potential new committers.
+
+ACTIVITY
+
+Mailing lists and development have been reasonably active
+months.  11 messages on users@ from Dec-Feb, and over 345 messages on
+dev@.  
+
+Four issues have been reported on Jira and eight old issues have been resolved.
+
+
+-----------------------------------------
+Attachment AQ: Report from the Apache Roller Project  [Dave Johnson]
+
+Apache Roller is a full-featured, Java-based weblogging package that works
+well on Tomcat and MySQL, and is also known to run on other servers and
+databases. The ASF blog site at blogs.apache.org runs on Roller 5.0.2.
+
+Issues
+
+No board issues at this time.
+
+Releases
+
+The latest release of Apache Roller is v5.0.2, which was released
+on October 30, 2013, a security vulnerability and bug fix release.
+
+Community
+
+The Roller community continues to be rather quiet with low traffic that 
+mostly concerns technical support and installation issues. The last new
+PMC member and committer who joined is Glenn Mazza in Nov 2012.
+
+
+-----------------------------------------
+Attachment AR: Report from the Apache Santuario Project  [Colm O hEigeartaigh]
+
+The Apache Santuario project is aimed at providing implementation of
+security standards for XML.
+
+There were three new releases of the Apache XML Security for Java project in
+the last quarter. Version 1.5.6 contained a minor bug fix, as well as a fix
+for security advisory CVE-2013-4517.
+
+In addition, there were two "beta" releases for the forthcoming 2.0.0 version
+of the Java project, 2_0_0-beta and 2_0_0-rc1. Release of the final version
+is anticipated in the next month.
+
+Last committer addition: Marc Giger, July 2012.
+Last PMC addition: Marc Giger, April 2013.
+
+
+-----------------------------------------
+Attachment AS: Report from the Apache SIS Project  [Adam Estrada]
+
+Apache SIS is a spatial framework that enables better representation of
+coordinates for searching, data clustering, archiving, or any other
+relevant spatial needs.
+
+Development:
+* Investigated datum aliasing for various producers [1]
+* Investigated using XSLT for processing different versions of
+XML-based formats like GML [2]
+* Basic CoordinateReferenceSystem implementations have been committed [3]
+* Migration from Well Known Text version 1 (WKT 1) formatting to WKT
+2, a.k.a. ISO 19162.
+
+Community:
+* First post to the Users@ mailing list [6]
+
+Branding:
+* The talk proposal for ApacheCon 2014 has been submitted. Martin used
+David Neufeld's text [7], with minor changes. currently waiting to see
+if ApacheCon accepts this proposal.
+
+* The OGC sent Martin a private email suggesting to submit a blog post
+on the OGC portal [8] about this talk. If accepted, Martin will come
+back on the mailing list for proposing a blog post for OGC portal.
+
+* There is an OGC meeting in March. Of particular interest for SIS
+there is a CRS WKT SWG (currently scheduled March 26th at 11:00
+AM[9]). We hope to have a fully functional WKT 2 implementation before
+this meeting, so we can share our experience with the group. SIS would
+be among the first WKT 2 implementations - the only other we are aware
+of was made by ESRI.
+
+Issues:
+Need to add Martin as a wiki editor [4]. Thread here.[5]
+
+Releases:
+RC SIS-0.4
+
+Press:
+None
+
+[1] https://issues.apache.org/jira/browse/SIS-145
+[2] https://issues.apache.org/jira/browse/SIS-152
+[3] http://s.apache.org/Eb8
+[4] https://cwiki.apache.org/confluence/display/SIS/SIS+Wiki
+[5] http://s.apache.org/vhi
+[6] http://s.apache.org/p4
+[7] http://s.apache.org/7Kb
+[8] http://www.opengeospatial.org/blog
+[9] http://www.opengeospatial.org/event/1403tcagenda
+
+
+-----------------------------------------
+Attachment AT: Report from the Apache Subversion Project  [Greg Stein]
+
+* Overview
+
+  No board-level issues at this time, since our report in January.
+
+* Community
+
+  No changes in committers or PMC makeup. Our last committer was added
+  in July 2013. Our last PMC addition was March 2012.
+
+* Releases
+
+  The community is currently voting on a number of releases, at the
+  time of the February board meeting. These candidates consiste of an
+  alpha for 1.9.0, for 1.8.8, and for 1.7.16.
+  
+  For those keeping score at home since the prior release numbers, the
+  1.7.15, 1.8.6, and 1.8.7 version numbers were skipped/pulled.
+
+
+-----------------------------------------
+Attachment AU: Report from the Apache Syncope Project  [Francesco Chicchiricco]
+
+
+Apache Syncope is an Open Source system for managing digital identities
+in enterprise environments, implemented in JEE technology.
+
+Status
+
+There are no outstanding issues requiring board attention.
+
+
+Community
+
+user@ ML is active, new users keep popping in for evaluating the project,
+existing users get regular support in reasonable time for their issues:
+currently 82 subscribers, including 4 archive / non human addresses.
+dev@ ML is active, mainly discussing new features: currently 59 subscribers,
+including 4 archive / non human addresses.
+
+We have consistently started implementing new features for next version
+1.2.0, while still maintaining 1.1.X (next release 1.1.6 is almost done).
+Some contacts were taken with Logging, CXF and Directory communities
+via their user@ ML for asking for support with - respectively - log4j2,
+JAX-RS and Escimo.
+
+Last committer addition (Guido Wimmel) is dated January 2014
+Last addition to PMC (Jan Bernhardt) is dated November 2012.
+
+Releases since last report
+
+   * 1.1.5 (Nov 28th, 2013)
+
+
+-----------------------------------------
+Attachment AV: Report from the Apache Turbine Project  [Thomas Vandahl]
+
+Apache Turbine is a servlet based framework that allows experienced 
+Java developers to quickly build web applications. Turbine allows you 
+to personalize the web sites and to use user logins to restrict access 
+to parts of your application.
+Turbine is a matured and well established framework that is used as 
+the base of many other projects.
+
+Status
+
+The Turbine project has again seen low levels of activity in the last 
+quarter.
+The Turbine project has no board-level issues at this time.
+
+Project Branding Board Report Checklist
+
+The last issue left is
+TODO: Logos and Graphics : include TM
+
+Community changes
+
+No new committers were voted in since the last board report.
+The last change to the committer base was the addition of Georg 
+Kallidis (2012/09/19).
+No new PMC members were voted in since the last board report.
+The last change to the PMC was the addition of Georg Kallidis 
+(2013/09/30).
+
+Turbine core project
+
+The Turbine core project proceeds slowly to the next milestone release
+which shall include a modified security implementation and support 
+for the Quartz scheduler to replace the built-in one.
+
+The last released component was the parent POM (2013/09/25).
+
+Fulcrum component project
+
+Some activity has taken place to come closer to a release of the 
+security component.
+
+The last released component was fulcrum-parser 1.0.3 (2013/10/11).
+
+
+-----------------------------------------
+Attachment AW: Report from the Apache Tuscany Project  [Jean-Sebastien Delfino]
+
+Apache Tuscany is an SOA framework based on OASIS OpenCSA and SCA.
+
+ISSUES
+- There are no issues that require the board's attention.
+
+RELEASES
+- Last release was Tuscany SCA 2.0.1, 10/3/2013.
+
+COMMUNITY ACTIVITY
+- Last committer addition was Sebastian Millies, 12/4/2012.
+
+- Mailing list traffic hasn't changed much in the past few months, and
+continues to be on the lower side, mostly a few questions on the user
+mailing list.
+
+BRANDING
+- We still need to update logos with ™ and review the project doap file.
+
+
+-----------------------------------------
+Attachment AX: Report from the Apache Velocity Project  [Nathan Bubna]
+
+
+-----------------------------------------
+Attachment AY: Report from the Apache Xalan Project  [Steven J. Hathaway]
+
+The Apache Xalan Project develops and maintains libraries and programs 
+that transform XML documents using XSLT standard stylesheets. Our 
+subprojects use the Java and C++ programing languages to implement the 
+XSLT libraries.
+
+ISSUES
+
+The volunteers appear short staffed to shepherd the staging of new 
+patch releases and perform quality assurance activities on the 
+code base.
+
+RELEASES
+
+- Xalan Java (2.7.1) 27-Nov-2007
+- Xalan C/C++ (1.11) 29-Oct-2012
+
+COMMUNITY ACTIVITY
+
+Xalan is a mature project with little development activity.
+There are still persons able to address the issues of
+developers.
+
+The development email has little volume.  The Xalan library
+still has a major presence in commercial software products.
+
+PMC MEMBERSHIP
+
+No membership changes.
+
+-----------------------------------------
+Attachment AZ: Report from the Apache Xerces Project  [Michael Glavassevich]
+
+Xerces-J
+
+A new XML parser configuration was developed with enhancements for
+the JAXP secure processing feature. This will allow applications to
+set global limits (using system properties) on the number and size
+of entities that should be processed by the parser. Similar
+capability was already available programmatically through the XML
+APIs.
+
+Some minor refactoring was done in the XML Schema 1.1
+implementation.
+
+Mailing list traffic has been low; roughly 50 posts on the j-dev
+and j-users lists since the beginning of November 2013.
+
+No new releases this quarter. The latest release is
+Xerces-J 2.11.0 (November 30th, 2010).
+
+Xerces-C
+
+New project files were added to support Visual Studio 2013. A few
+other minor changes were made to update copyright years.
+
+Mailing list traffic has been low; roughly 70 posts on the c-dev
+and c-users lists since the beginning of November 2013.
+
+No news about when the 3.2 version will be packaged. The latest
+release is Xerces-C 3.1.1 (April 27th, 2010).
+
+Xerces-P
+
+Nothing in particular to report. There was no development activity
+over the reporting period.
+
+XML Commons
+
+Some minor improvements were made to the XML Commons Resolver's
+classloading code to better align it with the ObjectFactory classes
+in Xerces-J and Xalan-J. No postings to the mailing list this
+quarter.
+
+Committer / PMC Changes
+
+No new committers in the last quarter. A potential new Xerces-J
+committer is currently being discussed by the PMC. The most recent
+committers were elected in July 2008 (Xerces-C) and May 2009
+(Xerces-J).
+
+No new PMC members in the last quarter. The last two additions to
+the PMC were in May 2010.
+
+Apache Project Branding Requirements
+
+There's still some work left to do on the TLP website, including
+adding "TM" to the project logo.
+
+
+-----------------------------------------
+Attachment BA: Report from the Apache XML Graphics Project  [Chris Bowditch]
+
+The Apache XML Graphics Project is responsible for software intended for
+the creation & maintenance of the conversion of XML formats to graphical
+output & related software components.
+
+
+== Issues for the Board ==
+No issues at present.
+
+== Community ==
+Last new committer: Robert Meyer on 05/08/13
+
+Last new PMC member: Luis Bernardo on 04/03/13
+
+No new committers recently but there are a couple of active contributors
+that the PMC is monitoring with a view to future committership.
+
+== XML GRAPHICS COMMONS ==
+5 bug fixes committed to SVN, 3 were patches submitted by contributors
+
+There were no releases this quarter.
+
+The latest release is 1.5 (20 October 2012)
+
+== FOP ==
+Mailing list activity is slightly down due to the holiday season, but is 
+starting to pick up again. Some new bugs logged and several patches have
+been submitted and processed. 46 separate commits in total to SVN.
+Significant development of note this quarter; work continues on a
+whitespace management extension, a basic fo:inline-container implementation
+was finished and changes checkstyle to rules being applied to the codebase.
+
+There were no releases this quarter
+
+The latest release is 1.1 (20 October 2012)
+
+== BATIK ==
+Mailing activity remains light, but a couple of bugs have been reported.
+There were actually 3 commits made by PMC members during this quarter; 1
+was a test commit, a 2nd to create a branch for a new feature and a 3rd
+was a user supplied patch being committed.
+
+There were no releases this quarter.
+
+The latest version is 1.7 (6 January 2008)
+
+
+-----------------------------------------
+Attachment BB: Report from the Apache Cordova Project  [Brian LeRoux]
+
+Apache Cordova is a platform for building native mobile applications using
+HTML, CSS and JavaScript. 
+
+STATUS
+
+It was recently brought to our attention that we had not being following
+Apache releases precisely as desired by policy. There has been lengthy
+discussion this report will attempt to summarize actions being taken by
+Cordova.
+
+ * Archived release artifacts will get a Vote thread for everything here [1]
+ * Current release artifacts Vote happening immediately for everything here [2]
+ * We will follow the Vote policy for all MAJOR/MINOR/PATCH releases moving
+   forward
+ * We have begun investigation of automating releases w/ an eye to improving
+   policy in the future
+
+Open discussion to understand how this process should work with package
+manager distribution. [3] [4] Related, but not directly nor an immediate
+concern, is App Store distribution. [5] 
+
+[1] http://archive.apache.org/dist/cordova
+[2] http://apache.org/dist/cordova
+[3] https://npmjs.org/package/cordova
+[4] http://plugins.cordova.io
+[5] https://issues.apache.org/jira/browse/LEGAL-174
+
+-----------------------------------------
+Attachment BC: Special report from the Apache OpenOffice Project  [Andrea Pescetti]
+
+An issue about ADA (Americans with Disabilities Act) statements has
+been opened at https://issues.apache.org/jira/browse/LEGAL-190
+to investigate complaints about ADA compliance of the Apache/OpenOffice
+web sites.
+
+<private>
+jIyajbe'
+</private>
+
+------------------------------------------------------
+End of agenda for the February 19, 2014 board meeting.
diff --git a/www/classic/board/agenda/test/data/board_agenda_2014_03_19.txt b/www/classic/board/agenda/test/data/board_agenda_2014_03_19.txt
new file mode 100644
index 0000000..7d106af
--- /dev/null
+++ b/www/classic/board/agenda/test/data/board_agenda_2014_03_19.txt
@@ -0,0 +1,4922 @@
+                    The Apache Software Foundation
+
+                  Board of Directors Meeting Agenda
+
+                            March 19, 2014
+
+
+ 1. Call to order
+
+    The meeting is scheduled for 10:30am (Pacific) and will begin as
+    soon thereafter that a sufficient attendance to constitute a
+    quorum is recognized by the chairman.  The meeting will be held
+    via teleconference, hosted by Doug Cutting and Cloudera:
+
+            International   : +1-650-479-3208
+            U.S. Toll-Free  : +1-877-668-4493
+            Other Toll-Free : http://s.apache.org/globalcallin
+            Access Code     : 2329 5771
+
+    IRC #asfboard on irc.freenode.net will be used for backup
+    purposes.
+
+ 2. Roll Call
+
+    ASF members are welcome to attend board meetings. Please
+    add your name under "guests" below, or just join the call and
+    announce your presence during the roll call at the beginning
+    of the meeting.
+
+    Directors (expected to be) Present:
+
+        Shane Curcuru
+        Doug Cutting
+        Bertrand Delacretaz
+        Roy T. Fielding
+        Jim Jagielski
+        Chris Mattmann
+        Brett Porter
+        Sam Ruby
+        Greg Stein
+
+    Directors (expected to be) Absent:
+
+        none
+
+    Executive Officers (expected to be) Present:
+
+        Ross Gardler
+        Rich Bowen
+        Craig L Russell
+
+    Executive Officers (expected to be) Absent:
+
+        none
+
+    Guests (expected):
+
+        Jake Farrell
+        Sean Kelly
+        Daniel Gruno
+        Marvin Humphrey
+        Cory Johns
+        David Nalley
+        Michael Joyce
+
+
+ 3. Minutes from previous meetings
+
+    Minutes (in Subversion) are found under the URL:
+
+        https://svn.apache.org/repos/private/foundation/board/
+
+    A. The meeting of February 19, 2014
+
+       See: board_minutes_2014_02_19.txt
+
+       [ approved: sc, cm, rf, jj, bd
+         comments:
+         ]
+
+ 4. Executive Officer Reports
+
+    A. Chairman [Brett]
+
+       At the last board meeting, we agreed on May 27 and 29 as the dates for
+       the Annual Members Meeting. I will send out the formal notice to
+       members and call for nominations of new members and the board in the
+       next couple of weeks, once we're inside the required 60 day period.
+
+       ApacheCon is coming up soon. Unfortunately, I'm not able to attend
+       this year, though I'm interested to hear which other directors will be
+       present. Given the timing, I don't expect there's a need for the board
+       to formally meet face to face.
+
+    B. President [Ross]
+       
+       ApacheCon is progressing well, see EVP report for details. Given
+       the extremely short timeline on this event
+       I think we can consider this a success. It looks to me like 
+       we will have an event that is at least as good as, if not better,
+       than most previous events. When we add to this the lack of drama
+       created by the producer I would like to think this is the start
+       of a healthy relationship that will, over time, develop a
+       valuable conference model that brings value to all parties.
+       
+       Our EA has been (mostly) consumed by ApacheCon items this month.
+       We did discuss a difficulty Melissa has with respect to visibility
+       into sponsor payments. It is difficult for Melissa to establish
+       whether a payment has been made or not and thus to establish
+       whether she ought to send a nag mail. On occasion this has been 
+       held up when our volunteers with access to this information are
+       otherwise engaged. With the excellent work VP Fundraising and 
+       Melissa have put into creating a process for managing sponsorships
+       this is now the most common bottleneck. I believe our treasurer is 
+       looking into options with respect to providing Melissa with timely 
+       access without adding additional overhead to the role of Treasurer. 
+       I look forward to a solution in the future.
+       
+       The Audit has not progressed significantly. As this was (once again)
+       a priority for this year I'm disappointed with the progress since
+       I personally undertook to see this through. I intend to explore 
+       the blocker over the next month since I have
+       finally landed in my own home now, so no more moves for many
+       years (I hope). 
+       
+       Trademarks continues to increase its demands on Shane whist
+       Shane continues to look for ways to streamline the process. 
+       Our EA has indicated that she is keen to help out with the 
+       process but still feels a little unclear as to where the
+       boundaries lie around what she can safely do to help. I 
+       hope to discuss this with Shane at ApacheCon in April. From
+       my perspective if we can free up even an hour a month of
+       Shane's time this will be productive as Shane is doing such
+       a superb job of refining out policies and practices in the
+       little time available.
+       
+       There is no report from VP Fundraising at the time of writing.
+       However Upayavira and I did touch base earlier this month and
+       discussed the state of Fundraising. Whilst Upayavira himself is
+       mostly engaged elsewhere it seems all sponsorship renewals are
+       under control thanks to the support of (mostly) Melissa and 
+       Sally. Upayavira's role seems to be one of oversight at present.
+       
+       Infra report no significant surprises this month but note that
+       the new Git features have been well received. 28 projects have 
+       adopted them in the first month, which has resulted in a tenfold
+       increase in git related traffic on various apache.org email 
+       lists. As we enter budget planning season I have specifically
+       asked infra to consider whether they ought to make a one-off
+       investment in some specialist support that will allow them to
+       better scale resources as the foundation continues to grow. This
+       suggestion was well received as some members of the infra team
+       feel there is an element of fire-fighting that can sometimes
+       slow longer term projects.
+       
+       TAC reports 26 applications, of which 15 were funded at an
+       estimated cost of $32k. This is both more applications and
+       approvals in the past. The process was quicker than in the past
+       though not without it's hiccups. Especially with respect to 
+       paying for flights. Thanks to Nick Burch who stepped in to
+       solve the problem by offering his personal card (which was the
+       reported fall-back position last month). I can confirm that
+       Nick was promptly reimbursed for this expense. Melissa reports
+       that she will seek to make recommendations for streamlining the
+       process for future events now that she has been a core part of
+       the TAC team.     
+       
+       
+       Additionally, please see Attachments 1 through 6.
+
+       [ comments:
+         ]
+
+    C. Treasurer [Chris]
+
+       The Treasurer's Office worked with Phil Steitz to get Amazon Payment
+       account data in the purview of the monthly data collection process.
+       This is the first month that will include a tag for Amazon payments.
+
+       Remittance to a TAC committee member for fronting the payments for
+       ACNA 2014 flights was completed.
+
+       Chris has been in touch with the contractor company for treasurer
+       services referred by Jim. Treasurer's Office has requested feedback
+       from the board and will arrive at a decision soon. Jim is awaiting
+       the decision from an audit perspective as this will affect the way
+       he proceeds with the audit.
+
+       The President's Office inquired to see the difficulty in providing
+       account access for WFS and other financials necessary for sponsorship
+       in-transit payment inquiries.  The Treasurer's Office is considering
+       how best to respond to the request.
+
+       Finally, the last request for transfer out of PayPal is in transit,
+       completing an activity desired years ago, to completely move the
+       bulk of ASF money out of PayPal and into WFS. Thanks to Upayavira
+       and Sam and others for their help in making this happen.
+
+       Income and Expenses
+
+       Current Balances:
+
+         Wells Fargo Business Checking:     958,880.79
+         Wells Fargo Savings:               287,886.47
+         PayPal:                             53,478.21
+         Amazon Prime:                        8,504.75
+         ----------------------------    ----------
+              Total                    $  1,300,245.47
+
+
+       Income Summary:
+
+         Lockbox                             50,271.00
+         Fundraising                         40,000.00
+         ----------------------------    ----------
+              Total                    $     90,271.00
+
+       Expense Summary:
+
+                 Category                  Amount
+         ----------------------------    ----------
+             EA                                8,670.22
+             Sysadmin                         31,800.00
+             misc expense		         493.74
+             ASF credit card - Sam Ruby           72.42
+             Press                             4,545.45
+             PayPal                           46,925.88
+         ----------------------------    ----------
+              Total                    $      92,507.71
+
+
+    D. Secretary [Craig]
+
+       February was a short and relatively light month for incoming 
+       documents. 42 iclas, two cclas, and four grants were received 
+       and filed.
+
+
+    E. Executive Vice President [Rich]
+
+        With ApacheCon now less than a month away, registrations are
+        progressing well, but rather behind my hopes. We were coming up
+        on 300 registrations when the Early Bird price expired. (I'll
+        hopefully update numbers prior to the meeting.) This is ahead
+        of where we were at this point last year, but still
+        disappointing given the expanded scope of the event. More
+        importantly, however, the producer is happy with the numbers,
+        and I view this event as an investment in the next event, so if
+        they're happy, I'm happy.
+
+        Everyone has been very helpful, with everyone I've asked for
+        assistance immediately stepping up and helping out. I'm looking
+        forward to doing this again, but with more lead time.
+
+        Meanwhile, we're still looking at venues in Europe, the
+        difficulty being that the OpenStack Summit in Paris hasn't
+        announced dates yet, and so we have to avoid both options that
+        they have announced, which greatly reduces our available venues.
+        Dates we are currently looking at are December 7 in Prague or
+        November 16 in Rome. Each of these have drawbacks, and we hope
+        to have something decided by the end of this month.
+
+    F. Vice Chairman [Greg]
+
+       Nothing to report for this month.
+
+ 5. Additional Officer Reports
+
+    A. VP of W3C Relations [Andy Seaborne / Doug]
+
+       See Attachment 7
+
+       [ approved: sr, bp, jj, dc, sc, cm, rf, gs
+         comments:
+         ]
+
+    B. Apache Legal Affairs Committee [Jim Jagielski]
+
+       See Attachment 8
+
+       [ approved: jj, sr, dc, sc, bp, cm, rf, gs
+         comments:
+         ]
+
+    C. Apache Security Team Project [Mark Cox / Shane]
+
+       See Attachment 9
+
+       [ approved: sr, bp, jj, dc, sc, cm, rf, gs
+         comments:
+         ]
+
+ 6. Committee Reports
+
+    A. Apache Abdera Project [Ant Elder / Jim]
+
+       See Attachment A
+
+       [ Abdera.
+         approved: sr, dc, sc, bp, cm, rf, gs
+         comments:
+         ]
+
+    B. Apache Any23 Project [Michele Mostarda / Roy]
+
+       See Attachment B
+
+       [ Any23.
+         approved: sr, bp, jj, dc, sc, cm, rf, gs
+         comments:
+         ]
+
+    C. Apache APR Project [Jeff Trawick / Brett]
+
+       See Attachment C
+
+       [ APR.
+         approved: sr, bp, jj, dc, sc, cm, rf, gs
+         comments:
+         ]
+
+    D. Apache Archiva Project [Maria Odea Ching / Sam]
+
+       See Attachment D
+
+       [ Archiva.
+         approved: sr, bp, jj, dc, sc, cm, rf, gs
+         comments:
+         ]
+
+    E. Apache Axis Project [Deepal Jayasinghe / Chris]
+
+       See Attachment E
+
+       [ Axis.
+         approved: sr, bp, jj, dc, sc, cm, rf, gs
+         comments:
+           cm: Please list date of last PMC member and/or committer addition.
+               Thanks!
+         ]
+
+    F. Apache Bigtop Project [Roman Shaposhnik / Bertrand]
+
+       See Attachment F
+
+       [ Bigtop.
+         approved: sr, bp, jj, dc, sc, cm, rf, gs
+         comments:
+           cm: Please list date of last PMC and/or committer addition. Thanks!
+         ]
+
+    G. Apache Bloodhound Project [Gary Martin / Greg]
+
+       See Attachment G
+
+       [ Bloodhound.
+         approved: sr, bp, jj, dc, sc, cm, rf, gs
+         comments:
+         ]
+
+    H. Apache Buildr Project [Alex Boisvert / Sam]
+
+       See Attachment H
+
+       [ Buildr.
+         approved: sr, bp, jj, dc, sc, cm, rf, gs
+         comments:
+         ]
+
+    I. Apache BVal Project [Matt Benson / Shane]
+
+       See Attachment I
+
+       [ BVal.
+         approved: sr, jj, dc, sc, bp, cm, rf, gs
+         comments:
+         ]
+
+    J. Apache Camel Project [Christian Mueller / Jim]
+
+       See Attachment J
+
+       [ Camel.
+         approved: sr, bp, jj, dc, sc, cm, rf, gs
+         comments:
+           cm: Please list dates of last PMC and/or committer addition.
+         ]
+
+    K. Apache Cayenne Project [Andrus Adamchik / Bertrand]
+
+       See Attachment K
+
+       [ Cayenne.
+         approved: sr, bp, jj, dc, sc, cm, rf, gs
+         comments:
+         ]
+
+    L. Apache Chemistry Project [Florian Müller / Chris]
+
+       See Attachment L
+
+       [ Chemistry.
+         approved: sr, bp, jj, dc, sc, cm, rf, gs
+         comments:
+           cm: Please list date of last PMC and/or committer addition.
+         ]
+
+    M. Apache Click Project [Malcolm Edgar / Doug]
+
+       See Attachment M
+
+       [ Click.
+         approved:
+         comments:
+           dc: I just emailed the chair and pmc, reminding them to report.
+         ]
+
+    N. Apache CloudStack Project [Chip Childers / Roy]
+
+       See Attachment N
+
+       [ CloudStack.
+         approved: sr, bp, jj, dc, sc, cm, rf, gs
+         comments:
+         ]
+
+    O. Apache Commons Project [Gary Gregory / Brett]
+
+       See Attachment O
+
+       [ Commons.
+         approved: sr, bp, jj, dc, sc, cm, rf, gs
+         comments:
+         ]
+
+    P. Apache Community Development Project [Luciano Resende / Greg]
+
+       See Attachment P
+
+       [ Community Development.
+         approved: jj, sr, dc, sc, bp, cm, rf, gs
+         comments:
+         ]
+
+    Q. Apache Continuum Project [Brent Atkinson / Roy]
+
+       See Attachment Q
+
+       [ Continuum.
+         approved: sr, bp, jj, dc, sc, cm, rf, gs
+         comments:
+         ]
+
+    R. Apache Cordova Project [Brian LeRoux / Bertrand]
+
+       See Attachment R
+
+       [ Cordova.
+         approved:
+         comments:
+         ]
+
+    S. Apache Creadur Project [Robert Burrell Donkin / Jim]
+
+       See Attachment S
+
+       [ Creadur.
+         approved:
+         comments:
+         ]
+
+    T. Apache cTAKES Project [Pei J Chen / Greg]
+
+       See Attachment T
+
+       [ cTAKES.
+         approved: sr, bp, jj, dc, sc, cm, rf, gs
+         comments:
+         ]
+
+    U. Apache Curator Project [Jordan Zimmerman / Shane]
+
+       See Attachment U
+
+       [ Curator.
+         approved: sr, dc, sc, bp, cm, rf, jj, gs
+         comments:
+         ]
+
+    V. Apache DirectMemory Project [Raffaele P. Guidi / Chris]
+
+       See Attachment V
+
+       [ DirectMemory.
+         approved: sr, bp, jj, dc, sc, cm, rf, gs
+         comments:
+         ]
+
+    W. Apache Felix Project [Felix Meschberger / Doug]
+
+       See Attachment W
+
+       [ Felix.
+         approved: sr, bp, jj, dc, sc, cm, rf, gs
+         comments:
+         ]
+
+    X. Apache Flex Project [Alex Harui / Sam]
+
+       See Attachment X
+
+       [ Flex.
+         approved: sr, bp, jj, dc, sc, cm, rf, gs
+         comments:
+           cm: Please list dates of last PMC and/or committer addition.
+         ]
+
+    Y. Apache Giraph Project [Avery Ching / Brett]
+
+       See Attachment Y
+
+       [ Giraph.
+         approved: sr, bp, jj, dc, sc, cm, rf, gs
+         comments:
+         ]
+
+    Z. Apache Gump Project [Stefan Bodewig / Shane]
+
+       See Attachment Z
+
+       [ Gump.
+         approved: sr, bp, jj, dc, sc, cm, rf, gs
+         comments:
+         ]
+
+    AA. Apache Helix Project [Kishore Gopalakrishna / Doug]
+
+       See Attachment AA
+
+       [ Helix.
+         approved: sr, bp, jj, dc, sc, cm, rf, gs
+         comments:
+           gs: all project reports should include a short blurb about what they
+               are/do. "what is Apache Helix?"
+         ]
+
+    AB. Apache Hive Project [Carl Steinbach / Jim]
+
+       See Attachment AB
+
+       [ Hive.
+         approved: bp, cm, rf, jj, sr, gs
+         comments:
+         ]
+
+    AC. Apache Incubator Project [Roman Shaposhnik / Roy]
+
+       See Attachment AC
+
+       [ Incubator.
+         approved: sr, bp, jj, dc, sc, cm, rf
+         comments:
+         ]
+
+    AD. Apache Jackrabbit Project [Michael Dürig / Chris]
+
+       See Attachment AD
+
+       [ Jackrabbit.
+         approved: sr, bp, jj, dc, sc, cm, rf, gs
+         comments:
+         ]
+
+    AE. Apache Karaf Project [Jean-Baptiste Onofré / Sam]
+
+       See Attachment AE
+
+       [ Karaf.
+         approved: sr, bp, jj, dc, sc, cm, rf, gs
+         comments:
+         ]
+
+    AF. Apache Knox Project [Kevin Minder / Bertrand]
+
+       See Attachment AF
+
+       [ Knox.
+         approved: sr, bp, jj, dc, sc, cm, rf, gs
+         comments:
+           cm: Please list date of last PMC and/or committer addition.
+         ]
+
+    AG. Apache Labs Project [Tim Williams / Brett]
+
+       See Attachment AG
+
+       [ Labs.
+         approved:
+         comments:
+           sr: Labs will report next month: http://s.apache.org/pb5
+         ]
+
+    AH. Apache Lucene Project [Uwe Schindler / Greg]
+
+       See Attachment AH
+
+       [ Lucene.
+         approved: sr, bp, jj, dc, sc, cm, rf, gs
+         comments:
+         ]
+
+    AI. Apache Lucene.Net Project [Prescott Nasser / Shane]
+
+       See Attachment AI
+
+       [ Lucene.Net.
+         approved: sc, sr, bp, cm, rf, jj, gs
+         comments:
+           cm: Please list date of last PMC and/or committer addition. Thanks!
+         ]
+
+    AJ. Apache MRUnit Project [Brock Noland / Sam]
+
+       See Attachment AJ
+
+       [ MRUnit.
+         approved: sr, jj, dc, sc, bp, cm, rf, gs
+         comments:
+           cm: Please list date of last PMC and/or committer addition. Thanks!
+         ]
+
+    AK. Apache OFBiz Project [Jacopo Cappellato / Doug]
+
+       See Attachment AK
+
+       [ OFBiz.
+         approved: sr, bp, jj, dc, sc, cm, rf, gs
+         comments:
+         ]
+
+    AL. Apache OODT Project [Sean Kelly / Brett]
+
+       See Attachment AL
+
+       [ OODT.
+         approved: sr, bp, jj, dc, sc, cm, rf
+         comments:
+         ]
+
+    AM. Apache Open Climate Workbench Project [Michael James Joyce / Chris]
+
+       See Attachment AM
+
+       [ Open Climate Workbench.
+         approved: sr, bp, jj, dc, sc, cm, rf
+         comments:
+         ]
+
+    AN. Apache OpenNLP Project [Joern Kottmann / Greg]
+
+       See Attachment AN
+
+       [ OpenNLP.
+         approved: sr, bp, jj, dc, sc, cm, rf, gs
+         comments:
+           cm: Please list date of last PMC and/or committer addition.
+         ]
+
+    AO. Apache OpenWebBeans Project [Mark Struberg / Roy]
+
+       See Attachment AO
+
+       [ OpenWebBeans.
+         approved: sr, bp, jj, dc, sc, cm, rf
+         comments:
+         ]
+
+    AP. Apache Pig Project [Julien Le Dem / Jim]
+
+       See Attachment AP
+
+       [ Pig.
+         approved: sr, bp, jj, dc, sc, cm, rf
+         comments:
+           bp: When were the last committer, PMC additions, and release made?
+         ]
+
+    AQ. Apache Pivot Project [Roger Whitcomb / Bertrand]
+
+       See Attachment AQ
+
+       [ Pivot.
+         approved: sr, bp, jj, dc, sc, cm, rf
+         comments:
+         ]
+
+    AR. Apache Portals Project [David Sean Taylor / Roy]
+
+       See Attachment AR
+
+       [ Portals.
+         approved: bp, rf, jj, sr, gs
+         comments:
+           gs: please state the month/year of the last addition of a committer,
+               and last addition to the PMC.
+         ]
+
+    AS. Apache ServiceMix Project [Gert Vanthienen / Shane]
+
+       See Attachment AS
+
+       [ ServiceMix.
+         approved: sr, bp, jj, dc, sc, cm, rf
+         comments:
+         ]
+
+    AT. Apache Shiro Project [Les Hazlewood / Sam]
+
+       See Attachment AT
+
+       [ Shiro.
+         approved: bp, sr, jj, dc, sc, cm, rf
+         comments:
+         ]
+
+    AU. Apache Sling Project [Carsten Ziegeler / Greg]
+
+       See Attachment AU
+
+       [ Sling.
+         approved: sr, bp, jj, dc, sc, cm, rf, gs
+         comments:
+         ]
+
+    AV. Apache SpamAssassin Project [Kevin A. McGrail / Jim]
+
+       See Attachment AV
+
+       [ SpamAssassin.
+         approved: sr, bp, jj, dc, sc, cm, rf
+         comments:
+         ]
+
+    AW. Apache Spark Project [Matei Zaharia / Bertrand]
+
+       See Attachment AW
+
+       [ Spark.
+         approved: sr, bp, jj, dc, sc, cm, rf
+         comments:
+         ]
+
+    AX. Apache Stanbol Project [Fabian Christ / Brett]
+
+       See Attachment AX
+
+       [ Stanbol.
+         approved: sr, bp, jj, dc, sc, cm, rf
+         comments:
+           cm: Please list date of last PMC and/or committer additions.
+         ]
+
+    AY. Apache Synapse Project [Hiranya Jayathilaka / Chris]
+
+       See Attachment AY
+
+       [ Synapse.
+         approved: sr, bp, jj, dc, sc, cm, rf
+         comments:
+         ]
+
+    AZ. Apache Tiles Project [Greg Reddin / Doug]
+
+       See Attachment AZ
+
+       [ Tiles.
+         approved: bp, sr, jj, dc, sc, rf
+         comments:
+         ]
+
+    BA. Apache Tomcat Project [Mladen Turk / Chris]
+
+       See Attachment BA
+
+       [ Tomcat.
+         approved: sr, bp, dc, sc, cm, rf, jj
+         comments:
+           cm: Please list date of last PMC and/or committer addition. Thanks!
+         ]
+
+    BB. Apache UIMA Project [Marshall Schor / Brett]
+
+       See Attachment BB
+
+       [ UIMA.
+         approved: sr, bp, jj, dc, sc, cm, rf
+         comments:
+         ]
+
+    BC. Apache VCL Project [Andy Kurth / Jim]
+
+       See Attachment BC
+
+       [ VCL.
+         approved: sr, bp, jj, dc, sc, cm, rf
+         comments:
+         ]
+
+    BD. Apache Velocity Project [Nathan Bubna / Shane]
+
+       See Attachment BD
+
+       [ Velocity.
+         approved: sr, dc, sc, cm, rf, jj
+         comments:
+         ]
+
+    BE. Apache Whirr Project [Andrew Bayer / Sam]
+
+       See Attachment BE
+
+       [ Whirr.
+         approved: sr, bp, dc, sc, cm, rf, jj
+         comments:
+         ]
+
+    BF. Apache Wicket Project [Martijn Dashorst / Doug]
+
+       See Attachment BF
+
+       [ Wicket.
+         approved: sr, bp, jj, dc, sc, cm, rf
+         comments:
+         ]
+
+    BG. Apache Wink Project [Luciano Resende / Greg]
+
+       See Attachment BG
+
+       [ Wink.
+         approved: sr, dc, sc, bp, cm, rf, jj, gs
+         comments:
+         ]
+
+    BH. Apache ZooKeeper Project [Flavio Junqueira / Roy]
+
+       See Attachment BH
+
+       [ ZooKeeper.
+         approved: sr, bp, jj, dc, sc, cm, rf
+         comments:
+           bp: when were the last changes to the PMC/committer rosters?
+         ]
+
+    BI. Apache Lenya Project [Richard Frovarp / Brett]
+
+       See Attachment BI
+
+       [ Lenya.
+         approved: bp, rf, sr, gs, bd
+         comments:
+         ]
+
+
+ 7. Special Orders
+
+    A. Establish the Apache Tajo Project
+
+       WHEREAS, the Board of Directors deems it to be in the best
+       interests of the Foundation and consistent with the Foundation's
+       purpose to establish a Project Management Committee charged with
+       the creation and maintenance of open-source software, for
+       distribution at no charge to the public, related to low latency
+       queries and extract, transform and load
+       (ETL) operations for the Hadoop ecosystem.
+
+       NOW, THEREFORE, BE IT RESOLVED, that a Project Management Committee
+       (PMC), to be known as the "Apache Tajo Project" be and hereby is
+       established pursuant to Bylaws of the Foundation; and be it further
+
+       RESOLVED, that the Apache Tajo Project be and hereby is responsible
+       for the creation and maintenance of software
+       related to low latency queries and extract, transform and load
+       (ETL) operations for the Hadoop ecosystem; and be it further
+
+       RESOLVED, that the office of "Vice President, Apache Tajo", be
+       and hereby is created, the person holding such office to serve
+       at the direction of the Board of Directors as the chair of the
+       Apache Tajo Project, and to have primary responsibility for
+       management of the projects within the scope of responsibility
+       of the Apache Tajo Project; and be it further
+
+       RESOLVED, that the persons listed immediately below be and hereby
+       are appointed to serve as the initial members of the Apache Tajo
+       Project:
+
+       * Alex Karasulu <ak...@apache.org>
+       * Eli Reisman <er...@apache.org>
+       * Henry Saputra <hs...@apache.org>
+       * Hyunsik Choi <hy...@apache.org>
+       * Jakob Glen Homan <jg...@apache.org>
+       * Chris Mattmann <ma...@apache.org>
+       * Owen O'Malley <om...@apache.org>
+       * JaeHwa Jung <bl...@apache.org>
+       * Jinho Kim <jh...@apache.org>
+       * Jihoon Son <ji...@apache.org>
+       * Keuntae Park <si...@apache.org>
+       * Roshan Sumbaly <rs...@apache.org>
+       * Sangwook Kim <sw...@apache.org>
+       * Yi Liu <yl...@apache.org>
+
+       NOW, THEREFORE, BE IT FURTHER RESOLVED, that Hyunsik Choi be appointed
+       to the office of Vice President, Apache Tajo, to serve in accordance
+       with and subject to the direction of the Board of Directors and the
+       Bylaws of the Foundation until death, resignation, retirement,
+       removal or disqualification, or until a successor is appointed; and
+       be it further
+
+       RESOLVED, that the Apache Tajo Project be and hereby is tasked with
+       the migration and rationalization of the Apache Incubator Tajo
+       podling; and be it further
+
+       RESOLVED, that all responsibilities pertaining to the Apache Incubator
+       Tajo podling encumbered upon the Apache Incubator Project are
+       hereafter discharged.
+
+    B. Change the Apache CloudStack Project Chair
+
+       WHEREAS, the Board of Directors heretofore appointed Chip Childers
+       to the office of Vice President, Apache CloudStack, and
+
+       WHEREAS, the Board of Directors is in receipt of the resignation of
+       Chip Childers from the office of Vice President, Apache CloudStack,
+       and
+
+       WHEREAS, the Project Management Committee of the Apache CloudStack
+       project has chosen by vote to recommend Hugo Trippaers as the
+       successor to the post;
+
+       NOW, THEREFORE, BE IT RESOLVED, that Chip Childers is relieved and
+       discharged from the duties and responsibilities of the office of Vice
+       President, Apache CloudStack, and
+
+       BE IT FURTHER RESOLVED, that Hugo Trippaers be and hereby is
+       appointed to the office of Vice President, Apache CloudStack, to serve
+       in accordance with and subject to the direction of the Board of
+       Directors and the Bylaws of the Foundation until death, resignation,
+       retirement, removal or disqualification, or until a successor is
+       appointed.
+
+    C. Change the Apache Pig Project Chair
+
+       WHEREAS, the Board of Directors heretofore appointed Julien Le Dem
+       to the office of Vice President, Apache Pig, and
+
+       WHEREAS, the Board of Directors is in receipt of the resignation
+       of Julien Le Dem from the office of Vice President, Apache
+       Pig, and
+
+       WHEREAS, the Project Management Committee of the Apache Pig
+       project has chosen by vote to recommend Cheolsoo Park as the
+       Successor to the post;
+
+       NOW, THEREFORE, BE IT RESOLVED, that Julien Le Dem is
+       relieved and discharged from the duties and responsibilities of
+       the office of Vice President, Apache Pig, and
+
+       BE IT FURTHER RESOLVED, that Cheolsoo Park be and hereby is
+       appointed to the office of Vice President, Apache Pig, to
+       serve in accordance with and subject to the direction of the
+       Board of Directors and the Bylaws of the Foundation until
+       death, resignation, retirement, removal or disqualification, or
+       until a successor is appointed.
+
+
+    D. Change the Apache Bigtop Project Chair
+
+       WHEREAS, the Board of Directors heretofore appointed
+       Roman Shaposhnik to the office of Vice President,
+       Apache Bigtop,  and
+       
+       WHEREAS, the Board of Directors is in receipt of the resignation
+       of Roman Shaposhnik from the office of Vice President,
+       Apache Bigtop, and
+       
+       WHEREAS, the Project Management Committee of the Apache Bigtop
+       project has chosen by vote to recommend Konstantin Boudnik as the
+       Successor to the post;
+       
+       NOW, THEREFORE, BE IT RESOLVED, that Roman Shaposhnik is
+       relieved and discharged from the duties and responsibilities of
+       the office of Vice President, Apache Bigtop, and
+       
+       BE IT FURTHER RESOLVED, that Konstantin Boudnik  be and
+       hereby is appointed to the office of Vice President, Apache Bigtop,
+       to serve in accordance with and subject to the direction of the
+       Board of Directors and the Bylaws of the Foundation until
+       death, resignation, retirement, removal or disqualification, or
+       until a successor is appointed.
+
+
+    E. Change the Apache Hama Project Chair
+
+       WHEREAS, the Board of Directors heretofore appointed Edward J. Yoon
+       to the office of Vice President, Apache Hama, and
+
+       WHEREAS, the Board of Directors is in receipt of the resignation
+       of Edward J. Yoon from the office of Vice President, Apache Hama,
+       and
+
+       WHEREAS, the Project Management Committee of the Apache Hama
+       project has chosen by vote to recommend Chia-Hung Lin as the successor
+       to the post;
+
+       NOW, THEREFORE, BE IT RESOLVED, that Edward J. Yoon is relieved and
+       discharged from the duties and responsibilities of the office
+       of Vice President, Apache Hama, and
+
+       BE IT FURTHER RESOLVED, that Chia-Hung Lin be and hereby is
+       appointed to the office of Vice President, Apache Hama, to
+       serve in accordance with and subject to the direction of the
+       Board of Directors and the Bylaws of the Foundation until
+       death, resignation, retirement, removal or disqualification, or
+       until a successor is appointed.
+
+
+    F. Change the Apache Lucy Project Chair
+
+       WHEREAS, the Board of Directors heretofore appointed Nikolas Wellnhofer
+       to the office of Vice President, Apache Lucy, and
+
+       WHEREAS, the Board of Directors is in receipt of the resignation
+       of Nikolas Wellnhofer from the office of Vice President, Apache Lucy,
+       and
+
+       WHEREAS, the Project Management Committee of the Apache Lucy
+       project has chosen by vote to recommend Logan Bell as the successor
+       to the post;
+
+       NOW, THEREFORE, BE IT RESOLVED, that Nikolas Wellnhofer is relieved and
+       discharged from the duties and responsibilities of the office
+       of Vice President, Apache Lucy, and
+
+       BE IT FURTHER RESOLVED, that Logan Bell be and hereby is
+       appointed to the office of Vice President, Apache Lucy, to
+       serve in accordance with and subject to the direction of the
+       Board of Directors and the Bylaws of the Foundation until
+       death, resignation, retirement, removal or disqualification, or
+       until a successor is appointed.
+
+
+    G. Establish the Apache Olingo Project
+
+       WHEREAS, the Board of Directors deems it to be in the best
+       interests of the Foundation and consistent with the
+       Foundation's purpose to establish a Project Management
+       Committee charged with the creation and maintenance of
+       open-source software, for distribution at no charge to
+       the public, related to providing an implementation of the
+       OASIS OData (Open Data Protocol) specifications, in
+       server and client form.
+
+       NOW, THEREFORE, BE IT RESOLVED, that a Project Management
+       Committee (PMC), to be known as the "Apache Olingo Project",
+       be and hereby is established pursuant to Bylaws of the
+       Foundation; and be it further
+
+       RESOLVED, that the Apache Olingo Project be and hereby is
+       responsible for the creation and maintenance of software
+       related to providing an implementation of the OASIS OData
+       (Open Data Protocol) specifications, in server and client
+       form; and be it further
+
+       RESOLVED, that the office of "Vice President, Olingo" be
+       and hereby is created, the person holding such office to
+       serve at the direction of the Board of Directors as the chair
+       of the Apache Olingo Project, and to have primary responsibility
+       for management of the projects within the scope of
+       responsibility of the Apache Olingo Project; and be it further
+
+       RESOLVED, that the persons listed immediately below be and
+       hereby are appointed to serve as the initial members of the
+       Apache Olingo Project:
+
+        * Florian Mueller             <fm...@apache.org>
+        * Dave Fisher                 <wa...@apache.org>
+        * Christian Amend          <ch...@apache.org>
+        * Francesco Chicchiriccò  <il...@apache.org>
+        * Jens Huesken            <jh...@apache.org>
+        * Michael Bolz                <mi...@apache.org>
+        * Stephan Klevenz         <sk...@apache.org>
+        * Tamara Boehm              <tb...@apache.org>
+        * Challen He              <ch...@apache.org>
+        * Chandan V A            <ch...@apache.org>
+        * Eduard Koller            <ed...@apache.org>
+
+       NOW, THEREFORE, BE IT FURTHER RESOLVED, that Stephan Klevenz
+       be appointed to the office of Vice President, Olingo, to
+       serve in accordance with and subject to the direction of the
+       Board of Directors and the Bylaws of the Foundation until
+       death, resignation, retirement, removal or disqualification,
+       or until a successor is appointed; and be it further
+
+       RESOLVED, that the initial Apache Olingo PMC be and hereby is
+       tasked with the creation of a set of bylaws intended to
+       encourage open development and increased participation in the
+       Apache Olingo Project; and be it further
+
+       RESOLVED, that the Apache Olingo Project be and hereby
+       is tasked with the migration and rationalization of the Apache
+       Incubator Olingo podling; and be it further
+
+       RESOLVED, that all responsibilities pertaining to the Apache
+       Incubator Olingo podling encumbered upon the Apache Incubator
+       Project are hereafter discharged.
+
+
+    H. Establish the Apache Allura Project
+
+       WHEREAS, the Board of Directors deems it to be in the best
+       interests of the Foundation and consistent with the
+       Foundation's purpose to establish a Project Management
+       Committee charged with the creation and maintenance of
+       open-source software, for distribution at no charge to 
+       the public, related to a software development infrastructure
+       platform commonly known as a "forge".
+
+       NOW, THEREFORE, BE IT RESOLVED, that a Project Management
+       Committee (PMC), to be known as the "Apache Allura Project",
+       be and hereby is established pursuant to Bylaws of the
+       Foundation; and be it further
+
+       RESOLVED, that the Apache Allura Project be and hereby is
+       responsible for the creation and maintenance of software
+       related to a software development infrastructure platform
+       commonly known as a "forge"; and be it further
+
+       RESOLVED, that the office of "Vice President, Apache Allura" be
+       and hereby is created, the person holding such office to
+       serve at the direction of the Board of Directors as the chair
+       of the Apache Allura Project, and to have primary responsibility
+       for management of the projects within the scope of
+       responsibility of the Apache Allura Project; and be it further
+
+       RESOLVED, that the persons listed immediately below be and
+       hereby are appointed to serve as the initial members of the
+       Apache Allura Project:
+
+        * Tim Van Steenburgh     <tv...@apache.org>
+        * Wayne Witzel III       <ww...@apache.org>
+        * Cory Johns             <jo...@apache.org>
+        * Dave Brondsema         <br...@apache.org>
+        * Roberto Galoppini      <ga...@apache.org>
+        * Alvaro del Castillo    <ac...@apache.org>
+        * Stefano Invernizzi     <st...@apache.org>
+        * Simone Gatti           <si...@apache.org>
+        * Jim Jagielski          <ji...@apache.org>
+
+       NOW, THEREFORE, BE IT FURTHER RESOLVED, that Dave Brondsema
+       be appointed to the office of Vice President, Apache Allura, to
+       serve in accordance with and subject to the direction of the
+       Board of Directors and the Bylaws of the Foundation until
+       death, resignation, retirement, removal or disqualification,
+       or until a successor is appointed; and be it further
+
+       RESOLVED, that the initial Apache Allura PMC be and hereby is
+       tasked with the creation of a set of bylaws intended to
+       encourage open development and increased participation in the
+       Apache Allura Project; and be it further
+
+       RESOLVED, that the Apache Allura Project be and hereby
+       is tasked with the migration and rationalization of the Apache
+       Incubator Allura podling; and be it further
+
+       RESOLVED, that all responsibilities pertaining to the Apache
+       Incubator Allura podling encumbered upon the Apache Incubator
+       Project are hereafter discharged.
+
+ 
+ 8. Discussion Items
+
+ 9. Review Outstanding Action Items
+
+    * Roy: Update the guidance for releases to forbid shipping binary
+           dependencies within a source package unless their source is also
+           included (see board_minutes_2012_04_18.txt) and communicate to
+           committers.
+          Status: still not done
+
+    * Greg: discuss "extras" issue with OpenOffice PMC and see if there is
+            anything to be done at the "ASF level"
+          Status:
+
+    * Chris: follow up on bringing on new committers and PMC members to DB
+          Status:
+
+    * Brett: follow up with Click regarding the Attic or rebooting
+          Status: not done
+
+    * Brett: Remind PMCs to check their committee records
+          Status: started but not complete yet
+
+    * Greg: ask about "pending discussion by the PMC" by JMeter
+          Status:
+
+    * Greg: ask for an out-of-band report for next month for Web Services
+          Status: no longer needed, they are due to report next month
+
+    * Chris: follow up with Empire-db about steps to bringing on new blood
+          Status:
+
+10. Unfinished Business
+
+11. New Business
+
+12. Announcements
+
+13. Adjournment
+
+    Scheduled to adjourn by 12:00pm (Pacific)
+
+
+============
+ATTACHMENTS:
+============
+
+-----------------------------------------
+Attachment 1: Report from the Executive Assistant  [Melissa Warnkin]
+
+Daily monitoring of all email activity (ea@, fundraising@, trademarks@,
+treasurer@, comdev@, and board@) and following-up with appropriate personnel
+
+    ApacheCon:  90% (includes TAC)
+        Very busy month; progressing well - Rich will provide more information
+        Researched items for this year's giveaways (to be used for ACNA,
+          OSCON, ACEU and community events throughout the year) and awaiting
+          shipment.
+        Assisted Rich with helping "spread the word".  Please forgive the
+          inundation of emails received on March 5th - I misunderstood Rich's
+          instructions and sent an email for each Project and Track to comdev@
+          rather than to dev@PROJECT.  Well, on the plus side, ya can't say we
+          haven't gotten the word out!! ;)
+        Currently working on the booth logistics
+
+    TAC:
+
+        Sent all rejection and acceptance letters out
+        All flights and hotel reservations have been made and sent to the
+          successful applicants
+        All documentation required for the applicants needing a visa have been
+          sent.  4 out of the 5 needing a visa have successfully received it;
+          the 5th has a visa appointment the week of March 10th.
+        I've submitted a direct bill application to the Westin for the TAC'ers
+          and staff lodging (rather than doing a wire transfer) - awaiting
+          approval on that from the Westin.
+        Fielded a very large amount of inquiries from the TAC'ers.  A handful
+          of folks were full of questions and uncertainty on what to do and
+          how to proceed; with a little TLC, I was able to guide them through
+          the entire process and ease their nerves.
+
+    Fundraising:  10%
+
+        Continuing to follow-up on renewals sent out
+            Working with the Treasurer's Office for a solution for me to gain
+              visibility into payments.  This will alleviate some of the
+              workload on their end, as well as enable me to gain the
+              information needed in a more timely manner for following up on
+              the past-due invoices.
+            Sam has fixed the info in svn so it is now readable.  Sam and
+              Chris will determine what is needed from WF in order for me to
+              gain read access into the account so that I can have "real-time"
+              info (the info in svn is only posted after Chris writes his
+              board report).
+        Sent out invoices for the sponsors due for renewal
+        A great big thank you to Sally, who has been in communications with
+          our Platinums.  As a result, we've obtained a PO# for Google's
+          Platinum renewal, and I've submitted the invoice through their
+          online portal (invoice is showing as approved; just awaiting
+          payment), and I've sent out the Yahoo! renewal.  She is awaiting
+          responses from Microsoft (they just came off of vacation, so she's
+          giving them adequate time to catch up) and Facebook.
+
+
+-----------------------------------------
+Attachment 2: Report from the VP of Brand Management  [Shane Curcuru]
+
+trademarks@ traffic continues to grow and bring up new issues.  It's 
+been very helpful to have a couple of members really step up to help 
+and thoughtfully answer various questions; David Nalley has been 
+especially helpful in this regard.
+
+Started a discussion on ways to improve services that trademarks@ 
+and the ASF offers to our projects, although there's limited feedback 
+so far there on some new ideas.
+
+I updated the Project Independence requirements in response to issues 
+raised recently with the focus of the page:
+
+  http://community.apache.org/projectIndependence.html
+
+Had a brief but productive call at DLAPiper request; they have a number 
+of specific documents almost ready to offer to help improve and simplify 
+our brand policing and education activities that I'm looking forward to.
+
+DLAPiper submitted a US registration for LUCENE.
+
+DLAPiper is submitting an international registration for HADOOP covering 
+EU and several key first-to-file countries.
+
+
+-----------------------------------------
+Attachment 3: Report from the VP of Fundraising  [Upayavira]
+
+As noted by Ross in his President report, I am glad to report that the 
+VP Fundraising role has become an oversight one. Melissa is handling most
+of the renewal work, and Sally is handling the higher value sponsors.
+Phil is handling thanking our PayPal/Amazon donors.
+
+The work required for the VP Fundraising appears to have dropped to a 
+much more manageable level for a volunteer, thanks to the work of the
+above named.
+
+-----------------------------------------
+Attachment 4: Report from the VP of Marketing and Publicity  [Sally Khudairi]
+
+I. Budget: we remain on schedule and under budget. All vendor payments have
+  been processed on time with ongoing thanks to the Treasurer and Operations
+  teams.
+
+II. Fundraising/Branding/Marketing liaison: no meetings are planned. Sally
+  Khudairi continues Sponsor renewal outreach activities, and has secured
+  confirmation from select Platinum-level Sponsors. The discussion regarding
+  project-specific marketing/promotional support that had begun in October has
+  resumed, this time with the Trademarks/Brand Management team as lead.
+
+III. Press Releases: the following formal announcement was issued via the
+  newswire service, ASF Foundation Blog, and announce@apache.org:
+
+- 27 February 2014: The Apache Software Foundation Announces Announces Apache™
+  Spark™ as a Top-Level Project
+- 03 March 2014: The Apache Software Foundation Announces Apache™ Open Climate
+  Workbench™ as a Top-Level Project
+
+IV. Informal Announcements: five newsworthy items were announced on @TheASF,
+  and nine new tweets on @ApacheCon feed. No new posts were made on
+  "TheApacheFoundation" account on YouTube.
+
+V. Future Announcements: we're awaiting clearance on a project milestone
+  announcement that we began work on in January. PMCs wishing to announce major
+  project news, as well as podlings ready to graduate from the Incubator, are
+  welcome to contact Sally at <pr...@apache.org> for more information. Kindly
+  provide at least 2-weeks' notice for proper planning and execution.
+
+VI. Media Relations: we responded to 8 media requests. The ASF received 3,030
+  press clips over this time period, vs. last month's clip count of 1,519.
+
+VII. Analyst Relations: we responded to 3 analyst queries, and secured Chris
+  Mattmann as co-host of the GreenMonk hangout/broadcast following our
+  announcement of Apache Climate (GreenMonk is RedMonk's sustainability-focused
+  arm). Apache was mentioned in 6 reports by Gartner (as well as an upcoming
+  Webinar on Apache Hadoop 2.0), 4 reports by Forrester, 7 write-ups by GigaOM,
+  8 reports by Yankee Group, and 4 reports by IDC.
+
+VIII. ApacheCon liaison: Sally continues to liaise with the ApacheCon
+  producer, with particular focus on communications and sponsor outreach. She is
+  also working with Melissa Warnkin on promotional items for the event.
+
+IX. (Non-ASF) Industry Events and Outreach liaison: Sally is liaising with a
+  small handful of events that are requesting the ASF's presence as
+  speakers/presenters/sponsors/*.
+
+X. Newswire accounts: we have renewed our pre-paid press release agreement
+  with NASDAQ GlobeNewswire, and have 17 in our account through the end of the
+  calendar year. We also have 7 remaining pre-paid press releases on the
+  PRNewswire account through May 2014, as well as ongoing distribution donated
+  by Pressat with no pre-established termination timeframe.
+
+
+-----------------------------------------
+Attachment 5: Report from the VP of Infrastructure  [Sam Ruby]
+
+New Karma:
+==========
+mdrob added to infra-interest.
+
+
+Finances:
+==========
+
+
+Operations Action Items:
+========================
+
+
+Short Term Priorities:
+======================
+
+* Look into mac build slaves.
+
+
+* Converge on git.apache.org migration to eris. (Step 1 is merge git -> git-wip on tyr)
+  (opinions?)
+
+* Investigate / negotiate external code-signing capability, currently in talks
+  under NDA. INFRA-3991 is tracking the status, and a Webex call has taken place.
+
+* Complete nagios-to-circonus migration for monitoring.
+
+* Continue to experiment with weekly team meetings via google hangout.
+
+* Explore the possibility of revamping the infra documents to have a more 
+  intuitive feel about them, improve readability.
+
+* Confluence Upgrade. Upgrade from 5.0.3 to latest. Hopefully will be less
+  painful this time around. 
+  (Support case closed, nothing useful came from it other than check the logs.)
+
+* Port tlp creation scripts over to new json-based design on whimsy.
+
+
+Long Range Priorities:
+======================
+
+* Choose a suitable technology for continued buildout of our virtual
+  hosting infra.  Right now we are on VMWare but it no longer is gratis
+  software for the ASF.
+
+* Continue gradually replacing gear we no longer have any hardware warranty
+  support for.
+
+* Formulate an effective process and surrounding policy documentation for
+  fulfilling the DMCA safe harbor provisions as they relate to Apache services.
+
+* Institute egress filtering on all mission-critical service hosts.
+  <private>
+    nuqjatlh?
+  </private>
+
+
+General Activity:
+=================
+
+* The new GitHub features have been well received, with 28 projects already
+  onboard with the new features in February alone. As a result, the number of
+  github related messages on the public ASF mailing lists have risen from 304
+  in January to 3,616 in February, with expectations to exceed 5,000 in
+  March. There has been a discussion on whether to transition from opt-in to
+  opt-out on these features, but for the time being, it remains opt-in. 
+
+* Instituted a weekly cron to inform private@cordova about the current list of
+  committers not on the PMC, which should be the empty set.  Currently about a
+  third of the pmc is impacted with no indication that this will ever be
+  addressed by the chair- the requisite notices have already been sent to
+  board@.
+
+* Discussed the current state of affairs with our build farms as they relate to
+  TrafficServer's needs.  We intend to address this with increased funding in
+  next year's budget.
+
+* Received a report about several compromised webpages hosted by VM's
+  associated with OfBiz.  In the process of working with the PMC to correct
+  this situation.
+
+
+-----------------------------------------
+Attachment 6: Report from the Apache Travel Assistance Committee  [Gavin McDonald]
+
+The Travel Assistance Committee exists to help those that would like to
+attend ApacheCon events, but are unable to do so for financial reasons.
+
+Overall Activity since last report
+
+With ApacheCon NA 2014 quickly approaching things have been in full swing.
+Announcements regarding TAC funding opportunities were disseminated around
+16th January 2014. Announcements were sent to pmcs@, committers@, the TAC
+website and the Linux Foundation in an attempt to reach a wider audience.
+Announcements were also made on social media channels.
+From the above, TAC received some 26 applications which is a noticeably
+larger figure than received in recent times. Based on judging by various
+TAC members and a subsequent judges call, an estimation was made that
+applicant reported flight costs, hotels, subsistence and conference fees
+we're likely to total ~$32k for 15 successful applicants.
+Further to the dissemination of acceptance and rejection letters, work has
+been focused around the booking of flights, accommodation and Visa
+referrals for successful TAC applicants.
+
+How has the community developed since the last report?
+
+No new members have joined TAC since last reporting.
+
+Other content:
+
+Based on feedback we received from ApacheCon 2013 in Portland, we have
+arranged a 'Welcome Dinner' (as oppose to Breakfast) for TAC'ers. This way
+we can ensure everyone is comfortable with the accommodation as well as the
+ApacheCon experience prior to the first day of the conference.
+
+N.B. We would also advise board@ to see the TAC section of the Post
+Executive Assistant's Report. This contains a substantial amount of
+information based on work undertaken by EA.
+
+
+-----------------------------------------
+Attachment 7: Report from the VP of W3C Relations  [Andy Seaborne]
+
+Nothing to report.
+
+
+-----------------------------------------
+Attachment 8: Report from the Apache Legal Affairs Committee  [Jim Jagielski]
+
+Somewhat slow but steady stream of posts with the one regarding "why is LGPL
+on the Not Allowed List" receiving the honor of most posts. There is nothing
+that requires board attention at this time
+
+
+-----------------------------------------
+Attachment 9: Report from the Apache Security Team Project  [Mark Cox]
+
+There continues to be a steady stream of reports of various kinds
+arriving at security@ in Feb. These continue to be dealt with by
+the security team.
+
+Feb 2014
+
+3 Support question
+1 Security vulnerability question, but not a vulnerability report
+11 Vulnerability reports to security@apache.org
+       1 [traffic server]
+       1 [logging]
+       1 [poi]
+       1 [archiva]
+       3 [httpd]
+       2 [cordova]
+       1 [cxf]
+       1 [tomcat]
+
+4 Vulnerability reports to projects own security lists
+       1 [sling]
+       1 [struts]
+       2 [tomcat]
+
+
+-----------------------------------------
+Attachment A: Report from the Apache Abdera Project  [Ant Elder]
+
+Apache Abdera provides Java implementations of the IETF Atom Syndication
+Format and Publishing Protocol specifications.
+
+Abdera is very quiet, almost dormant. There was one bug report recently, 
+no one has had a chance to investigate it yet, other than that there has 
+been little activity in the project. It might be worth thinking about 
+moving to the attic but while there are still a few PMC members watching
+the lists I think its probably ok to keep the project alive for now.
+
+The last release was one year ago, the last committer / PMC member 
+addition was Nov 2011.
+
+No board issues.
+
+
+-----------------------------------------
+Attachment B: Report from the Apache Any23 Project  [Michele Mostarda]
+
+Anything To Triples (Any23) is a library, a web service and a command
+line tool that extracts structured data in RDF format from a variety
+of Web documents.
+
+Project Releases
+
+The last release of Any23 (0.9.0) was on 3rd November 2013.
+
+Overall Project Activity since last report
+
+Project activity has been very quiet again. There has been one 
+proposed fix for a new RDFa compliant parser and some community
+members have been trying this out very recently.
+Some other issues have been fixed and the process of proposing parts
+of the codebase to the Apache Tika community is the main focus.
+One issue which is currently being worked on (and nearly complete)
+is to migrate the 'mime' module over to Apache Tika. Please see
+the below Jira ticket.
+https://issues.apache.org/jira/browse/TIKA-1208.
+Due to interest/committer resources from within Any23 progress
+on this issue is slower than preferred HOWEVER it is NOT dead
+in the water.
+
+When were the last committers or PMC members elected?
+
+Chris Mattmann was added back to the PMC on Wed, 15th May 2013.
+
+How has the community developed since the last report?
+
+There has been no community development since we last reported.
+
+Changes to PMC & Committers
+
+As of 17/03/2014 (dd/mm/yyyy) the community is currently VOTE'ing 
+on a PROPOSAL to change the Project Chair from Michele Mostarda 
+to Lewis John McGibbney.
+
+
+
+-----------------------------------------
+Attachment C: Report from the Apache APR Project  [Jeff Trawick]
+
+The Apache Portable Runtime (APR) project creates and maintains
+software libraries that provide a predictable and consistent interface
+to underlying platform-specific implementations.  The sub-projects
+which are released somewhat regularly are APR and APR-util.  In addition,
+the APR-iconv sub-project is commonly used but has not had a release
+since 2007.
+
+Releases:
+---------
+Nothing was released this quarter.  APR 1.5.0 and APR-util 1.5.3 were 
+released November 18, 2013.
+
+Community
+---------
+
+New PMC members: none
+The last new PMC member was added in November of 2013.
+
+New committers: none
+The last new committer was added in March of 2013.
+
+Ten bugs were opened during the reporting period, with some
+sort of developer followup (closure or discussion) on four bugs.
+(Additionally, a number of bugs that had been left open after 
+being fixed in older releases have been cleaned up.)
+
+Mailing list activity has been very quiet this quarter, with no
+release activity and limited discussion of bugs.
+
+Development
+-----------
+Development has been very light this quarter.
+
+Issues
+------
+There are no board-level issues at this time.
+
+
+-----------------------------------------
+Attachment D: Report from the Apache Archiva Project  [Maria Odea Ching]
+
+Apache Archiva is an extensible repository management software that helps
+taking care of your own personal or enterprise-wide build artifact 
+repository. It is the perfect companion for build tools such as Maven, 
+Continuum, and ANT.
+
+Releases
+--------
+
+* Last release was on 19 February 2014 (Archiva 2.0.0)
+
+<PRIVATE> 
+Team has yet to work through a security release based on 
+some vulnerabilities found in Struts that affect the current 1.3 GA 
+version (but not 1.4). To address the security issues, the Struts 
+libraries used in the 1.3 series were upgraded to 2.3.16. The fix is
+already in place, but the release still needs to be rolled out.
+</PRIVATE>
+
+Community
+---------
+
+We have not added any committers or PMC members recently, with the last
+addition for both groups on 14 Sep 2012.
+
+Development
+-----------
+
+Release of 2.0.1 is currently being planned to address issues in the 
+recently released 2.0.0.
+
+Issues
+------
+
+No board level issues at this time.
+
+
+-----------------------------------------
+Attachment E: Report from the Apache Axis Project  [Deepal Jayasinghe]
+
+The Apache Axis project is responsible for the creation and maintenance
+of software related to the Axis Web Services frameworks and subsidiary
+components.
+
+
+Community
+=========
+
+No new committers or PMC members were nominated this quarter. 
+The level of participation is consistent and healthy.
+
+Both user and developer mailing lists continue to be active with a 
+fair amount of traffic.
+
+
+Releases
+No releases for this quarter.
+
+Last releases:
+Axis2/Java: April 2012
+Rampart/Java: April 2012
+Sandesha2/Java: April 2012
+Axis2 Transports/Java: December 2009
+Axis/Java: April 2006
+Axis2/C: Apr 2009
+Rampart/C: May 2009
+Sandesha/C: Oct 2007
+Savan/C: May 2007
+Axis/C++ 1.x: March 2006
+
+
+Issues
+There are no issues requiring board attention at this time.
+
+
+-----------------------------------------
+Attachment F: Report from the Apache Bigtop Project  [Roman Shaposhnik]
+
+Apache Bigtop is a software related to a system for integration,
+packaging, deployment and validation of a big data management
+software distribution based on Apache Hadoop.
+
+RELEASES
+* The last release of Apache Bigtop was version 0.7.0, released on Nov 5, 2013
+* Bigtop 0.8.0 is the next release scheduled for Q2 of 2014, based on Hadoop 2.3
+  - release is delayed from originally planned Q1 of 2014 because of the scope
+    of the changes
+
+CURRENT ACTIVITY
+* Development activity continues as can be seen from the following report:
+     https://issues.apache.org/jira/issues/?filter=12326778
+  (since last board report, Dec 2013)
+* Bigtop 0.8.0 is the next release the community is working on
+* Groovy language runtime environment has been added to Bigtop
+* Latest version of Hadoop 2.3 is being added to Bigtop
+
+COMMUNITY
+
+No changes
+
+* Currently there are:
+- Total of 115 subscribers to the developer list
+- Total of 132 subscribers to the user list
+- Total of 24 subscribers to the announce list
+- Total of 25 committers
+- Total of 20 PMC members
+
+ISSUES
+
+* The Apache Bigtop PMC has voted to recommend 
+     Konstantin Boudnik <co...@apache.org> 
+  be appointed to the office of Vice President, Apache Bigtop
+* PMC has voted on and approved establishing term limits for
+  the position of PMC Chair. Adopted: a position of an Apache Bigtop Chair
+  gets elected for a year. After a year passes it is expected of the active
+  Chair to start a [DISCUSS] email thread on private@bigtop.apache.org asking
+  PMC members to nominate themselves for the next year. It is perfectly
+  acceptable for the active chair to nominate him or herself. There is no
+  limit on the number of terms that one person can server as an Apache Bigtop
+  Chair. Each term, however is limited to one year.
+
+
+-----------------------------------------
+Attachment G: Report from the Apache Bloodhound Project  [Gary Martin]
+
+Project Description
+===================
+Apache Bloodhound is a software development collaboration tool, including
+issue tracking, wiki and repository browsing.
+
+Issues
+======
+
+There are no issues that we believe currently require the board's attention.
+
+Releases
+========
+
+There have been no releases over the last three months. The last releases
+were:
+
+* apache-bloodhound-0.6 (16th July 2013)
+* apache-bloodhound-0.7 (23rd August 2013)
+
+Preparation of a new release is expected within around a week.
+
+Community & Development
+=======================
+
+Two new committee members have been added this quarter:
+
+* SaintGermain (1st January 2014)
+* Antony Semonella (9th January 2014)
+
+Bloodhound is once again looking to become involved with GSoC this year and
+the community has prepared a number of sample projects for students interest.
+This has already seen six students discussing projects on the dev mailing
+list who all seem to have been engaged with promptly in order to hold their
+interest. We have three PMC members who have put themselves forward for
+mentorship. This has also being used as an informal opportunity for those
+mentors to discuss GSoC with local students which may benefit projects beyond
+Bloodhound with potential students.
+
+Development effort has increased again after a slow January but the mailing
+list traffic has remained healthy with new contributors appearing fairly
+regularly. This activity has obviously been boosted significantly by the GSoC
+related discussions. 
+
+
+-----------------------------------------
+Attachment H: Report from the Apache Buildr Project  [Alex Boisvert]
+
+Apache Buildr is a Ruby-based build system for Java-based applications,
+including support for Scala, Groovy and a growing number of JVM languages and
+tools.
+
+Our last release (1.4.15) happened in November. Development and community
+activity (mailing lists, bug reports, etc.) has been low since then. Our last
+committer/PMC changes happened in October.
+
+In February, we discussed and agreed to move to git as our primary
+version-control system, as well as "turning on" the improved GitHub integration
+(https://blogs.apache.org/infra/entry/improved_integration_between_apache_and).
+
+We have no issues that require board attention.
+
+
+-----------------------------------------
+Attachment I: Report from the Apache BVal Project  [Matt Benson]
+
+The Apache BVal project implements the Java EE Bean Validation specification(s)
+and related extensions, and became a top-level project of the foundation on
+February 15, 2012.
+
+### Releases ###
+No new releases.
+
+### Activity ###
+Development has proceeded at what can charitably be termed a crawl for the past
+year while BVal's team have been expending their volunteer energies elsewhere.
+A large obstacle has just been removed, however, in the form of the Apache
+Commons Weaver component, which has just seen its 1.0 release. This project had
+been one of the aforementioned time/energy sinks and was developed for the
+express purpose of solving one of BVal's long-standing design problems; speaking
+on behalf of the PMC I am hopeful that we can now resume a respectable
+development velocity and finally make our 1.0 and 1.1 (implementing,
+respectively, the same versions of the Java Bean Validation specification)
+releases in the near future.
+
+### Community  ###
+No changes in community. Romain Manni-Bucau was added to the PMC during the
+previous quarter after having been elected a committer the quarter before that.
+
+### Branding ###
+Nothing to report.
+
+### Legal ###
+No concerns at present.
+
+### Infrastructure ###
+Nothing needed at the moment.
+
+
+-----------------------------------------
+Attachment J: Report from the Apache Camel Project  [Christian Mueller]
+
+Apache Camel is a powerful open source integration framework based on known
+Enterprise Integration Patterns.
+
+Project Status
+--------------
+* There are no issues that require the board attention.
+* The project is healthy, active and stays at a high level.
+
+Community
+---------
+* Packtpub published one new book about Apache Camel:
+  http://www.packtpub.com/apache-camel-developers-cookbook/book
+* The previous CamelOne conference is now part of RedHat's DevNation
+  conference which is planned for 04/13/2014 - 04/17/2014
+  (http://www.devnation.org/#agenda)
+* We will have two talks at ApacheCon 2014 in Denver:
+  * http://s.apache.org/8un
+  * http://s.apache.org/TPG
+* We got 3 new contributors who signed the ICLA.
+* The community stays at a high level (289 subscribers at dev@; 732
+  subscribers at users@)
+* The community is active and questions being answered in short term.
+ * Avg. 692 mails per month on the users mailing list in December 2013 -
+   February 2014
+ * Avg. 142 mails per month on the dev mailing list in December 2013 -
+   February 2014
+ * Avg. 275 commits per month in December 2013 - February 2014
+
+Community Objectives
+--------------------
+ * We handled the security issues CVE-2014-0002 and CVE-2014-0003. Thanks to
+   David Jorm for reporting it to us.
+ * We are finalizing Apache Camel 2.13.0 to get it out of the door soon.
+ * We are discussing new features for the next minor release Apache Camel
+   2.14.0.
+
+Project Composition
+-------------------
+* No new committer in this reporting period (last one joined 10/16/2013)
+* No new PMC member in this reporting period (last one joined 10/05/2013)
+
+Releases
+--------
+* 2.12.3 (02/21/14)
+* 2.11.4 (02/16/14)
+* 2.11.3 (01/13/14)
+
+
+-----------------------------------------
+Attachment K: Report from the Apache Cayenne Project  [Andrus Adamchik]
+
+Apache Cayenne is a Java persistence framework. It takes a distinct approach 
+to object persistence and provides an ORM runtime, remote persistence services, 
+and a GUI mapping/modeling tool.
+
+Project Status
+
+* Cayenne 3.1 Release Candidate 1 was released on Feb 18.  
+* New feature development continues for Cayenne 3.2.
+* Git migration got stalled (mainly lack of time among the champions to restart 
+  a conversation with infra). Looking for ways to get it back on track.
+
+Community
+
+* Mailing list activity is about average on developer and user lists.
+* The last PMC member was added in December 2012.
+* The last committer was added in May 2012.
+* We have a new, but steady contributor who submitted a number of patches for 
+  Cayenne 3.2 in the last quarter
+
+
+-----------------------------------------
+Attachment L: Report from the Apache Chemistry Project  [Florian Müller]
+
+Apache Chemistry is an effort to provide an implementation of the CMIS
+(Content Management Interoperability Services) specification in Java,
+Python, PHP, .NET, and Objective-C (and possibly other languages).
+The project has graduated in February 2011.
+
+== Project status ==
+
+There isn't much activity except for the OpenCMIS subproject, which
+receives bug fixes, improvements and new features. OpenCMIS is still
+preparing the next release.
+
+There are no board-level issues at this time.
+
+== Community ==
+
+No community changes this quarter.
+
+== Releases ==
+
+Last releases:
+
+OpenCMIS 0.10.0    2013-08-15
+ObjectiveCMIS 0.2  2013-07-30
+cmislib 0.5.1      2012-12-19
+DotCMIS 0.5        2013-01-19
+
+
+-----------------------------------------
+Attachment M: Report from the Apache Click Project  [Malcolm Edgar]
+
+
+-----------------------------------------
+Attachment N: Report from the Apache CloudStack Project  [Chip Childers]
+
+DESCRIPTION
+Apache CloudStack is open source software designed to deploy and manage 
+large networks of virtual machines, as a highly available, highly scalable 
+Infrastructure as a Service (IaaS) cloud computing platform.
+
+ISSUES
+
+The board has a resolution on it's agenda for this meeting to change
+the Apache CloudStack PMC chair (special order B).
+
+CURRENT ACTIVITY
+* The community is finalizing our Apache CloudStack 4.3.0 release. This 
+  release was delayed from the community's initial target for a release date, 
+  due to an issue with how we were treating a specific dependency during the 
+  default build of the software. This issue was identified by the PMC and has 
+  been resolved. We are actively testing our latest RC now.
+* The project was informed that the Citrix-hosted realhostip.com DNS resolver
+  service will be going offline this summer. It is currently used by 
+  CloudStack installations as a default installation configuration option. 
+  Best practice for production installations include changing this to a 
+  local solution, however we are aware that many installations do not make
+  this change. We will be informing our user community of this news during 
+  our 4.3.0 release announcement, and have already committed a patch that 
+  removes the need for this external service from 4.3.0 onward.
+* The project is about to go into feature freeze for Apache CloudStack 4.4.0.
+* The documentation has made the proposed transition from the publican 
+  docbook format to .rst format. It is too early to tell if this had the 
+  desired effect on lowering the barriers for user contributions.
+* The community is working with TLF to organize the upcoming CCC14NA 
+  conference in Denver, with the event obviously being co-located with 
+  ApacheCon NA.
+
+RELEASES
+Apache CloudStack 4.2.1 was released on January 10, 2014.
+
+COMMUNITY
+Including the following additions, CloudStack has 86 committers and 26 PMC 
+members.
+
+New Committers:
+Sanjay Tripathi (sanjaytripathi) - Jan 9
+Mark Hinkle (mrhinkle) - Jan 24
+Chris Suich (csuich2) - Feb 6
+
+New PMC Members:
+Giles Sirret (giles) - Jan 21
+Mike Tutkowski (mtutkowski) - Feb 4
+
+The Apache CloudStack project remains a high volume community:
+
+dev@ 761 729(+32) subs / msgs = Dec: 1298, Jan: 1977, Feb: 1691
+users@ 1042(-59) subs / msgs = Dec: 514, Jan: 516, Feb: 474
+issues@ 192(+15) subs / msgs = Dec: 3028, Jan: 2607, Feb: 943
+commits@ 202(+8) subs / msgs = Dec: 1023, Jan: 1311, Feb: 884
+marketing@ 178(+15) subs / msgs = Dec: 63, Jan: 91, Feb: 18
+users-cn@ 508(+40) subs / msgs = Dec: 83, Jan: 64, Feb: 38
+
+
+-----------------------------------------
+Attachment O: Report from the Apache Commons Project  [Gary Gregory]
+
+The Apache Commons project focuses on all aspects of reusable Java components.
+
+Apache Commons components are widely used in many projects, both within Apache
+and without.
+
+No issues require board attention at this time.
+
+Overall project health is good with twelve releases this period. The [csv]
+component is still inching towards 1.0 releases and [imaging] is very close to
+1.0 as well.
+
+Releases:
+
+   - 2013-12-12: Apache Commons BeanUtils 1.9.0
+   - 2013-12-20: Apache Commons Codec 1.9
+   - 2013-12-31: Apache Commons Pool 2.1
+   - 2014-01-01: Apache Commons Lang 3.2
+   - 2014-01-02: Apache Commons Exec 1.2
+   - 2014-01-09: Apache Commons Lang 3.2.1
+   - 2014-01-12: Apache Commons BeanUtils 1.9.1
+   - 2014-01-21: Apache Commons Compress 1.7
+   - 2014-02-07: Apache Commons FileUpload 1.3.1
+      - SECURITY - CVE-2014-0050. Specially crafted input can trigger a DoS
+      if the buffer used by the MultipartStream is not big enough. When
+      constructing MultipartStream enforce the requirements for buffer size by
+      throwing an IllegalArgumentException if the requested buffer size is too
+      small. This prevents the DoS.
+   - 2014-02-25: Apache Commons Pool 2.2
+   - 2014-03-04: Apache Commons Lang 3.3
+   - 2014-03-04: Apache Commons DBCP 2.0
+
+New committers
+
+   - 2014-01-24: Duncan Jones
+   - 2014:02-13: Bernd Eckenfels
+
+News
+
+   - We’ve moved Commons Attributes to dormant. Since no development has
+     happened for a long time, we’ve moved the Apache Commons Attributes
+     component to dormant. No further development is expected.
+   - The site has a new look and feel. Not all component sites have been
+     republished yet.
+
+
+-----------------------------------------
+Attachment P: Report from the Apache Community Development Project  [Luciano Resende]
+
+The Community Development PMC is responsible for helping people become
+involved with Apache projects
+
+
+Project Status
+--------------
+
+No issues require board attention at this time.
+
+PMC changes
+-----------
+
+No Changes. The latest addition has been Suresh Marru on 2013-04-26.
+
+
+Google Summer of Code
+---------------------
+
+It’s GSoC time again, we have been accepted as a Mentoring Organization and 
+we are currently accepting students proposals. 
+
+Ulrich Stark has volunteered as GSoC Admin and has been doing an excellent work 
+handling all the Organization registration and mentoring registration and 
+validation with the respective PMCs.
+
+
+ComDev & Events
+---------------
+
+The ComDev PMC is now a "home" for some of the ConCom responsibilities. 
+In the last few months, Rich Bowen has been leading the RFP for ApacheCon Denver 
+and the schedule is now up and live at the conference website : 
+http://events.linuxfoundation.org/events/apachecon-north-america/program/schedule.
+
+There has also been discussion about a community panel where people would discuss 
+some of the Apache “hot topics” such as the “Release Process”. The panel topic hasn’t 
+been finalized yet and is being discussed on the comdev AT apache DOT org.
+ 
+Other
+-----
+
+There has been a few threads recently about Apache Releases 
+and how to support a faster release process for Apache projects. 
+
+
+-----------------------------------------
+Attachment Q: Report from the Apache Continuum Project  [Brent Atkinson]
+
+Apache Continuum is an enterprise-ready continuous integration server with
+features such as automated builds, release management, role-based security,
+and integration with popular build tools and source control management
+systems.
+
+The heightened activity cited in the last report resulted in a temporarily
+build to address the remote execution vulnerabilities in Apache Struts 2 
+that lead to vmbuild being compromised and subsequently disabled by the
+infrastructure team. The build has been running on vmbuild without incident
+since January, 7 2014.
+
+The last release was Continuum 1.4.1, on January 7, 2013. A release including
+fixes for the previously mentioned vulnerabilities is still pending.
+
+As expected, there has been low volume on the mailing lists and in the issue
+tracker.
+
+There have been no new committers since last cycle. The last committer was
+added December 8, 2010 and the last PMC member was added on September 2, 2012.
+
+
+-----------------------------------------
+Attachment R: Report from the Apache Cordova Project  [Brian LeRoux]
+
+
+-----------------------------------------
+Attachment S: Report from the Apache Creadur Project  [Robert Burrell Donkin]
+
+
+-----------------------------------------
+Attachment T: Report from the Apache cTAKES Project  [Pei J Chen]
+
+Apache cTAKES (clinical Text Analysis and Knowledge Extraction System)
+is a natural language processing (NLP) tool for information extraction
+from electronic medical record clinical free-text.
+
+Issues:
+There are no issues requiring board attention at this time.
+
+Releases:
+- ctakes-3.0.0-incubating on 2013-02-22
+- ctakes-3.1.0 on 2013-08-30
+- ctakes-3.1.1 on 2013-12-05
+
+Development:
+The committee is actively working and planning for the future release.
+Some of the planned code changes for the upcoming release includes:
+- YTEX (Yale Extensions for Apache cTAKES) has been committed to sandbox.  
+Key features include storing annotations into an relational db, exporting
+annotation to data mining toolkits (WEKA, R, Matlab, etc.).
+- New faster dictionary lookup component has been committed to sandbox
+- New temporal relations component in progress
+- Various bug fixes and code enhancements tracked by Jira
+
+Community:
+Last Committers/PMC:
+Murali Nagendranath (2013-10-21)
+Vijay Garla (2013-11-16)
+dev mailing list subscribers count: 103 (+9 since last report) 
+user mailing list subscribers count: 91 (+10 since last report)
+
+
+-----------------------------------------
+Attachment U: Report from the Apache Curator Project  [Jordan Zimmerman]
+
+Project Status
+==============
+* 2.4.1 maintenance released currently being voted on
+
+Community
+=========
+* In the past 5 weeks 10 issues were resolved
+* Last release: 2.4.0 on Feb 8, 2014
+* Curator switched to a Github mirror and will now take Pull
+Requests instead of patches
+
+Issues for board consideration
+==============================
+* Curator continues to have only 1 active committer however
+patches/PRs are coming from a good number of unique active users
+
+
+-----------------------------------------
+Attachment V: Report from the Apache DirectMemory Project  [Raffaele P. Guidi]
+
+Apache DirectMemory is an off-heap cache implementation for the JVM
+
+* General Information
+Development and mailing lists traffic are mostly quiet, we are working on a
+minor (fix) 0.2.1 release
+
+* Issues
+No known issues at the time
+
+* Committers or PMC members change 
+Last added PMC member was Noctarius (Cristoph Engelbert) on 2013-09-25
+
+* Releases
+Release 0.2 - 2013-09-17
+Release 0.1 - 2012-07-09
+
+
+-----------------------------------------
+Attachment W: Report from the Apache Felix Project  [Felix Meschberger]
+
+Apache Felix is a project aimed at implementing specifications from the OSGi
+Alliance as well as implementing other supporting tools and technologies aligned
+with OSGi technology.
+
+Community
+- PMC: No new PMC members have been added in this report period. The last new
+  PMC member was added in Dec. 2013
+- Committers: David Bosschaert has been added as a committer on Dec. 20, 2013
+- Steady mailing list activity.
+- There are no issues requiring board attention at this time.
+
+Software
+- Apache Felix Utils 1.6.0 (March 5, 2014)
+- Apache Felix Declarative Services (SCR) 1.8.2 (January 21, 2014)
+- Apache Felix Inventory 1.0.4 (March 3, 2014)
+- Apache Felix Jaas 0.0.2 (Feburary 17, 2014)
+- Apache Felix Web Console 4.2.2 (Feburary 06, 2014)
+- Apache Felix Inventory 1.0.2 (Feburary 06, 2014)
+- Apache Felix iPOJO Runtime and Manipulator 1.11.1 (January 29, 2014)
+- Apache Felix Metatype 1.0.10 (January 19, 2014)
+- Apache Felix Coordinator 1.0.0 (January 19, 2014)
+- Apache Felix AutoConf Processor 0.1.5 (December 10, 2013)
+- Apache Felix DeploymentAdmin 0.9.5 (December 10, 2013)
+- Apache Felix HTTP Service 2.2.2 (December 10, 2013)
+
+Project Branding
+- TM missing from all Logos
+
+Licensing and other issues
+- None
+
+
+-----------------------------------------
+Attachment X: Report from the Apache Flex Project  [Alex Harui]
+
+Apache Flex is an application framework for easily building Flash-based
+applications for mobile devices, the browser and desktop.
+
+RELEASES
+-Apache Flex SDK 4.11.0 was released on 10/28/13.
+-Voting is in progress for SDK 4.12.0
+-Apache Flex Installer 2.7.0 was also released on 10/28/13.
+-Voting is also in progress for Installer 3.0.0 which has the new
+ capability to use Ant script syntax to drive the install process.
+
+ACTIVITY
+Activity in Apache Flex continues to be in two main areas:  improvements
+to the existing Adobe Flash Platform-dependent code base, including the
+releases listed above, and prototyping ways to create a version of Flex
+that is independent from the Adobe Flash Platform.  There is another group
+working on Maven-related tools for the existing code base.
+
+In the past three months we've seen:
+- Continued JIRA activity (more bugs raised than resolved however)
+- More committers becoming active again.
+- Fewer new folks contributing and eventually becoming committers.
+
+Other highlights:
+-Over 70 bugs have been fixed in 4.12.0.
+-Three committers will be giving presentations on Flex at ApacheCon 2014.
+
+Code Donation Update
+-FlexUnit was donated but has yet to be formulated into a release.
+-Swiz donation is still pending.  The donator has not filed the paperwork.
+-BlazeDS donation paperwork was submitted but the code is not yet in the
+ repo because it was discovered that some pieces were missing.  We hope to
+ get the missing pieces soon.  The missing pieces are stuck in IP review at
+ Adobe.
+
+COMMUNITY
+-One person who has been helpful on the mailing list and in JIRA was
+ invited as a committer and declined.
+-No other candidates for new committer or promotions of committers to PMC
+ in this reporting period.
+-A non-committer claims to be starting on a book about Apache Flex.
+-Latest analytics include over 3000 hits per day on the website during the
+ work week (less on weekends).
+-There were more than 14,000 installs of 4.11.0 since its release.
+-It feels like there is more interest from users based on activity on
+ users@.
+-Slight decrease in activity-level and number of committers working on SDK
+ repo but more activity and committers working on FlexJS.
+-Several Apache Flex committers will be presenting at the 360 Flex
+ conference in May
+
+TRADEMARKS
+-The new version of Flex is going to be called FlexJS.  We have begun
+ associating the TM symbol with FlexJS per advice from trademarks@
+-This site is hopefully in compliance with Apache trademark policy
+ http://www.madeinflex.com/terminos-legales/
+<private>
+nuqDaq 'oH puchpa''e'
+</private>
+
+INFRASTRUCTURE
+* I'm still hoping to find time to resolve INFRA-4380 (attachments in old
+Flex bugs).
+
+
+-----------------------------------------
+Attachment Y: Report from the Apache Giraph Project  [Avery Ching]
+
+Giraph is a Bulk Synchronous Parallel framework for writing programs
+that analyze large graphs on a Hadoop cluster. Giraph is similar to
+Google's Pregel system.
+
+Project Status
+--------------
+
+Upcoming releases:
+  1.1.0 - Getting close to done (coordinated by Roman Shaposhnik)
+
+Community
+---------
+
+* In the past 30 days we have resolved 25 issues.
+* Presented at Strata 2014 - 
+  http://strataconf.com/strata2014/public/schedule/detail/32137
+* Last committer voted in 11/2012 (Nitay Joeffe)
+* Last PMC member voted in 2/2014 (Eli Reisman)
+* Last release 5/2013 (1.0.0)
+
+Mailing lists:
+  231 subscribers on dev
+  379 subscribers on user
+
+
+-----------------------------------------
+Attachment Z: Report from the Apache Gump Project  [Stefan Bodewig]
+
+Apache Gump is a cross-project continuous integration server.  Gump's
+intention isn't so much to be a CI server but rather a vehicle that
+makes people look beyond their project's boundaries and helps the
+projects to collaborate.
+
+Gump is written in Python and supports several build tools and version
+control systems.  The Apache installation of Gump builds ASF as well
+as non-ASF projects and their dependencies.  It started in the Java
+part of the foundation but also builds projects like APR, HTTPd and
+XMLUnit.NET.
+
+== Summary ==
+
+Gump seems to create useful results for the few projects that use it.
+Activity spiked when JUnit dropped Ant build support, very little
+activity apart from that.
+
+== Releases ==
+
+Gump has never done any releases.  One reason for this is that the ASF
+installations of Gump work on the latest code base almost all of the
+time following its "integrate everything continuously" philosophy.
+
+== Activity ==
+
+The JUnit team decided to drop the Ant build and switch to "Maven
+only".  Gump used Ant to build JUnit and the migration caused a few
+hiccups along the way.  Three different people modified a few
+descriptors over a period of several days until things were back to
+normal.  No other activity.
+
+== Changes to the Roster ==
+
+All ASF committers have write access to the metadata that configure
+the ASF installations.
+
+No new committers to the code base, no changes to the PMC.  The most
+recent addition to the PMC was in December 2006 when we added Sander
+Temme.
+
+
+-----------------------------------------
+Attachment AA: Report from the Apache Helix Project  [Kishore Gopalakrishna]
+
+Development
+===========
+Fixed minor bugs and added new features on the main release branches
+- Significant performance improvements to the Helix controller
+- Improved CI health
+- 20 new JIRAS since last report.
+- 9 issues resolved.
+
+Progress on integrating with provisioners like YARN
+- Fully-functional example of Helix demonstrating the ability to integrate
+  with YARN and manage containers
+- Initial work on integrating existing task framework to run within
+  provisioned containers
+- Initial exploration of Mesos integration
+
+Progress on pluggable monitoring
+- Initial code for plugging in monitoring frameworks like Riemann to support
+  centralized actionable alerts
+
+Community
+=========
+- 100+ emails on the dev list
+- 70+ emails on the user list
+- Establishment of regular meetings on #apachehelix
+- Receiving significant community input related to improving Helix APIs
+  through IRC and the mailing lists
+- Last committer 05/18/13
+- Last PPMC 11/7/13
+
+Releases
+=========
+
+- Making progress on 0.7.x stability
+- Plan to release 0.6.3 with critical bug fixes/features.
+
+
+-----------------------------------------
+Attachment AB: Report from the Apache Hive Project  [Carl Steinbach]
+
+DESCRIPTION
+
+Apache Hive is a data warehouse written on top of Apache Hadoop. It
+provides SQL to query and manage data (in the form of tables and
+partitions stored in HDFS or external systems) and provides a
+metastore containing metadata information about the stored data.
+
+RELEASES
+
+* The last release of Apache Hive was version 0.12.0, released on
+  October 15, 2013.
+
+* Work on the upcoming 0.13.0 release has begun.
+
+COMMUNITY
+
+* Development activity continues as can be seen from the following
+  report: http://s.apache.org/Nx9
+
+* A Hive User Group meeting was held on March 17th at Hortonworks'
+  office in Palo Alto.
+
+* Xuefu Zhang (xuefu) and Gunther Hagleitner (gunther) were voted in
+  as PMC members. The last addition to the Hive PMC was made on
+  March 3rd.
+
+* Remus Rusanu, Sergey Shelukhin, Jason Dere, and Vikram Dixit were
+  voted in as committers. The last addition was made on February 26th.
+
+* Currently there are:
+- 655 subscribers to the developer list
+- 1658 subscribers to the user list
+- 12 committers
+- 17 PMC members
+- 6 Emeritus PMC members
+
+BRANDING CHECKLIST
+
+We have created HIVE-2432 to track this, with sub-tasks corresponding
+to each item.
+
+* Project Website Basics:  [DONE]
+* Project Naming And Descriptions: [DONE]
+* Website Navigation Links: [IN PROGRESS]
+* Trademark Attributions: [IN PROGRESS]
+* Logos and Graphics: [DONE]
+* Project Metadata:  [DONE]
+
+
+-----------------------------------------
+Attachment AC: Report from the Apache Incubator Project  [Roman Shaposhnik]
+
+The Apache Incubator is the entry path into the ASF for projects and
+codebases wishing to become part of the Foundation's efforts.
+
+There are 33 podlings currently under incubation.
+
+* Community
+
+  New IPMC members:
+
+    Justin Mclean
+
+  People who left the IPMC: 
+
+    (None)
+
+* New Podlings
+
+    (None)
+
+* Graduations
+
+  The board has motions for the following:
+
+    (None)
+
+  The following graduations have been approved by
+  the previous board meeting but haven't been recorded
+  in the incubator report:
+
+    Knox
+    Spark
+
+* Releases
+
+  The following releases were made since the last Incubator report:
+
+    Feb  2 Apache Spark 0.9.0-incubating
+    Feb  2 Apache Falcon 0.4-incubating
+    Feb  5 Apache Twill 0.1.0-incubating
+    Feb 10 Apache Olingo 1.1.0-incubating
+    Feb 21 Apache Storm 0.9.1-incubating
+    Feb 24 Apache Celix 1.0.0-incubating
+    Feb 28 Apache Tez 0.3.0-incubating
+
+  It took 2-10 days for the third IPMC vote to arrive.
+
+    Release                               VOTE start  Third IMPC +1  Days
+    ---------------------------------------------------------------------
+    Apache Spark 0.9.0-incubating         Jan 24      Jan 31          5
+    Apache Falcon 0.4-incubating          Jan 24      Feb  2         10
+    Apache Twill 0.1.0-incubating         Feb  1      Feb  4          3
+    Apache Olingo 1.1.0-incubating        Jan 31      Feb 10         10
+    Apache Storm 0.9.1-incubating         Feb 13      Feb 16          3
+    Apache Celix 1.0.0-incubating         Feb 16      Feb 22          6
+    Apache Tez 0.3.0-incubating           Feb 26      Feb 28          2
+
+* Miscellaneous
+
+  * NPanday missed two reports in a row and community activity is low.
+    This has been escalated to the project's mentors.
+
+  * A proposal for Hoya, an application to deploy and manage existing
+    distributed applications in a YARN cluster, is still pending a vote.
+
+  * The Apache Phoenix podling is concerned that an import of existing
+    issues database into ASF JIRA is taking too long
+
+<private>
+Hab SoSlI' Quch!
+</private>
+
+-------------------- Summary of podling reports --------------------
+
+* Not yet ready to graduate
+
+  No release(s):
+    
+    BatchEE
+    DataFu
+    log4cxx2
+    Phoenix
+    Wave
+    Streams
+    
+  Community growth:
+ 
+    DeviceMap
+    Drill
+    Falcon
+    MRQL
+    Kalumet
+    Streams
+
+  Considering retirement:
+  
+    S4
+
+* Ready to graduate 
+
+    Allura
+    Tajo
+
+* Did not report, expected next month
+
+    NPanday
+
+----------------------------------------------------------------------
+                       Table of Contents
+Allura
+BatchEE
+DataFu
+DeviceMap
+Drill
+Falcon
+Kalumet
+log4cxx2
+MRQL
+NPanday
+Phoenix
+S4
+Sentry
+Sirona
+Storm
+Streams
+Tajo
+Wave
+
+---------------------------------------------------------------------- 
+
+--------------------
+Allura
+
+Forge software for the development of software projects, including source
+control systems, issue tracking, discussion, wiki, and other software
+project management tools.
+
+Allura has been incubating since 2012-06-25.
+
+Graduation discussions are currently ongoing.
+Community Discussion: http://markmail.org/message/wdddve3kxceqvgj5
+Podling vote: http://markmail.org/message/4g54fcxwb4xxys5l
+
+Any issues that the Incubator PMC (IPMC) or ASF Board wish/need to be
+aware of?
+
+  None
+
+How has the community developed since the last report?
+
+  Two talks about Allura were accepted for ApacheCon.  A few small patches
+  from new contributors.  A guide for new contributors was written.  One
+  person has expressed interest in participating in the GSoC with Allura.
+
+How has the project developed since the last report?
+
+  A second release was made recently (Feb 25).  Many new features and fixes
+  continue to land, including a new user profile page design.
+
+Date of last release: 
+
+  2014-02-25
+
+When were the last committers or PMC members elected?
+
+  2013-04-11
+
+Signed-off-by: 
+
+  [ ](allura) Ross Gardler
+  [ ](allura) Greg Stein
+  [X](allura) Jim Jagielski
+
+Shepherd/Mentor notes:
+
+  Justin Mclean (jmclean):
+
+    IPMC has voted for graduation and just started a vote on
+    general@incubator.
+
+--------------------
+BatchEE
+
+BatchEE projects aims to provide a JBatch implementation (aka JSR352) and a
+set of useful extensions for this specification.
+
+BatchEE has been incubating since 2013-10-03.
+
+Three most important issues to address in the move towards graduation:
+
+  1. Build a Community
+     We really need to work on this. Mark Struberg will hold a talk 
+     about BatchEE on JAX in early May 2014 in Mainz
+
+  2. Ship stable releases
+     This looks good so far. We are pretty close on getting 
+     a first release out.
+
+  3. Establish an ASF culture. 
+     We also need to work on this front. The committer circle does fine
+     on the technical side but we really need to raise attention about 
+     the importance of structural things like not pulling in too many
+     foreign dependencies and shipping board reports in time.
+
+
+Any issues that the Incubator PMC (IPMC) or ASF Board wish/need to be
+aware of?
+
+  None yet. We still have to work on a few things but nothing critical.  I
+  will make sure we raise issues if we cannot solve them.
+
+
+How has the community developed since the last report?
+
+  The community does not yet grow much in terms of committers.  There are
+  quite a few interested users though and the project gets used in
+  production projects already.
+
+How has the project developed since the last report?
+
+  We have missed reporting for 2 consecutive months due to time constraints
+  of the involved leaders. We will report the next 3 month to show our
+  commitment
+
+Date of last release: 
+
+  none yet. We are preparing to release 0.1-incubating within 
+  the next 2 month.
+
+When were the last committers or PMC members elected?
+  
+  We still have the initial set of committers.
+
+Signed-off-by: 
+
+  [ ](batchee) Jean-Baptiste Onofré
+  [ ](batchee) Olivier Lamy
+  [X](batchee) Mark Struberg
+
+--------------------
+DataFu
+
+DataFu provides a collection of Hadoop MapReduce jobs and functions in
+higher level languages based on it to perform data analysis. It provides
+functions for common statistics tasks (e.g. quantiles, sampling), PageRank,
+stream sessionization, and set and bag operations. DataFu also provides
+Hadoop jobs for incremental data processing in MapReduce.
+
+DataFu has been incubating since 2014-01-05.
+
+Three most important issues to address in the move towards graduation:
+
+  1. Building ASF community
+  2. Release
+  3. Remaining incubator paperwork
+
+Any issues that the Incubator PMC (IPMC) or ASF Board wish/need to be
+aware of?
+
+  None.
+
+How has the community developed since the last report?
+
+  More contributions have been received from Jian Wang, who has also 
+  been voted in as the newest committer and PPMC member.  A talk
+  is planned at the Apache Pig meetup to be held on March 14th.
+
+How has the project developed since the last report?
+
+  Three JIRAs have been opened, four have been closed.  The project has 
+  migrated from Ant to the Gradle build system, which will make it easier 
+  to add libraries for Hive, Crunch, etc.
+
+Date of last release: 
+
+  None. Second month of incubation.
+
+When were the last committers or PMC members elected?
+
+  2014-02-22
+
+Signed-off-by: 
+
+  [ ](datafu) Ashutosh Chauhan
+  [X](datafu) Roman Shaposhnik
+  [x](datafu) Ted Dunning
+
+--------------------
+DeviceMap
+
+Apache DeviceMap is a data repository containing device information, images
+and other relevant information for all sorts of mobile devices, e.g.
+smartphones and tablets. While the focus is initially on that data, APIs
+will also be created to use and manage it.
+
+DeviceMap has been incubating since 2012-01-03.
+
+Three most important issues to address in the move towards graduation:
+
+  1. Make a release 
+  2. Get more contributors 
+  3. Grow the community
+
+Any issues that the Incubator PMC (IPMC) or ASF Board wish/need to be aware
+of?
+
+  DeviceMap's activity is very low and has actually gone down in the last
+  few months.
+
+  The next step is probably for the podling to consider whether it can
+  reasonably expect to grow a community and get more active, or whether it's
+  not active enough to graduate as an Apache project.
+
+How has the community developed since the last report?
+
+  No changes.
+
+How has the project developed since the last report?
+
+  Minimal changes only.
+
+Date of last release:
+
+  None yet.
+
+When were the last committers or PMC members elected?
+
+  May 2013
+
+Signed-off-by: 
+
+  [X](devicemap) Bertrand Delacretaz
+  [ ](devicemap) Kevan Miller
+  [ ](devicemap) Andrew Savory
+
+Shepherd/Mentor notes:
+
+  Roman Shaposhnik (rvs):
+
+    I will agree that the community activity is very low and the trend is
+    not positive. I would encourage mentors to probe around the question of
+    potential retirement.
+
+--------------------
+Apache: Project Drill
+
+Description:
+
+Apache Drill is a distributed system for interactive analysis of large-scale
+datasets that is based on Google's Dremel. Its goal is to efficiently
+process nested data, scale to 10,000 servers or more and to be able to
+process petabyes of data and trillions of records in seconds.
+
+Drill has been incubating since 2012-08-11.
+
+Three Issues to Address in Move to Graduation:
+
+  1. Continue to attract new developers and and early users with a variety
+     of skills and viewpoints
+  2. Continue to develop deeper community skills and knowledge by building
+     additional releases
+  3. Demonstrate community robustness by rotating project tasks among
+     multiple project members
+ 
+Issues to Call to Attention of PMC or ASF Board:
+
+  None
+ 
+How community has developed since last report:
+
+  Community awareness and participation were strengthened through a meeting
+  of the Bay Area Apache Drill User Group in San Jose sponsored by Yahoo!
+  This event expanded participation to include many new to Drill and
+  particularly those interested as potential users (analysts rather than
+  developers).  
+
+  Speakers included Drill project mentor Ted Dunning from MapR, Data
+  Scientist Will Ford from Alpine Data Labs, new Drill committer Julian Hyde
+  from HortonWorks and Aman Sinha, MapR Drill engineer.
+
+  Additional events include:
+
+  • Two new Drill committers accepted appointment: Julian Hyde (HortonWorks)
+    and Tim Chen (Microsoft).
+  • Drill has a new project mentor, Sebastian Schelter.
+ 
+  Mailing list discussions:
+
+  Subscriptions to the Drill mailing lists have risen to 399 on dev list and
+  308 on the user list and 508 uniques across both lists.  There has been
+  active and increasing participation in discussions on the developer
+  mailing list, including new participants and developers. Participation on
+  the user list is growing although still small; mainly activity takes place
+  on developer mailing list.
+ 
+  Activity summary for the user mailing list:
+
+  http://mail-archives.apache.org/mod_mbox/incubator-drill-user/
+ 
+    February to date 02/26/2014: 25
+    January 2014, 12
+    December 2013, 62
+
+  Topics in discussion on the user mailing list included but not limited to:
+
+  • Feb 2014: Connecting Drill to HBase, Support for Distinct/Count
+  • Jan 2014: Loading Data into Drill, Data Locality
+  • December 2013: Loading Data into Drill, Setting Drill with HDFS and
+    other Storage engines
+
+  Activity summary for the dev mailing list:
+
+    http://mail-archives.apache.org/mod_mbox/incubator-drill-dev/
+    February to date 02/26/2014: 250 (jira; discussion; review requests)
+    January 2014, 156 (jira; focused discussions)
+    December 2013, 51 (jira; focused discussions)
+
+  Topics in discussion on the dev mailing list included but not limited to:
+
+  • February to date 02/26/2014: How to contribute to Drill; review requests
+    for Drill 357, 346, 366, 364; status of Drill functions including Hash
+    functions; support operators +,- for date and interval arithmetic
+  • January: Sql Options discussions, Casting discussions, Multiplex Data
+    Channel feedbacks
+  • December: Guide for new comers contribution, Aggregate functions code
+    gen feedback Code
+
+  For details of code commits, see http://bit.ly/14YPXN9
+  There has been continued activity in code commits
+
+  19 contributors have participated in GitHUB code activity; there have been
+  116 forks.
+  
+  February code commits include but not limited to: Support for
+  Information_schema, Hive storage and metastore integration, Optiq JDBC
+  thinning and refactoring, Math functions rework to use codegen, Column
+  pruning for Parquet/Json, Moving Sql parsing into Drillbit server side,
+  TravisCI setup 
+
+  January code commits include but not limited to: Implicit and explicit
+  casting support, Broadcast Sender exchange, add TPC-H test queries,
+  Refactor memory allocation to use hierarchical memory allocation and
+  freeing.
+
+  Community Interactions
+
+  Weekly Drill hangout continues, conducted remotely through Google hangouts
+  Tuesday mornings 9am Pacific Time to keep core developers in contact in
+  realtime despite geographical separation.
+
+  Community stays in touch through @ApacheDrill Twitter ID, and by postings
+  on various blogs including Apache Drill User http://drill-user.org/ which
+  has had several updates and through international presentations at
+  conferences.
+
+  Viability of community is also apparent through active participation in
+  the Bay Area Apache Drill User group meeting in early November, which has
+  grown to 440 members.
+
+  Sample presentations:
+
+  • “How to Use Drill” by Ted Dunning and Will Ford, Bay Area Apache Drill
+    Meet-up 24 February
+  • “How Drill Addresses Dynamic Typing” by Julian Hyde, Bay Area Apache
+     Drill Meet-up 24 February
+  • “New Features and Infrastructure Improvements” by Aman Sinha, Bay Area
+     Apache Drill Meet-up 24 February
+
+  Articles
+
+  Examples of articles or reports on Apache Drill since last report include:
+
+  • Drill blog post by Ellen Friedman at Apache Drill User updating
+    community on how people will use Drill and inviting comments/ questions
+    from remote participants as part of the Drill User Group
+    http://bit.ly/1p1Qvgn
+  • Drill blog post by Ellen Friedman at Apache Drill User reports on
+    appointment of new Drill committers and new mentor http://bit.ly/JIcwQe
+
+  Social Networking
+
+  @ApacheDrill Twitter entity is active and has grown substantially by 19%,
+  to 744 followers.
+
+How project has developed since last report:
+
+  1. Significant progress is being made on execution engine and sql front
+     end to support more functionality, also more integrations with storage
+     engines.
+  2. Work on ODBC driver has begun with a new group led by George Chow in
+     Vancouver.
+  3. Significant code drops have been checked in from a number of
+     contributors and committers
+  4. Work toward 2nd milestone is progressing substantially.
+
+Signed-off-by:
+
+  [x](drill) Ted Dunning
+  [x](drill) Grant Ingersoll
+  [x](drill) Isabel Drost-Fromm
+  [x](drill) Sebastian Schelter
+
+Shepherd/Mentor notes:
+
+  Isabel Drost-Fromm (isabel):
+
+    For the next report, please include information on date of last
+    release and when last committer/PMC member was elected.
+
+--------------------
+Falcon
+
+Falcon is a data processing and management solution for Hadoop designed for
+data motion, coordination of data pipelines, lifecycle management, and data
+discovery. Falcon enables end consumers to quickly onboard their data and
+its associated processing and management tasks on Hadoop clusters.
+
+Falcon has been incubating since 2013-03-27.
+
+Three most important issues to address in the move towards graduation:
+
+  1. Continue to build community
+  2. Add more committers to the project
+
+Any issues that the Incubator PMC (IPMC) or ASF Board wish/need to be aware
+of?
+
+  - No
+
+How has the community developed since the last report?
+
+  * Two new committers have been invited to join the project
+  * More users & contributors have joined the falcon project and the
+    community continues to grow
+
+How has the project developed since the last report?
+
+  * We have had discussions on the mailing list relating to the Roadmap of
+    the project with wide participation from many members in the community.
+  * We are currently working on major features to further enhance the
+    project and have a release planned (0.5-incubating) early April
+  * There is plenty of activity happening on the project through JIRAs
+
+Date of last release:
+
+  2014-02-03 (0.4-incubating)
+
+When were the last committers or PMC members elected?
+
+  Two new committers have been invited to join the project.
+
+Signed-off-by:
+
+  [ ](falcon) Arun Murthy
+  [X](falcon) Chris Douglas
+  [ ](falcon) Owen O'Malley
+  [ ](falcon) Devaraj Das
+  [X](falcon) Alan Gates
+
+--------------------
+Kalumet
+
+Kalumet a complete environment manager and deployer including J2EE
+environments (application servers, applications, etc), softwares, and
+resources.
+
+Kalumet has been incubating since 2011-09-20.
+
+Community Development:
+
+  Apache Kalumet 0.6-incubating version has been released.
+
+  We are in the way of promoting the documentation on the website.
+
+Project Development:
+
+  We are preparing the 0.7-incubating release.
+
+  Local branches have been created containing:
+
+  - new model and REST API
+  - new webconsole (remove of Echo framework)
+
+Before Graduation (most important issues to address in the move towards
+graduation):
+
+  - The documentation has been updated and aligned with the 0.6-incubating
+    release. The documentation will be promoted on the website and "linked"
+    in announcement e-mails.
+  - The 0.7-incubating release will fix the graduation issue, especially in
+    term of license (removal of Echo2 framework for the UI).
+
+Post Graduation:
+
+  - Kalumet scripts. It's the extension of the "software" concept globally
+    to all Kalumet resources. It will allow users to create custom
+    deployment/update plan, with a set of fine-grained steps.
+
+Any issues that the Incubator PMC (IPMC) or ASF Board wish/need to be
+aware of:
+
+  None so far. 
+
+Date of the last release: 2013-11-25
+
+  No new committer or PMC
+
+NB: Jim Jagielski asked to be retired from the mentors of the project.
+
+Signed-off-by: 
+
+  [X](kalumet) Jim Jagielski
+  [ ](kalumet) Henri Gomez
+  [ ](kalumet) Jean-Baptiste Onofre
+  [ ](kalumet) Olivier Lamy
+
+--------------------
+log4cxx2
+
+Logging for C++
+
+log4cxx2 has been incubating since 2013-12-09.
+
+Three most important issues to address in the move towards graduation:
+
+  1. We probably need to decide what's an acceptable platform/compiler list,
+     sort out any remaining hiccups, and then move towards a release.
+  2. We need to release 0.11.0 as maintenance release.
+  3. We need to make a broader use of the ASF infrastructure (notably the
+     CI, as well as improved management of the Jira site - notably with
+     triaging), and establish a roadmap for the next releases.
+
+Any issues that the Incubator PMC (IPMC) or ASF Board wish/need to be
+aware of?
+
+  N/A
+
+How has the community developed since the last report?
+
+  The committers are still getting acquainted with each other and the
+  foundation. There's only little need for support currently, but
+  from time to time it looks like "old users" notify about themselves.
+
+How has the project developed since the last report?
+
+  We have applied a lot of bug fixes which were collected in the last
+  years in JIRA and fit to a maintenance release, tested on different
+  platforms and started to discuss about changes in the used build
+  system because of different problems.
+
+Date of last release:
+
+  2008-04-03 was the official, pre-incubation 0.10.0
+
+  Many post-0.10.0 commits exist on trunk which we intend to get out as
+  0.11.x.
+
+When were the last committers or PMC members elected?
+
+  N/A
+
+Signed-off-by:
+
+  [X](log4cxx2) Christian Grobmeier
+  [ ](log4cxx2) Scott Deboy
+
+--------------------
+MRQL
+
+MRQL is a query processing and optimization system for large-scale,
+distributed data analysis, built on top of Apache Hadoop, Hama, and Spark.
+
+MRQL has been incubating since 2013-03-13.
+
+Three most important issues to address in the move towards graduation:
+
+  1. increase adoption, expand user community, and increase user list
+     activity
+  2. recruit more developers, committers, and PMCers
+  3. have at least one more incubator release
+
+Any issues that the Incubator PMC (IPMC) or ASF Board wish/need to be
+aware of?
+
+  none
+
+How has the community developed since the last report?
+
+  Nothing to report. No new developers. No new committers.
+
+How has the project developed since the last report?
+
+  Ported MRQL to Yarn. Added support for Spark 0.9.0.
+  Improved the MRQL build process in many ways.
+  Changed the run scripts to construct assembly jars at runtime.
+
+Date of last release: 
+
+  2013-10-31
+
+When were the last committers or PMC members elected?
+
+  2013-03-13
+
+Signed-off-by: 
+
+  [X](mrql) Alan Cabrera
+  [ ](mrql) Anthony Elder
+  [ ](mrql) Alex Karasulu
+  [ ](mrql) Mohammad Nour El-Din
+
+Shepherd/Mentor notes:
+
+  Roman Shaposhnik (rvs):
+
+    A reasonably sized community. Given that it has been incubating for
+    about a year now, I'd encourage graduation activity. A few more releases
+    would be a good first step.
+
+--------------------
+Phoenix
+
+Phoenix is an open source SQL query engine for Apache HBase, a NoSQL data
+store. It is accessed as a JDBC driver and enables querying and managing
+HBase tables using SQL.
+
+Phoenix has been incubating since 12/11/2013.
+
+Three most important issues to address in the move towards graduation:
+
+  1) Perform initial release out of apache incubator followed up quickly by
+     two new releases
+  2) Make our customers successful and prove value of Phoenix+HBase over
+     other alternatives
+  3) Attract new committers to the project
+
+Any issues that the Incubator PMC (IPMC) or ASF Board wish/need to be
+aware of?
+
+  We've been waiting more than two months for our Github issues to be
+  imported into our Apache JIRA.
+
+How has the community developed since the last report?
+
+  Lots of user/dev traffic on email list and general interest. Received a
+  nice patch from an external contributor to replace our CSV loader with the
+  Apache Commons CSV loader that's under development.
+
+  No new committers.
+
+How has the project developed since the last report?
+
+  * IP Clearance is complete.
+  * Vote is in progress on dev list for on our first release. Prior RC was
+    sunk due to the license and notice files not being correct.
+  * Working in parallel toward 3.0 and 4.0 releases as well.
+
+Date of last release:
+
+  No release yet.
+
+When were the last committers or PMC members elected?
+ 
+  No new committers or PMC members.
+
+Signed-off-by: 
+
+  [ ](phoenix) Lars Hofhansl
+  [X](phoenix) Andrew Purtell
+  [X](phoenix) Devaraj Das
+  [ ](phoenix) Enis Soztutar
+  [ ](phoenix) Steven Noels
+
+--------------------
+S4
+
+S4 (Simple Scalable Streaming System) is a general-purpose, distributed,
+scalable, partially fault-tolerant, pluggable platform that allows
+programmers to easily develop applications for processing continuous,
+unbounded streams of data.
+
+S4 has been incubating since 2011-09-26.
+
+Three most important issues to address in the move towards graduation:
+
+  1. No development since last release
+  2. Limited activity on mailing lists
+  3. Need new committers/contributors
+
+Any issues that the Incubator PMC (IPMC) or ASF Board wish/need to be
+aware of?
+
+  The project is considering retirement
+
+How has the community developed since the last report?
+
+  No development
+
+How has the project developed since the last report?
+
+  No development
+
+Date of last release: 
+
+  June 2013: S4 0.6.0 released
+
+When were the last committers or PMC members elected?
+
+  March 2013 (Daniel Gómez Ferro)
+
+Signed-off-by: 
+
+  [x](s4) Patrick Hunt
+  [ ](s4) Arun Murthy
+
+--------------------
+Sentry
+
+Sentry is a highly modular system for providing fine grained role
+based authorization to both data and metadata stored on an Apache Hadoop
+cluster.
+
+Sentry has been incubating since 2013-08-08.
+
+Three most important issues to address in the move towards graduation:
+
+  1. Grow the Sentry community 
+  2. Add new committers that diversify the project
+  3. Continue to release at regular intervals
+
+Any issues that the Incubator PMC (IPMC) or ASF Board wish/need to be
+aware of?
+
+  None
+
+How has the community developed since the last report?
+
+  We have added a new committer to the project. Updated and redesigned the
+  Sentry Web site. 
+
+How has the project developed since the last report?
+
+  Work continues on the db_policy_store branch (SENTRY-37) and to issue the
+  1.3 release. Additionally a new website and logo have been chosen:
+  http://sentry.incubator.apache.org
+
+Date of last release: 
+
+  2013-09-25
+
+When were the last committers or PMC members elected?
+
+  Vamsee Yarlagadda has been added as a committer as announced on Feb 28
+  2014. No new PPMC members have been added since the project has entered
+  the incubator.
+
+Signed-off-by: 
+
+  [X](sentry) Arvind Prabhakar
+  [X](sentry) Joe Brockmeier
+  [X](sentry) David Nalley
+  [ ](sentry) Olivier Lamy
+  [x](sentry) Patrick Hunt
+  [ ](sentry) Thomas White
+
+--------------------
+Sirona
+
+Monitoring Solution java oriented.
+
+Sirona has been incubating since 2013-10-15.
+
+Three most important issues to address in the move towards graduation:
+
+  1. Stabilize the javaagent API and features.
+  2. Stabilize test portability/stability (if possible).
+  3. Get more committers.
+
+Any issues that the Incubator PMC (IPMC) or ASF Board wish/need to be
+aware of?
+
+  No
+
+How has the community developed since the last report?
+
+  In interest yes, not really in contributor.
+
+How has the project developed since the last report?
+
+  The project API starts to be stable and now we start adding enhancements
+  in the javaagent.
+
+Date of last release:
+
+  2013-17-12
+
+When were the last committers or PMC members elected?
+
+  None since starting the incubation
+
+Signed-off-by: 
+
+  [X](sirona) Olivier Lamy
+  [ ](sirona) Henri Gomez
+  [X](sirona) Jean-Baptiste Onofre
+  [ ](sirona) Tammo van Lessen
+  [ ](sirona) Mark Struberg
+
+Shepherd/Mentor notes:
+
+  Roman Shaposhnik (rvs):
+
+    A great community.
+
+--------------------
+Storm
+
+Storm is a distributed, fault-tolerant, and high-performance realtime
+computation system that provides strong guarantees on the processing of
+data.
+
+Storm has been incubating since 2013-09-18.
+
+Three most important issues to address in the move towards graduation:
+
+  1. Growing the community and adding Committers/PPMC Members
+  2. Release on a regular basis
+  3. Lower the user/developer entry barrier by improving documentation,
+    examples, and integration options.
+
+Any issues that the Incubator PMC (IPMC) or ASF Board wish/need to be
+aware of?
+   
+  None.
+
+How has the community developed since the last report?
+
+  We have voted in 2 additional Committers/PPMC Members. Since our first
+  Apache release, community and committer involvement has increased and we
+  hope to continue that trend. 
+
+How has the project developed since the last report?
+
+  We successfully executed our first Apache release. We have migrated the
+  storm-project.net website and github wiki to the podling website. To
+  support our initial and subsequent releases, we also migrated the Storm
+  build system from Leiningen to Apache Maven.
+
+Date of last release: 
+
+  2014-02-22
+
+When were the last committers or PMC members elected?
+
+  2014-03-04
+
+Signed-off-by: 
+
+  [x](storm) Ted Dunning
+  [X](storm) Arvind Prabhakar
+  [ ](storm) Devaraj Das
+  [ ](storm) Matt Franklin
+  [ ](storm) Benjamin Hindman
+
+--------------------
+Streams
+
+Apache Streams is a lightweight server for ActivityStreams.
+
+Streams has been incubating since 2012-11-20.
+
+Three most important issues to address in the move towards graduation:
+
+  1. Growing the active developer community  
+  2. Making a secondary incubator release
+  3. Develop concrete use cases and providing tutorials for users
+
+Any issues that the Incubator PMC (IPMC) or ASF Board wish/need to be
+aware of?
+
+
+
+How has the community developed since the last report?
+
+  Since the last report we have admitted a new committer Carol Hansen, who
+  has provided an interface for streams. We have started discussions on
+  modules to possible incorporate into Streams, which Steve Blackmon has
+  spearheaded. We have also received pull requests from outside developers
+  and started a migration from svn to git. Discussions have also begun on
+  schema clarification which is a pressing issue as the project becomes
+  standardized.  
+
+How has the project developed since the last report?
+
+  A substantial commit was made by Steve Blackmon including a Twitter
+  Firehose attachment and a Apache Storm. It has laid the ground work for
+  additional attachments. A Lucene connector and Elastic Search connector
+  are being planned.
+
+Date of last release: 
+
+  2013-01-09
+
+When were the last committers or PMC members elected?
+
+  2014-01-14 (Carol Hansen)
+
+Signed-off-by: 
+
+  [x](streams) Matt Franklin
+  [x](streams) Ate Douma
+  [ ](streams) Craig McClanahan
+
+--------------------
+Tajo
+
+Tajo is a distributed data warehouse system for Hadoop.
+
+Tajo has been incubating since 2013-03-07.
+
+Three most important issues to address in the move towards graduation:
+
+  1. Apache Tajo graduation IPMC vote has been passed.
+     (http://markmail.org/message/qq4mxzgc4h5ripkr)
+  2. 
+  3. 
+
+Any issues that the Incubator PMC (IPMC) or ASF Board wish/need to be
+aware of?
+
+  No
+
+How has the community developed since the last report?
+
+  Some committers have presented Tajo project in some conferences and
+  meetups.  Especially, Keuntae Park, one of the committers, will present
+  Tajo in ApacheCon.
+
+How has the project developed since the last report?
+
+  We have resolved more than 200 issues since the last report.  There have
+  been real users of Tajo project.  They are giving many feedbacks obtained
+  from real use cases.  We are improving Tajo from their feedbacks.
+  Recently, we have started the works on multi-tenancy.
+
+Date of last release: 
+
+  2013-11-20
+
+When were the last committers or PMC members elected?
+
+  2014-01-02: Keuntae Park
+
+Signed-off-by: 
+
+  [ ](tajo) Chris Mattmann
+  [ ](tajo) Owen O'Malley
+
+--------------------
+Wave
+
+A wave is a hosted, live, concurrent data structure for rich communication.
+It can be used like email, chat, or a document.
+
+Wave has been incubating since 2010-12-04.
+
+Three most important issues to address in the move towards graduation:
+
+  1. Make a release
+  2. Expand the community
+  3. Decide on future path (application framework, or web application)
+
+Any issues that the Incubator PMC (IPMC) or ASF Board wish/need to be
+aware of?
+
+  None.
+
+How has the community developed since the last report?
+
+  Around the time of the last report, there was discussion on the list about
+  shutting down the project due to a lack of activity.  Since then, we have
+  had 3 new developers submit patches adding new features to Wave, pointing
+  out bugs, and picking up older features that stalled before completion.
+
+How has the project developed since the last report?
+
+  Several major patches adding support for MongoDB, full text search, and
+  date filtering to Wave have been submitted for review.
+  Some of the older ideas (e.g. the email bridge robot) have been picked up
+  by new developers.
+
+Date of last release: 
+
+  N/A
+
+When were the last committers or PMC members elected?
+
+  The last 2 committers were elected around 30th June 2013
+
+Signed-off-by: 
+
+  [X](wave) Christian Grobmeier
+  [X](wave) Upayavira
+
+
+-----------------------------------------
+Attachment AD: Report from the Apache Jackrabbit Project  [Michael Dürig]
+
+The Apache Jackrabbit™ content repository is a fully conforming
+implementation of the Content Repository for Java™ Technology API
+(JCR, specified in JSR 170 and 283).
+
+The Apache Jackrabbit project is in good shape. We have no board-level
+issues at this time.
+
+o Releases
+
+We made the following stable release from Jackrabbit trunk:
+
+  * Apache Jackrabbit 2.6.5 on December 13th
+
+  We made the following unstable release from Jackrabbit trunk:
+
+  * Apache Jackrabbit 2.7.4 on February 11th 
+    
+  We made the following releases from the Jackrabbit Oak sub project:
+  
+  * Apache Jackrabbit Oak 0.13 on December 13th
+  * Apache Jackrabbit Oak 0.14 on January 13th
+  * Apache Jackrabbit Oak 0.15 on January 27th
+  * Apache Jackrabbit Oak 0.16 on February 10th
+  * Apache Jackrabbit Oak 0.17.1 on February 26th
+  * Apache Jackrabbit Oak 0.18 on March 11th
+        
+o Community / Development
+  * No new committers or PMC members joined the Jackrabbit team since
+    February 2013.
+
+
+-----------------------------------------
+Attachment AE: Report from the Apache Karaf Project  [Jean-Baptiste Onofré]
+
+Apache Karaf provides higher level features and services
+specifically designed for creating OSGi-based servers.
+
+Community
+=========
+The new Karaf 3.0.0 has been a good message to the community.  The website has
+been a bit polished to give more visibility to the documentation of the two
+active Karaf branches.
+
+Last committers addition: October 21, 2013
+Last PMC addition: September 05, 2012
+
+Development
+===========
+The following new releases have been voted:
+- Apache Karaf 3.0.0 (major new version) (December 24, 2013)
+- Apache Karaf Cave 2.3.0 (first release of the Maven/OBR repository) (January
+  21, 2014)
+- Apache Karaf 2.3.4 (maintenance release) (February 17, 2014)
+
+Apache Karaf and all subprojects have moved to git (thanks INFRA for that).
+
+Issues for board consideration
+==============================
+None so far.
+
+
+-----------------------------------------
+Attachment AF: Report from the Apache Knox Project  [Kevin Minder]
+
+# Description
+The Knox Gateway is a REST API gateway for securing Hadoop REST APIs at the
+perimeter.
+
+# Issues
+None
+
+# Status
+* Graduation approved by board February 19, 2014
+* Working through tasks required of graduating projects
+* Discussing first TLP release
+
+# Releases
+* 0.3.0: 2013-10-13 (Incubating)
+
+# Development Activity
+* Community is discussing the creation of 0.4.0 as the first TLP release
+* Jira: 301 total, +50 -38 (last 30 days)
+* Git (Source): 43 commits over last 30 days
+* SVN (Site & Docs): 7 commits over last 30 days
+
+# Community Activity
+## Membership Changes
+* None since graduation.
+* Have not yet made adjustments to membership due to graduation.
+## Mailing List Activity
+* dev@knox: 99 messages over last 30 days
+* user@knox: 23 messages over last 30 days
+
+
+-----------------------------------------
+Attachment AG: Report from the Apache Labs Project  [Tim Williams]
+
+
+-----------------------------------------
+Attachment AH: Report from the Apache Lucene Project  [Uwe Schindler]
+
+The Apache Lucene project develops open-source search software.
+
+
+TLP
+---
+
+No new PMC members were added in the last quarter.  The most recent PMC
+member addition happened in April 2013.
+
+We added three new committers in the last quarter: Areek Zillur, Benson
+Margulies, Anshum Gupta.
+
+We ack'ed two mentor requests for Google Summer of Code 2014.  The following
+committers will be available to mentor GSoC students: Michael McCandless,
+David Smiley
+
+
+Lucene Core and Solr
+--------------------
+
+Lucene Core is a search-engine toolkit.
+
+Solr is a search server built on top of Lucene Core.
+
+In the last quarter we made three releases of both Lucene Core and Solr:
+
+ - 4.6.1 on 28 January 2014
+ - 4.7.0 on 26 February 2014
+
+The corresponding Apache Solr Reference Guides were released
+as PDF versions, generated from the Confluence Wiki:
+
+ - 4.7 on 4 March 2014
+
+The community is very active.
+
+
+Open Relevance Project
+----------------------
+
+The Open Relevance Project is a project aimed at providing Lucene and others
+tools for judging the quality of search and machine learning approaches.  The
+community is not very active, but we don't expect it to be very high volume
+either as it is a niche area.
+
+
+PyLucene
+--------
+
+PyLucene is a Python integration of Lucene Java.  Development is almost
+entirely an automated port, so this project will never require a lot of
+developers.  The user community is active.
+
+In the last quarter we made one release of PyLucene:
+
+ - 4.6.1-1 on 14 February 2014
+
+
+-----------------------------------------
+Attachment AI: Report from the Apache Lucene.Net Project  [Prescott Nasser]
+
+Apache Lucene.Net is a port of the Lucene search engine library, written
+in C# and targeted at .NET runtime users.
+
+== Summary ==
+
+Activity has picked up for the port of 4.3.0, the team is finishing up
+testing and some contrib packages for additional functionality. It looks
+like we should be approaching a release soon.
+
+== Releases ==
+
+Working toward 4.3.0, hopefully shortly
+
+== Statistics ==
+
+Nuget package downloads:
+
+Lucene.Net 3.0.3: 53626
+Lucene.Net Contrib 3.0.3: 16349
+Lucene.Net Contrib Spatial: 2205
+Lucene.Net Contrib Spatial.NTS: 611
+
+
+-----------------------------------------
+Attachment AJ: Report from the Apache MRUnit Project  [Brock Noland]
+
+MRUnit is a Java library that helps developers unit test Apache Hadoop
+MapReduce jobs. Unit testing is a technique for improving project quality
+and reducing overall costs by writing a small amount of code that can
+automatically verify the software you write performs as intended. This is
+considered a best practice in software development since it helps identify
+defects early, before they're deployed to a production system.
+
+RELEASES
+ * The last release of Apache MRUnit was version 1.0.0, released on
+ * May 21, 2013. This was MRUnit's first release since graduation in May 2012.
+
+CURRENT ACTIVITY
+ * Voting on release 1.1.0rc0 is now open
+ * Development activity continues as can be seen from the following
+report: http://s.apache.org/QMa
+ * 4 JIRA's was resolved since the last report.
+ * Mail traffic is largely on the DEV list. Messages since Jan 1st:
+dev 20, user 14
+
+COMMUNITY
+ The composition of the committers and PMC members has not changed since
+ the last report.
+
+
+Currently there are:
+ * Total of 38 subscribers to the developer list.
+ * Total of 80 subscribers to the user list.
+ * Total of 10 committers
+ * Total of 10 PMC members
+
+ISSUES
+ There are no issues requiring board attention at this time.
+
+
+
+-----------------------------------------
+Attachment AK: Report from the Apache OFBiz Project  [Jacopo Cappellato]
+
+Apache OFBiz (The Apache Open For Business Project) is an open source
+enterprise automation software project. By enterprise automation we mean:
+ERP, CRM, E-Business / E-Commerce, MRP, SCM, CMMS/EAM, and so on.
+
+We have no issues that require Board assistance at this time.
+
+*Releases*
+* "Apache OFBiz 11.04.04" has been released in February 18, 2014: this is
+ a bug fix release of the 11.04 branch
+* the stabilization of the latest release branch 13.07 is mostly complete
+ and we are preparing to issue the first release out of it (13.07.01)
+* we are also backporting bug fixes to the other active release
+ branch 12.04: soon we will probably issue one release for it
+
+*Community and Project*
+* no new committers or PMC members have been added in this quarter; the
+ last committer was Paul Foxworthy (paulfoxworthy), invited in
+ November 2012; the last PMC member was Erwan de Ferrieres (erwan),
+ invited in December 2009
+* mailing list traffic and commits are lower than in the past years but they
+  are still relevant
+* ApacheCon 2014: OFBiz will be represented by a presentation by me 
+  ("Development of a Groovy based DSL for Apache OFBiz") and by a tutorial by
+  another member of the PMC, Anil Patel ("Introduction to Developing
+  Application for Apache OFBiz Framework")
+* there is an ongoing discussion, within the PMC/committers group and in the
+  community, about the current status of the OFBiz project; over-simplifying
+  the two positions are the following:
+1) the ones that are worried by the fact that the project's progress is slower
+    than in the past (several historical committers are indeed less active) and
+    push to get more committers and PMC members onboard
+2) the ones that believe that slowing down is natural in a project that is
+    reaching a stability phase and, considering the great complexity of the
+    OFBiz codebase, it is important to only invite contributors that 
+    clearly demonstrate a deep knowledge of the framework in order to maintain
+    and improve its quality and stability over time
+** it is my personal belief that addressing the concerns of both groups is
+    important and I will try to encourage and facilitate a constructive
+    discussion about these topics; hopefully, the project will establish
+    the right rules and mechanisms to enlarge the committers base and 
+    maintain a high quality code
+
+*Infra/Legal*
+We have no issues.
+
+
+-----------------------------------------
+Attachment AL: Report from the Apache OODT Project  [Sean Kelly]
+
+DESCRIPTION
+
+Apache OODT is a software framework as well as an architectural style for the
+rapid construction of scientific data systems.  It provides components for
+data capture, curation, metadata extraction, workflow management, resource
+management, and data processing.
+
+RELEASES/DEVELOPMENT
+
+• OODT-0.6 on 2013-07-17
+• OODT-0.5 on 2012-12-25
+
+OODT-0.7 will focus on Apache Tika [1] integration and Apache CXF [2]
+integration.  OODT-0.7 is projected to be released in 2014-06.  We resolved 8
+issues in JIRA [3] since our last report.
+
+Our development mailing lists remain popular, while the user list shows less
+activity.  The table below lists the number of postings by list, by month,
+in 2014:
+
+List Jan Feb Mar
+---- --- --- ---
+dev   90  65  18
+user   4   2   0
+
+COMMUNITY
+
+We inducted no new committers or PMC members since our last report.  (The last
+committer and PMC member was brought in on 2013-10-21.)
+
+ISSUES
+
+There are no issues requiring board attention at this time.
+
+[1] http://tika.apache.org/
+[2] http://cxf.apache.org/
+[3] https://issues.apache.org/jira/browse/OODT
+
+
+-----------------------------------------
+Attachment AM: Report from the Apache Open Climate Workbench Project  [Michael James Joyce]
+
+Apache Open Climate Workbench is a tool for scalable comparison of remote 
+sensing observations to climate model outputs.  
+
+Project Activity:
+OCW just graduated from Incubator at the last Board Meeting. Recent
+development has been focused on improving the evaluation UI and expanding
+toolkit functionality through new metric additions. Most of the mailing list
+interaction has been focused around the recent graduation of the project
+along with other changes being made, such as the transition to using git.
+
+Other Activity:
+Michael Joyce and Maziyar Boustani will be giving a presentation on OCW 
+at ApacheCon 2014.
+
+Issues for the Board:
+None
+
+When was the last release:
+2013-10-11
+
+When was the last committer or PMC member elected:
+2013-06-21
+
+Any legal concerns?
+LEGAL-193 was opened because there is code that lacks proper licensing 
+that was integrated into the OCW codebase some time ago. The author of 
+the original work has been contacted with regards to attaching an 
+explicit license to their work so it can be integrated into the project.
+We're waiting for a response back.
+
+
+-----------------------------------------
+Attachment AN: Report from the Apache OpenNLP Project  [Joern Kottmann]
+
+The Apache OpenNLP library is a machine learning based toolkit for the
+processing of natural language text. It supports the most common NLP tasks,
+such as tokenization, sentence segmentation, part-of-speech tagging,
+named entity extraction, chunking, parsing, and coreference resolution.
+These tasks are usually required to build more advanced text processing
+services.
+
+Development
+------------------
+The team is currently working on the last issues for the 1.6.x release branch
+and will soon begin testing. The next release it probably out in a couple of
+weeks.
+
+Community
+---------------
+The community remained stable the last three months, a few patches
+were contributed and a new component to build language models was
+added to the sandbox.
+
+There are no new PMC members and there have been no PMC/PPMC additions
+since the project moved to Apache.
+
+Mark Giaconia was added as a committer in October 2013 and is active since then.
+
+Releases
+------------
+The last release OpenNLP 1.5.3 was released on 15.4.2013.
+
+Issues
+--------
+There are no board-level issues at this time. 
+
+
+-----------------------------------------
+Attachment AO: Report from the Apache OpenWebBeans Project  [Mark Struberg]
+
+Apache OpenWebBeans 1.x is an ALv2-licensed implementation of the
+"Contexts and Dependency Injection for the Java EE platform"
+specification which is defined as JSR-299 (CDI-1.0).
+OpenWebBeans 2.x will also implement the CDI-1.1 and
+CDI-1.2 (MR) specifications(JSR-346).
+
+Board Issues
+ There are no issues requiring board attention this time.
+
+Development
+ Development continues in trunk to implement CDI 1.1 as
+ we switched the trunk to version 2.0.0-SNAPSHOT.
+ We continue to actively maintain the owb-1.2.x branch.
+
+New Releases
+ OpenWebBeans 1.2.2, February 21st, 2014
+ This version is also used in the Apache TomEE-1.6.1 release.
+
+Discussions.
+ No discussions atm.
+
+Community
+ Community activity is pretty good. We are working towards CDI-1.2 now.
+ Last Committer: Karl Kilden on Oct 29th, 2013.
+ Karl helped us with improving our documentation.
+
+
+-----------------------------------------
+Attachment AP: Report from the Apache Pig Project  [Julien Le Dem]
+
+Pig is a platform for analyzing large data sets that consists of a
+high-level language for expressing data analysis programs, coupled
+with infrastructure for evaluating these programs. The salient
+property of Pig programs is that their structure is amenable to
+substantial parallelization, which in turns enables them to handle
+very large data sets.
+
+Releases: None this quarter
+
+Community:
+* 413 subscribers to the dev mailing list (400 in the last report)
+* 1142 subscribers to the user mailing list (1096 in the last report)
+* We have a new Committer: Mark Wagner
+* We have a new PMC member: Aniket Mokashi
+* The Pig PMC has voted for a new PMC chair candidate - Cheolsoo Park.
+* The PMC has now 15 members and the project counts 8 additional
+committers
+* a Pig meet up is coming Fri Mar 14 at linked-in: 
+http://www.meetup.com/PigUser/events/160604192/
+
+
+Status of branding checklist:
+Project Naming and Description: DONE
+Website Navigation Links: DONE
+Trademark Attributions: DONE
+Logos and Graphics: NOT STARTED
+Project Metadata: NOT STARTED
+
+
+-----------------------------------------
+Attachment AQ: Report from the Apache Pivot Project  [Roger Whitcomb]
+
+Apache Pivot is a platform for building installable Internet
+applications (IIAs). It combines the enhanced productivity and
+usability features of a modern user interface toolkit with the
+robustness of the Java platform.
+
+Status:
+Still slow but pretty steady traffic these last three months.  It appears
+there were several new people starting Pivot projects, so there were spikes
+in the User list traffic.  There have definitely been some things brought
+up that could use some development attention in the coming months, as well
+as some ideas for future development (integration with Piccolo2D among them).
+
+There is still development going on for the 2.1 version, although I think
+the 2.0.4 (maintenance) version is probably stable.  There have been only
+four new issues opened in JIRA since the last report, and three were
+resolved.  So, basically the product seems to be pretty stable and the
+PMC are busy with other things at the moment.
+
+Issues:
+None that I know of.
+
+Releases:
+Last release was 2.0.3, published 01 Aug 2013.
+
+Branding/Naming issues:
+None.
+
+Legal issues:
+None.
+
+Infrastructure Issues/Needs:
+We have been trying to figure out what's happening with the Apache Extras
+site (hosted on Google Code).  ComDev was looking into things as of October
+and Luciano said in early January that they were still waiting on Google
+contacts for an answer.  I can't follow the email discussion which is on
+a "members-only" mailing list.
+
+Community:
+Last Committer Piotr Kolaczkowski (pkolaczk) was created 09 May 2012.
+
+
+-----------------------------------------
+Attachment AR: Report from the Apache Portals Project  [David Sean Taylor]
+
+Apache Portals is a project for building freely available and interoperable
+portal software. With the Pluto project, we provide a reference implementation
+for the Java portlet standard. The Jetspeed project is a full feature
+enterprise open source portal. The Portals Applications project is dedicated
+to providing robust, full-featured, commercial-quality, and freely available
+portlet applications.
+
+Releases
+
+None this quarter.
+
+March 6, 2013 - Portals Apps Web Content 1.3
+October 10, 2011 - Portals Jetspeed 2.2.2
+26 September 2011 - Portals Pluto 2.0.3
+
+Committer/PMC
+
+None
+
+Security updates:
+
+None
+
+Community update
+
+The main activity this quarter has been the continued work on the Java Portlet
+Specification 3.0 reference implementation. We are working towards a Jetspeed
+2.3.0 release 2nd Quarter 2014
+
+
+
+-----------------------------------------
+Attachment AS: Report from the Apache ServiceMix Project  [Gert Vanthienen]
+
+Apache ServiceMix is a flexible, open-source integration container that
+unifies the features and functionality of Apache ActiveMQ, Camel, CXF and
+Karaf to provide a complete, enterprise-ready ESB powered by OSGi.
+
+Project Status
+
+We have lost a lot of our momentum now that major parts of the functionality
+are being maintained in related projects like Apache Karaf and Apache Camel.
+
+In the past month, we've had a discussion on the users@ mailing list about
+the status of the project and whether or not ServiceMix is offering any added
+value over directly using the related projects. We did get quite a bit of
+positive feedback and as a result, we now have more activity again in JIRA 
+as well as on the mailing lists.
+
+There are no outstanding issues requiring board attention.
+
+Community
+
+Since our last board report, we added 3 new people to the PMC: Dan Kulp,
+Jonathan Anstey and Willem Jiang. The last committer was added in November 
+2011.
+
+Community Objectives
+
+The main goal at the moment is getting the Apache ServiceMix 5.0.0 release
+out, in which we will drop support for a few features considered obsolete to
+ensure it's easier to keep a steady release schedule in the future.
+
+Releases
+
+- Apache ServiceMix Specs 2.4.0 in January
+- A set of 22 OSGi bundles in January
+- A set of 67 OSGi bundles in February
+- A set of 59 OSGi bundles in March
+
+
+-----------------------------------------
+Attachment AT: Report from the Apache Shiro Project  [Les Hazlewood]
+
+Apache Shiro is a powerful and flexible open-source application security
+framework that cleanly handles authentication, authorization, enterprise
+session management and cryptography.
+
+We have no issues that require Board assistance at this time.
+
+Releases:
+
+- We published a 1.2.3 bugfix release on 25 February 2014, 7 days ago.  A 1.3
+  release is still on the horizon as an interim before 2.0.
+
+Community & Project:
+
+- Brian Demers graciously fixed the user-reported CVE-2014-0074 and pushed out
+  the 1.2.3 hotfix.
+
+- A new Shiro plugin for Apache ActiveMQ has been contributed to (and accepted
+  by) the Apache ActiveMQ team.  This allows all aspects of ActiveMQ to be
+  secured by Shiro - a nice addition! The plugin is scheduled to be available
+  in the upcoming ActiveMQ 5.10 release.
+
+- Efforts towards a 2.0 distribution have picked up on a new dev branch.  We
+  will still likely need a 1.3 interim release, but that has been slow-going
+  as of late.  Hopefully we can release 1.3 next month.
+
+- User mailing list continues to be quite active.
+
+Last PMC Member voted in: Brian Demers on 20 May 2013
+Last committer voted in: Jared Bunting on 29 Jul 2012
+
+
+-----------------------------------------
+Attachment AU: Report from the Apache Sling Project  [Carsten Ziegeler]
+
+Apache Sling is an OSGI-based scriptable web framework that uses a Java Content 
+Repository, such as Apache Jackrabbit, to store and manage content.
+
+There are no issues which require board attention at the moment.
+
+Community
+
+Good activity level overall, contributions from different people continue.
+
+1 new committers:
+Tommaso Teofili
+
+Last PMC member addition was Mike Mueller, September 2010.
+
+Releases
+
+    Apache Sling Commons Log 4.0.0, 
+    Apache Sling Security 1.0.0, 
+    Apache Sling JCR Registration 1.0.0, 
+    Apache Sling Bundle Resource 2.2.20, 
+    Apache Sling JCR Base 2.2.2, 
+    Apache Sling Eventing 3.3.6, 
+    Apache Sling Scripting API 2.1.6, 
+    Apache Sling Scripting Core 2.0.26, 
+    Apache Sling Servlets Get 2.1.6, 
+    and Apache Sling Servlets Post 2.3.4 (March 7th, 2014)
+
+    Apache Sling Maven Launchpad Plugin 2.3.0 (March 6th, 2014)
+
+    Apache Sling API 2.6.0, 
+    and Apache Sling Engine 2.3.0 (March 3rd, 2014)
+
+    Apache Sling Servlets Resolver 2.3.0, 
+    and Apache Sling Resource Merger 1.0.0 (February 24th, 2014)
+
+    Apache Sling JCR API 2.2.0, 
+    Apache Sling JCR Base 2.2.0, 
+    and Apache Sling JCR Resource 2.3.0 (February 17th, 2014)
+    
+    Apache Sling Service User Mapper 1.0.0, 
+    and Apache Sling Resource Resolver Mock 0.2.0 (February 6th, 2014)
+
+    Apache Sling Health Check Core 1.1.0, 
+    Apache Sling Health Check Webconsole 1.1.0, 
+    and Apache Sling Auth Core 1.1.6 (January 31th, 2014)
+
+    Apache Sling Pax Exam Utilities 1.0.2 (January 28th, 2014)
+
+    Apache Sling API 2.5.0, 
+    and Apache Sling Eventing 3.3.4 (January 24th, 2014)
+
+    Apache Sling Installer Core 3.5.0, 
+    and Apache Sling Eventing 3.3.2 (January 19th, 2014)
+
+    Apache Sling Web Console Security Provider 1.1.2 (December 17th, 2013)
+
+    Apache Sling Maven JSPC Plugin 2.0.8 (December 14th, 2013)
+
+Documentation and infrastructure
+
+    Website has moved to Apache CMS
+    Dist folder has moved to svn
+
+Project Branding is tracked in SLING-2696.
+
+
+-----------------------------------------
+Attachment AV: Report from the Apache SpamAssassin Project  [Kevin A. McGrail]
+
+Description
+-----------
+SpamAssassin is a mail filter to identify spam. It is an intelligent email
+filter which uses a diverse range of tests to identify unsolicited bulk email,
+more commonly known as Spam. These tests are applied to email headers and
+content to classify email using advanced statistical methods. In addition,
+SpamAssassin has a modular architecture that allows other technologies to be
+quickly wielded against spam and is designed for easy integration into
+virtually any email system.
+
+Releases
+--------
+3.4.0-rc6 was released on 2/5/14.
+
+3.4.0 was a big release introducing 2+ years of fixes and features. It was
+released on 2/11/14.  Thanks to Sally Khudairi and the press team for their
+help in announcing this to the world (http://s.apache.org/G6b).
+
+Our rules releases have been fairly consistent with hiccups caused by both the
+new 3.4.0 release and a need for more masscheckers.
+
+The release of 3.4.1 is imminent.
+
+No other releases for this quarter.
+
+
+Community & Development
+-----------------------
+The most recent addition to our PMC is Adam Katz added on 2013-01-30.
+
+The most recent addition to the committers is Joe Quinn added on 2014-02-27.
+
+We also have 3 contributors invited to submit a CLA on the project and begin
+moving towards committer karma.
+
+We cleaned up
+https://people.apache.org/committers-by-project.html#spamassassin fixing two
+users with name problems (Henrik and Doc)
+
+We also cleaned up the PMC by removing the following PMC members who are now
+considered emeritus by the project and which the board approved unanimously:
+    - Theo Van Dinter
+    - Matt Kettler
+    - Daryl C. W. O'Shea
+    - Daniel Quinlan
+    - Dale 'Doc' Schneider
+    - Malte S. Stretz "
+
+Our RuleQA dev list has been active and community support is good allowing the
+project to publish rules more consistently.  
+
+The project users' list is active; questions get asked and answered.
+
+The project dev list has been active with both committers and community
+members contributing.
+
+We have migrated our website and dist to svnpubsub.
+
+We are waiting on CentOS VM to transfer our zones and zones2 server off of
+Solaris (Bug 6886) 
+
+We are working on getting our Jenkins build slave working under FreeBSD
+instead of Solaris1 (Bug 6887).
+
+
+Project Branding Requirements
+-----------------------------
+James Thompson at cPanel, Inc. drew and donated a new logo for the project.  
+
+The website was revised considerably with the new logo and the new release of
+3.4.0.  Therefore, here is a report on Project Branding Report Checklist:
+
+    DONE - Project Website Basics : homepage is project.apache.org
+
+    DONE - Project Naming And Descriptions : use proper Apache forms, describe
+product, etc.
+
+    DONE - Website Navigation Links : navbar links included, link to
+www.apache.org included
+
+    DONE - Trademark Attributions : attribution for all ASF marks included in
+footers, etc.
+
+    IN PROCESS - Logos and Graphics : include TM, use consistent product logo
+on your site - NOTE: Pending TM being added to one version of the logo to make
+the announcement for the new logo.
+
+    DONE - Project Metadata : DOAP file checked in and up to date
+
+    DONE - added Read PMC Branding Responsibilities
+
+
+Issues
+------
+
+As the project continues to battle spam, we find we are working quite often on
+rules and related anti-spam resources that are not code such as real-time
+blacklists (RBLs).  I believe there is considerable value to the project, the
+foundation and the anti-spam community if we were to spearhead these resources
+under the ASF umbrella.  I have begun the framework at
+https://raptor.pccc.com/raptor.cgim?template=RBL with the intention to run
+this under the project if permitted.  I would like feedback if this is
+possible or if it needs to be run outside of ASF.
+
+No other issues requiring board attention.
+
+
+-----------------------------------------
+Attachment AW: Report from the Apache Spark Project  [Matei Zaharia]
+
+Apache Spark is a fast and general engine for large-scale data processing. It
+offers high-level APIs in Java, Scala and Python as well as a rich set of
+libraries including stream processing, machine learning, and graph analytics.
+
+Project status:
+
+The project recently became a TLP and continues to grow in terms of community
+size. We switched all our infrastructure out of the incubator and to
+spark.apache.org domains / repos (though the old site still needs a redirect).
+We have a new minor release being finalized for later this month, and a Spark
+1.0 release targeting end of April. Recent activity includes new machine
+learning algorithms, updating the Spark Java API to work with Java 8 lambda
+syntax, Python API extensions, and improved support for Hadoop YARN.
+
+Releases:
+
+Our last few releases were:
+
+Feb 2, 2014: Spark 0.9.0-incubating
+Dec 19, 2013: Spark 0.8.1-incubating
+Sept 25, 2013: Spark 0.8.0-incubating
+
+Committers and PMC:
+
+The last committers and (podling) PMC members were added on Dec 22, 2013.
+
+
+-----------------------------------------
+Attachment AX: Report from the Apache Stanbol Project  [Fabian Christ]
+
+Apache Stanbol provides a set of reusable components for semantic content
+management.
+
+There are no issues which require board attention at the moment.
+
+The project is performing well and the 0.12 release was recently published.
+The trunk development is now heading towards a 1.0 release. The release-0.12
+branch will be further maintained for future bug fix releases.
+
+There is a good mail frequency on the dev list and questions from users are
+handled promptly. The community is currently discussing proposals for the
+upcoming GSoC.
+
+Subscribers on the dev list: 213
+
+We have elected two new committers who had worked on Stanbol during the
+2013 GSoC projects.
+
+Dileepa Jayakody was elected as a new committer on Jan 14th, 2014
+Antonio David Perez Morales was elected as a new committer on Jan 14th, 2014
+
+Apache Stanbol 0.12 was released on Mar 2nd, 2014
+Last release was: apache-stanbol-enhancement-engines-0.10.0 on Feb 2nd, 2013
+
+
+-----------------------------------------
+Attachment AY: Report from the Apache Synapse Project  [Hiranya Jayathilaka]
+
+Apache Synapse is a high performance, flexible, lightweight
+Enterprise Service Bus (ESB) and a mediation framework.
+
+Community
+=========
+
+No new committers or PMC members were nominated this quarter. Latest
+Synapse committer was elected on December, 2013. Latest Synapse PMC
+member was elected on December, 2013. These additions were reported
+on our last board report.
+
+The level of participation is consistent and healthy.
+
+Both user and developer mailing lists continue to be active with a 
+moderate amount of traffic.
+
+Releases
+========
+
+There have been no new releases during this period.
+The last release of Synapse is version 2.1, which was released on 
+January, 2012.
+
+Work is currently underway for a 3.0 release. 
+
+Board issues
+============
+
+None identified.
+
+
+-----------------------------------------
+Attachment AZ: Report from the Apache Tiles Project  [Greg Reddin]
+
+Apache Tiles is a templating framework for modern Java applications.
+
+General:
+
+This has been a very slow quarter for Apache Tiles. There have not been any
+software releases or PMC changes in this quarter. There have been a few threads
+on the user@ mailing list, but even that traffic seems to have slowed down for
+the time being. The ongoing slow pace of the project continues to be something
+to keep an eye on, but I don't believe it is a cause for concern at the moment.
+
+
+-----------------------------------------
+Attachment BA: Report from the Apache Tomcat Project  [Mladen Turk]
+
+General:
+  Continued healthy activity across multiple components and
+  responsiveness on both dev and user lists.
+
+Issues:
+  There are no issues requiring Board attention at this time.
+
+Releases:
+  * Apache Tomcat 8.0.0-RC10 - alpha, 2013-12-26
+  * Apache Tomcat 8.0.1 - beta, 2014-02-02
+  * Apache Tomcat 8.0.2 (not released)
+  * Apache Tomcat 8.0.3 - beta, 2014-02-11
+  * Apache Tomcat 7.0.48 (not released)
+  * Apache Tomcat 7.0.49 (not released)
+  * Apache Tomcat 7.0.50 - 2014-01-08
+  * Apache Tomcat 7.0.51 (not released)
+  * Apache Tomcat 7.0.52 - 2014-02-17
+  * Apache Tomcat 6.0.38 (not released)
+  * Apache Tomcat 6.0.39 - 2014-01-31
+  * Apache Tomcat Connectors 1.2.38 (not released)
+  * Apache Tomcat Connectors 1.2.39 - 2014-03-11
+  * Apache Standard Taglib 1.2.0 (not released)
+  * Apache Standard Taglib 1.2.1 - 2014-01-02
+
+Development:
+  There was lots of development activity on Apache Tomcat 7
+  and Apache Tomcat 8. Recently some work has been done on
+  new NIO2 connector.
+  There was the first release of Apache Standard Taglib 1.2, an
+  implementation of JSTL 1.2 (JSR 052). It is the first release
+  of a tag library, after migrating Apache Taglibs project from
+  Apache Jakarta to Apache Tomcat several years ago. It is the
+  first release that implements JSTL 1.2 specification.
+
+Community:
+  There were no changes in community since the last report.
+  We have organised a day long Tomcat Summit for ApacheCon.
+  Topics for discussion are currently based around future development
+  direction but any attendee is welcome to add their own topic(s).
+
+Security:
+ * CVE-2013-2067 - Important: Session fixation
+   FORM authentication associates the most recent request
+   requiring authentication with the current session.
+   By repeatedly sending a request for an authenticated
+   resource while the victim is completing the login form,
+   an attacker could inject a request that would be executed
+   using the victim's credentials.
+ * CVE-2013-2071 - Moderate: Information disclosure
+   Bug 54178 described a scenario where elements of a previous
+   request may be exposed to a current request. This was very
+   difficult to exploit deliberately but fairly likely to happen
+   unexpectedly if an application used AsyncListeners that
+   threw RuntimeExceptions.
+ * CVE-2013-4590 - Low: Information disclosure
+   Application provided XML files such as web.xml, context.xml,
+   .tld, .tagx and .jspx allowed XXE which could be used to
+   expose Tomcat internals to an attacker. This vulnerability
+   only occurs when Tomcat is running web applications from untrusted
+   sources such as in a shared hosting environment.
+ * CVE-2013-4322 - Important: Denial of service
+   The fix for CVE-2012-3544 was not complete.
+   It did not cover the following cases:
+   chunk extensions were not limited
+   whitespace after the : in a trailing header was not limited
+ * CVE-2014-0050 - Important: Denial of Service
+   It was possible to craft a malformed Content-Type header for
+   a multipart request that caused Apache Tomcat to enter an
+   infinite loop. A malicious user could, therefore, craft a
+   malformed request that triggered a denial of service.
+ <private>
+ tlhIngan maH!
+ </private>
+
+Trademark:
+  Detailed status:
+  https://svn.apache.org/repos/private/pmc/tomcat/trademark-status.txt
+  We have received a request from Canonical to use the Tomcat logo to
+  identify their Tomcat installation bundle for JuJu, their virtualised
+  platform. We intend to grant them permission to do so (with some
+  constraints).
+
+
+-----------------------------------------
+Attachment BB: Report from the Apache UIMA Project  [Marshall Schor]
+
+Apache UIMA's mission: the creation and maintenance of open-source
+software related to the analysis of unstructured data, guided by the
+UIMA Oasis Standard.
+
+Dates:
+30 Jan 2014    last release
+12 Mar 2013    last PMC addition
+24 Dec 2013    last Committer addition
+            
+2 Releases:
+  30 Jan 2014  UIMA-DUCC 1.0.0 released
+      http://uima.apache.org/news.html#30 January 2014
+      DUCC = Distributed UIMA Cluster Computing
+  14 Jan 2014  UIMA Java SDK 2.5.0 released 
+      http://uima.apache.org/news.html#14 January 2014
+
+Other Activity:
+
+Worked with Infra to set up a demo web-server for DUCC
+here:  http://uima-ducc-vm.apache.org:42133/jobs.jsp
+
+The main web page was augmented to reflect the growing
+number of significant components: Ruta, DUCC, and uimaFIT
+were added to the big picture.
+
+Major work continues on DUCC and Ruta. The core Java
+framework is being improved to better support large
+multi-core processors.
+
+The mailing lists are fairly active, and normal
+bug finding/fixing work continues.
+
+Community:
+1 committer added in December.
+ 
+Issues: 
+No Board level issues at this time.
+
+
+-----------------------------------------
+Attachment BC: Report from the Apache VCL Project  [Andy Kurth]
+
+DESCRIPTION
+
+VCL is a modular cloud computing platform which dynamically provisions and
+brokers remote access to compute resources including virtual machines,
+bare-metal computers, and resources in other cloud platforms. A self-service
+web portal is used to request resources and for administration. VCL became a
+TLP on June 20, 2012.
+
+CURRENT ACTIVITY
+
+* Development progress was a bit slow over the holidays and January but is
+  picking up.
+
+* Work has been completed to improve support for cluster reservations which
+  are distributed across different management nodes.
+
+* Work continues to fix some minor issues. We hope to create a release late
+  spring or early summer which will include support for new features
+  including provisioning on OpenStack, Windows 8.1 images, and nested
+  hypervisor provisioning.
+
+* The community continues to work to attract development contributions and
+  eventually additional committers. Contributions have recently been made
+  from people in the community who have not contributed code before.
+
+RELEASES
+
+* None
+
+COMMUNITY
+
+* Subscribers to the user list: 163
+* Posts to user list, 12/13-3/14: 156
+* Subscribers to the dev list: 134
+* Posts to dev list, 12/13-3/14: 68
+* Committers: 8 (last addition: Young Oh, 12/13)
+* PMC members: 7 (last addition: 6/12)
+
+ISSUES
+
+* There are no issues requiring board attention at this time.
+
+
+-----------------------------------------
+Attachment BD: Report from the Apache Velocity Project  [Nathan Bubna]
+
+Apache Velocity is a java template engine and related projects.
+
+RELEASES
+
+* Last release was master POM, May 2012
+* Last noteworthy release was Engine in 2010
+
+CURRENT ACTIVITY
+
+* There were no commits or contributions this quarter.
+
+COMMUNITY
+
+* Last committer added April 28, 2013
+* Activity is inconsistent on the user list but steady on Stack Overflow.
+
+
+-----------------------------------------
+Attachment BE: Report from the Apache Whirr Project  [Andrew Bayer]
+
+Whirr is a library for running services like Hadoop or ZooKeeper in the cloud.
+
+Releases:
+No new releases this quarter. Last release was 0.8.2, April 2013.
+
+Community: 
+The PMC composition did not change, and we had no new committers since the last
+report. The last PMC change was the addition of Andrew Bayer in November of
+2012, and the last new committer was Graham Gear, also in November of 2012.
+
+Issues:
+The project attempted a release vote last month on 0.9.0 and no one
+voted. We will be trying again shortly, but the project looks to be
+moribund, sadly.
+
+
+-----------------------------------------
+Attachment BF: Report from the Apache Wicket Project  [Martijn Dashorst]
+
+Apache Wicket is a Java framework for creating highly dynamic,
+component oriented web applications.
+
+Things worthy of note:
+
+- Wicket is 10 years old
+- Wicket 7 is moving along
+- Promoted experimental modules to non-experimental
+- Released Wicket 6.13.0, 6.14.0, 1.5.11, 1.4.23
+- Fixed CVE-2013-2055, CVE-2014-0043
+- No new committers or members were added in this period
+
+Date last committer added: 12 July 2013
+
+10 year anniversary
+
+From what we could gather from our archives, long time committers'
+memories and creator Jonathan Locke, Wicket was conceived somewhere in
+april 2004. It was not called that but when it was open sourced in
+august 2004 the project was named Wicket. The project tried a start at
+codehaus, but moved to sourceforge quickly when it took very long to
+get resources allocated. The next couple of years Wicket grew into a
+nice community and after a rather short courtship moved to Apache and
+is still a healthy, if mature community. 
+
+Most first timers are still listed on the PMC and still have their
+commit bits, even if their involvement has grown silent over the years.
+
+While Wicket was grown by an exceptional community of developers, I'd
+like to thank especially Jonathan Locke, for his creation of Wicket and
+his foresight to invite a community to take over the project and take
+Wicket further than we all could have imagined.
+
+Wicket 7
+
+Our development branch is still being worked on but reaches the point
+where we can release betas. One thing worthy of note is the addition of
+a new feature that loosens some of our strict rules of matching markup
+hierarchy with a Java component hierarchy. This solves one of the most
+hated 'features' since 1.0.
+
+Experimental modules
+
+We added some experimental modules in the beginning of the Wicket 6
+timeframe, promising to graduate them when reaching maturity. The time
+came for several modules to graduate from experimental to core module:
+
+ - Bean validation support
+ - CDI 1.1 support
+ - Native websocket support
+
+Other experimental modules will remain either experimental or will be
+'sunsetted'.
+
+Releases and CVEs
+
+Several maintenance and security releases have been performed, solving
+two CVE's across our full range of releasable code: 1.4, 1.5 and 6.x.
+
+CVE-2013-2055 allowed access to web templates stored with a Wicket
+application. This is fixed in 1.4.23, 1.5.11 and 6.8.
+
+CVE-2014-0043 allowed querying for the existence of particular classes
+in the classpath by issuing requests to special urls handled by Wicket.
+This only affects applications using 1.5 or 6.x and users are advised
+to upgrade to 1.5.11 or 6.14.0
+
+
+-----------------------------------------
+Attachment BG: Report from the Apache Wink Project  [Luciano Resende]
+
+Apache Wink is a project that enables development and consumption of
+REST style web services. The core server runtime is based on the
+JAX-RS (JSR 311) standard. The project also introduces a client
+runtime which can leverage certain components of the server-side
+runtime. Apache Wink delivers component technology that can be easily
+integrated into a variety of environments.
+
+There are no issues that require Board attention at the moment.
+
+Releases:
+* Last release was Apache Wink 1.4.0 which was released on September 15
+
+Activity:
+* Regular mailing list activity (on the low side).
+
+Committers or PMC changes:
+* Voted Gerhard Petracek was added as a Wink committer in August 2013.
+
+Trademark/Branding:
+* No known issues.
+
+Legal Issues:
+* None
+
+<private>
+qoSlIj DatIvjaj
+</private>
+
+
+-----------------------------------------
+Attachment BH: Report from the Apache ZooKeeper Project  [Flavio Junqueira]
+
+ZooKeeper is a reliable coordination service for distributed systems.
+ 
+Bug-fix release 3.4.6 has been voted this week and we are in the process
+of publishing it.
+
+Trunk is still under development for an eventual 3.5.0 release. A couple
+of important improvements on the way for 3.5.0:
+ 
+- One important new feature in 3.5.0 will be the ability to reconfigure
+a ZooKeeper ensemble. This feature was discussed a long time in
+ZOOKEEPER-107 and we have converged and committed it;
+- We are also focusing on a number of improvements over the code that
+performs recovery. In particular, we are targeting an implementation that
+avoids sending and taking unnecessary snapshots, which reduces time to
+recover in the presence of crashes.
+ 
+Also, the release is supposed to address scalability, jdk7 and openjdk support,
+maven build/rel, testing and audit logging. There are other various patches
+we are working on related code cleanup and refactoring.
+ 
+Note that the status of releases hasn't changed since the last board report.
+3.5.0 release date is not defined yet. 
+ 
+No infrastructure issues.
+ 
+Community:
+ 
+Mailing list activity is moderate and the number of patch reviews and
+commits has dropped significantly. 
+ 
+* 10 active committers representing 8 unique organizations. No change to
+the list of committers.
+*  9 active PMC members representing 7 unique organizations. No change to
+the list of PMC members.
+* 421 subscribers on dev (up from 408 since December 2013).
+* 927 subscribers on user (up from 891 last quarter).
+* 1891 jira issues have been created to date (58 more since December
+2013)
+
+========
+Apache BookKeeper (subproject)
+
+Bookkeeper is a distributed, reliable, and high performance logging
+service. The project also includes Hedwig which is a highly scalable
+Pub/Sub service built on top of ZooKeeper and Bookkeeper with strong
+durability guarantees.
+
+We are currently working towards the 4.3.0 release, which is in its
+final phase now. We project that it will be released early in April.
+This release includes a lot of improvements to the bookie on-disk
+performance, a new statistics framework, and protobuffer protocol
+support along with numerous bugfixes.
+
+We will also release a bugfix release on the 4.2 branch, 4.2.3, in the
+next fortnight.
+
+Infrastructure issues:
+
+No issues.
+
+Community:
+
+51 subscribers to bookkeeper-dev
+68 subscribers to bookkeeper-user
+
+730 issues opened to date, 27 since 2013-12-12
+496 issues resolved to date, 30 since 2013-12-12
+44 people have reported issues, 3 since 2013-12-12
+18 people have contributed patches, 5 since 2013-12-12
+
+
+-----------------------------------------
+Attachment BI: Report from the Apache Lenya Project  [Richard Frovarp]
+
+The Apache Lenya CMS is a Cocoon based XML/XHTML content management
+system.
+
+Development:
+
+Last release: 2.0.4 on 2011-03-14
+
+Community:
+
+Last change to community was PMC addition in October 2011.
+
+Activity:
+
+The main question from the board was project activity.
+
+The project has experienced a downturn in activity over the past 12-18
+months. Activity has dropped to near zero.
+
+Casual observation of participation indicates that there are enough active
+PMC members to act on the needs of the project. However, an inquiry as to
+those that were willing to participate actively in the project on votes if
+necessary only resulted in two PMC members showing interest. This means that
+there may not be enough PMC votes to take action on the project. The last
+vote required of the PMC was October 2011.
+
+If interest in PMC members does not pick up before the next reporting
+quarter, the Attic may be the best course of action. There currently are no
+committers or contributors that could be promoted to PMC status.
+
+
+------------------------------------------------------
+End of agenda for the March 19, 2014 board meeting.
diff --git a/www/classic/board/agenda/test/data/board_minutes_2014_02_19.txt b/www/classic/board/agenda/test/data/board_minutes_2014_02_19.txt
new file mode 100644
index 0000000..33ae5fb
--- /dev/null
+++ b/www/classic/board/agenda/test/data/board_minutes_2014_02_19.txt
@@ -0,0 +1,3657 @@
+                    The Apache Software Foundation
+
+                  Board of Directors Meeting Minutes
+
+                            February 19, 2014
+
+
+ 1. Call to order
+
+    The meeting was scheduled for 10:30am (Pacific) and began at
+    10:34 when a sufficient attendance to constitute a quorum was
+    recognized by the chairman. The meeting was held via
+    teleconference, hosted by Doug Cutting and Cloudera.
+
+    IRC #asfboard on irc.freenode.net was used for backup purposes.
+
+ 2. Roll Call
+
+    Directors Present:
+
+        Shane Curcuru
+        Bertrand Delacretaz
+        Roy T. Fielding
+        Jim Jagielski
+        Chris Mattmann
+        Brett Porter
+        Greg Stein
+
+    Directors Absent:
+
+        Sam Ruby
+        Doug Cutting
+ 
+    Executive Officers Present:
+
+        Ross Gardler
+        Rich Bowen
+        Craig L Russell
+
+    Executive Officers Absent:
+
+        none
+
+    Guests:
+
+        Sean Kelly
+        Daniel Gruno
+        Phil Steitz
+        Jake Farrell
+        Marvin Humphrey
+        David Nalley
+        Noah Slater
+
+ 3. Minutes from previous meetings
+
+    Published minutes can be found at:
+
+        http://www.apache.org/foundation/board/calendar.html
+
+    A. The meeting of January 15, 2014
+
+       See: board_minutes_2014_01_15.txt
+
+       Approved by General Consent.
+
+ 4. Executive Officer Reports
+
+    A. Chairman [Brett]
+
+       The main topic of discussion on the board list over the last month has
+       been release practices. As it progressed, it was good to see that
+       ongoing operational concerns were handled separately from discussion
+       about how to do more frequent releases within the bounds of current
+       ASF policy. Releasing open source software to the public is one of the
+       most fundamental things we do, so it is important that it is handled
+       diligently.
+
+       We're getting closer to the time where we need to prepare for the
+       Annual Members Meeting, so I've started to canvas dates. Currently the
+       first week of June seems the most feasible, but I've included a
+       discussion item in the agenda to decide.
+
+       The ASF received an invitation to participate in the "2014 Future of
+       Open Source Survey", which Sally has taken forward with the PMCs.
+
+    B. President [Ross]
+
+      An extremely busy month for me personally which has kept me away from
+      many of my ASF duties.
+   
+      The EA contract was renewed as previously agreed. A new renewal date has
+      been entered into the calendar. With Melissa's help we are in the
+      processes of updating our Director records with CSC. Please note that
+      Melissa is now providing an approximate breakdown of her time. As is
+      appropriate Melissa is in full control of her time allocation, this new
+      reporting is intended only to inform the board for budget monitoring as
+      requested.
+
+      ApacheCon proceeds thanks to continuing significant effort from Rich.
+      Due to my personal issues this month I have not been as helpful as I had
+      hoped but it seems Rich has, as always, taken it in his stride. See the
+      EVP report for more detail.
+   
+      I am yet to make significant progress on reporting budget vs actuals.
+      The treasurer has provided some initial data exports but I have been
+      unable to find the time to process it. Since I need to create a new
+      budget for the following year I propose to build this reporting into a
+      new spreadsheet that I develop during the preparation of this budget.
+   
+      Trademarks remains very busy and Shane has indicated that he is falling
+      behind a little. I have encouraged Shane to continue to work with
+      Melissa to identify areas in which she can help. I also note that an
+      Member has also offered to help.
+   
+      Fundraising is also progressing well though it is notable that this is
+      taking up a reasonable chunk of both Sally's and Melissa's time. Like
+      trademarks we need to acknowledge this role is not one that a volunteer
+      can be expected to fill. Unlike Trademarks though VP Fundraising appears
+      to have been able to find sufficient tasks that can be handled by
+      contractors. I believe this is mainly due to the less legally sensitive
+      domain. However, I grow increasingly concerned that more support from
+      Officers in managing key sponsor relations is necessary.
+   
+      Marketing progresses with its usual rhythm. No exceptional items to
+      reports.
+   
+      Infra also reports nothing exceptional this month. I do note the ongoing
+      improvement of GitHub integration at the specific request of committers.
+   
+      I engaged with the Cordova PMC with respect to their release process.
+      Initially this engagement was only as a member attempting to help them
+      understand the lay of the land. However at the request of a number of
+      Directors and Infra I subsequently made a formal request (cc board@ and
+      infra-private@) to ensure releases after 2.8.1 are formally voted upon.
+      Joe has been working with the PMC to define a suitable process which
+      does not introduce unnecessary work. I will conduct any necessary sanity
+      checks with the board to ensure the final solution is acceptable. For
+      now the PMC has acknowledged the need to address this issue (see Cordova
+      report) and Joe reports that he is satisfied with progress to date.
+   
+      TAC has, once again, failed to submit a report (and due to my own
+      lateness they have not had a prompt from me). However, Melissa reports
+      progress has been made towards planning for ApacheCon.
+   
+      Additionally, please see Attachments 1 through 6.
+
+
+    C. Treasurer [Chris]
+
+       The Treasurer's Office processed repayment for some items related 
+       to the Dublin Meetup and also processed payment to NASDAQ Global
+       Newswire in coordination with VP Press, Marketing and the President.
+
+       The Treasurer and the President identified how a statement of actuals could 
+       be provided to the President quarterly.
+
+       Over the past month, the office has periodically provided information 
+       to the EA on sponsors and their incoming payments.
+
+       We have processed a payment to the EA and set up her new payment 
+       amount to reflect her updated contract and raise.
+
+       The Office dealt with an inquiry from the Apache OOo PMC regarding 
+       reimbursements for FOSDEM 2014.
+
+       We are actively coordinating with Virtual, Inc. to obtain a quote 
+       for their financial services.
+
+       We are working with EA and Nick Burch to handle wire transfer for 
+       initial payments for TAC flights for ACNA 2014.
+
+       Income and Expenses
+
+       Current Balances:
+
+         Wells Fargo Business Checking:     914,191.62
+         Wells Fargo Savings:               287,864.39
+         PayPal:                            100,404.09
+         ----------------------------    ----------
+              Total                    $  1,302,460.10 
+
+       Income Summary:
+
+         Lockbox                             50,737.49
+         Fundraising                         10,965.00
+         ----------------------------    ----------
+              Total                    $     61,702.49
+
+       Expense Summary:
+
+                 Category                  Amount
+         ----------------------------    ----------
+             EA                               3,462.00
+             Trademarks                       2,613.75
+             Sysadmin                        31,100.00
+             misc expense                       578.29
+             ASF credit card - Sam Ruby          37.44
+             ASF credit card - Justin Erenkrantz 50.00
+             Press                           11,545.45
+             Dublin Meetup                       25.44
+             PayPal                          45,312.20
+         ----------------------------    ----------
+              Total                    $     94,724.57
+
+
+    D. Secretary [Craig]
+
+       January was an average month after the December doldrums.  There 
+       were 60 iclas and three cclas received and filed. 
+
+       The board subscription list received some overdue maintenance. 
+       LDAP subscriptions to pmc-chairs have been synchronized with PMC 
+       chairs in committee-info.txt. All but three PMC chairs are 
+       subscribed to board.
+
+
+    E. Executive Vice President [Rich]
+
+        ApacheCon North America 2014 will be held in Denver Colorado,
+        April 7-9, with tutorials and a co-located Cloudstack event to
+        follow on the 10th and 11th.
+
+        Since the last meeting, the ApacheCon call for papers has come
+        and gone, and we have, as of Monday, February 17th, selected a
+        schedule of talks for the event, and notified the selected
+        speakers. We are still receiving answers back from those
+        speakers and adjusting the schedule for the people who have
+        declined, or want their talks moved to avoid other conflicts.
+
+        Members of the Apache community were amazingly helpful in the
+        process of selecting the content, and I think we have a really
+        solid schedule for this event.
+
+        As compared to years past, the conference will have much more
+        content, with 10 tracks on Monday and Tuesday, and 9 on
+        Wednesday, and the Cloudstack Collaboration Conference on
+        Thursday and Friday. Additionally we have a day and a half
+        of tutorials, and numerous evening events.
+
+        It is now LF's responsibility to market the event and draw in
+        the registrations. I expect to have a report on registrations
+        for the next board meeting. The lead time is very short, and
+        they have their work cut out for them. Any way that we can help
+        promote the event will be important to augment their effort.
+
+        Meanwhile, we are looking at venues in Europe for November, with
+        Budapest and Rome being considered. And we are also very
+        tentatively looking at the possibility of doing an event in
+        Brazil, although that is unlikely to be in this calendar year.
+
+    F. Vice Chairman [Greg]
+
+       Nothing to report for this month.
+
+    Executive officer reports approved as submitted by General Consent.
+
+ 5. Additional Officer Reports
+
+    A. VP of W3C Relations [Andy Seaborne / Chris]
+
+       See Attachment 7
+
+    B. Apache Legal Affairs Committee [Jim Jagielski]
+
+       See Attachment 8
+
+    C. Apache Security Team Project [Mark Cox / Brett]
+
+       See Attachment 9
+
+    Additional officer reports approved as submitted by General Consent.
+
+ 6. Committee Reports
+
+    A. Apache Abdera Project [Ant Elder / Shane]
+
+       No report was submitted.
+
+    B. Apache Ambari Project [Yusaku Sako / Doug]
+
+       See Attachment B
+
+    C. Apache Ant Project [Conor MacNeill / Bertrand]
+
+       See Attachment C
+
+    D. Apache Buildr Project [Alex Boisvert / Roy]
+
+       No report was submitted.
+
+    E. Apache Cassandra Project [Jonathan Ellis / Greg]
+
+       See Attachment E
+
+       AI: Greg: follow up
+
+    F. Apache Clerezza Project [Hasan Hasan / Jim]
+
+       See Attachment F
+
+    G. Apache Click Project [Malcolm Edgar / Chris]
+
+       No report was submitted.
+
+    H. Apache Cocoon Project [Thorsten Scherler / Jim]
+
+       See Attachment H
+
+    I. Apache Community Development Project [Luciano Resende / Roy]
+
+       No report was submitted.
+
+    J. Apache Continuum Project [Brent Atkinson / Bertrand]
+
+       No report was submitted.
+
+       AI: Bertrand to pursue a report for Continuum
+
+    K. Apache CouchDB Project [Jan Lehnardt / Shane]
+
+       See Attachment K
+
+    L. Apache Creadur Project [Robert Burrell Donkin / Brett]
+
+       No report was submitted.
+
+    M. Apache DeltaSpike Project [Mark Struberg / Greg]
+
+       See Attachment M
+
+    N. Apache DirectMemory Project [Raffaele P. Guidi / Doug]
+
+       No report was submitted.
+
+    O. Apache Empire-db Project [Francis De Brabandere / Chris]
+
+       See Attachment O
+
+       AI: Chris: follow up with Empire-db
+
+    P. Apache Etch Project [Martin Veith / Roy]
+
+       See Attachment P
+
+    Q. Apache Flume Project [Arvind Prabhakar / Doug]
+
+       See Attachment Q
+
+    R. Apache Forrest Project [David Crossley / Bertrand]
+
+       See Attachment R
+
+    S. Apache Giraph Project [Avery Ching / Greg]
+
+       No report was submitted.
+
+       AI: Greg to pursue a report for Giraph
+
+    T. Apache Gora Project [Lewis John McGibbney / Brett]
+
+       See Attachment T
+
+    U. Apache Hama Project [Edward J. Yoon / Jim]
+
+       See Attachment U
+
+    V. Apache Helix Project [Kishore Gopalakrishna / Shane]
+
+       See Attachment V
+
+    W. Apache HTTP Server Project [Eric Covener / Jim]
+
+       See Attachment W
+
+    X. Apache HttpComponents Project [Asankha Perera / Bertrand]
+
+       See Attachment X
+
+    Y. Apache Incubator Project [Marvin Humphrey / Doug]
+
+       See Attachment Y
+
+    Z. Apache jclouds Project [Andrew Bayer / Roy]
+
+       See Attachment Z
+
+    AA. Apache jUDDI Project [Kurt Stam / Greg]
+
+       See Attachment AA
+
+    AB. Apache Kafka Project [Jun Rao / Brett]
+
+       See Attachment AB
+
+    AC. Apache Lenya Project [Richard Frovarp / Shane]
+
+       See Attachment AC
+
+       The report was not approved due to lack of detail, and a
+       report will be expected next month.
+
+    AD. Apache Libcloud Project [Tomaz Muraus / Chris]
+
+       See Attachment AD
+
+    AE. Apache Logging Project [Christian Grobmeier / Bertrand]
+
+       See Attachment AE
+
+    AF. Apache ManifoldCF Project [Karl Wright / Roy]
+
+       See Attachment AF
+
+    AG. Apache Marmotta Project [Jakob Frank / Doug]
+
+       See Attachment AG
+
+    AH. Apache Mesos Project [Benjamin Hindman / Shane]
+
+       See Attachment AH
+
+    AI. Apache Oltu Project [Antonio Sanso / Jim]
+
+       See Attachment AI
+
+    AJ. Apache Onami Project [Simone Tripodi / Greg]
+
+       See Attachment AJ
+
+       Greg: follow up on "typo"
+
+    AK. Apache Oozie Project [Mohammad Islam / Chris]
+
+       See Attachment AK
+
+    AL. Apache OpenJPA Project [Pinaki Poddar / Brett]
+
+       See Attachment AL
+
+    AM. Apache Perl Project [Philippe M. Chiasson / Bertrand]
+
+       See Attachment AM
+
+    AN. Apache POI Project [Yegor Kozlov / Shane]
+
+       See Attachment AN
+
+    AO. Apache Qpid Project [Gordon Sim / Roy]
+
+       See Attachment AO
+
+    AP. Apache River Project [Greg Trasuk / Brett]
+
+       See Attachment AP
+
+    AQ. Apache Roller Project [Dave Johnson / Doug]
+
+       See Attachment AQ
+
+    AR. Apache Santuario Project [Colm O hEigeartaigh / Jim]
+
+       See Attachment AR
+
+    AS. Apache SIS Project [Adam Estrada / Chris]
+
+       See Attachment AS
+
+    AT. Apache Subversion Project [Greg Stein]
+
+       See Attachment AT
+
+       verbal approval of late report
+
+    AU. Apache Syncope Project [Francesco Chicchiricco / Greg]
+
+       See Attachment AU
+
+    AV. Apache Turbine Project [Thomas Vandahl / Bertrand]
+
+       See Attachment AV
+
+    AW. Apache Tuscany Project [Jean-Sebastien Delfino / Brett]
+
+       See Attachment AW
+
+    AX. Apache Velocity Project [Nathan Bubna / Chris]
+
+       No report was submitted.
+
+       AI: Chris to pursue a report for Velocity
+
+    AY. Apache Xalan Project [Steven J. Hathaway / Shane]
+
+       See Attachment AY
+
+       AI: Shane: ask for an update on sufficiency of PMC members on
+       their next regular report
+
+    AZ. Apache Xerces Project [Michael Glavassevich / Jim]
+
+       See Attachment AZ
+
+       AI: Jim: follow up with regard to new committers next regular
+       report
+
+    BA. Apache XML Graphics Project [Chris Bowditch / Roy]
+
+       See Attachment BA
+
+    BB. Apache Cordova Project [Brian LeRoux / Greg]
+
+       See Attachment BB
+
+       AI: Shane: follow up with PMC with regard to cordova.io domain
+       name.
+
+    BC. Apache OpenOffice Project special report [Andrea Pescetti / Doug]
+
+       See Attachment BC
+
+    Committee reports approved as submitted by General Consent.
+
+ 7. Special Orders
+ 
+    A. Establish the Apache Open Climate Workbench Project
+
+       WHEREAS, the Board of Directors deems it to be in the best interests of
+       the Foundation and consistent with the Foundation's purpose to
+       establish a Project Management Committee charged with the creation and
+       maintenance of open-source software, for distribution at no charge to
+       the public, related to the preparation, evaluation and analysis of
+       massive climate remote sensing and model output data.
+
+       NOW, THEREFORE, BE IT RESOLVED, that a Project Management Committee
+       (PMC), to be known as the "Apache Open Climate Workbench Project", be
+       and hereby is established pursuant to Bylaws of the Foundation; and be
+       it further
+
+       RESOLVED, that the Apache Open Climate Workbench Project be and hereby
+       is responsible for the creation and maintenance of software related to
+       preparation, evaluation and analysis of massive climate remote sensing
+       and model output data; and be it further
+
+       RESOLVED, that the office of "Vice President, Apache Open Climate
+       Workbench", be and hereby is created, the person holding such office to
+       serve at the direction of the Board of Directors as the chair of the
+       Apache Open Climate Workbench Project, and to have primary
+       responsibility for management of the projects within the scope of
+       responsibility of the Apache Open Climate Workbench Project; and be it
+       further
+
+       RESOLVED, that the persons listed immediately below be and hereby are
+       appointed to serve as the initial members of the Apache Open Climate
+       Workbench Project:
+
+       * Andrew Hart <ah...@apache.org>
+       * Maziyar Boustani <bo...@apache.org>
+       * Christopher Douglas <cd...@apache.org>
+       * Chris Jack <cj...@apache.org>
+       * Dan Crichton <cr...@apache.org>
+       * Denis Nadeau <dn...@apache.org>
+       * estani <es...@apache.org>
+       * Cameron Goodale <go...@apache.org>
+       * Alex Goodman <go...@apache.org>
+       * Huikyo Lee <hu...@apache.org>
+       * Jason Peter Evans <ja...@apache.org>
+       * Jinwon Kim <jk...@apache.org>
+       * Michael Joyce <jo...@apache.org>
+       * Laura Carriere <lc...@apache.org>
+       * Lluis Fita Borrell <lf...@apache.org>
+       * Luca Cinquini <lu...@apache.org>
+       * Chris Mattmann <ma...@apache.org>
+       * Nick Kew <ni...@apache.org>
+       * Paul Loikith <pl...@apache.org>
+       * Paul Michael Ramirez <pr...@apache.org>
+       * Paul Zimdars <pz...@apache.org>
+       * M. V. S. Rama Rao <ra...@apache.org>
+       * J Sanjay <sa...@apache.org>
+       * Shakeh Khudikyan <sk...@apache.org>
+       * Suresh Marru <sm...@apache.org>
+       * Duane Waliser <wa...@apache.org>
+       * Kim Whitehall <wh...@apache.org>
+
+       NOW, THEREFORE, BE IT FURTHER RESOLVED, that Michael Joyce be appointed
+       to the office of Vice President, Apache Open Climate Workbench, to
+       serve in accordance with and subject to the direction of the Board of
+       Directors and the Bylaws of the Foundation until death, resignation,
+       retirement, removal or disqualification, or until a successor is
+       appointed; and be it further
+
+       RESOLVED, that the Apache Open Climate Workbench Project be and hereby
+       is tasked with the migration and rationalization of the Apache
+       Incubator Open Climate Workbench podling; and be it further
+
+       RESOLVED, that all responsibilities pertaining to the Apache Incubator
+       Open Climate Workbench podling encumbered upon the Apache Incubator
+       Project are hereafter discharged.     
+
+       Special Order 7A, Establish the Apache Open Climate Workbench Project, was
+       approved by Unanimous Vote of the directors present.
+
+     
+    B. Change the Apache Incubator Project Chair
+
+       WHEREAS, the Board of Directors heretofore appointed Marvin Humphrey
+       to the office of Vice President, Apache Incubator, and
+
+       WHEREAS, the Board of Directors is in receipt of the resignation of
+       Marvin Humphrey from the office of Vice President, Apache Incubator,
+       and
+
+       WHEREAS, the Project Management Committee of the Apache Incubator
+       project has chosen by vote to recommend Roman Shaposhnik as the
+       successor to the post;
+
+       NOW, THEREFORE, BE IT RESOLVED, that Marvin Humphrey is relieved and
+       discharged from the duties and responsibilities of the office of Vice
+       President, Apache Incubator, and
+
+       BE IT FURTHER RESOLVED, that Roman Shaposhnik be and hereby is
+       appointed to the office of Vice President, Apache Incubator, to serve
+       in accordance with and subject to the direction of the Board of
+       Directors and the Bylaws of the Foundation until death, resignation,
+       retirement, removal or disqualification, or until a successor is
+       appointed.
+
+       Special Order 7B, Change the Apache Incubator Project Chair,
+       was approved by Unanimous Vote of the directors present.
+
+
+    C. Establish the Apache Spark Project
+
+       WHEREAS, the Board of Directors deems it to be in the best interests
+       of the Foundation and consistent with the Foundation's purpose to
+       establish a Project Management Committee charged with the creation
+       and maintenance of open-source software, for distribution at no
+       charge to the public, related to fast and flexible large-scale data
+       analysis on clusters.
+       
+       NOW, THEREFORE, BE IT RESOLVED, that a Project Management Committee
+       (PMC), to be known as the "Apache Spark Project", be and hereby is
+       established pursuant to Bylaws of the Foundation; and be it further
+       
+       RESOLVED, that the Apache Spark Project be and hereby is responsible
+       for the creation and maintenance of software related to fast and
+       flexible large-scale data analysis on clusters; and be it further
+
+       RESOLVED, that the office of "Vice President, Apache Spark" be and
+       hereby is created, the person holding such office to serve at the
+       direction of the Board of Directors as the chair of the Apache Spark
+       Project, and to have primary responsibility for management of the
+       projects within the scope of responsibility of the Apache Spark
+       Project; and be it further
+       
+       RESOLVED, that the persons listed immediately below be and hereby are
+       appointed to serve as the initial members of the Apache Spark Project:
+        
+       * Mosharaf Chowdhury <mo...@apache.org> 
+       * Jason Dai <ja...@apache.org> 
+       * Tathagata Das <td...@apache.org> 
+       * Ankur Dave <an...@apache.org> 
+       * Aaron Davidson <ad...@apache.org> 
+       * Thomas Dudziak <to...@apache.org> 
+       * Robert Evans <bo...@apache.org>
+       * Thomas Graves <tg...@apache.org> 
+       * Andy Konwinski <an...@apache.org>
+       * Stephen Haberman <st...@apache.org> 
+       * Mark Hamstra <ma...@apache.org> 
+       * Shane Huang <sh...@apache.org> 
+       * Ryan LeCompte <ry...@apache.org> 
+       * Haoyuan Li <ha...@apache.org>
+       * Sean McNamara <sm...@apache.org> 
+       * Mridul Muralidharan <mr...@apache.org> 
+       * Kay Ousterhout <ka...@apache.org>
+       * Nick Pentreath <ml...@apache.org> 
+       * Imran Rashid <ir...@apache.org>
+       * Charles Reiss <wo...@apache.org> 
+       * Josh Rosen <jo...@apache.org>
+       * Prashant Sharma <pr...@apache.org> 
+       * Ram Sriharsha <ha...@apache.org>
+       * Shivaram Venkataraman <sh...@apache.org> 
+       * Patrick Wendell <pw...@apache.org> 
+       * Andrew Xia <xi...@apache.org> 
+       * Reynold Xin <rx...@apache.org> 
+       * Matei Zaharia <ma...@apache.org>
+        
+       NOW, THEREFORE, BE IT FURTHER RESOLVED, that Matei Zaharia be
+       appointed to the office of Vice President, Apache Spark, to serve
+       in accordance with and subject to the direction of the Board of
+       Directors and the Bylaws of the Foundation until death, resignation,
+       retirement, removal or disqualification, or until a successor is
+       appointed; and be it further
+       
+       RESOLVED, that the Apache Spark Project be and hereby is tasked
+       with the migration and rationalization of the Apache Incubator Spark
+       podling; and be it further
+       
+       RESOLVED, that all responsibilities pertaining to the Apache Incubator
+       Spark podling encumbered upon the Apache Incubator Project are
+       hereafter discharged. 
+
+       Special Order 7C, Establish the Apache Spark Project, was
+       approved by Unanimous Vote of the directors present.
+
+
+    D. Establish the Apache Knox Project
+
+       WHEREAS, the Board of Directors deems it to be in the best
+       interests of the Foundation and consistent with the Foundation's
+       purpose to establish a Project Management Committee charged with
+       the creation and maintenance of open-source software, for
+       distribution at no charge to the public, related to secure access
+       for Apache Hadoop clusters.
+
+       NOW, THEREFORE, BE IT RESOLVED, that a Project Management Committee
+       (PMC), to be known as the "Apache Knox Project" be and hereby is
+       established pursuant to Bylaws of the Foundation; and be it further
+
+       RESOLVED, that the Apache Knox Project be and hereby is responsible
+       for the creation and maintenance of software related to secure
+       access for Apache Hadoop clusters; and be it further
+
+       RESOLVED, that the office of "Vice President, Apache Knox", be
+       and hereby is created, the person holding such office to serve
+       at the direction of the Board of Directors as the chair of the
+       Apache Knox Project, and to have primary responsibility for
+       management of the projects within the scope of responsibility
+       of the Apache Knox Project; and be it further
+
+       RESOLVED, that the persons listed immediately below be and hereby
+       are appointed to serve as the initial members of the Apache Knox
+       Project:
+
+      * Christopher Douglas <cd...@apache.org> 
+      * Chris Mattmann <ma...@apache.org> 
+      * Devaraj Das <dd...@apache.org> 
+      * Dilli Dorai <di...@apache.org>  
+      * Alan Gates <ga...@apache.org> 
+      * John Speidel <js...@apache.org> 
+      * Kevin Minder <km...@apache.org>
+      * Larry McCay <lm...@apache.org> 
+      * Mahadev Konar <ma...@apache.org>
+      * Owen O'Malley <om...@apache.org>  
+      * Sumit Mohanty <sm...@apache.org>
+      * Tom Beerbower <tb...@apache.org>  
+      * Thomas White <to...@apache.org> 
+      * Venkatesh Seetharam <ve...@apache.org>
+
+      NOW, THEREFORE, BE IT FURTHER RESOLVED, that Kevin Minder be appointed
+      to the office of Vice President, Apache Knox, to serve in accordance
+      with and subject to the direction of the Board of Directors and the
+      Bylaws of the Foundation until death, resignation, retirement,
+      removal or disqualification, or until a successor is appointed; and
+      be it further
+
+      RESOLVED, that the Apache Knox Project be and hereby is tasked with
+      the migration and rationalization of the Apache Incubator Knox
+      podling; and be it further
+
+      RESOLVED, that all responsibilities pertaining to the Apache Incubator
+      Knox podling encumbered upon the Apache Incubator Project are
+      hereafter discharged.
+
+       Special Order 7D, Establish the Apache Knox Project, was
+       approved by Unanimous Vote of the directors present.
+
+
+ 8. Discussion Items
+
+    A. Select a date for the Annual Members Meeting
+    
+       What availability do other directors and executive officers have?
+    
+       Last week in May would be one year since the last meeting. 
+    
+       Ross prefers *not* the first week of June.
+    
+       No holidays are in conflict from Tuesday through Thursday of prospective weeks.
+    
+       May 27 through May 29 is the tentative date.
+
+ 9. Review Outstanding Action Items
+
+    * Greg: email to multiple PMCs to ask for dates on releases.
+          Status: Brett can roll this in with note about committee records
+
+    * Roy: Update the guidance for releases to forbid shipping binary
+           dependencies within a source package unless their source is also
+           included (see board_minutes_2012_04_18.txt) and communicate to
+           committers.
+          Status: still not done
+
+    * Greg: discuss "extras" issue with OpenOffice PMC and see if there is
+            anything to be done at the "ASF level"
+          Status:
+
+    * Chris: follow up on bringing on new committers and PMC members to DB
+          Status:
+
+    * Brett: follow up with Click regarding the Attic or rebooting
+          Status: still not done
+
+    * Jim: Ask Any23 PMC if they are ready to switch chairs
+          Status: PMC pinged.
+
+    * Brett: Remind PMCs to check their committee records
+          Status: tracking, but message still not done
+
+    * Doug: to pursue a report for Helix
+          Status: report received
+
+    * Brett: to pursue a report for jclouds
+          Status: report received
+
+    * Greg: ask about "pending discussion by the PMC" by JMeter
+          Status:
+
+    * Doug: pursue a report for Mesos
+          Status: report was received
+
+    * Chris: pursue a report for OpenJPA
+          Status: report received
+
+    * Bertrand: inconsistency with last committer in TomEE report
+          Status: TomEE PMC confirms last committer was Nov 2013, all good.
+
+    * Greg: ask for an out-of-band report for next month for Web Services
+          Status:
+
+10. Unfinished Business
+
+11. New Business
+
+12. Announcements
+
+13. Adjournment
+
+    Adjourned at 11:41 a.m. (Pacific)
+
+============
+ATTACHMENTS:
+============
+
+-----------------------------------------
+Attachment 1: Report from the Executive Assistant  [Melissa Warnkin]
+
+Daily monitoring of all email activity (ea@, fundraising@, trademarks@,
+treasurer@, comdev@, and board@) and following-up with appropriate personnel
+
+    ApacheCon:  70% (includes TAC)
+        Very busy month; progressing well - Rich will provide more information
+        Placed a reorder for the "Ask Me" pins and stickers (half of which is
+          being sent directly from the vendor to Michael Stehmann in Germany
+          for OOO's 2014 events, as well as for distributing amongst others in
+          the EU.  By doing so, this will reduce our shipping costs
+          tremendously). 
+        Researched items for our giveaways (will be placing an order within a
+          week or so)
+        Sent email for a volunteer to edit the website to update the ApacheCon
+          info at the top right of all pages (still reflects Portland info)
+        Sent email for volunteer to create the Speaker Slide Template
+
+    TAC:
+
+        Initial preparations made so we can proceed immediately with the
+          planning on Feb 10 after the judges make their decision
+
+    Fundraising:  25%
+
+        Updated "Thanks" page on website
+        Sent letter to Craigslist acknowledging their payment
+        Call w/Upayavira on Jan 22 to discuss pending renewals and upcoming
+          renewals.  We will be having bi-weekly calls starting on Feb 6
+        Continuing to follow-up on renewals sent out
+        Sent quote to Produban (per their request) for Silver renewal (not due
+          until Aug 1)
+        Sally (per Upayavira's request) reached out to the Platinum sponsors
+          regarding their renewal and approached the subject of the proposed
+          new "Diamond" level
+
+    Misc:  5%
+        Sorted FedEx invoice for a shipment sent to Lewis McGibbney and
+          committed to svn for processing
+        Prepared package to Michael Stehmann for FOSDEM (Rich graciously
+          agreed to take with him so we could avoid the $176+ in shipping
+          costs...thanks again, Rich!!)
+        Completed the annual report questionnaire received from CSC.  Sent to
+          Ross for review of a couple of missing bits of information
+        Contract renewal - signed on Jan 20
+        Weekly status calls with Ross and Rich
+
+
+-----------------------------------------
+Attachment 2: Report from the VP of Brand Management  [Shane Curcuru]
+
+This was a very busy month on trademarks@, and there are a number of 
+open questions still being worked on.  There have also been a number of 
+good discussions about clarifying our policies - both for PMCs as well 
+as for third parties - and about improving the Project Independence 
+guidelines.
+
+Incubator PMC and trademarks@ was contacted by a third party about our 
+use of the Apache Sentry name for our security-related product.  
+Discussions are continuing.
+
+My two talks on Brand Management were accepted for ApacheCon Denver, and 
+also one brand talk at the following CloudStack Collab that week. Phew!
+
+The Apache Hadoop PMC created trademarks@hadoop.a.o privately archived 
+mailing list; plans are to use it for better coordination of various 
+Hadoop-related brand policing.
+
+Met with counsel for the CLOUDSTACK matter, and met with a representative 
+from UKFast to work on a settlement to ensure our registration in the EU 
+can continue and to ensure that UKFast recognizes our marks.
+
+
+-----------------------------------------
+Attachment 3: Report from the VP of Fundraising  [Upayavira]
+
+At the request of Upayavira, this month’s report is being written by Melissa.
+
+Melissa has been continuing to follow-up on the renewals that have been sent
+out.  As a result of her persistence, some that we thought were “dead”, she
+has revived.
+
+We have received a Bronze payment from Cerner.  
+
+As of the writing of this, we’re awaiting an update from the Treasurer’s
+office on any new payments.
+
+Melissa has reached out to Sam to request the Tax#/EIN# be added to the quotes
+and invoices.
+
+Facebook has sent a Supplier ACH Enrollment Form, which Melissa has completed
+and sent off to them.
+
+In the process of adding “thank yous” to individual donors on the “Thanks”
+page of the website.
+
+The renewals for Yahoo! and Citrix will be going out soon, as they are up for
+renewal the first week of April.
+
+Although we’ve been making great progress, it’s clear that we still have a lot
+of work ahead of us.   I’ve (me, Melissa) actually been contemplating a better
+invoicing/accounting system to keep track of this.  I think it would be in our
+best interest if we purchase an invoicing/accounting system.  We might have to
+pay for a program, but it would be totally worth it in the long run.
+
+
+-----------------------------------------
+Attachment 4: Report from the VP of Marketing and Publicity  [Sally Khudairi]
+
+I. Budget: we remain on schedule and under budget. All vendor payments have
+been processed on time with thanks to the Treasurer and Operations teams.
+
+II. Fundraising/Branding/Marketing liaison: no meetings are planned. Sally
+Khudairi completed Sponsor renewal outreach activities for several
+organizations, and has secured confirmation from select Platinum-level
+Sponsors.
+
+III. Press Releases: the following formal announcement was issued via the
+newswire service, ASF Foundation Blog, and announce@apache.org:
+
+- 11 January 2014: The Apache Software Foundation Announces Release of #Apache™
+  #SpamAssassin™ 3.4.0
+
+IV. Informal Announcements: six newsworthy items were announced on @TheASF; one
+new post was made on the @ApacheCon Twitter feed. No new posts were made on
+"TheApacheFoundation" account on YouTube.
+
+V. Future Announcements: one project milestone announcement is planned to take
+place by the end of the month. PMCs wishing to announce major project news, as
+well as podlings ready to graduate from the Incubator, are welcome to contact
+Sally at <pr...@apache.org> for more information. Kindly provide at least
+2-weeks' notice for proper planning and execution.
+
+VI. Media Relations: we responded to 9 media requests, and 2 notifications for
+industry award submissions. The ASF received 1,519 press clips over this time
+period, vs. last month's clip count of 422.
+
+VII. Analyst Relations: we responded to 2 analyst queries. Apache was mentioned
+in 17 reports by Gartner, 7 write-ups by GigaOM, 13 reports by Yankee Group,
+and 3 reports by IDC.
+
+VIII. ApacheCon liaison: Sally is liaising with the ApacheCon producer, with
+particular focus on communications and sponsor outreach.
+
+IX. (Non-ASF) Industry Events and Outreach liaison: Sally continues
+coordinating award nominations for a few Apache projects, as well as liaising
+with the ASF's presence at several conferences and virtual events.
+
+X. Newswire accounts: we have renewed our pre-paid press release agreement with
+NASDAQ GlobeNewswire, and have 17 in our account through the end of the
+calendar year. We also have 9 remaining pre-paid press releases on the
+PRNewswire account through May 2014, as well as ongoing distribution donated by
+Pressat with no pre-established termination timeframe.
+
+
+-----------------------------------------
+Attachment 5: Report from the VP of Infrastructure  [Sam Ruby]
+
+
+New Karma:
+==========
+
+
+Finances:
+==========
+
+
+Board Action Items:
+===================
+
+
+Short Term Priorities:
+======================
+
+* Look into mac build slaves.
+
+
+* Converge on git.apache.org migration to eris. (Step 1 is merge git ->
+  git-wip on tyr) (opinions?)
+
+* Investigate / negotiate external code-signing capability, currently in talks
+  under NDA. INFRA-3991 is tracking the status, and a Webex call has taken
+  place.
+
+* Complete nagios-to-circonus migration for monitoring.
+
+* Continue to experiment with weekly team meetings via google hangout.
+
+* Explore the possibility of revamping the infra documents to have a more 
+  intuitive feel about them, improve readability.
+
+* Confluence Upgrade. Upgrade from 5.0.3 to latest. Hopefully will be less
+  painful this time around.  (Support case closed, nothing useful came from it
+  other than check the logs.)
+
+* Port tlp creation scripts over to new json-based design on whimsy.
+
+* Ensure all contractors are participating in on-call situations, minimally by
+  requiring cell-phone notification (via SMS, twitter, etc) for all circonus
+  alarms.
+
+* Explore better integration with GitHub that allows us to retain the same
+  information on the mailing list, so that vital discussions are recorded as
+  having taken place in the right places (if it didn't happen on the ML...).
+
+Long Range Priorities:
+======================
+
+* Choose a suitable technology for continued buildout of our virtual
+  hosting infra.  Right now we are on VMWare but it no longer is gratis
+  software for the ASF.
+
+* Continue gradually replacing gear we no longer have any hardware warranty
+  support for.
+
+* Formulate an effective process and surrounding policy documentation for
+  fulfilling the DMCA safe harbor provisions as they relate to Apache services.
+
+* Institute egress filtering on all mission-critical service hosts.
+
+
+General Activity:
+=================
+
+* Migrated dist.apache.org from backups of thor to eris.  Unfortunately a
+  dozen commits were naturally lost in the process.  Thanks to TRACI.NET for
+  providing additional bandwidth for this purpose.
+
+* Jira: Jira is now runnning on Apache Tomcat 8.0.0 (rather than 7.0.x). While
+  running on 8.0.x is unsupported by Atlassian, this is providing valuable
+  feedback to the Tomcat community. To mitigate the risk of running an
+  unsupported configuration, Jira is being monitored more closely than usual for
+  any problems and there is a plan in place to rollback to 7.0.x if necessary.
+
+* At the behest of committers, we have started working on a stronger
+  implementation of GitHub services, including 'vanity plates' for all Apache
+  committers on GitHub.  A method of interacting with GitHub Pull Requests and
+  comments has been completed, that both interacts with the GitHub interface
+  and retains all messages on the local mailing lists and JIRA instances for
+  record keeping. At the time of writing, we have 367 committers on the Apache
+  team on GitHub. We have made a blog entry about this at
+  http://s.apache.org/asfgithub which seems to have reached many projects
+  already.  Furthermore, the Incubator has been involved in the development of
+  this, and are thus also aware of its existence and use cases.
+
+* The new SSL wildcard was obtained from Thawte earlier this month, and will
+  be rolled out to services very soon. Thanks to jimjag this got the business
+  end of the deal done so we could actually get the cert in before the incumbent
+  expires.
+
+* All remaining SVN repos have now been upgraded to 1.8.
+
+* Resurrected thor (mail-search) after soliciting help from SMS for on-site
+  repairs.
+
+* Amended release policy to provide rationale and spent time explaining the new
+  section to members@.  See http://www.apache.org/dev/release#why
+
+* Work with Cordova on processing their historical releases to comport with
+  policy.
+
+
+-----------------------------------------
+Attachment 6: Report from the Apache Travel Assistance Committee  [Gavin McDonald]
+
+We had 26 applications submitted this time. Of those, based on the judges
+recommendations, the committee chose to accept 15 of these. Considering the
+tight timescales we've been compressed into, those numbers are actually
+pretty good.
+
+All 15 successful applicants have accepted, and we now have an almost
+complete set of flight / hotel / conference / dates / etc requirements from
+everyone. We're working with the travel agent to find the cheapest sensible
+flights for everyone, probably about half have been finalised now, rest
+expected soon. As with past conferences, we're booking non-refundable and
+non-changeable tickets, and we're self-insuring for the event of someone not
+getting a visa or similar. We're ensuring everyone has their own travel
+insurance to cover medical costs especially, but also ideally cancellations
+in case they're ill or similar.
+
+We've 5 applicants who need to apply for visas, so these are our top
+priority.
+
+We have however hit a snag with getting the wire transfer to the Travel
+Agent, so she can ticket the flights we're happy with. We think we'll
+probably be fine to wait until early next week to ticket most flights, but
+for next time it'd be good if more people were able to approve transfers
+with the bank. If the delay looks set to increase, we'll just put more (or
+perhaps even all) on credit cards.
+
+On a related money note, only Gav and Melissa have access to
+/repos/private/financials/Bills/ to submit or track invoices. It would be
+good if all of the Travel Assistance Committee could be given access too,
+since we do generate a fair number each year.
+
+-----------------------------------------
+Attachment 7: Report from the VP of W3C Relations  [Andy Seaborne]
+
+Nothing to report this month.
+
+-----------------------------------------
+Attachment 8: Report from the Apache Legal Affairs Committee  [Jim Jagielski]
+
+Relatively slow but steady month. No progress yet on Creative Commons
+(CC-BY 4.0) issue. Geir has offered to help regarding conversations
+with Oracle related to TCK access (renewals as well as new ones).
+We are operating under the understanding that we still can test against
+expired TCKs in the meantime.
+
+
+-----------------------------------------
+Attachment 9: Report from the Apache Security Team Project  [Mark Cox]
+
+There continues to be a steady stream of reports of various kinds
+arriving at security@ in Jan. These continue to be dealt with by
+the security team.
+
+Some effort was made this month to start to chase some old issues
+which we forwarded to projects but were there was no visible progress.
+One of these was escalated to the board after the reporter had no
+response for 6 months (the discussion was ongoing at the time of this
+report, but in general the difficulty is where a PMC does not have
+complete technical coverage of the project, in these cases we should
+make sure the PMC build a separate security team of the folks who can
+handle issues.  This is in no way an ASF-only issue, we see exactly
+the same problems with other upstreams including Linux kernel etc.)
+
+Jan 2014
+
+1 Security vulnerability question, but not a vulnerability report
+4 Phishing/spam/proxy/attacks point to site "powered by Apache"
+5 Vulnerability reports to security@apache.org
+       1 [cordova]
+       1 [directory]
+       1 [roller]
+       1 [archiva]
+       1 [shiro]
+10 Vulnerability reports to projects own security lists
+       2 [tomcat]
+       2 [camel]
+       2 [struts]
+       1 [cloudstack]
+       2 [aoo]
+       1 [hadoop]
+
+-----------------------------------------
+Attachment A: Report from the Apache Abdera Project  [Ant Elder]
+
+
+-----------------------------------------
+Attachment B: Report from the Apache Ambari Project  [Yusaku Sako]
+
+Apache Ambari simplifies provisioning, managing, and monitoring of Apache
+Hadoop clusters.
+Since the last report in Jan 2013, Ambari released 1.4.3 which included
+resolution of 238 JIRAs.
+
+Mailing Lists:
+  * user@ambari.apache.org: 201 subscribers (+6 since last report)
+  * dev@ambari.apache.org: 126 subscribers (-1 since last report)
+
+Releases:
+  * 2014-01-21  1.4.3
+  * 2014-01-03  1.4.2
+  * 2013-10-21  1.4.1
+  * 1.4.4 release vote underway
+
+Committers:
+  * 2013-12-23  Added Jeff Sposetti
+
+PMC:
+  * 2013-11-20  Added 37 initial PMC members upon establishing TLP
+
+Issues:
+  * There are no board-level issues at this time.
+
+-----------------------------------------
+Attachment C: Report from the Apache Ant Project  [Conor MacNeill]
+
+Apache Ant is a Java based build tool along with associated tools. It
+consists of 4 main projects:
+
+   - Ant core and libraries (Antlibs)
+   - Ivy - Ant based dependency manager
+   - IvyDE - Eclipse plugin to integrate Ivy into Eclipse
+   - EasyAnt - Ant and Ivy toolbox to support build processes
+
+o Release Status
+
+Core
+---------
+Ant 1.9.3 was released on December 29, 2013
+
+Ant Compress Antlib 1.4 was released on January 29th 2014
+
+Ivy
+-------
+Ivy 2.3.0 was released on January 21, 2013
+Ivy-DE 2.2.0 was released on November 22, 2013
+
+A release candidate has been proposed for Ivy 2.4.0 but is not yet available.
+
+EasyAnt
+-------------
+The current release is still from the Incubator
+0.9-Incubating.
+
+o Committers and PMC
+
+Jean-Louis Boudart was added to the PMC on Dec 6th, 2013
+
+Charles Duffy was made a committer on Dec 8th, 2013.
+
+o Community
+
+No issues.
+
+-----------------------------------------
+Attachment D: Report from the Apache Buildr Project  [Alex Boisvert]
+
+
+-----------------------------------------
+Attachment E: Report from the Apache Cassandra Project  [Jonathan Ellis]
+
+Cassandra is a distributed database providing massive scalability,
+high performance, and high availability.
+
+Releases:
+
+2.0.3  25 Nov 13
+1.2.12 25 Nov 13
+1.2.13 20 Dec 13
+2.0.4  30 Dec 13
+1.2.14  3 Feb 14
+
+Development:
+
+Work on 2.1 continues.  User-defined types [1] and collection indexing [2]
+are complete, and internal optimization is ongoing: we have added a persistent,
+atomic b-tree that saves 60% heap space compared to SnapTreeMap [3].
+
+Community:
+
+The January 2014 Cassandra Summit Japan [4] [5] saw about 100 attendees, a small
+increase over December 2012.  About 2/3 of the audience were running Cassandra
+in production.  There was widespread agreement that the English language
+is the largest barrier to Cassandra use in Japan, and growth will not take off
+until Japanese documentation is available.
+
+Mikhail Stepura was added as committer 16 Jan 2014.
+
+[1] https://issues.apache.org/jira/browse/CASSANDRA-5590
+[2] https://issues.apache.org/jira/browse/CASSANDRA-4511
+[3] https://git-wip-us.apache.org/repos/asf?p=cassandra.git;a=tree;f=src/java/org/apache/cassandra/utils/btree;h=20bf514a69d2ba368adea16388670b7b2ee257bf;hb=HEAD
+[4] http://b-rabbit.jp/cassandra/cstk2014/
+[5] http://d.hatena.ne.jp/oranie/20140127/1390798275
+
+
+-----------------------------------------
+Attachment F: Report from the Apache Clerezza Project  [Hasan Hasan]
+
+DESCRIPTION
+Apache Clerezza is an OSGi-based modular application and a set of components 
+(bundles) for building RESTful Semantic Web applications and services.
+
+ISSUES FOR THE BOARD
+There are no issues requiring board attention at this time.
+
+RELEASE
+Latest release (partial-release-20130710) was created on 10.07.2013
+
+ACTIVITY
+Various improvements and bug fixes in source codes including:
+
+- Storage Provider:
+  - Integration of Virtuoso: improved bnode handling, improved handling of 
+    very long literals and literals with non-ascii characters
+- SPARQL
+  - Bug fix of SPARQL PreParser
+  - Improved SPARQL engine by acquiring read locks to prevent Concurrent 
+    Modification Exception
+  - Replaced deprecated TcManager method for SPARQL queries
+- Improved error reporting in processing InfoDiscobit
+- Improved graph management (added delete graph functionality)
+- New editor to fix webpage, support graph assert/revoke in various 
+  serializations in editor backend
+- Improved JenaSerializerProvider to get a readlock before serializing graphs
+- Fixed encoding issue with SRenderlets/XmlResult
+- Continue creation of various Karaf features and Sling Launcher 
+  PartialBundleLists to ease usage of Clerezza functionalities in other projects
+
+COMMUNITY
+Latest change was addition of a new committer and PMC member on 16.08.2013
+
+INFRASTRUCTURE
+- Source codes have been migrated to Git
+- Jenkins configuration fixed
+- Webpages require update. Minor update to the download section as requested by
+  sebb@apache.org has been made (removing link to snapshot version)
+
+-----------------------------------------
+Attachment G: Report from the Apache Click Project  [Malcolm Edgar]
+
+
+-----------------------------------------
+Attachment H: Report from the Apache Cocoon Project  [Thorsten Scherler]
+
+Apache Cocoon 3 is a major rewrite of Cocoon 2.2. Like Cocoon 2 it
+is based around the concept of pipelines and sitemaps and it is
+very similar to Cocoon 2.2 in many respects but is slimmed down and
+designed to be easily used with Java code (= no frameworks required!).
+On top of this, Cocoon 3 has the goal of becoming the best available
+platform for RESTful webservices and web applications.
+
+Issues needing board attention:
+ None.
+
+Changes in the PMC membership:
+ None.
+ Last modified: 2012/10/21 (change of PMC chair)
+
+Community
+
+Traffic on users and devs list continues be light. Some users asked about
+different issues in the different versions of cocoon. Various devs attended
+the questions and provided solutions. David Crossley pointed out that I was
+not subscribed to the board mailing which I fixed. Further I updated
+irs-disclosures.txt to my best knowledge however Simone had not been in this
+doc so I used a approx. date.
+
+Releases
+
+2.1 has been released on 2013/03/20.
+
+
+Development
+None
+
+
+Security issues reported:
+ None.
+
+Progress of the project:
+
+ We need to release a new version of cocoon 3 and cocoon 2.2 but still no
+committer has stepped up yet to do so.
+
+
+-----------------------------------------
+Attachment I: Report from the Apache Community Development Project  [Luciano Resende]
+
+
+-----------------------------------------
+Attachment J: Report from the Apache Continuum Project  [Brent Atkinson]
+
+
+-----------------------------------------
+Attachment K: Report from the Apache CouchDB Project  [Jan Lehnardt]
+
+Apache CouchDB is a database that uses JSON for documents, JavaScript for
+MapReduce queries, and regular HTTP for an API.
+
+Releases
+
+  No releases in this time period.
+
+  Release has been blocked on a number of issues, but is actively being
+  worked on.
+
+
+Recent Activity
+
+ - Number of the core devs met in Vienna to discuss the pending merges.
+ - Finalising the merge of Benoit Chesneau’s rcouch fork.
+ - Working on the BigCouch merge from Cloudant.
+ - Created a replication list to discuss specific replication topics.
+ - New marketing list about to be created for new marketing team.
+ - Confluence wiki set up, and migration being planned.
+ - Review Board instance set up, and discussion about review ongoing.
+ - Translation work going well.
+ - Community-provided packages added for Ubuntu Precise and upcoming
+   Trusty release.
+ - Community
+
+
+Including the following additions, CouchDB has 31 committers and
+9 PMC members.
+
+New committers:
+
+  Nick North
+
+No new PMC members. Most recent PMC addition Nov 9th, 2012.
+
+
+Mailing list stats:
+
+announce
+ - 151 subscribers (+20)
+ - 1 message since May (-1)
+
+user
+ - 1405 subscribers (-26)
+ - 1086 messages since May (+280)
+
+erlang
+ - 154 subscribers (+8)
+ - 14 messages since May (-8)
+
+dev
+ - 602 subscribers (-4)
+ - 1977 messages since May (+1097)
+
+commits
+ - 104 subscribers (-1)
+ - 2735 messages since May (+1694)
+
+l10n
+ - 31 subscribers (+10)
+ - 207 messages since May (+104)
+
+replication
+ - 47 subscribers
+ - 35 messages since May
+
+
+Issues
+
+None.
+
+
+-----------------------------------------
+Attachment L: Report from the Apache Creadur Project  [Robert Burrell Donkin]
+
+
+-----------------------------------------
+Attachment M: Report from the Apache DeltaSpike Project  [Mark Struberg]
+
+
+
+Apache DeltaSpike is a portable JSR-299 CDI
+(Contexts and Dependency Injection for Java) Extension library
+which contains lots of useful tools and helpers
+which are missing in the CDI core spec.
+
+DeltaSpike is not a CDI-container itself, but a portable
+Extension library which can run on all CDI-containers!
+
+DeltaSpike is tested and runs on many Java EE Servers 
+like Apache TomEE, Red Hat JBoss Application Server, 
+JBoss Wildfly, Oracle WebLogic, Oracle Glassfish, IBM WebSphere, and also
+on simple Servlet containers like Apache Tomcat or Jetty in combination
+with either JBoss Weld or Apache OpenWebBeans.
+
+Project Status:
+Bugfixing goes on in the current code base.
+Community is stable and active.
+Gerhard Petracek will present DeltaSpike on the JavaLand conference.
+
+Releases:
+last release: deltaspike-0.5 on 2013-09-11.
+
+As the JSF-integration module is now pretty much production 
+ready we will probably ship 1.0 pretty soon.
+
+Community:
+Last Committer: Thomas Andraschko (tandraschko) on 2013-12-14
+Mailing list activity was high and we had many different committers
+contributing to our jsf module improvements.
+
+Issues:
+There are no issues requiring board attention at this time.
+
+
+-----------------------------------------
+Attachment N: Report from the Apache DirectMemory Project  [Raffaele P. Guidi]
+
+
+-----------------------------------------
+Attachment O: Report from the Apache Empire-db Project  [Francis De Brabandere]
+
+Apache Empire-db is a relational database abstraction layer that allows
+developers to take a more SQL-centric approach in application
+development than traditional ORM frameworks. Its focus is to allow
+highly efficient database operations in combination with a maximum of
+compile-time-safety and DBMS independence.
+
+Progress of the project
+
+The last three months have been quite calm, nothing specific to mention.
+
+Changes in committers or PMC members
+
+There have been no changes in committers or PMC members during the last 
+months.
+
+Issues
+
+There are no issues that require the board's attention at this time.
+
+Releases
+
+NONE
+
+-----------------------------------------
+Attachment P: Report from the Apache Etch Project  [Martin Veith]
+
+Apache Etch is a cross-platform, language- and transport-independent
+RPC-like framework for building and consuming network services.
+
+BOARD ISSUES 
+There are no Board-level issues at this time. 
+
+RELEASES 
+* Apache Etch 1.3.0 was released on September 26, 2013. 
+
+ACTIVITY 
+* We have had some users on the lists but activity on the mailing list
+  is still rather low.
+* We got some patches for the cpp-binding from external contributors which have
+  been merged.
+
+COMMITTERS OR PMC MEMBERS CHANGE 
+* No changes regarding PMC or committers composition since graduation 
+  in January 2013. 
+* Our committer and user base is still quite small. We were able to get
+  exactly three PMC votes for the last release.
+
+
+-----------------------------------------
+Attachment Q: Report from the Apache Flume Project  [Arvind Prabhakar]
+
+DESCRIPTION
+
+Apache Flume is a distributed, reliable, and available system for
+efficiently collecting, aggregating, and moving large amounts of log
+data to scalable data storage systems such as Apache Hadoop's HDFS.
+
+RELEASES
+* The last release of Flume was version 1.4.0, released on July
+2, 2013.
+* Discussions around the next release are currently underway.
+
+CURRENT ACTIVITY
+* Development activity continues with steady stream of issues being
+logged and resolved.
+* A total of 76 issues have been filed, and 37 issues have been
+resolved between the period starting November 2, 2013 and January 29,
+2014.
+* Approximately 1135 messages were exchanged on the dev list in the
+past three months, while a total of 289 were exchanged on the user
+list in this period.
+
+COMMUNITY
+* Wolfgang Hoschek and Roshan Naik were added as committers to the
+project on September 24, 2013.
+* No new additions were made to the PMC on the project since it
+graduated from Incubator.
+* Currently there are:
+- Total of 226 subscribers to the developer list
+- Total of 523 subscribers to the user list
+- Total of 24 committers
+- Total of 20 PMC members
+
+ISSUES
+* There are no issues requiring board attention at this time.
+
+-----------------------------------------
+Attachment R: Report from the Apache Forrest Project  [David Crossley]
+
+Apache Forrest mission is software for generation of aggregated multi-channel
+documentation maintaining a separation of content and presentation.
+
+Issues needing board attention:
+  None.
+
+Changes in the PMC membership:
+  None.
+  Last modified: 2013-04-08
+  Most recent addition: 2009-06-09
+
+New committers:
+  None.
+  Most recent addition: 2009-06-09
+
+General status:
+  The most recent release is 0.9 on 2011-02-07.
+
+  No activity on the user mail list.
+
+  The only activity on the dev mail list was me doing a few issue tracker
+  comments to show people some easy things that they could do to help the
+  project to move forward.
+
+  We received a request from a maintainer endeavouring to enable the Homebrew
+  package manager to handle Forrest, beyond their current workaround. I did
+  explain to our project what needs to happen. There has been no response.
+
+  The project was asked to review our situation regarding the recently
+  revised branding guidelines. No-one commented that they have done so.
+
+  At this quarter, eight PMC members responded to my draft report. This
+  confirms that there are sufficient people hanging around for us to
+  potentially be able to make a decision or encourage new contributors.
+
+  The draft report did re-start a small discussion on private@ list about the
+  state of the project. People were reminded about the outcome of the last
+  time that this arose, i.e. it is okay for the project to be quiet, as long
+  as it is still able to make decisions. People were asked to make effort on
+  the dev mail list, and to assist with project tasks, and reminded about the
+  need for a release.
+
+Security issues reported:
+  None.
+
+Progress of the project:
+  Enabled per-project configuration of Cocoon error handling.
+
+  Updated our JSch supporting product.
+
+
+-----------------------------------------
+Attachment S: Report from the Apache Giraph Project  [Avery Ching]
+
+
+-----------------------------------------
+Attachment T: Report from the Apache Gora Project  [Lewis John McGibbney]
+
+The Apache Gora open source framework provides an in-memory data model and
+persistence for big data. Gora supports persisting to column stores, key
+value stores, document stores and RDBMSs, and analyzing the data with
+extensive Apache Hadoop MapReduce support.
+
+Project Releases
+
+The last release of Gora (0.3) was on 8th May 2013.
+
+Overall Project Activity since last report
+
+Project activity has been good. We've received a number of 
+contributions from non-pmc/committers which is really positive.
+Work is ongoing on GORA_94 a branch of the trunk code which 
+focuses on a long-overdue upgrade of our legacy Avro 
+dependencies from 1.3.3 to 1.7.X. As this is a major
+undertaking therefore once this is addressed we will 
+be pushing a release candidate for 0.4.
+
+When were the last committers or PMC members elected?
+
+Apostolos Giannakidis as PMC member and committer
+on 2014-01-17 (yyy-mm-dd). 
+
+How has the community developed since the last report?
+
+Shadowing overall project activity the community mailing
+lists and Jira have seen contributions from new faces
+and new names.
+This is very positive for the project showing that 
+people are not only using Gora but are keen to engage in
+development.
+Mailing list numbers are as follows
+user@:    from 49 --> 57
+dev@:     from 60 --> 64
+commits@  from NA --> 26
+
+Changes to PMC & Committers
+
+Apostolos Giannakidis joined as PMC member and committer
+on 2014-01-17 (yyy-mm-dd). Apostolos is the second GSoC
+student who has been VOTE'd by the Gora PMC to join our 
+ranks. Sebb kept us on our toes during the board@ 
+72hr NOTICE period so thank you to him for that.
+
+PMC and Committer diversity
+
+We currently have committers from a wide variety of Apache projects
+including, Nutch, Tika, OODT, Camel, Solr, Accumulo, Whirr, Hadoop,
+Any23 & HBase (this is not an exhaustive list).
+
+
+-----------------------------------------
+Attachment U: Report from the Apache Hama Project  [Edward J. Yoon]
+
+Apache Hama is a BSP (Bulk Synchronous Parallel) computing framework
+on top of HDFS (Hadoop Distributed File System) for massive scientific
+computations such as matrix, graph and network algorithms.
+
+Releases
+
+The last release of Hama (0.6.3) was on 11th October 2013.
+
+Overall Project Activity since last report
+
+Traffic on the lists is stable, and we're continuously receiving
+contributions and questions from new users and committers. Developers
+are working on scalability issues.
+
+When were the last committers or PMC members elected?
+
+The last PMC addition: Aug 4, 2013
+The last committer addition: Sep 9, 2013
+
+How has the community developed since the last report?
+
+No significant difference since the last report.
+
+dev@ subscribers: from 94 -> 97 (+3 since last report)
+user@ subscribers: from 173 -> 176 (+3 since last report)
+
+
+-----------------------------------------
+Attachment V: Report from the Apache Helix Project  [Kishore Gopalakrishna]
+
+Apache Helix is a generic cluster management framework used to build
+distributed systems and provides automatic partition management, fault
+tolerance and elasticity.
+
+Development
+===========
+
+Fixed minor bugs and added new features.
+- Initial provisioning work to integrate with Resource managers like YARN and
+  Mesos
+- Controller pipeline performance improvements.
+- Task framework for tasks associated with resources
+- Design and initial code for monitoring with Helix
+- Atomic API to support admin operations like cluster creation etc.
+- 150 new JIRAS since last report.
+- 220 issues resolved.
+
+- Redesigned website. Added version specific docs.
+- Completed most of the work related to graduation
+
+Community
+=========
+- 550+ emails on the dev list
+- 100+ emails on the user list
+
+Releases
+=========
+
+- Released 0.6.2 with critical bug fixes and security patches. [Stable]
+- Released 0.7.0 with new high level api. [Alpha]
+- Plan to release 0.7.x stable version.
+
+
+-----------------------------------------
+Attachment W: Report from the Apache HTTP Server Project  [Eric Covener]
+
+Project Description
+===================
+The Apache HTTP Server Project is an effort to develop and maintain an
+open-source HTTP server for modern operating systems.
+
+Issues for the Board
+====================
+There are no outstanding issues that require the board's attention.
+
+Releases
+========
+We've had one maintenance release of each in-service stream
+since the last reporting period:
+
+* 2.2.26 was released Nov 18, 2013
+* 2.4.7 was released Nov 25, 2013
+
+Bug reports
+===========
+185 bugs had activity, 81 new, 90 resolved.
+
+Community
+=====================
+Yann Ylavic and Mike Mrumph were accepted as
+new committers.
+
+IRC and mailing list activity is steady.
+
+Development activity is relatively low.  There has been a
+hint of interest in SPDY and HTTP/2.0 and how we could
+adjust our architecture.
+
+A few interesting netcraft posts came out in this period,
+but not much community discussion on them yet.
+
+
+-----------------------------------------
+Attachment X: Report from the Apache HttpComponents Project  [Asankha Perera]
+
+The Apache HttpComponents project is responsible for creating and 
+maintaining a toolset of low level Java components focused on HTTP 
+and associated protocols.
+
+Status
+- Overall the project remains active.
+
+Releases
+- HttpComponents 4.3.1 GA was released on the 28th of December 2013
+- HttpClient 4.3.2 GA was released on the 21st of January 2014
+
+Community
+- Gary Gregory <ggregory at apache.org> was voted into the PMC on the 
+  27th of Jan 2014.
+
+- The community remains small but active, but has good user 
+  interaction on the mailing lists 
+
+
+-----------------------------------------
+Attachment Y: Report from the Apache Incubator Project  [Marvin Humphrey]
+
+The Apache Incubator is the entry path into the ASF for projects and
+codebases wishing to become part of the Foundation's efforts.
+
+There are 36 podlings currently under incubation.
+
+* Community
+
+  New IPMC members:
+
+    Suresh Srinivas
+    Carl Steinbach
+
+  People who left the IPMC:
+
+    Dennis Lundberg
+
+* New Podlings
+
+    (None)
+
+* Graduations
+
+  The board has motions for the following:
+
+    Open Climate Workbench
+
+  At time of writing, graduation votes were underway for the following:
+
+    Knox
+    Spark
+
+* Releases
+
+  The following releases were made since the last Incubator report:
+
+    Jan 21 Apache Metamodel 4.0.0-incubating
+
+  It took 9 days for the third IPMC vote to arrive.
+
+    Release                             RC VOTE start  Third IMPC +1   Days
+    -----------------------------------------------------------------------
+    Apache Metamodel 4.0.0-incubating   Dec 12         Dec 21      9
+
+* IP Clearance
+
+  * Salesforce donated the code for Phoenix, an open source SQL query engine
+    for Apache HBase, a NoSQL data store. It is accessed as a JDBC driver
+    and enables querying and managing HBase tables using SQL. 
+
+* Miscellaneous
+
+  * The issue of how best to integrate with GitHub is a recurring topic of
+    discussion.  Infra added a new feature -- forwarding of comments on pull
+    requests to dev lists -- which was well received.  However, as GitHub's
+    interface is an external commercial service rather than something we run
+    on our own hardware, it is difficult to ensure that communications
+    will be archived, requiring additional vigilance from PMCs.
+
+  * A proposal for Hoya, an application to deploy and manage existing
+    distributed applications in a YARN cluster, was discussed at length but
+    has not yet been voted on.
+
+-------------------- Summary of podling reports --------------------
+
+* Still getting started at the Incubator
+
+    DataFu
+
+* Not yet ready to graduate
+
+  No release:
+
+    Hadoop Development Tools
+    log4cxx2
+    Phoenix
+    Usergrid
+
+  Community growth:
+
+    Blur
+    Tez
+    Twill
+
+  Low activity:
+
+    Droids
+
+* Ready to graduate
+
+    Open Climate Workbench
+    Knox
+
+* Did not report, expected next month
+
+    BatchEE
+    DeviceMap
+    NPanday
+    Sirona
+
+----------------------------------------------------------------------
+                       Table of Contents
+Blur
+DataFu
+DeviceMap
+Droids
+Hadoop Development Tools
+Knox
+log4cxx2
+Open Climate Workbench
+Phoenix
+Tez
+Twill
+Usergrid
+
+----------------------------------------------------------------------
+
+--------------------
+
+Blur
+
+Blur is a search platform capable of searching massive amounts of data
+in a cloud computing environment.
+
+Blur has been incubating since 2012-07-24.
+
+Three most important issues to address in the move towards graduation:
+
+  1. We received the Trademark assign document from trademarks@ and are
+     pursuing getting it signed by Near Infinity.
+  2. Another Release
+  3. Another Release
+
+Any issues that the Incubator PMC (IPMC) or ASF Board wish/need to be
+aware of?
+
+  No.
+
+How has the community developed since the last report?
+
+  We continue to be small but active.
+  - Subscriptions: user@ - 54[+3]; dev@ - 61[+1]
+
+How has the project developed since the last report?
+
+  The majority of effort has been around bug fixes that were
+  needed.  The code is now solid and tested at scale now so we anticipate a
+  bug fix release soon.
+
+Date of last release:
+
+  2013-10-09
+
+When were the last committers or PMC members elected?
+
+  2013-08-30
+
+Signed-off-by:
+
+  [ ](blur) Doug Cutting
+  [X](blur) Patrick Hunt
+  [X](blur) Tim Williams
+
+--------------------
+DataFu
+
+DataFu provides a collection of Hadoop MapReduce jobs and functions in
+higher level languages based on it to perform data analysis. It provides
+functions for common statistics tasks (e.g. quantiles, sampling), PageRank,
+stream sessionization, and set and bag operations. DataFu also provides
+Hadoop jobs for incremental data processing in MapReduce.
+
+DataFu has been incubating since 2014-01-05.
+
+Three most important issues to address in the move towards graduation:
+
+  1. Building ASF community
+  2. Release
+  3. Remaining incubator paperwork
+
+Any issues that the Incubator PMC (IPMC) or ASF Board wish/need to be
+aware of?
+
+  None.
+
+How has the community developed since the last report?
+
+  Since initial incubation, have received contributions from two new
+  contributors.
+
+How has the project developed since the last report?
+
+  First report.  Have obtained all the necessary infra (git/jira/wiki,etc).
+  Thirty JIRAs have been opened, 14 have been closed.  Active discussion on
+  mailing list as to community development, etc.
+
+Date of last release:
+
+  None. First month of incubation.
+
+When were the last committers or PMC members elected?
+
+  None. First month of incubation.
+
+Signed-off-by:
+
+  [ ](datafu) Ashutosh Chauhan
+  [X](datafu) Roman Shaposhnik
+  [ ](datafu) Ted Dunning
+
+Shepherd/Mentor notes:
+
+  Dave Fisher (wave):
+
+    New community to the incubator just getting started. Good guidance from
+    Mentors. Needs Apache trademark attribution on site. Should have links
+    to Mailing lists on the site.
+
+--------------------
+DeviceMap
+
+Shepherd/Mentor notes:
+
+  Marvin Humphrey (marvin):
+
+    A draft report was posted to the DeviceMap mailing list on Friday
+    February 7th for review, but it was never added to the official report.
+
+--------------------
+Droids
+
+Droids aims to be an intelligent standalone robot framework that allows to
+create and extend existing droids (robots).
+
+Droids has been incubating since 2008-10-09.
+
+Three most important issues to address in the move towards graduation:
+
+  1. Activity
+
+Any issues that the Incubator PMC (IPMC) or ASF Board wish/need to be
+aware of?
+
+  None, beside the real low traffic on mailing list and source code commits.
+
+How has the community developed since the last report?
+
+  No changes to community.
+
+How has the project developed since the last report?
+
+  The project has been very quiet / dormant for the past half year.
+
+Date of last release:
+
+  2012-10-15
+
+When were the last committers or PMC members elected?
+
+  2012-05-07
+
+Signed-off-by:
+
+  [X](droids) Thorsten Scherler
+  [X](droids) Richard Frovarp
+
+Shepherd/Mentor notes:
+
+  John Ament (johndament):
+
+    Droids is a long standing podling, with a robust code base but without
+    much need for frequent releases.  I think graduating into an existing
+    TLP (not their own TLP) would be a good resolution, it helps avoid some
+    of the over head of many binding votes to carry on while still
+    maintaining an area to work in.  The people working on droids were fast
+    to respond and give feedback on what's happening, but like is mentioned
+    the list is not very active (in the past 6 months, the main
+    conversations going on were around status of the project).
+
+--------------------
+Hadoop Development Tools
+
+Eclipse based tools for developing applications on the Hadoop platform
+
+Hadoop Development Tools has been incubating since 2012-11-09.
+
+  1. we have to finish the release of version 0.0.1, the main issue being
+     resolving source and binary license and notice files.
+  2. we have to define and implement an effective approach to manage the
+     "client connections" to multiple clusters.
+  3. Build Community
+
+Any issues that the Incubator PMC (IPMC) or ASF Board wish/need to be
+aware of?
+
+ - None
+
+How has the community developed since the last report?
+
+ - Srimanth Gunturi joined as committer and PPMC member
+
+How has the project developed since the last report?
+
+ - Two additional 0.0.1 release candidates as we worked through issues
+ - Jenkins job setup
+
+Date of last release:
+
+ - None
+
+When were the last committers or PMC members elected?
+
+ - November 2013
+
+Signed-off-by:
+
+  [ ](hadoopdevelopmenttools) Suresh Marru
+  [ ](hadoopdevelopmenttools) Chris Mattmann
+  [X](hadoopdevelopmenttools) Roman Shaposhnik
+
+Shepherd/Mentor notes:
+
+  Dave Fisher (wave):
+
+    I don't see any on dev list activity since their release in November was
+    held up due to dependency issues and LICENSE issues.
+
+    Are these guys talking somewhere else?
+
+--------------------
+Knox
+
+Knox Gateway is a system that provides a single point of secure access for
+Apache Hadoop clusters.
+
+Knox has been incubating since 2013-02-22.
+
+Three most important issues to address in the move towards graduation:
+
+  1. Expand community to include more diverse committers.
+  2. Review and complete all graduation readiness items.
+  3. Begin the process!
+
+Any issues that the Incubator PMC (IPMC) or ASF Board wish/need to be aware
+of?
+
+  1. None
+
+How has the community developed since the last report?
+
+  1. Two new committers added.
+  2. More user questions on user list trickling in.
+
+How has the project developed since the last report?
+
+  1. Internally agreed to being graduation processes.
+  2. Working toward a 0.4.0 release.
+  3. A few IP issues found and resolved.
+  4. Resolved 142(+42) of 242(+52) total issues currently in JIRA.
+
+Date of last release:
+
+  0.3.0: 2013-10-13
+
+When were the last committers or PMC members elected?
+
+  2013-12-19: Added Vladimir Tkhir as new committer
+  2013-12-19: Added Maksim Kononenko as new committer
+
+Signed-off-by:
+
+  [ ](knox) Owen O'Malley
+  [X](knox) Chris Douglas
+  [ ](knox) Mahadev Konar
+  [X](knox) Alan Gates
+  [ ](knox) Devaraj Das
+  [ ](knox) Chris Mattmann
+  [X](knox) Tom White
+
+--------------------
+log4cxx2
+
+Logging for C++
+
+log4cxx2 has been incubating since 2013-12-09.
+
+Three most important issues to address in the move towards graduation:
+
+  1. We probably need to decide what's an acceptable platform/compiler
+     list, sort out any remaining hiccups, and then move towards a
+     release.
+  2. We need to publish the project site with updated content to
+     reflect the new status and fix documentation bugs.
+  3. We need to make a broader use of the ASF infrastructure
+     (notably the CI, as well as improved management of the Jira
+     site - notably with triaging), and establish a roadmap for
+     the next releases.
+
+Any issues that the Incubator PMC (IPMC) or ASF Board wish/need to be
+aware of?
+
+  We are stuck on INFRA-7209 and how to properly publish the project
+  site.
+
+How has the community developed since the last report?
+
+  The committers are still getting acquainted with each other and the
+  foundation. There have been some discussions about how to develop
+  within the team of committers already, like using a CI, how
+  to deal with issues regarding a changelog, which fixes should be
+  covered by our first incubation release etc.
+  Moderation of the list seems to work, there were some support
+  requests which were answered and problems introduced by commits on
+  trunk discussed.
+
+How has the project developed since the last report?
+
+  Some known bugs were fixed already and available patches applied,
+  which is work in progress for the new release. It has been suggested
+  to schedule most of the remaining available patches for an upcoming
+  release of 0.11.0 to include as much content which has been provided
+  over the years as possible.
+
+Date of last release:
+
+  2008-04-03 was the official, pre-incubation 0.10.0
+
+  Many post-0.10.0 commits exist on trunk which we intend to get out
+  as 0.11.x.
+
+When were the last committers or PMC members elected?
+
+  N/A
+
+Signed-off-by:
+
+  [X](log4cxx2) Christian Grobmeier
+  [ ](log4cxx2) Scott Deboy
+
+--------------------
+Open Climate Workbench
+
+Shepherd/Mentor notes:
+
+  Justin Mclean (jmclean):
+
+    Report not submitted. Project is up for graduation at board meeting.
+
+--------------------
+Phoenix
+
+Phoenix is an open source SQL query engine for Apache HBase, a NoSQL data
+store.  It is accessed as a JDBC driver and enables querying and managing
+HBase tables using SQL.
+
+Phoenix has been incubating since 12/11/2013.
+
+Three most important issues to address in the move towards graduation:
+
+  1) Perform initial release out of apache incubator followed up quickly
+     by two new releases
+  2) Make our customers successful and prove value of Phoenix+HBase over
+     other alternatives
+  3) Attract new committers to the project
+
+Any issues that the Incubator PMC (IPMC) or ASF Board wish/need to be
+aware of?
+
+The below is informational for the IPMC (no need to forward the board):
+
+  We've been waiting for our Github issues to be imported into our Apache
+  JIRA but it is taking a while. We're considering doing the import
+  ourselves, as we're starting to see duplicate JIRAs and continue to have
+  to point users back to our old Github issues.
+  [[https://issues.apache.org/jira/browse/INFRA-7179|INFRA-7179]]
+
+How has the community developed since the last report?
+
+We've cut over from our former Github-based open source project to
+our new Apache home and dev and user lists are busy.
+
+No new committers.
+
+How has the project developed since the last report?
+
+ * Apache Brand Management has ok'd our name of Apache Phoenix [1]
+ * IP Clearance is nearly complete: software grant has been
+   submitted and acknowledged. Vote is underway and will close
+   on 2/8.  IP-CLEARANCE note has been posted on general.
+ * Reviewing proposed release on dev list and if all looks good,
+   will start a vote for our first release next week.
+ * Working in parallel toward a new 3.0.0 release as well.
+
+Date of last release:
+
+ No release yet.
+
+When were the last committers or PMC members elected?
+
+ No new committers or PMC members.
+
+
+1. https://issues.apache.org/jira/browse/PODLINGNAMESEARCH-44?filter=-2
+
+Signed-off-by:
+
+  [x](phoenix) Lars Hofhansl
+  [X](phoenix) Andrew Purtell
+  [X](phoenix) Devaraj Das
+  [ ](phoenix) Enis Soztutar
+  [X](phoenix) Steven Noels
+
+--------------------
+Tez
+
+Tez is an effort to develop a generic application framework which can be
+used to process arbitrarily complex data-processing tasks and also a
+re-usable set of data-processing primitives which can be used by other
+projects.
+
+Tez has been incubating since 2013-02-24.
+
+Three most important issues to address in the move towards graduation:
+
+  1. Growing the community
+  2.
+  3.
+
+Any issues that the Incubator PMC (IPMC) or ASF Board wish/need to be
+aware of?
+
+  None at this time.
+
+How has the community developed since the last report?
+
+  No new PPMC members or committers added since the last report. We have had
+  interest from both new users and contributors via mailing lists and JIRA.
+  The Hive project recently merged its native support for Tez into their
+  trunk branch. The Pig community is also working on integrating  Tez and we
+  have seen various JIRAs filed as well as some patches from Pig developers.
+
+How has the project developed since the last report?
+
+  Since the first week of November, 2013 (last report), we have had around
+  180+ jiras filed and 130+ jiras resolved. We made the first release of Tez
+  ( version 0.2.0 ) in the first week of December, 2013. There is currently
+  ongoing work to make Tez work on a secure Hadoop cluster, after which we
+  plan to do a 0.3.0 release.
+
+Date of last release:
+
+  2013-12-03
+
+When were the last committers or PMC members elected?
+
+  At project incubation. No new PPMC members or committers added since the
+  last report.
+
+Signed-off-by:
+
+  [ ](tez) Alan Gates
+  [ ](tez) Arun Murthy
+  [X](tez) Chris Douglas
+  [ ](tez) Chris Mattmann
+  [x](tez) Jakob Homan
+  [ ](tez) Owen O'Malley
+
+--------------------
+Twill
+
+Twill is an abstraction over Apache Hadoop® YARN to reduce the complexity of
+developing distributed applications.
+
+Twill has been incubating since 2013-11-14.
+
+Top three items to resolve before graduation:
+
+  - More committers from different organizations.
+  - Regular Releases.
+  - Increase adoption.
+
+Any issues that the Incubator PMC (IPMC) or ASF Board wish/need to be
+aware of?
+
+  - None at this time.
+
+How has the community developed since the last report?
+
+  - Activity on the dev list up from 141 messages in December to 173
+    in January.
+  - Subscribers to the dev list up from 24 to 31.
+  - One new contributor in January.
+
+How has the project developed since the last report?
+
+  - IP clearance was completed.
+  - Web site is up and running.
+  - First release is currently under vote on the incubator list.
+
+Date of last release:
+
+  - First release is under vote and expected to happen 2/6/14.
+
+What are the plans for the next period?
+  - Establish a cadence of monthly releases
+  - Engage more members of the community to contribute actively
+  - Improve documentation and website
+
+When were the last committers or PMC members elected?
+
+  - No new committers since incubation.
+
+Signed-off-by:
+
+  [ ](twill) Vinod K
+  [ ](twill) Arun C Murthy
+  [X](twill) Tom White
+  [X](twill) Patrick Hunt
+  [ ](twill) Andrei Savu
+
+Shepherd/Mentor notes:
+
+  Roman Shaposhnik (rvs):
+
+    A brand new community off to a good start
+
+--------------------
+Usergrid
+
+Usergrid is an open-source Backend-as-a-Service (“BaaS” or “mBaaS”) composed
+of an integrated distributed NoSQL database, application layer and client
+tier with SDKs for developers looking to rapidly build web and/or mobile
+applications.
+
+Usergrid has been incubating since 2013-10-03.
+
+Three most important issues to address in the move towards graduation:
+
+  1. Learning the Apache Way
+  2. Growing a diverse community
+  3. Getting project infrastructure and codebase setup at Apache
+
+Any issues that the Incubator PMC (IPMC) or ASF Board wish/need to be
+aware of?
+
+  - None at this time
+
+How has the community developed since the last report?
+
+  - A couple of new names have appeared on dev@usergrid which is positive.
+
+How has the project developed since the last report?
+
+  - Have imported JIRA issues from pre-Apache project JIRA
+  - Work is continuing on a new "Core Persistence" module
+  - Almost done with Java package renaming to org.apache.usergrid
+
+Date of last release:
+
+  - No releases yet.
+
+When were the last committers or PMC members elected?
+
+  - Alex Karasulu, January 13, 2014
+
+Signed-off-by:
+
+  [ ] (snoopdave) Dave Johnson
+  [X] (jfarrell) Jake Farrell
+  [X] (jim) Jim Jagielski
+  [X] (lewismc) Lewis John Mcgibbney
+  [ ] (lresende) Luciano Resende
+
+
+-----------------------------------------
+Attachment Z: Report from the Apache jclouds Project  [Andrew Bayer]
+
+A cloud agnostic library that enables developers to access a variety of
+supported cloud providers using one API.
+
+Project Status
+--------------
+
+jclouds was confirmed as a TLP in October 2013 and has carried out two
+successful releases (1.6.3 and 1.7.0) since then. The developer and user
+community is active, with a sustained number of improvements being contributed
+by users. The PMC has recently discussed how to encourage some of these users
+to become committers and is actively reaching out to grow the committer base.
+
+Community
+---------
+
+''When was the last committer voted in?''
+
+2013-08-08 (Zack Shoylev)
+
+''When was the last PMC member added?''
+
+2013-04-29 (initial composition of the PMC when jclouds entered the incubator)
+
+There is regular activity on both the user and dev lists. Responses to
+questions are generally fast, with multiple community members contributing.
+
+Community Objectives
+--------------------
+
+What are the projects main plans and expectations for the community in the
+next period?
+
+ * Growing the committer base by encouraging regular contributors
+ * Encouraging involvement and contributions by vendors of supported providers
+ * Improving the user and new developer experience through revamped
+   documentation
+ * "Freshening up" the project's image via a new site design
+ * Finishing ongoing architectural changes in preparation for the next major
+   version
+
+Releases
+--------
+
+Have there been any releases from the project in the last quarter?
+
+ * 1.6.3 (2013-11-30)
+ * 1.7.0 (2013-12-23)
+ * 1.7.1 (2014-02-11)
+
+
+-----------------------------------------
+Attachment AA: Report from the Apache jUDDI Project  [Kurt Stam]
+
+jUDDI (pronounced "Judy") is an open source Java implementation of the
+Universal Description, Discovery, and Integration (UDDI v3) specification for
+(Web) Services. The jUDDI project includes Scout. Scout is an implementation
+of the JSR 93 - Java API for XML Registries 1.0 (JAXR). 
+
+jUDDI 
+- Very low traffic on the mailing lists this quarter.
+- Release 3.2.0. For full announcement see
+  http://apachejuddi.blogspot.com/2014/02/juddi-320-released-now-with-full-gui.html. 
+
+Scout 
+- No release this period, not really any development took place.
+- Very low volume of JAXR related questions on the mailing list. 
+
+Last PMC addition and new committer April 3, 2013 (Alex O'Ree)
+Last Release jUDDI-3.2.0, Feb 5, 2014
+There are no issues that require the boards attention at this time.
+
+
+-----------------------------------------
+Attachment AB: Report from the Apache Kafka Project  [Jun Rao]
+
+Apache Kafka is a distributed pub/sub system for efficiently collecting and
+delivering a large number of messages to both offline and online systems.
+
+Development
+===========
+We released Kafka 0.8.0 and have since improved existing admin tools. An 0.8.1
+release branch has been created and we intend to release 0.8.1 in a few weeks.
+We are actively working on a new version of the producer client, which
+provides better performance and a cleaner api. After that, we expect to
+rewrite the consumer client for the same reasons.
+
+Community
+===========
+Lots of activities in the mailing list. kafka-user has 538, 461, 436 emails in
+Jan, Dec and Nov, respectively (slightly less than 582 in Oct). kafka-dev has
+540, 509, 540 emails in Jan, Dec and Nov (slightly less than 581 in Oct). At
+least one Kafka talk is submitted to ApacheCon 2014. We last elected two
+committers in Oct. 2013.
+
+Releases
+===========
+0.8.0 was released on Dec 3, 2013.
+
+-----------------------------------------
+Attachment AC: Report from the Apache Lenya Project  [Richard Frovarp]
+
+The Apache Lenya CMS is a Cocoon based XML/XHTML content management
+system.
+
+Issues:
+
+No board level issues at this time.
+
+Development:
+
+No new releases this quarter.
+Last release: 2.0.4 on 2011-03-14
+
+Community:
+
+Last change to community was PMC addition in October 2011.
+
+
+-----------------------------------------
+Attachment AD: Report from the Apache Libcloud Project  [Tomaz Muraus]
+
+Libcloud is a Python library that abstracts away the differences among
+multiple cloud provider APIs.
+
+Issues
+
+There are no issues that require the board's attention at this time.
+
+Releases
+
+- Libcloud 0.14.0 has been released on January 22nd, 2014
+- Libcloud 0.13.3 (security release) has been released on December 31st, 2013
+- Libcloud 0.14.0-beta3 has been released on November 25th, 2013
+
+Community
+
+- Brian Curtin joined as a committer on November 25th, 2013
+- Latest PMC addition - John Carr On August 4th, 2013
+- I (Tomaz Muraus) have attended CloudStack Collaboration conference in
+  Amsterdam in November where we had good collaboration with CloudStack
+  people
+
+Miscellaneous
+
+- We have launched a new website -
+  https://libcloud.apache.org/blog/2014/01/23/welcome-to-the-new-website.html
+- We have issued a security release for CVE-2013-6480
+  (https://libcloud.apache.org/security.html#CVE-2013-6480) in December. The
+  security release was out on the same day that the security issue has been
+  reported.
+
+
+-----------------------------------------
+Attachment AE: Report from the Apache Logging Project  [Christian Grobmeier]
+
+The Apache Logging Services Project creates and maintains open-
+source software related to the logging of application behavior.
+
+Currently there are no issues, which require the board’s attention.
+
+
+- Community
+
+Log4j 2 remains a very active project. The overall
+community is healthy and friendly. We expect to add new committers in the 
+coming weeks.
+
+Log4j2 talks were submitted to the ApacheCon US CFP.
+
+Log4cxx returned to the incubator and was active for a few weeks.
+
+A Chainsaw release is currently blocked because we don't have
+access to a code signing certificate. We consider this very
+important for Chainsaw. Our Infra request showed that
+other projects need access to that certificate as well, like:
+OpenOffice, jUDDI, Tomcat.
+
+The ticket is unresolved since 05/Oct/2011:
+https://issues.apache.org/jira/browse/INFRA-3991 
+
+In general, the project is healthy and growing.
+
+- Project Branding Requirements
+
+All components meet the branding requirements, except Chainsaw. 
+We are still planning for a new Chainsaw release.
+
+- Last three community changes
+
+ * Remko Popma joined the PMC on Sep 28 2013.
+ * Dominik Psenner joined the PMC on Jun 03 2013.
+ * Nick Williams joined as a Committer on May 11 2013.
+
+- Releases
+
+ * Log4j Extras 1.2.17 (Oct 20, 2013)
+ * Log4j 2.0-beta9 (Sep 21, 2013)
+ * Log4net 1.2.12 (Sep 13, 2013)
+    
+- Subproject summaries
+
+Log4j 2: Very active. We are discussing a new beta or release
+candidate and the GA release.
+
+Log4j 1: Almost no activity.
+
+Log4net: Less active, but healthy and maintained.
+
+Log4cxx: Returned to the incubator, very active since then.
+
+Log4php: Less activity.
+
+Chainsaw: The ticket INFRA-3991 is blocking a new release: 
+    https://issues.apache.org/jira/browse/INFRA-3991
+
+
+-----------------------------------------
+Attachment AF: Report from the Apache ManifoldCF Project  [Karl Wright]
+
+Project description
+==============
+
+ManifoldCF is an effort to provide an open source framework for connecting
+source content repositories like Microsoft Sharepoint and EMC Documentum, to
+target repositories or indexes, such as Apache Solr, OpenSearchServer or
+ElasticSearch. ManifoldCF also defines a security model for target
+repositories that permits them to enforce source-repository security
+policies.
+
+Releases
+========
+
+ManifoldCF graduated from the Apache Incubator on May 16, 2012.  Since then,
+there have been five major releases, including a 1.4 release on October 28,
+2013, and a point release 1.4.1 on November 16, 2014.  A new major release
+(1.5) is being voted on at this time.
+
+Committers and PMC membership
+========================
+
+The last committer and PMC member we signed up was Minoru Osuka (minoru), on
+January 10, 2013.  We voted in a new committer and PMC member in May, but he
+declined to accept the committership due to his company's policies.  Other
+contributors have been approached, but have also declined to accept
+consideration for possible committership. The most recent of these
+encounters took place in September.
+
+We are still not entirely sure why people who are obviously interested and to
+some degree committed to the project seem unwilling to become full committers.
+I suspect that corporate restrictions make this a challenge in some cases.
+Also, we seem to be interacting more with contractors than with employees
+recently, and it may well be that contractors have less interest in a
+long-standing relationship with our project.  Nevertheless, we have rumors of
+significant contributions being prepared by at least three individuals; if any
+of these contributions are made, then we will likely offer the individuals
+involved committerships.
+
+Mailing list activity
+==============
+
+Mailing list has been active, with a wide range of topics.  Most of our
+connectors now have significant use cases and constituencies.  Dev list
+comments centered around voting, extensions to the SharePoint connector,
+people looking for integration advice, etc.  ManifoldCF also participated in
+Google Summer of Code, and MCF committers mentored one student developer
+through end of September 2013.
+
+External contributions and even committer contributions have been significant
+this quarter, despite heavy workload among most of the committer community.
+
+I am unaware of any mailing-list question that has gone unanswered.
+
+Outstanding issues
+==================
+
+None.
+
+Branding
+========
+
+We have reviewed the site branding guidelines and believe we are now
+compliant with these, with the possible exception of (TM) signs in logos
+from other Apache products that don't have any such marks.  We have
+not yet scheduled time to address this issue.
+
+
+-----------------------------------------
+Attachment AG: Report from the Apache Marmotta Project  [Jakob Frank]
+
+Apache Marmotta, an Open Platform for Linked Data.
+
+Apache Marmotta was founded in December 2012 and has graduated from
+the Incubator in November 2013.
+
+The first maintenance release (3.0.1) was published this month, the
+next major release is currently blocked by an incompatible transitive
+dependency (LGPL).
+
+Traffic on the lists is stable. Especially users@marmotta.a.o shows
+promising engagement, we are receiving contributions from users after
+questions on the list.
+
+Subscribers to the projects mailing list:
+    dev@marmotta.a.o: 60 subscribers (+2 since last report, 2014-01)
+  users@marmotta.a.o: 66 subscribers (+5 since last report, 2014-01)
+
+
+Releases
+  2014-01-21 (3.0.1)
+  2013-10-03 (3.1.0-incubating)
+
+Committers & PMC
+  Raffaele Palmieri (committer&PMC, 2013-05-21)
+  Peter Ansell (committer&PMC, 2013-06-24)
+
+Issues for the Board
+  There are no Board-level issues at this time.
+
+
+-----------------------------------------
+Attachment AH: Report from the Apache Mesos Project  [Benjamin Hindman]
+
+Apache Mesos is a cluster manager that provides resource sharing and
+isolation across cluster applications.
+
+## General ##
+
+The state of the project seems healthy, lots of releases (5 since the
+last board report) and continued adoption plus mailing list and
+development contributions.
+
+## Releases ##
+
+ * Apache Mesos 0.14.0 (2013-10-09)
+ * Apache Mesos 0.14.1 (2013-10-09)
+ * Apache Mesos 0.14.2 (2013-11-03)
+ * Apache Mesos 0.15.0 (2013-11-25)
+ * Apache Mesos 0.16.0 (2013-01-23)
+
+## Community ##
+
+ * Added 2 new committers and PMC members:
+    Jie Yu (jieyu) on 2013-01-25
+    Yan Xu (shortly after becoming a committer he had a baby so he
+            hasn't gotten an Apache account yet!)
+
+ * 164/117 created/resolved JIRA issues in last 90 days.
+ * 78/49 created/resolved JIRA issues in last 30 days.
+
+ * 115 messages to user@mesos.apache.org (January - February), with
+   2188 messages to dev@mesos.apache.org (a lot of which is from
+   Review Board and JIRA).
+
+ * Sharethrough hosted a hackathon in their SF office on February 14.
+
+ * Red Hat announced that Mesos has been officially accepted into
+   their distribution channel.
+
+ * A large refactor to the isolation and containerization mechanisms
+   in Mesos has driven multiple open source code contributions from
+   new contributors which we're very excited about.
+
+## Issues ##
+
+There are no issues requiring board attention at this time.
+
+
+-----------------------------------------
+Attachment AI: Report from the Apache Oltu Project  [Antonio Sanso]
+
+DESCRIPTION
+
+Oltu is a project to develop a Java library which provides an API
+specification for, and an unconditionally compliant implementation of the
+OAuth v2.0 specifications. OAuth is a mechanism that allows users to
+authenticate and authorise access by another party to resources they control
+while avoiding the need to share their username and password credentials.
+
+MILESTONES
+
+org.apache.oltu.commons 1.0 and org.apache.oltu.jose 1.0 were released on February 7th.
+
+CURRENT ACTIVITY
+
+The core part of the project related to 'The OAuth 2.0 Authorization
+Framework' (RFC 6749) is pretty stable due the fact RFC 6749 is now a
+standard.
+
+New parts of the OAuth specification family (JOSE) have been released this
+month. Soon we will release a stable version 1.0 of OAuth core.
+
+Users activity is growing slowly but steadily (the user@ mailing list has
+got new messages from potential new users)
+
+COMMUNITY
+
+PMC composition has not changed since graduation
+We have voted one new committer since graduation
+
+ISSUES
+
+There are no issues requiring board attention at this time.
+
+
+-----------------------------------------
+Attachment AJ: Report from the Apache Onami Project  [Simone Tripodi]
+
+DESCRIPTION
+
+Apache Onami is a project focused on the development and maintenance
+of a set of Google Guice extensions not provided out of the box by the
+library itself nor the Google developers team, such as integration
+with 3rd part frameworks or extra functionalities.
+
+MILESTONES
+
+Since last report, there have not been three new releases.
+
+CURRENT ACTIVITY
+
+Development activity is quite healthy, Onami-Persist proposal has been
+accepted and contributed, currently in the Onami Sandbox.
+
+COMMUNITY
+
+PMC composition has not changed since graduation.
+Users community is quite silent, development is not really active due to
+committers engagement in other projects.
+
+ISSUES
+
+There are no issues requiring board attention at this time.
+
+
+-----------------------------------------
+Attachment AK: Report from the Apache Oozie Project  [Mohammad Islam]
+DESCRIPTION
+ 
+Apache Oozie is a system for managing and scheduling
+workflows that run different types of Hadoop jobs 
+(such as MapReduce, Pig, Hive and Sqoop) as well as 
+system specific jobs (such as Java programs and shell scripts).
+ 
+RELEASES
+* Last release was Apache Oozie version 4.0.0,
+ released on AUG/30/2013. No new release since last report.
+* Apache Oozie version 4.0.1 is WIP
+ 
+CURRENT ACTIVITY
+* Development activity continues as can be seen from the
+following JIRA report:  http://s.apache.org/t9c (since
+last report, Nov 2013)
+ 
+COMMUNITY
+ 
+* PMC composition has not changed since last report.
+ 
+* Committers composition has not changed since last report.
+ 
+* Currently there are:
+- Total of 338  (+24) subscribers to the user list
+- Total of 115 (-1) subscribers to the developer list
+- Total of 14 committers
+- Total of 12 PMC members
+ 
+ISSUES
+ 
+* There are no issues requiring board attention at this
+time.
+
+-----------------------------------------
+Attachment AL: Report from the Apache OpenJPA Project  [Pinaki Poddar]
+
+There are no items requiring board attention at this time.
+
+* Highlights
+   Apache OpenJPA provides POJO persistence for stand-alone JSE, JEE   
+   container and many other lightweight frameworks, such as Tomcat,  
+   TomEE, Spring or OSGi.
+   
+* Community
+
+   Work has started on implementation of new features for JPA 2.1. 
+   
+   Support for Java 7 has been incorporated. 
+
+   Mailing lists continue to be active and many applications are
+   migrating from other vendors to OpenJPA. 
+
+   The developer community had maintained the codebase stable, 
+   supported for previous releases and backported resolved defects. 
+   
+   
+    
+* Governance
+
+    We continue to monitor contributors for possible committers and
+    PMC members. 
+
+* Releases
+
+
+-----------------------------------------
+Attachment AM: Report from the Apache Perl Project  [Philippe M. Chiasson]
+
+
+-- mod_perl 1.0 --
+
+The mod_perl 1.x is a maintenance track designed to work with httpd
+1.3.x.
+
+No new mod_perl 1.x releases since the last report.
+
+--- mod_perl 2.0 --
+
+mod_perl 2.X is designed to work with all httpd 2.X branches.
+
+Work to fully support httpd-2.4 is moving along.
+
+--- Apache-Test --
+
+Apache-Test provides a framework which allows module writers to write
+test suites than can query a running mod_perl enabled server.  It is
+used by mod_perl, httpd and several third party applications, and
+includes support for Apache modules written in C, mod_perl, PHP
+and Parrot.
+
+Apache-Test 1.38 was released on August 6th, 2012
+
+No new Apache-Test releases since the last report.
+
+--- Apache-SizeLimit --
+
+Apache-SizeLimit is a popular component in most mod_perl production
+environments.  It is used to kill off large httpd child processes
+based on various environmental triggers.
+
+No new Apache-SizeLimit releases since the last report.
+
+--- Apache-Bootstrap --
+
+Apache-Bootstrap is a framework to make it easier to build perl
+module distributions for different mod_perl versions.  It encapsulates
+code developed over the years by mod_perl developers to make
+maintaining Apache::* and Apache2::* modules in the same distribution easy.
+
+No new Apache-Bootstrap releases since the last report.
+
+
+--- Apache-Reload --
+
+Apache-Reload is a popular component in most mod_perl development
+environments, used to refresh compiled code in the perl interpreter
+without completely restarting httpd.
+
+Apache-Reload 0.12 was released on March 31st, 2012
+
+No new Apache-Reload releases since the last report.
+
+
+-- Apache-DBI --
+
+Apache-DBI is a popular component in many mod_perl deployments. It
+is used to provide transparent database connection pooling to clients
+using DBI.
+
+Apache-DBI 1.12 was released on June 12nd, 2013
+
+No new Apache-DBI releases since the last report.
+
+-- Development --
+
+mod_perl continues to be a healthy development community, though
+as a mature and stable product development moves at a naturally
+slower pace than in years past.  Bugs are found and discussed and
+applied with due consideration for our production userbase.
+
+Work on the http-2.4 branch is ongoing and we are getting closer to
+being able to merge it to trunk and make an official release supporting httpd
+2.4
+
+-- Users --
+
+The mod_perl users list is seeing steady activity, with a growing interest
+in seeing the httpd-2.4 work complete.
+
+Patches and bug reports are few, but keep on coming.
+
+
+-- PMC --
+
+No noteworthy PMC events happened since the last report.
+
+
+-----------------------------------------
+Attachment AN: Report from the Apache POI Project  [Yegor Kozlov]
+
+Apache POI is a Java library for reading and writing Microsoft Office file
+formats.
+
+
+Releases
+--------
+Version 3.10-FINAL was released on 8th February 2014
+
+
+Community
+---------
+
+ Andreas Beeker (kiwiwings) has been voted in as a POI committer/PMC member
+
+
+Project Status
+---------
+
+Apache POI continues to be an active project, both in terms of
+community and development. Traffic on the mailing lists has been 
+steady in the last 3 months.
+
+Most patches are applied without much delay.
+
+General Comments
+----------------
+There are no issues that require Board attention.
+
+
+-----------------------------------------
+Attachment AO: Report from the Apache Qpid Project  [Gordon Sim]
+
+Apache Qpid™ is a project focused on creating software based on the
+Advanced Message Queuing Protocol (AMQP), currently providing a
+protocol engine library, message brokers written in C++ and Java, and
+client libraries for C++, Java (including JMS), .Net, Python, Perl and
+Ruby.
+
+* Releases:
+
+Qpid Proton 0.6 was released on 16th January.
+
+Qpid Dispatch Router 0.1 was released on 17th January.
+
+The Qpid 0.26 release vote has concluded (we have changed the
+publishing process we use and publication is currently waiting on
+infra-7201, but should be complete soon). The previous Qpid release
+(0.24) was in 7th Sep, 2013.
+
+* Community:
+
+The main developer and user lists continue to be active. JIRAs are
+being raised and addressed.
+
+No new committers were added since last report (November 2013). The
+last committer added was Pavel Moravec on 30th Aug, 2013. The last PMC
+members to be added were Andrew Stitcher, Chuck Rolke, Justin Ross and
+Keith Wall, who were originally voted in during September 2011. It was
+brought to our attention however that there was no record of
+notification to - or acknowledgement from, as at that time required -
+the board at that time. This was rectified by a vote in Dec 2013 and
+an acknowledgement was received from Jim Jagielski.
+
+* Development Highlights:
+
+AMQP 1.0 continues to be an area of activity as issues are reported
+(often in conjunction with other AMQP 1.0 implementations) and fixed.
+
+Development is underway on a new AMQP 1.0 based JMS client, in line
+with the JMS Mapping being developed at OASIS.
+
+The existing JMS over 1.0 client and the java broker now support
+WebSockets, tracking the specification for that being developed at
+OASIS.
+
+Though not part of Qpid per se, an AMQP based NMS implementation
+(using qpid::messaging under the covers) has been developed in
+conjunction with the ActiveMQ project, increasing options for
+interoperability between the two projects.
+
+Dispatch Router added support for both competing and non-competing
+patterns, based on patterns specified in the configuration file. (Will
+be part of 0.2 release). The Dispatch Router is tracking the
+specification development for AMQP management.
+
+Proton Messenger added support for dynamic nodes. (Included in 0.6
+release). Some ideas have also been discussed to simplify using the
+Proton engine API, namely adding an event-oriented interface and some
+generic container support.
+
+* Issues:
+
+There are no items requiring board attention at this time.
+
+
+-----------------------------------------
+Attachment AP: Report from the Apache River Project  [Greg Trasuk]
+
+Apache River is a Java-based Service Oriented Architecture, implementing
+the Jini Specification and Jini Technology Starter Kit originally
+donated by Sun Microsystems.
+
+ISSUES FOR THE BOARD
+
+There are no board-level issues at this time
+
+RELEASES
+
+Apache River 2.2.2 was released on November 18, 2013
+Apache River 2.2.1 was released on May 2, 2013.
+
+COMMUNITY
+
+No new committers have been added since Nov of 2011.
+We hope that with releases coming on a more regular basis, user interest will
+pick up, and with it we will attract more potential new committers.
+
+ACTIVITY
+
+Mailing lists and development have been reasonably active
+months.  11 messages on users@ from Dec-Feb, and over 345 messages on
+dev@.  
+
+Four issues have been reported on Jira and eight old issues have been resolved.
+
+
+-----------------------------------------
+Attachment AQ: Report from the Apache Roller Project  [Dave Johnson]
+
+Apache Roller is a full-featured, Java-based weblogging package that works
+well on Tomcat and MySQL, and is also known to run on other servers and
+databases. The ASF blog site at blogs.apache.org runs on Roller 5.0.2.
+
+Issues
+
+No board issues at this time.
+
+Releases
+
+The latest release of Apache Roller is v5.0.2, which was released
+on October 30, 2013, a security vulnerability and bug fix release.
+
+Community
+
+The Roller community continues to be rather quiet with low traffic that 
+mostly concerns technical support and installation issues. The last new
+PMC member and committer who joined is Glenn Mazza in Nov 2012.
+
+
+-----------------------------------------
+Attachment AR: Report from the Apache Santuario Project  [Colm O hEigeartaigh]
+
+The Apache Santuario project is aimed at providing implementation of
+security standards for XML.
+
+There were three new releases of the Apache XML Security for Java project in
+the last quarter. Version 1.5.6 contained a minor bug fix, as well as a fix
+for security advisory CVE-2013-4517.
+
+In addition, there were two "beta" releases for the forthcoming 2.0.0 version
+of the Java project, 2_0_0-beta and 2_0_0-rc1. Release of the final version
+is anticipated in the next month.
+
+Last committer addition: Marc Giger, July 2012.
+Last PMC addition: Marc Giger, April 2013.
+
+
+-----------------------------------------
+Attachment AS: Report from the Apache SIS Project  [Adam Estrada]
+
+Apache SIS is a spatial framework that enables better representation of
+coordinates for searching, data clustering, archiving, or any other
+relevant spatial needs.
+
+Development:
+* Investigated datum aliasing for various producers [1]
+* Investigated using XSLT for processing different versions of
+XML-based formats like GML [2]
+* Basic CoordinateReferenceSystem implementations have been committed [3]
+* Migration from Well Known Text version 1 (WKT 1) formatting to WKT
+2, a.k.a. ISO 19162.
+
+Community:
+* First post to the Users@ mailing list [6]
+
+Branding:
+* The talk proposal for ApacheCon 2014 has been submitted. Martin used
+David Neufeld's text [7], with minor changes. currently waiting to see
+if ApacheCon accepts this proposal.
+
+* The OGC sent Martin a private email suggesting to submit a blog post
+on the OGC portal [8] about this talk. If accepted, Martin will come
+back on the mailing list for proposing a blog post for OGC portal.
+
+* There is an OGC meeting in March. Of particular interest for SIS
+there is a CRS WKT SWG (currently scheduled March 26th at 11:00
+AM[9]). We hope to have a fully functional WKT 2 implementation before
+this meeting, so we can share our experience with the group. SIS would
+be among the first WKT 2 implementations - the only other we are aware
+of was made by ESRI.
+
+Issues:
+Need to add Martin as a wiki editor [4]. Thread here.[5]
+
+Releases:
+RC SIS-0.4
+
+Press:
+None
+
+[1] https://issues.apache.org/jira/browse/SIS-145
+[2] https://issues.apache.org/jira/browse/SIS-152
+[3] http://s.apache.org/Eb8
+[4] https://cwiki.apache.org/confluence/display/SIS/SIS+Wiki
+[5] http://s.apache.org/vhi
+[6] http://s.apache.org/p4
+[7] http://s.apache.org/7Kb
+[8] http://www.opengeospatial.org/blog
+[9] http://www.opengeospatial.org/event/1403tcagenda
+
+
+-----------------------------------------
+Attachment AT: Report from the Apache Subversion Project  [Greg Stein]
+
+* Overview
+
+  No board-level issues at this time, since our report in January.
+
+* Community
+
+  No changes in committers or PMC makeup. Our last committer was added
+  in July 2013. Our last PMC addition was March 2012.
+
+* Releases
+
+  The community is currently voting on a number of releases, at the
+  time of the February board meeting. These candidates consist of an
+  alpha for 1.9.0, for 1.8.8, and for 1.7.16.
+  
+  For those keeping score at home since the prior release numbers, the
+  1.7.15, 1.8.6, and 1.8.7 version numbers were skipped/pulled.
+
+
+-----------------------------------------
+Attachment AU: Report from the Apache Syncope Project  [Francesco Chicchiricco]
+
+
+Apache Syncope is an Open Source system for managing digital identities
+in enterprise environments, implemented in JEE technology.
+
+Status
+
+There are no outstanding issues requiring board attention.
+
+
+Community
+
+user@ ML is active, new users keep popping in for evaluating the project,
+existing users get regular support in reasonable time for their issues:
+currently 82 subscribers, including 4 archive / non human addresses.
+dev@ ML is active, mainly discussing new features: currently 59 subscribers,
+including 4 archive / non human addresses.
+
+We have consistently started implementing new features for next version
+1.2.0, while still maintaining 1.1.X (next release 1.1.6 is almost done).
+Some contacts were taken with Logging, CXF and Directory communities
+via their user@ ML for asking for support with - respectively - log4j2,
+JAX-RS and Escimo.
+
+Last committer addition (Guido Wimmel) is dated January 2014
+Last addition to PMC (Jan Bernhardt) is dated November 2012.
+
+Releases since last report
+
+   * 1.1.5 (Nov 28th, 2013)
+
+
+-----------------------------------------
+Attachment AV: Report from the Apache Turbine Project  [Thomas Vandahl]
+
+Apache Turbine is a servlet based framework that allows experienced 
+Java developers to quickly build web applications. Turbine allows you 
+to personalize the web sites and to use user logins to restrict access 
+to parts of your application.
+Turbine is a matured and well established framework that is used as 
+the base of many other projects.
+
+Status
+
+The Turbine project has again seen low levels of activity in the last 
+quarter.
+The Turbine project has no board-level issues at this time.
+
+Project Branding Board Report Checklist
+
+The last issue left is
+TODO: Logos and Graphics : include TM
+
+Community changes
+
+No new committers were voted in since the last board report.
+The last change to the committer base was the addition of Georg 
+Kallidis (2012/09/19).
+No new PMC members were voted in since the last board report.
+The last change to the PMC was the addition of Georg Kallidis 
+(2013/09/30).
+
+Turbine core project
+
+The Turbine core project proceeds slowly to the next milestone release
+which shall include a modified security implementation and support 
+for the Quartz scheduler to replace the built-in one.
+
+The last released component was the parent POM (2013/09/25).
+
+Fulcrum component project
+
+Some activity has taken place to come closer to a release of the 
+security component.
+
+The last released component was fulcrum-parser 1.0.3 (2013/10/11).
+
+
+-----------------------------------------
+Attachment AW: Report from the Apache Tuscany Project  [Jean-Sebastien Delfino]
+
+Apache Tuscany is an SOA framework based on OASIS OpenCSA and SCA.
+
+ISSUES
+- There are no issues that require the board's attention.
+
+RELEASES
+- Last release was Tuscany SCA 2.0.1, 10/3/2013.
+
+COMMUNITY ACTIVITY
+- Last committer addition was Sebastian Millies, 12/4/2012.
+
+- Mailing list traffic hasn't changed much in the past few months, and
+continues to be on the lower side, mostly a few questions on the user
+mailing list.
+
+BRANDING
+- We still need to update logos with ™ and review the project doap file.
+
+
+-----------------------------------------
+Attachment AX: Report from the Apache Velocity Project  [Nathan Bubna]
+
+
+-----------------------------------------
+Attachment AY: Report from the Apache Xalan Project  [Steven J. Hathaway]
+
+The Apache Xalan Project develops and maintains libraries and programs 
+that transform XML documents using XSLT standard stylesheets. Our 
+subprojects use the Java and C++ programing languages to implement the 
+XSLT libraries.
+
+ISSUES
+
+The volunteers appear short staffed to shepherd the staging of new 
+patch releases and perform quality assurance activities on the 
+code base.
+
+RELEASES
+
+- Xalan Java (2.7.1) 27-Nov-2007
+- Xalan C/C++ (1.11) 29-Oct-2012
+
+COMMUNITY ACTIVITY
+
+Xalan is a mature project with little development activity.
+There are still persons able to address the issues of
+developers.
+
+The development email has little volume.  The Xalan library
+still has a major presence in commercial software products.
+
+PMC MEMBERSHIP
+
+No membership changes.
+
+-----------------------------------------
+Attachment AZ: Report from the Apache Xerces Project  [Michael Glavassevich]
+
+Xerces-J
+
+A new XML parser configuration was developed with enhancements for
+the JAXP secure processing feature. This will allow applications to
+set global limits (using system properties) on the number and size
+of entities that should be processed by the parser. Similar
+capability was already available programmatically through the XML
+APIs.
+
+Some minor refactoring was done in the XML Schema 1.1
+implementation.
+
+Mailing list traffic has been low; roughly 50 posts on the j-dev
+and j-users lists since the beginning of November 2013.
+
+No new releases this quarter. The latest release is
+Xerces-J 2.11.0 (November 30th, 2010).
+
+Xerces-C
+
+New project files were added to support Visual Studio 2013. A few
+other minor changes were made to update copyright years.
+
+Mailing list traffic has been low; roughly 70 posts on the c-dev
+and c-users lists since the beginning of November 2013.
+
+No news about when the 3.2 version will be packaged. The latest
+release is Xerces-C 3.1.1 (April 27th, 2010).
+
+Xerces-P
+
+Nothing in particular to report. There was no development activity
+over the reporting period.
+
+XML Commons
+
+Some minor improvements were made to the XML Commons Resolver's
+classloading code to better align it with the ObjectFactory classes
+in Xerces-J and Xalan-J. No postings to the mailing list this
+quarter.
+
+Committer / PMC Changes
+
+No new committers in the last quarter. A potential new Xerces-J
+committer is currently being discussed by the PMC. The most recent
+committers were elected in July 2008 (Xerces-C) and May 2009
+(Xerces-J).
+
+No new PMC members in the last quarter. The last two additions to
+the PMC were in May 2010.
+
+Apache Project Branding Requirements
+
+There's still some work left to do on the TLP website, including
+adding "TM" to the project logo.
+
+
+-----------------------------------------
+Attachment BA: Report from the Apache XML Graphics Project  [Chris Bowditch]
+
+The Apache XML Graphics Project is responsible for software intended for
+the creation & maintenance of the conversion of XML formats to graphical
+output & related software components.
+
+
+== Issues for the Board ==
+No issues at present.
+
+== Community ==
+Last new committer: Robert Meyer on 05/08/13
+
+Last new PMC member: Luis Bernardo on 04/03/13
+
+No new committers recently but there are a couple of active contributors
+that the PMC is monitoring with a view to future committership.
+
+== XML GRAPHICS COMMONS ==
+5 bug fixes committed to SVN, 3 were patches submitted by contributors
+
+There were no releases this quarter.
+
+The latest release is 1.5 (20 October 2012)
+
+== FOP ==
+Mailing list activity is slightly down due to the holiday season, but is 
+starting to pick up again. Some new bugs logged and several patches have
+been submitted and processed. 46 separate commits in total to SVN.
+Significant development of note this quarter; work continues on a
+whitespace management extension, a basic fo:inline-container implementation
+was finished and changes checkstyle to rules being applied to the codebase.
+
+There were no releases this quarter
+
+The latest release is 1.1 (20 October 2012)
+
+== BATIK ==
+Mailing activity remains light, but a couple of bugs have been reported.
+There were actually 3 commits made by PMC members during this quarter; 1
+was a test commit, a 2nd to create a branch for a new feature and a 3rd
+was a user supplied patch being committed.
+
+There were no releases this quarter.
+
+The latest version is 1.7 (6 January 2008)
+
+
+-----------------------------------------
+Attachment BB: Report from the Apache Cordova Project  [Brian LeRoux]
+
+Apache Cordova is a platform for building native mobile applications using
+HTML, CSS and JavaScript. 
+
+STATUS
+
+It was recently brought to our attention that we had not being following
+Apache releases precisely as desired by policy. There has been lengthy
+discussion this report will attempt to summarize actions being taken by
+Cordova.
+
+ * Archived release artifacts will get a Vote thread for everything here [1]
+ * Current release artifacts Vote happening immediately for everything here [2]
+ * We will follow the Vote policy for all MAJOR/MINOR/PATCH releases moving
+   forward
+ * We have begun investigation of automating releases w/ an eye to improving
+   policy in the future
+
+Open discussion to understand how this process should work with package
+manager distribution. [3] [4] Related, but not directly nor an immediate
+concern, is App Store distribution. [5] 
+
+[1] http://archive.apache.org/dist/cordova
+[2] http://apache.org/dist/cordova
+[3] https://npmjs.org/package/cordova
+[4] http://plugins.cordova.io
+[5] https://issues.apache.org/jira/browse/LEGAL-174
+
+-----------------------------------------
+Attachment BC: Special report from the Apache OpenOffice Project  [Andrea Pescetti]
+
+An issue about ADA (Americans with Disabilities Act) statements has
+been opened at https://issues.apache.org/jira/browse/LEGAL-190
+to investigate complaints about ADA compliance of the Apache/OpenOffice
+web sites.
+
+------------------------------------------------------
+End of minutes for the February 19, 2014 board meeting.
diff --git a/www/classic/board/agenda/test/protractor.conf.js b/www/classic/board/agenda/test/protractor.conf.js
new file mode 100644
index 0000000..09a9f90
--- /dev/null
+++ b/www/classic/board/agenda/test/protractor.conf.js
@@ -0,0 +1,2 @@
+exports.config = {
+}
diff --git a/www/classic/board/agenda/test/specs/agenda.rb b/www/classic/board/agenda/test/specs/agenda.rb
new file mode 100644
index 0000000..f3113f1
--- /dev/null
+++ b/www/classic/board/agenda/test/specs/agenda.rb
@@ -0,0 +1,31 @@
+class AgendaPage
+  def initialize(page)
+    browser.get(page)
+  end
+
+  def title(n)
+    return element(by.repeater('item in agenda').row(n).
+      column('{{ item.title }}')).getText()
+  end
+
+  def class(n)
+    return element(by.repeater('item in agenda').row(n)).getAttribute('class')
+  end
+
+  def nav(n)
+    return element(by.repeater('item in toc').row(n)).getOuterHtml()
+  end
+end
+
+describe 'agenda' do
+  agenda = AgendaPage.new('/2014-03-19/')
+
+  it 'should include cordova' do
+    agenda.title(35).must_equal 'Cordova'
+    agenda.class(35).must_equal 'missing'
+  end
+
+  it 'nav should include special orders' do
+    agenda.nav(5).must_include 'Establish-Tajo'
+  end
+end
diff --git a/www/classic/board/agenda/views/main._html b/www/classic/board/agenda/views/main._html
new file mode 100755
index 0000000..d680ee2
--- /dev/null
+++ b/www/classic/board/agenda/views/main._html
@@ -0,0 +1,115 @@
+#!/usr/bin/ruby
+
+#
+# Main "layout" for the application, houses a single view
+#
+
+_html ng_app: 'AsfBoardAgenda', ng_controller: 'Layout' do
+  _base href: @base
+  _title 'ASF Board Agenda', ng_bind: 'title'
+  _script src: '../js/app.js'
+  _script src: '../js/services.js'
+  _script src: '../js/filters.js'
+  _script src: '../js/directives.js'
+
+  _link rel: 'stylesheet', href: '../stylesheets/app.css'
+
+  _body 'Layout' do
+    # sibling navigation links and banner
+    _header.navbar.navbar_fixed_top class: '{{ item | color }}' do
+      _div.navbar_brand '{{ title }}'
+      _span.clock! "\u231B"
+      _ul.nav.nav_pills.navbar_right do
+        _li.label.label_danger ng_if: 'queued' do
+          _a '{{queued}}', href: 'queue'
+        end
+        _li.dropdown class: '{{ info }}', ng_show: 'item.title' do
+          _a.info!.dropdown_toggle class: '{{ item | color}}',
+            ng_click: 'infoToggle()' do
+            _ 'info'
+            _b.caret
+          end
+          _dl.dropdown_menu.dl_horizontal do
+            _dt 'Attach'
+            _dd '{{ item.attach }}'
+            _dt 'Author', ng_if: 'item.owner'
+            _dd '{{ item.owner }}'
+            _dt 'Shepherd', ng_if: 'item.shepherd'
+            _dd '{{ item.shepherd }}'
+            _dt 'Approved', ng_show: 'item.approved'
+            _dd '{{ item.approved && item.approved.join(", ") }}',
+              ng_show: 'item.approved'
+            _dt 'Links', ng_show: 'item.roster||item.prior_reports||item.stats'
+            _dd ng_show: 'item.roster' do
+              _a 'Roster', href: '{{ item.roster }}'
+            end
+            _dd ng_show: 'item.prior_reports' do
+              _a 'Prior Reports', ng_href: '{{ item.prior_reports }}'
+            end
+            _dd ng_show: 'item.stats' do
+              _a 'Statistics', ng_href: '{{ item.stats }}'
+            end
+          end
+        end
+
+        _li_.dropdown do
+          _a.nav!.dropdown_toggle data_toggle: "dropdown" do
+            _ 'navigation'
+            _b.caret
+          end
+          _ul.dropdown_menu do
+            _li! {_a.agenda! 'Agenda', href: './'}
+            _li! ng_repeat: 'item in toc' do
+              _a '{{ item.index }}', ng_href: '{{item.href}}'
+            end
+
+            _li.divider
+
+            _li {_a 'Search', href: 'search'}
+
+            _li {_a 'Comments', href: 'comments'}
+
+            _li ng_if: 'mode == "director"' do
+              _a.shepherd! 'Shepherd', ng_href: 'shepherd/{{firstname}}'
+            end
+
+            _li(ng_if: 'mode == "director"') do
+              _a.queue! 'Queue', href: 'queue'
+            end
+
+            _li(ng_show: 'false') {_a.help! 'Help', href: 'help'}
+          end
+        end
+      end
+    end
+
+    userid = env['REMOTE_USER']
+    userid = userid.dup.untaint if userid =~ /\A[-\w]+\Z/
+    _main :ng_view, autoscroll: 'true', data_agenda: @agenda,
+      data_drafts: @drafts.join(' '),
+      data_availid: userid, data_initials: ASF::Auth::DIRECTORS[userid],
+      data_firstname: Etc.getpwnam(userid)[4].split(',').first.split(' ').
+        first.force_encoding('utf-8')
+
+    _aside.agendas! ng_show: 'false' do
+      _h2 'Other Board Meeting Agendas'
+      _ul do
+        @agendas.each do |agenda|
+          _li! { _a agenda, href: agenda }
+        end
+      end
+    end
+
+    _footer_.navbar.navbar_fixed_bottom class: '{{ item | color }}' do
+      _a.backlink.navbar_brand '{{ prev && prev.title }}', rel: 'prev',
+        ng_href: '{{ prev_href }}', ng_show: 'prev'
+
+      _span ng_repeat: 'button in buttons' do
+        _ng_include src: 'button'
+      end
+
+      _a.nextlink.navbar_brand '{{ next && next.title }}', rel: 'next',
+        ng_href: '{{ next_href }}', ng_show: 'next'
+    end
+  end
+end
diff --git a/www/classic/roster/committee.cgi b/www/classic/roster/committee.cgi
new file mode 100755
index 0000000..790a745
--- /dev/null
+++ b/www/classic/roster/committee.cgi
@@ -0,0 +1,484 @@
+#!/usr/bin/ruby1.9.1
+
+require 'wunderbar'
+require 'whimsy/asf'
+
+# mapping of committee names to canonical names (generally from ldap)
+# See also asf/committee.rb
+canonical = Hash.new {|hash, name| name}
+canonical.merge! \
+  'community development'       => 'comdev',
+  'conference planning'         => 'concom',
+  'conferences'                 => 'concom',
+  'http server'                 => 'httpd',
+  'httpserver'                  => 'httpd',
+  'java community process'      => 'jcp',
+  'lucene.net'                  => 'lucenenet',
+  'quetzalcoatl'                => 'quetz',
+  'security team'               => 'security',
+  'open climate workbench'      => 'climate',
+  'c++ standard library'        => 'stdcxx',
+  'travel assistance'           => 'tac',
+  'traffic server'              => 'trafficserver',
+  'web services'                => 'ws',
+  'xml graphics'                => 'xmlgraphics'
+
+display_name = Hash.new {|hash, name| name}
+namemap = Proc.new do |name|
+  cname = canonical[name.downcase]
+  display_name[cname] = name unless display_name.include? cname
+  cname
+end
+
+# parse chairs and nonpmc names from committee-info.txt
+board = ASF::SVN['private/committers/board']
+committee = File.read("#{board}/committee-info.txt").split(/^\* /)
+reporting = committee.first[/^2.(.*)\n3/m,1].scan(/^    (\w.*?)(?:\s*#|$)/).
+  flatten.sort.map {|name| namemap.call(name)}.uniq
+head = committee.shift.split(/^\d\./)[1]
+chairs = Hash[head.scan(/^\s+(\w.*?)\s\s+.*<(\w+)@apache\.org>/).
+  map {|name, id| [namemap.call(name), id]}]
+nonpmcs = head.sub(/.*?also has/m,'').
+  scan(/^\s+(\w.*?)\s\s+.*<\w+@apache\.org>/).flatten.uniq.map(&namemap)
+
+# parse roster information and display names from committee-info.txt
+info = {}
+committee.each do |roster|
+  roster.gsub! /^.*\(\s*emeritus\s*\).*/i, ''
+  name =  roster[/(\w.*?)\s+\(/,1]
+  info[namemap.call(name)] = roster.scan(/<(.*?)@apache\.org>/).flatten
+end
+
+# parse site information
+site = {}
+templates = ASF::SVN['asf/infrastructure/site/trunk/templates']
+projects = File.read("#{templates}/blocks/projects.mdtext")
+found = false
+projects.scan(/\[(.*?)\]\((http.*?) "(.*)"\)/).each do |name, link, text|
+  site[namemap.call(name)] = [link, text]
+end
+
+skeleton = File.read("#{templates}/skeleton.html")
+projects = skeleton[/<h4>Foundation Projects<\/h4>(.*?)<h4>/m,1]
+projects.scan(/<a href="(.*?)" title="(.*?)">(.*?)</).each do |link, text, name|
+  cname =  namemap.call(name)
+  link = 'http://www.apache.org' + link if link =~ /^\//
+  nonpmcs << cname unless nonpmcs.include? cname
+  site[cname] = [link, text]
+end
+
+committers = ASF.committers.map(&:id)
+
+banned = ASF::Person.list('loginShell=/usr/bin/false').map(&:id)
+
+_html do
+  # extract pmc name from uri
+  if ENV['REQUEST_URI'] =~ /committee\/(.+)/
+    @pmc = CGI::unescape($1)
+  end
+
+  _head_ do
+    if @pmc.to_s.empty?
+      _title 'Apache Committees'
+    else
+      _title "Apache Committee - #{@pmc}"
+    end
+    _meta charset: 'utf-8'
+    _style %{
+      .issue {font-weight:bold; color: red}
+      td:last-child {font-weight:bold}
+      td:last-child:not(.chair) {color: red}
+      td:last-child:not(:empty):before {content: '\u21d0 '}
+      tr:hover {background-color: #FF8}
+      td span {display: none}
+      td:hover span {position: absolute; display: block; background-color: #FFF;
+        padding: 1em; border: 2px solid #0F0; border-radius: 1em;
+        color: black; font-weight: normal}
+    }
+  end
+
+  _body? do
+    # common banner
+    _a href: 'https://whimsy.apache.org/' do
+      _img title: "ASF Logo", alt: "ASF Logo", 
+        src: "https://id.apache.org/img/asf_logo_wide.png"
+    end
+
+    if @pmc
+      # individual pmc display page
+      @pmc.untaint if @pmc =~ /^[-\w]+$/
+      name = canonical[@pmc.downcase]
+
+      # extract roster from committee-info.txt
+      info = (info[name] || []).map {|uid| ASF::Person.find(uid)}
+
+      # extract roster from ldap
+      if name.tainted?
+        committee = []
+        group = []
+      else
+        committee = ASF::Committee.find(name).members
+        group = ASF::Group.find(name).members
+      end
+
+      # merge the two sources
+      pmc = (info + committee).uniq
+
+      if name == 'orphans'
+        pmc = ASF::Person.list - 
+         ASF::Group.list.map(&:members).flatten - 
+         ASF::Committee.list.map(&:members).flatten - 
+         ASF.members
+      end
+
+      # header for pmc, and pmc wide notices
+      if site.include? name
+        # site information found, link to it
+        link, text = site[name]
+        _h1_ do
+          _a display_name[name], href: link, title: text
+        end
+        if pmc.empty?
+          _p 'Project not found, but is in the navigation ' +
+            'list of projects on apache.org', class: 'issue'
+        elsif info.empty?
+          _p 'Not in committee-info.txt', class: 'issue'
+        elsif committee.empty?
+          if nonpmcs.include? name
+            _p 'Not in ldap'
+          else
+            _p 'Not in ldap', class: 'issue'
+          end
+        elsif not reporting.include? name
+          _p 'Not in reporting schedule', class: 'issue'
+        end
+      else
+        # site information not found
+        _h1_ display_name[name]
+        if name == 'orphans'
+        elsif pmc.empty?
+          _p 'Project not found', class: 'issue'
+        else
+          if not nonpmcs.include? name
+            _p 'Not in the navigation list of projects on apache.org',
+              class: 'issue'
+          end
+          if committee.empty?
+            _p 'Not in LDAP', class: 'issue'
+          end
+          if info.empty?
+            _p 'Not in committee-info.txt', class: 'issue'
+          end
+          if not reporting.include? name
+            _p 'Not in reporting schedule', class: 'issue'
+          end
+        end
+      end
+
+      if (group - pmc).empty?
+        unless group.empty?
+          _h2_ 'PMC==Committers'
+        end
+      else
+        _h2_ 'PMC'
+      end
+
+      # prevent complaining if the person is banned
+      recognized = committers + banned
+
+      _table_ do
+	pmc.sort_by {|person| person.id}.each do |person|
+	  _tr_ do
+            # availid
+	    _td do
+	      _a person.id, href: "../committer/#{person.id}"
+	    end
+
+            # display name
+            if not person.asf_member?
+	      _td person.public_name
+            elsif person.asf_member? == true
+	      _td { _strong person.public_name }
+            else
+	      _td { _em person.public_name }
+            end
+
+            # notices
+	    if not committee.include?(person) and not committee.empty?
+	      _td do
+                _indented_text! 'not in LDAP committee'
+                _span "modify_committee.pl #{name} --add #{person.id}"
+              end
+	    elsif not group.include?(person) and not group.empty?
+	      _td do
+                _indented_text! 'not in LDAP group'
+                _span "modify_unix_group.pl #{name} --add #{person.id}"
+              end
+	    elsif not info.empty? and not info.include? person
+	      _td do
+                _indented_text! 'not in committee-info.txt'
+                _span "modify_committee.pl #{name} --rm #{person.id}"
+              end
+            elsif not recognized.include? person.id
+              _td do
+                if name == 'orphans'
+                  _indented_text! 'Not disabled'
+                else
+                  _indented_text! 'Not in ASF list of committers'
+		  if person.public_name
+                    _span "modify_unix_group.pl committers --add #{person.id}"
+		  else
+                    _span "modify_unix_group.pl #{name} --rm #{person.id}"
+		  end
+		end
+              end
+	    elsif not person.icla
+	      _td do
+                _indented_text! 'missing ICLA'
+                _span "modify_unix_group.pl #{name} --rm #{person.id}"
+	      end
+	    elsif chairs[name] == person.id
+	      _td 'chair', class: 'chair'
+            else
+	      _td
+	    end
+	  end
+	end
+      end
+
+      unless (group - pmc).empty?
+        _h2_ 'Committers (excluding PMC members already listed above)'
+        _table_ do
+	  group.sort_by {|person| person.id}.each do |person|
+            next if pmc.include? person
+	    _tr_ do
+              # availid
+	      _td do
+	        _a person.id, href: "../committer/#{person.id}"
+	      end
+
+              if not person.asf_member?
+	        _td person.public_name
+              elsif person.asf_member? == true
+	        _td { _strong person.public_name }
+              else
+	        _td { _em person.public_name }
+              end
+
+              if not recognized.include? person.name
+                _td do
+		  _indented_text! 'Not in ASF list of committers'
+		  if person.public_name
+                    _span "modify_unix_group.pl committers --add #{person.id}"
+		  else
+                    _span "modify_unix_group.pl #{name} --rm #{person.id}"
+		  end
+		end
+              elsif person.public_name
+                _td
+              else
+                _td do
+		  _indented_text! 'Missing ICLA'
+                  _span "modify_unix_group.pl #{name} --rm #{person.id}"
+		end
+              end
+            end
+          end
+        end
+      end
+
+      # links
+      _ul do
+        _li do
+	  _a 'How to grant SVN access to a project source repository',
+	    href: 'http://www.apache.org/dev/pmc.html#SVNaccess'
+	end
+        _li do
+	  _a 'infrastructure site README',
+	    href: 'http://svn.apache.org/repos/asf/infrastructure/site/trunk/README'
+	end
+        _li do
+	  _a 'committee-info.txt',
+	    href: 'https://svn.apache.org/repos/private/committers/board/committee-info.txt'
+	end
+      end
+
+    else # PMC list
+
+      # TODO remove? appears to be overwritten before first use
+      pmcs = ASF::Committee.list
+
+      # get a list of chairs from LDAP
+      ldap_chairs = ASF.pmc_chairs
+
+      # membership of each PMC
+      pmc_members = Hash[
+        ASF.search_one(ASF::Committee.base, 'cn=*', %w(cn member)).
+          map {|attrs| [ attrs['cn'].first, 
+            (attrs['member'] || []).map {|uid| uid[/uid=(.*?),/,1]} ] }
+      ]
+
+      # membership of each group
+      groups = Hash[
+        ASF.search_one(ASF::Group.base, 'cn=*', %w(cn memberUid)).
+          map {|attrs| [ attrs['cn'].first, attrs['memberUid'] || [] ] }
+      ]
+
+      # list of pmcs from ldap 
+      pmcs = pmc_members.keys
+
+      # list of people with an ICLA
+      iclas = Hash[ASF::ICLA.new.each.map {|id, name, email| [id, 1]}]
+
+      # table has two sections, first a list of pmcs then other committees
+      pmcsection = true
+      _h1_ "PMCs"
+
+      # merge names from committee-info.txt, ldap and site, eliminating nonpmcs
+      names = (info.keys + pmcs + site.keys + reporting + chairs.keys).
+        uniq.compact
+
+      _table_ do
+        ((names-nonpmcs).sort + nonpmcs.sort).each do |name|
+
+          # this is admittedly kind-of a hack, but when encountering the
+          # first non-pmc, dump a list of ldap-chairs that are not currently
+          # chairs, then insert a header in the middle of the table
+          if pmcsection and nonpmcs.include? name
+            ldap_chairs.sort_by {|p| p.name}.each do |chair|
+              next if chairs.values.include? chair.name
+              _tr_ do
+	        _td { _em 'missing' }
+                if chair.asf_member?
+                  _td do
+                    _strong chair.public_name, title: chair.name
+                  end
+                else
+                  _td chair.public_name, title: chair.name
+                end
+	        _td 'pmc-chair not listed in committee-info.txt'
+	      end
+            end
+
+            _tr_ do
+              _td colspan: '3' do
+                _h1 "Other Offices and Committees", id: 'other'
+              end
+              _td
+            end
+            pmcsection = false
+          end
+
+          # extract committee roster from ldap
+          pmc_names = (pmc_members[name] || []).sort
+
+          _tr_ do
+            # committtee name, linking to page if there is a roster to be found
+            if not pmc_names.empty? or info.include? name
+              _td do
+                _a display_name[name], href: name
+              end
+            elsif site.include? name
+              # site information found, link to it
+              link, text = site[name]
+              _td do
+                _a display_name[name], href: link
+              end
+            else
+              _td display_name[name]
+            end
+
+            # chair name, bold if the chair is an ASF member
+            chair = ASF::Person.find(chairs[name])
+            if chair.asf_member?
+              _td do
+                _strong chair.public_name
+              end
+            elsif chair
+              _td chair.public_name
+            else
+	      _td { _em 'missing' }
+            end
+
+            # notices
+            if chair and not reporting.include? name
+              _td 'not in reporting schedule'
+            elsif not info[name] or info[name].empty?
+              if not pmc_names.empty?
+                _td 'ldap only'
+              elsif chair.icla and nonpmcs.include? name
+                _td 'chair only', class: 'chair'
+              elsif site.include? name
+                _td 'website only'
+              elsif chair
+                _td 'chair only'
+              elsif reporting.include?  name
+                _td 'only in reporting schedule'
+              else
+                _td 'not found'
+              end
+            elsif pmc_names.empty?
+              if nonpmcs.include? name
+                _td
+              else
+                _td 'committee-info.txt only'
+              end
+            elsif info[name].sort == pmc_names
+              if pmc_names.any? {|id| not iclas.include? id}
+                if pmc_names.one? {|id| not iclas.include? id}
+                  _td 'missing an ICLA on file'
+                else
+                  _td 'missing ICLAs on file'
+                end
+              elsif not site.include? name
+                _td 'not linked in sidebar on apache.org web site'
+              elsif not pmc_names.include? chairs[name]
+                if nonpmcs.include? name
+                  _td
+                else
+                  _td 'chair not in pmc-chairs ldap group'
+                end
+              elsif not groups[name]
+                if nonpmcs.include? name
+                  _td
+                else
+                  _td 'no corresponding LDAP group'
+                end
+              elsif not (pmc_members[name] - groups[name]).empty?
+                if (pmc_members[name] - groups[name]).length == 1
+                  _td 'one committee member not in LDAP group'
+                else
+                  _td 'multiple committee members not in LDAP group'
+	        end
+              elsif not (groups[name] - committers - banned).empty?
+	        if (groups[name] - committers - banned).length > 1
+                  _td 'multiple group members not in list of committers'
+	        else
+                  _td 'one group member not in list of committers'
+		end
+              else
+                _td
+              end
+            elsif (info[name] - pmc_names).empty?
+              if (pmc_names - info[name]).length == 1
+                _td 'ldap contains an additional entry'
+              else
+                _td 'ldap contains additional entries'
+              end
+            elsif (pmc_names - info[name]).empty?
+              if (info[name] - pmc_names).length == 1
+                _td 'committee-info.text contains an additional entry'
+              else
+                _td 'committee-info.text contains additional entries'
+	      end
+            else
+              _td 'multiple differences found'
+            end
+          end
+
+        end
+      end
+    end
+
+  end
+end
diff --git a/www/classic/roster/committer.cgi b/www/classic/roster/committer.cgi
new file mode 100755
index 0000000..ca0cc8a
--- /dev/null
+++ b/www/classic/roster/committer.cgi
@@ -0,0 +1,321 @@
+#!/usr/bin/ruby1.9.1
+
+require 'wunderbar'
+require 'whimsy/asf'
+
+exceptions = %w(hudson-jobadmin).map {|name| ASF::Committee.find name}
+
+# location of pgp keys
+COMMITTER_KEYS = "https://people.apache.org/keys/committer/%s.asc"
+
+# extract committer email from uri
+if ENV['REQUEST_URI'] =~ /committer\/(.+?)(\?|$)/
+  ENV['QUERY_STRING'] = "email=#{CGI::escape($1)}@apache.org"
+end
+
+_json do
+  person = ASF::Person.find_by_email(@email)
+  if person
+    _availid person.id
+    _name person.public_name
+    _emails person.all_mail
+    _urls person.urls
+    _committees person.committees.map(&:name)
+    _member person.asf_member?
+    _banned person.banned? if person.banned?
+    _pgpkeys (person.pgp_key_fingerprints || [])
+    _groups person.groups.map(&:name)
+    _auth person.auth
+  end
+end
+
+_text do
+  person = ASF::Person.find_by_email(@email)
+  if person
+    _ "AvailId:    #{person.id}"
+    _ "Member:     #{person.asf_member?}"
+    if person.committees.empty?
+      _ "Committees: -"
+    else
+      _ "Committees: #{person.committees.map(&:name).sort.join(' ')}"
+    end
+  end
+end
+
+_html do
+  _head_ do
+    @email = @email.strip.sub(/^mailto:/, '').strip if @email
+    if @email.to_s =~ /(.*)@apache.org$/
+      _title "Apache committer - #{$1}"
+    else
+      _title 'Apache email address lookup'
+    end
+    _meta charset: 'utf-8'
+    _style %{
+      h2 {margin-bottom: 0}
+      table ul {margin: 0; padding: 0; list-style: none}
+      table {border-spacing: 0 1em}
+      td:first-child {text-align: right; padding: 0}
+      td:first-child:after {content: ' \u2014'}
+      td:last-child {border-left: solid 1px #000; padding: 0 0.5em}
+      table {padding-left: 1.5em}
+      .issue {color: red; font-weight:bold}
+    }
+
+    _script %q{
+      function trim_email(e) {
+        return e.replace(/^\s+/, '').replace(/\s+$/, '').replace(/^mailto:/, '');
+      }
+    }
+  end
+
+  _body? do
+    # common banner
+    _a href: 'https://whimsy.apache.org/' do
+      _img title: "ASF Logo", alt: "ASF Logo", 
+        src: "https://id.apache.org/img/asf_logo_wide.png"
+    end
+
+    # header based on URI and http method employed
+    if @email.to_s.empty?
+      # display form (and matching header) if no email was provided, or this
+      # page was the result of a post (presumably from the form)
+      _h1_ 'Apache email address lookup'
+
+      _form method: 'post' do
+        _input id: 'email', name: 'email', type: 'email', value: @email,
+          onchange: 'value = trim_email(value);'
+      end
+    else
+      # individual committer page
+      _h2_ @email
+    end
+
+    unless @email.to_s.empty?
+      # individual committer page - start by looking up email address
+      person = ASF::Person.find_by_email(@email)
+
+      if person
+        _table do
+	  if person.id == 'notinavail'
+            _tr_ do
+	      _td 'name'
+	      _td ASF::ICLA.find_by_email(@email).name
+            end
+	  else
+            # committer's availid - but only if the email is non apache.org
+            unless @email =~ /@apache.org$/
+              _tr_ do
+                _td 'id'
+                _td person.id
+              end
+            end
+
+            # display name (typically from iclas.txt)
+            _tr_ do
+              _td 'name'
+              if person.icla
+                _td person.public_name
+              else
+                _td person.public_name || 'Not Found', class: 'issue', 
+                  title: 'No ICLA on file'
+              end
+            end
+
+            # membership information (from members.txt)
+            if person.asf_member? or person.icla
+              _tr_ do
+                _td 'ASF Member'
+                _td person.asf_member?
+              end
+            end
+
+            # personal urls
+            unless person.urls.empty?
+              _tr_ do
+                _td 'Personal URL'
+                _td do
+		  _ul do
+		    person.urls.each do |url|
+		      _li {_a url, href: url}
+		    end
+		  end
+                end
+              end
+            end
+
+            # if user is banned, flag this
+            if person.banned?
+              _tr_ do
+                _td 'login'
+                _td 'disabled', class: 'issue'
+              end
+            end
+
+            # list of committees that this committer is a member of (from ldap)
+            unless (person.committees-exceptions).empty?
+              _tr_ do
+                _td 'Committees'
+                _td do
+	          _ul do
+	            person.committees.sort_by(&:name).each do |committee|
+                      next if exceptions.include? committee
+                      name = committee.name 
+		      _li do
+                        if person.groups.any? {|group| group.name == name}
+                          _a name, href: "../committee/#{name}"
+                        else
+                          if committee.members.empty?
+                            _a name, href: "../committee/#{name}",
+                              title: "not in corresponding LDAP group"
+                          else
+                            _a name, href: "../committee/#{name}",
+                              title: "not in corresponding LDAP group",
+                              class: 'issue'
+                          end
+                        end
+                        _ '(chair)' if committee.chair == person
+                      end
+		    end
+		  end
+	        end
+              end
+            end
+
+            # list of groups that this committer is a member of (from ldap)
+            groups =  person.groups.select do |group| 
+              not person.committees.any? {|cmt| cmt.name == group.name}
+            end
+
+            unless groups.empty?
+              _tr_ do
+                _td 'Groups'
+                _td do
+	          _ul do
+	            groups.sort_by(&:name).each do |group|
+		      _li group.name
+		    end
+		  end
+	        end
+              end
+            end
+
+            # list of other authorities that this individual has
+            # (from asf-authorization-template)
+            auth = person.auth
+            exceptions.each do |exception| 
+              auth << exception.name if person.committees.include? exception
+            end
+            unless auth.empty?
+              _tr_ do
+                _td 'Auth'
+                _td do
+	          _ul do
+	            auth.sort.each do |group|
+		      _li group
+		    end
+		  end
+	        end
+              end
+	    end
+
+            if person.pgp_key_fingerprints
+              require 'net/https'
+              person.id.untaint if person.id =~ /^\w+/
+              uri = URI.parse(COMMITTER_KEYS % person.id)
+              _tr_ do
+                _td 'PGP Key'
+                found = false
+	        http = nil
+                begin
+		  http = Net::HTTP.new(uri.host, uri.port)
+		  http.use_ssl = true if uri.scheme == 'https'
+		  http.verify_mode = OpenSSL::SSL::VERIFY_NONE
+		  found = true if http.head(uri.path).code == '200'
+		ensure
+		  http.finish if http and http.started?
+		end
+                _td do
+                  _ul do
+                    person.pgp_key_fingerprints.each do |pgpkey|
+		      if found
+                        _li {_a pgpkey, href: uri}
+		      else
+                        _li pgpkey
+		      end
+                    end
+                  end
+                end
+              end
+            end
+
+            if ASF::Person.new($USER).asf_member?
+              emails = person.all_mail
+              emails.delete "#{person.id}@apache.org"
+              unless emails.empty?
+                _tr_ do
+                  _td 'Email addresses'
+                  _td do
+	            _ul do
+	              emails.sort.each do |email|
+                        if person.obsolete_emails.include? email
+		          _li {_del email}
+                        else
+		          _li email
+                        end
+		      end
+		    end
+		  end
+                end
+	      end
+
+              if person.asf_member?
+                if person.members_txt
+                  _tr_ do
+                    _td 'members.txt'
+                    _td { _pre " *) " + person.members_txt.strip }
+                  end
+                end
+              elsif person.member_nomination
+                _tr_ do
+                  _td do
+                   _a 'nominated-members', href: 'https://svn.apache.org/repos/private/foundation/Meetings/20130521/nominated-members.txt'
+                  end
+                  _td { _pre person.member_nomination.chomp }
+                end
+              elsif person.member_watch
+                _tr_ do
+                  _td do
+                   _a 'potential-member-watch', href: 'https://svn.apache.org/repos/private/foundation/potential-member-watch-list.txt'
+                  end
+                  _td { _pre person.member_watch.chomp }
+                end
+              end
+            end
+	  end
+        end
+      else
+        _p "not found"
+      end
+    end
+
+    # additional links (note some are member only)
+    _h2_ 'Sources'
+    _ul do
+      _li do
+        _a 'id.apache.org', href: 'https://id.apache.org/'
+      end
+      if ASF::Person.new($USER).asf_member?
+        _li do
+          _a 'members.txt', href: 'https://svn.apache.org/repos/private/foundation/members.txt'
+        end
+        _li do
+          _a 'iclas.txt', href: 'https://svn.apache.org/repos/private/foundation/officers/iclas.txt'
+        end
+        _li do
+          _a 'asf-authorization-template', href: 'https://svn.apache.org/repos/infra/infrastructure/trunk/subversion/authorization/asf-authorization-template'
+        end
+      end
+    end
+  end
+end
diff --git a/www/classic/roster/modify_group_member.cgi b/www/classic/roster/modify_group_member.cgi
new file mode 100755
index 0000000..9f90a7c
--- /dev/null
+++ b/www/classic/roster/modify_group_member.cgi
@@ -0,0 +1,245 @@
+#!/usr/bin/ruby1.9.1
+
+require 'wunderbar'
+require 'whimsy/asf'
+require 'ldap'
+
+exceptions = %w(hudson-jobadmin).map {|name| ASF::Committee.find name}
+
+
+# The following is needed to cover the differences between POST,GET and params
+# using e.g. @project is nullified by _html_
+cgi = CGI.new
+xProject = cgi['project']
+xPerson  = cgi['person']
+xType    = cgi['type']
+xAction  = cgi['action']
+# and this is to make string handling easier
+xProject = '' if xProject.nil?
+xPerson  = '' if xPerson.nil?
+xType    = '' if xType.nil?
+xAction  = '' if xAction.nil?
+
+
+# do not allow execution in production
+unless cgi.host.nil? or cgi.host =~ /^192[.]168/
+  print "Status: 401 Unauthorized\r\n"
+  exit
+end
+
+
+# test parameters
+if xProject == '' and xPerson == '' and xAction == '' and xType == ''
+  error = 'show'
+else
+  if  xProject == ''          or  xPerson  == ''       or 
+     (xAction  != 'add'       and xAction != 'remove') or
+     (xType    != 'committee' and xType   != 'group' )
+    error = "wrong params in cgi call"
+  end
+end
+
+
+# check user/group exist in LDAP
+def runLDAPcheck(lType, lProject, lPerson, lAction)
+  # verify that project or group exist
+  if lType == 'committee'
+    mySel = ASF::Committee.find(lProject)
+  else
+    mySel = ASF::Group.find(lProject)
+  end
+  if mySel.nil?
+    return "name: #lProject not found in apache/ldap"
+  end
+ 
+  # verify that person exist (NOT done for group/remove)
+  if !(lAction == 'remove' and lType == 'group')
+    myUser = ASF::Person.find(lPerson)
+    if myUser.nil?
+      return "person: #lPerson not found in apache/ldap"
+    end
+  end
+end
+
+def runLDAPmodify
+  ldap = LDAP::Conn.new('localhost', 1636)
+  print "\nConn done\n"
+  print ldap.perror("conn")
+  print "\ntesting bind\n"
+
+  # bind ldap instance to defined user
+  ldap.bind('uid=USER,dc=apache,dc=org', 'PASSWORD')
+  print ldap.perror("bind")
+
+
+# BIND fails with ssh -L, --- the rest of this func is not tested ---
+
+#  rescue LDAP::ResultError=>re
+#    return  "Error new LDAP server: message: ["+ re.message + "]"
+  ldap.unbind
+  return 'SSLCon is ok'
+
+
+  # set filter
+#  @response = @ldap.search(@xProject, 'base', ['member', 'memberUid'], 'cn=*')
+# This is not done, because LDAP gives error if xPerson does not exist (remove)
+# and also if person already exist (add)
+
+#  if xAction == 'add'
+#    @myModType = new LDAP::mod_type(LDAP_MOD_ADD)
+#  else
+#    @myModType = new LDAP::mod_type(LDAP_MOD_DELETE)
+#  end
+ 
+#  if @xType == 'group'
+#    @myMod = new LDAP::mod(@myModType, 'memberUid' ,@xPerson)
+#  else
+#    @myMod = new LDAP::mod(@myModType, 'member' ,@xPerson)
+#  end
+
+#  @ldap.unbind
+
+
+#Ruby and rubygem, has no standard method for sending mail.
+
+#OLD TO BE DONE
+#   my $date = gmtime;
+#   open my $sendmail, "|-", "/usr/sbin/sendmail -oi -t -odq"
+#       or die "Can't open sendmail: $!";
+#   print $sendmail <<EOH;
+#To: <$opt_notify>
+#From: "$uname" <$u...@apache.org>
+#Subject: LDAP $action on $groupdn
+#Date: $date +0000
+#
+#Members acted on:
+#EOH
+#    print $sendmail "$_\n" for @members;
+#
+#    if ($opt_filter) {
+#        if ($opt_rm and not @members) {
+#            print $sendmail "$_\n" for sort keys %oldmember;
+#        }
+#        print $sendmail <<EOH;
+#
+#Filtered members:
+#EOH
+#        print $sendmail "$_\n" for @filtered;
+#
+#    }
+#
+#    close $sendmail or die "Sendmail failed: " . ($! || $? >> 8) . "\n";
+#    print "Notification sent to <$opt_notify>.\n";
+#}
+end
+
+
+def runExecute
+  return 'jan was in runExecute'
+  # verify that project or group exist
+  if @type == 'committee'
+    mySel = ASF::Committee.new(project)
+  else
+    mySel = ASF::Group.new(project)
+  end
+  unless mySel
+    return "name: #@project not found in apache/ldap"
+  end
+
+  # verify that person exist (NOT done for group/remove)
+  if !(@action == 'remove' and @type == 'group')
+    myUser = ASF::Person.new(person)
+    unless myUser
+      return "Person #@person not found in apache/ldap"
+    end
+  end
+end
+
+
+# if no errors check user 
+if error.nil?
+  error = runLDAPcheck(xType, xProject, xPerson, xAction)
+end
+
+# if no errors execute modify user 
+if error.nil?
+  error = runLDAPmodify
+end
+
+
+_html do
+  _head_ do
+     _title_ 'Apache modify ' + xProject + ' ' + xAction + ' ' + xType + ' ' + xPerson
+    _meta charset: 'utf-8'
+    if error.nil?
+      _style %{ body {background-color: #00ff00;} }
+    else
+      if error == 'show'
+        _style %{ body {background-color: #ffffff;} }
+      else
+        _style %{ body {background-color: #0000ff;} }
+      end
+    end
+  end
+
+  _body? do
+    # common banner
+    _a href: 'https://id.apache.org/' do
+      _img title: "Logo", alt: "Logo", 
+        src: "https://id.apache.org/img/asf_logo_wide.png"
+    end
+
+    if error.nil?
+      _text xPerson
+      _h1_ xPerson + ' ' + xAction + ' to/from ' + xType + ' in ' + xProject + ' with SUCCESS!'
+    else
+      _h1_ 'modify user' 
+      if error != 'show'
+        _text_ 'problem: ' + error
+        _br_
+        _text_ 'please correct'
+        _br_
+      end
+
+      _form method: 'post' do
+        _table do
+          _tr do
+            _td_ 'project:'
+            _td colspan: 2 do
+              _input_ type: 'text', name: 'project', value: xProject, required: true
+            end
+          end
+          _tr do
+            _td_ 'person:'
+            _td colspan: 2 do
+              _input_ type: 'text', name: 'person', value: xPerson, required: true
+            end
+          end
+          _tr do
+            _td_ 'type:'
+            _td do
+              _input_ type: "radio", name: "type", value: "group", required: true, checked: xType == 'group'
+              _ 'group'
+            end
+            _td do
+              _input_ type: "radio", name: "type", value: "committee", required: true, checked: xType == 'committee'
+              _ 'committee' 
+            end
+          end
+          _tr do
+            _td_ 'action:'
+            _td do
+              _input_ type: "radio", name: "action", value: "add", required: true, checked: xAction == 'add'
+              _ 'add'
+            end
+            _td do
+              _input_ type: "radio", name: "action", value: "remove", required: true, checked: xAction == 'remove'
+              _ 'remove'
+            end
+          end
+        end
+        _input_ type: 'submit', value: 'Submit Request'
+      end
+    end 
+  end
+end
diff --git a/www/committers/X_______.cgi b/www/committers/X_______.cgi
new file mode 120000
index 0000000..552c160
--- /dev/null
+++ b/www/committers/X_______.cgi
@@ -0,0 +1 @@
+../../infra/committers/X_______.cgi
\ No newline at end of file
diff --git a/www/committers/subscribe.cgi b/www/committers/subscribe.cgi
new file mode 100755
index 0000000..3e9cf79
--- /dev/null
+++ b/www/committers/subscribe.cgi
@@ -0,0 +1,147 @@
+#!/usr/bin/ruby1.9.1
+require 'wunderbar'
+require 'mail'
+require 'whimsy/asf'
+require 'whimsy/asf/podlings'
+require 'whimsy/asf/site'
+require 'time'
+
+$SAFE = 1
+
+FORMAT_NUMBER = 3 # json format number
+
+user = ASF::Person.new($USER)
+# authz handled by httpd
+
+# TODO dedup, copied from mlreq
+class Podlings
+  def self.list
+    return @list if @list
+    # extract the names of podlings (and aliases) from podlings.xml
+    require 'nokogiri'
+    incubator_content = ASF::SVN['asf/incubator/public/trunk/content']
+      current = Nokogiri::XML(File.read("#{incubator_content}/podlings.xml")).
+      search('podling[status=current]')
+    podlings = current.map {|podling| podling['resource']}
+    podlings += current.map {|podling| podling['resourceAliases']}.compact.
+      map {|names| names.split(/[, ]+/)}.flatten
+    @list = podlings
+  end
+end
+
+lists = ASF::Mail.lists
+lists.delete_if {|list| list =~ /^(ea|secretary|president|treasurer|chairman|committers$)/ }
+lists.delete_if {|list| list =~ /(^|-)security$|^security(-|$)/ }
+
+pmcs = ASF::Committee.list.map(&:mail_list)
+seen = Hash.new
+lists.each do |list|
+  seen[list] = 0
+  seen[list] = 1 if pmcs.include? list.split('-').first
+  seen[list] = 2 if Podlings.list.include? list.split('-').first
+  seen[list] = 2 if (list.split('-').first == 'incubator') \
+                    && (Podlings.list.include? list.split('-')[1])
+end
+
+unless user.asf_member?
+  # non-members only see specifically whitelisted foundation lists as well
+  # as all non-private committee lists
+  whitelist = ['infrastructure', 'jobs', 'site-dev', 'committers-cvs',
+     'site-cvs', 'concom', 'party']
+  lists.delete_if {|list| seen[list] < 1 and not whitelist.include? list}
+  lists.delete_if {|list| list =~ /-private$/}
+  lists += ['board'] if ASF.pmc_chairs.include? user
+end
+
+lists.sort!
+
+addrs = (["#{$USER}@apache.org"] + user.mail + user.alt_email)
+
+_html do
+  _head_ do
+    _title 'ASF Mailing List Self-subscription'
+  end
+  _body? do
+    if _.post?
+      unless addrs.include? @addr and lists.include? @list
+        _h2_.error "Invalid input"
+        break
+      end
+      Dir.chdir '/var/tools/infra/subreq'
+      `svn update --non-interactive`
+      fn = "#{$USER}-#{@list}-#{Time.now.strftime '%Y%m%d-%H%M%S-%L'}.json".untaint
+      if File.exist? fn
+        _h2_.error "Too many concurrent requests"
+        break
+      end
+
+      vars = {
+        version: FORMAT_NUMBER,
+        availid: $USER,
+        addr: @addr,
+        listkey: @list,
+        # f3
+        member_p: user.asf_member?,
+        chair_p: ASF.pmc_chairs.include?(user),
+      }
+      request = JSON.pretty_generate(vars) + "\n"
+      _pre request
+
+      # commit it
+      File.open(fn, 'w') { |file| file.write request }
+      _.system(['svn', 'add', '--', fn])
+      _.system [
+        'svn', 'commit', ['--no-auth-cache', '--non-interactive'],
+        '--with-revprop', "whimsy:author=#{$USER}",
+        '-m', "#{@list}@ += #{$USER}",
+        (['--username', $USER, '--password', $PASSWORD] if $PASSWORD),
+        '--', fn
+      ]
+      _ 'Request successful. You will be subscribed within the hour.'
+    end
+    unless _.post?
+    end
+    _form method: 'post' do
+      _fieldset do
+        _legend 'ASF Mailing List Self-subscription'
+
+        _label 'Subscribe'
+        _select name: 'addr' do
+          addrs.each do |addr|
+            _option addr
+          end
+        end
+
+        _ 'to'
+        _select name: 'list' do
+          seen = Hash.new
+          lists.each do |list|
+            seen[list] = 0
+            seen[list] = 1 if pmcs.include? list.split('-').first
+            seen[list] = 2 if Podlings.list.include? list.split('-').first
+            seen[list] = 2 if (list.split('-').first == 'incubator') \
+                              && (Podlings.list.include? list.split('-')[1])
+          end
+          _option '--- Foundation lists ---', disabled: 'disabled'
+          lists.find_all { |list| seen[list] == 0 }.each do |list|
+            _option list
+          end
+          _option '--- Top-Level Projects ---', disabled: 'disabled'
+          lists.find_all { |list| seen[list] == 1 }.each do |list|
+            _option list
+          end
+          _option '--- Podlings ---', disabled: 'disabled'
+          lists.find_all { |list| seen[list] == 2 }.each do |list|
+            _option list
+          end
+        end
+        _input type: 'submit', value: 'Submit Request'
+      end
+    end
+    _ 'Only your forwarding address and registered alternates are listed.'
+    _ 'Visit'
+    _a 'https://id.apache.org/', href: "https://id.apache.org/details/#{$USER}"
+    _ 'to add or remove forwarding or alternate addresses.'
+    _br
+  end
+end
diff --git a/www/favicon.ico b/www/favicon.ico
new file mode 100644
index 0000000..f0c22ad
Binary files /dev/null and b/www/favicon.ico differ
diff --git a/www/fundraising/invoice.cgi b/www/fundraising/invoice.cgi
new file mode 100755
index 0000000..0c35858
--- /dev/null
+++ b/www/fundraising/invoice.cgi
@@ -0,0 +1,481 @@
+#!/usr/bin/ruby1.9.1
+# encoding: utf-8
+require 'wunderbar'
+require "date"
+require "yaml"
+
+require 'whimsy/asf'
+require 'whimsy/asf/podlings'
+require 'whimsy/asf/site'
+user = ASF::Person.new($USER)
+unless user.asf_member? or ASF.pmc_chairs.include? user or $USER=='ea'
+  print "Status: 401 Unauthorized\r\n"
+  print "WWW-Authenticate: Basic realm=\"ASF Members and Officers\"\r\n\r\n"
+  exit
+end
+
+HISTORY = '/var/tools/invoice'
+if %r{/(?<invoice>\d+)(\.\w+)?$} =~ ENV['PATH_INFO']
+  if File.exist? "#{HISTORY}/#{invoice.untaint}"
+    form = YAML.load_file("#{HISTORY}/#{invoice.untaint}")
+    ENV['QUERY_STRING'] =
+      form.map {|k,v| "#{k}=#{CGI.escape(v.first)}"}.join("&") if form
+  end
+end
+
+_html do
+  _head_ do
+    _title "ASF Invoice #{invoice}"
+    _style %{
+      .c1 {padding-top:2pt;margin-right:9pt;text-align:right;padding-bottom:2pt}
+      .c5 {vertical-align:top;width:51.8pt}
+      .c7 {vertical-align:top;width:134.1pt;border-style:solid;background-color:#f2f2f2;border-color:#888;border-width:1pt;padding:0pt 3.6pt 0pt 3.6pt}
+      table {border-collapse:collapse}
+      tr {height: 15pt}
+      .c10 {vertical-align:top;width:76.5pt;border-style:solid;border-color:#888;border-width:1pt;padding:0pt 3.6pt 0pt 3.6pt}
+      .c11 {vertical-align:top;width:72pt;border-style:solid;border-color:#888;border-width:1pt;padding:0pt 3.6pt 0pt 3.6pt}
+      .c13 {color:#404040}
+      .c15 {vertical-align:top;width:396pt;border-style:solid;border-color:#888;border-width:1pt;padding:0pt 3.6pt 0pt 3.6pt}
+      .c16 {vertical-align:top;width:67.5pt;padding:0pt 3.6pt 0pt 3.6pt}
+      .c17 {padding-top:2pt;padding-bottom:4pt}
+      .c18 {vertical-align:top;width:267.8pt;padding:0pt 3.6pt 0pt 3.6pt}
+      .c20 {vertical-align:top;width:267.8pt}
+      .c21 {text-align:right}
+      .c23 {width:287.2pt;padding:0pt 3.6pt 0pt 3.6pt}
+      .c26 {width:220.5pt}
+      .c29 {padding-top:2pt;text-align:center;padding-bottom:2pt}
+      .c30 {margin: 1em 5em}
+      th {font-size: 10pt; font-weight: normal; }
+      p {min-height:9pt;font-size:9pt;margin:0;font-family:Verdana}
+      form, img {margin-left: auto; margin-right: auto; display: block; padding-bottom: 10pt}
+      body {max-width:540pt; padding:0 36pt}
+      input, textarea {width: 300pt}
+      input[name=total] {background-color: #8e8; color: #000; border: outset 1px; padding: 2px; border-radius: 0.3em}
+      input[type=button] {width: 73pt}
+      .index {border-spacing: 20px 5px; border-collapse: separate}
+      .index th {border-bottom: solid black}
+      .index input[type=submit] {width: 10em; display: block; margin-left: auto; margin-right: auto}
+      .buttons a {text-decoration: none}
+      .buttons button {width: 100pt}
+    }
+
+    _script src: '/jquery.min.js'
+    _script src: '/jquery-ui.min.js'
+  end
+
+  _body? do
+    _img alt: "Logo", src: "https://id.apache.org/img/asf_logo_wide.png"
+
+    _svg width: '100%', height: 30 do
+      _path d: 'M0,0h230v14h-230z', fill: '#636'
+      _path d: 'M245,0h230v14h-230z', fill: '#996'
+      _path d: 'M490,0h230v14h-230z', fill: '#669'
+    end
+
+    invoice ||= @invoice_number
+    invoice ||= Dir.chdir(HISTORY) {Dir['*'].max || 1000}.succ
+    @invoice_number = nil if ENV['REQUEST_URI'].end_with? '?'
+
+    base = ENV['REQUEST_URI'].dup
+    base.chomp! ENV['QUERY_STRING']
+    base.chomp! '?'
+    base.chomp! ENV['PATH_INFO']
+
+    if ENV['PATH_INFO'].to_s.end_with? '/'
+
+      _table_.index do
+        _thead_ do
+          _tr do
+            _td colspan: 4 do
+              _form action: "#{base}/#{invoice}" do
+                _input type: 'submit', value: 'New Invoice' 
+              end
+            end
+          end
+          _tr do
+            _th 'Invoice'
+            _th 'Date'
+            _th 'Customer'
+            _th 'Amount'
+          end
+        end
+        _tbody do
+          Dir.chdir(HISTORY) do
+            Dir['*'].sort.reverse.each do |invoice|
+              form = YAML.load_file("#{HISTORY}/#{invoice.untaint}")
+              if form
+                _tr_ do
+                  _td {_a invoice, href: invoice}
+                  _td Date.parse(form['date'].first)
+                  _td form['customer'].first
+                  _td.c21 form['total'].first.sub('$ ', '')
+                end
+              end
+            end
+          end
+        end
+      end
+
+    elsif not @invoice_number and not _.pdf?
+
+      start = Date.today
+      finish = Date.new(start.year+1, start.month, start.day)-1
+
+      _form_ method: 'post', action: "#{base}/#{invoice}" do
+        _table style: 'margin-left: auto; margin-right: auto' do
+          _tr.presets! style: 'display: none' do
+            _td 'Presets'
+            _td do
+              _input type: 'button', value: 'Bronze',   'data-amount' => 5_000
+              _input type: 'button', value: 'Silver',   'data-amount' => 20_000
+              _input type: 'button', value: 'Gold',     'data-amount' => 40_000
+              _input type: 'button', value: 'Platinum', 'data-amount' => 100_000
+            end
+          end
+
+          _tr do
+            _td 'E-Mail'
+            _td do
+              _input type: 'email', name: 'email', 
+                value: @email || 'fundraising@apache.org'
+            end
+          end
+
+          _tr do
+            _td 'Invoice Number'
+            _td { _input name: 'invoice_number', value: invoice}
+          end
+
+          _tr do
+            _td 'Customer Name'
+            _td do
+              _input name: 'customer', value: @customer,
+                required: true, autofocus: true
+            end
+          end
+
+          _tr do
+            _td 'Purchase Order #'
+            _td { _input name: 'po_number', value: @po_number }
+          end
+
+          _tr do
+            _td 'Bill to'
+            _td { _textarea @bill_to, name: 'bill_to', rows: 6, required: true }
+          end
+
+          _tr do
+            _td 'Item Description'
+            _td do
+              _textarea @item, name: 'item', rows: 6, required: true,
+                placeholder: "quantity - description @ $ price"
+            end
+          end
+
+          _tr do
+            _td 'Amount'
+            _td do
+              _input name: 'total', value: "#{@total or '$ 0'}"
+            end
+          end
+        end
+
+        _input name: 'date', type: 'hidden', value: start.strftime("%B %d, %Y")
+
+        _input type: 'submit', value: 'Save', style: 'margin-top: 1em; 
+          width: 10em; display: block; margin-left: auto; margin-right: auto'
+      end
+
+      _div.instructions! do
+        _h4 'Instructions:'
+        _p.c30 do
+          _'The'
+          _em 'Amount'
+          _ 'field contains the sum of the dollar amounts entered in the'
+          _em 'Item Description'
+          _ 'field.'
+        end
+        _p.c30 do
+          _ 'To have the dollar amount placed in the third column of the'
+          _ 'invoice form, place it at the end of the line preceeded by an'
+          _em '@'
+          _ 'sign.'
+        end
+        _p.c30 do
+          _ 'To enter a quantity, start the line with an integer followed by a'
+          _em '-'
+          _ '(dash) character.'
+        end
+      end
+
+      _script %{
+        $('#presets').show();
+        $('#presets input[type=button]').click(function() {
+          var amount = '$ ' + $(this).attr('data-amount');
+          amount = amount.toString().replace(/(\\d)(?=(\\d\\d\\d)+$)/g, "$1,");
+          var item = "2013 " + $(this).val() + " Sponsorship @ " + 
+            amount + "\\n\\n";
+          item += "Start Date: #{start.strftime("%B %d, %Y")}\\n\";
+          item += "End Date: #{finish.strftime("%B %d, %Y")}\\n";
+          $('textarea[name=item]').val(item).keyup();
+          if ($('input[name=customer]').val() == '') {
+            $('input[name=customer]').focus();
+          }
+        });
+
+        $('textarea[name=item]').keyup(function() {
+          var total = 0;
+
+          // Process each line in turn
+          var lines = $(this).val().match(/[^\\r\\n]+/g);
+          for (var i=0; lines && i<lines.length; i++) {
+             var line = lines[i];
+
+             // Look for a $price at the end
+             var price = line.match(/\\$\\s?([,\\d]+(\\.\\d\\d)?)$/);
+             if (price && price.length > 0) {
+                // Bingo, it's a price one
+                var amt = parseFloat(price[1].replace(/,/,''));
+
+                // Did they give a quantity at the start?
+                var qty = line.match(/^(\\d+)\\s*[\\@\\-]/);
+                if (qty && qty.length > 0) {
+                   // This is a "quantity - text @ $price"
+                   var quantity = parseInt( qty[1] );
+                   total += (quantity * amt);
+                } else {
+                   // This is a "text $price"
+                   total += amt;
+                }
+             }
+          }
+ 
+          // Turn it into a $ figure with commas
+          // TODO Support other currencies
+          total = total.toFixed(2);
+          total = total.replace(/(\\d)(?=(\\d\\d\\d)+[$\\.])/g, "$1,");
+
+          if ($('input[name=total]').val() != '$ ' + total) {
+            $('input[name=total]').stop().css('backgroundColor', '#FF0').
+              val('$ ' + total).animate({'backgroundColor': '#8e8'}, 1000);
+            $("input[type=submit]").attr('disabled', (total=='0'));
+          }
+        }).keyup();
+
+        $("input[name=invoice_number],input[name=total]").
+          focus(function(){ $(this).blur(); });
+      }
+
+    else
+
+      _table_ do
+        unless _.pdf?
+          _thead_ do
+            _tr do
+              _th.buttons colspan: 2 do
+                _a href: "#{base}/#{invoice}?" do
+                  _button 'Edit' 
+                end
+                _a href: "#{base}/#{invoice}.pdf" do
+                  _button 'Generate PDF' 
+                end
+              end
+            end
+          end
+        end
+
+        _tbody do
+          _tr do
+            _td style: "width: 270pt; color: #006" do
+              _p "Dept. 9660"
+              _p "Los Angeles, CA 90084-9660, USA"
+              _p "E-mail: #{@email ||'fundraising@apache.org'}"
+              _p "US IRS Tax/EIN: 47-0825376"
+            end
+            _td style: "width: 270pt; text-align: right" do
+              _p "Invoice", style: "font-size: 28pt; color: #636"
+              _p @date
+            end
+          end
+        end
+      end
+
+      _p
+
+      _table_ do
+        _tbody do
+          _tr do
+            _td.c26 do
+              _table do
+                _tbody do
+                  _tr do
+                    _td.c16 do
+                      _p "Invoice No.", class: "c17 c13"
+                    end
+                    _td.c23 do
+                      _p @invoice_number
+                    end
+                  end
+
+                  _tr do
+                    _td.c16 do
+                      _p "Customer:", class: "c17 c13"
+                    end
+                    _td.c23 do
+                      _p @customer
+                    end
+                  end
+
+                  if @po_number and not @po_number.empty?
+                    _tr do
+                      _td.c16 do
+                        _p "Reference:", class: "c17 c13"
+                      end
+                      _td.c23 do
+                        _p "PO##{@po_number}"
+                      end
+                    end
+                  end
+                end
+              end
+            end
+            _td.c5
+            _td.c20 do
+              _table do
+                _tbody do
+                  _tr do
+                    _td.c18 do
+                      _p 'Bill To:', class: "c17 c13"
+                    end
+                  end
+
+                  _tr do
+                    _td.c18 do
+                      @bill_to.lines.each do |line|
+                        _p line.chomp
+                      end
+                    end
+                  end
+                end
+              end
+            end
+          end
+        end
+      end
+
+      _p style: 'height: 30pt'
+
+      _table_ do
+        _thead do
+          _tr do
+            _th 'Quantity', class: "c11"
+            _th 'Item', class: "c15"
+            _th 'Total', class: "c11"
+          end
+        end
+        _tbody do
+          @item.lines.each do |line|
+            line.gsub!(/^(\d+)\s-\s*/,'')
+            quantity = $1
+
+            if line.match(/[-@]?\s?\$\s?([,\d\.]+)$/)
+	      amt = $1.gsub(',', '')
+	      quantity ||= '1'
+	      price = quantity.to_i * amt.to_f
+
+	      # Format the float as a 2dp number
+	      price = "%0.2f" % price
+
+	      # Now make it look pretty with commas
+	      price = price.gsub(/(\d)(?=(\d\d\d)+(?!\d))/, '\1,')
+            else
+              quantity = price = '' 
+            end
+
+            _tr do
+              _td.c11 do
+                _p.c29 quantity
+              end
+              _td.c15 do
+                _p.c17 line.chomp
+              end
+              _td.c10 do
+                _p.c1 price
+              end
+            end 
+          end
+          (10-@item.lines.count).times do
+            _tr do
+              _td.c11
+              _td.c15
+              _td.c10
+            end
+          end
+        end
+      end
+
+      _p
+      
+      _table_ style: "margin-left: auto" do
+        _tbody do
+          _tr do
+            _td.c7 do
+              _p "Subtotal:", class: "c17 c21 c13"
+            end
+            _td.c10 do
+              _p.c1 @total
+            end
+          end
+          _tr do
+            _td.c7 do
+              _p 'Tax:', class: "c17 c21 c13"
+            end
+            _td.c10 do
+              _p.c1 "-"
+            end
+          end
+          _tr do
+            _td.c7 do
+              _p 'Shipping:', class: "c17 c21 c13"
+            end
+            _td.c10 do
+              _p.c1 '-'
+            end
+          end
+          _tr do
+            _td.c7 do
+              _p "Miscellaneous:", class: "c17 c21 c13"
+            end
+            _td.c10 do
+              _p.c1 "-"
+            end
+          end
+          _tr do
+            _td.c7 do
+              _p "Balance Due:", class: "c17 c21 c13" 
+            end
+            _td.c10 do
+              _p.c1 @total
+            end
+          end
+        end
+      end
+
+      _div style: "margin-top: 30pt; color: #006" do
+        _p "Please make checks payable to “The Apache Software Foundation”."
+        _p
+        _p "Wire and ACH payments information:"
+        _p "Beneficiary: “Apache Software Foundation”"
+        _p "Routing #: 121 000 248 (for domestic wire or ACH)"
+        _p "SWIFT: WFBIUS6S (for international wire)"
+        _p "Account #: 3189163755"
+        _p "Wells Fargo Bank"
+      end
+
+      @invoice_number.untaint if @invoice_number =~ /^\d+$/
+      File.open("#{HISTORY}/#{@invoice_number}", 'w') do |file|
+        file.write params.to_yaml
+      end
+    end
+  end
+end
diff --git a/www/fundraising/prospects.cgi b/www/fundraising/prospects.cgi
new file mode 100755
index 0000000..907c160
--- /dev/null
+++ b/www/fundraising/prospects.cgi
@@ -0,0 +1,126 @@
+#!/usr/bin/ruby1.9.1
+require 'wunderbar'
+require 'whimsy/asf'
+require 'whimsy/asf/podlings'
+require 'whimsy/asf/site'
+require 'yaml'
+require 'date'
+
+user = ASF::Person.new($USER)
+unless user.asf_member? or ASF.pmc_chairs.include? user or $USER=='ea'
+  print "Status: 401 Unauthorized\r\n"
+  print "WWW-Authenticate: Basic realm=\"ASF Members and Officers\"\r\n\r\n"
+  exit
+end
+
+level= nil
+case ENV['PATH_INFO']
+when '/'
+  show = "ALL"
+  title = "All Prospect Actions"
+when "/today"
+  show = "ACTIVE"
+  title = "Prospect Actions due by Today"
+when "/this-week"
+  show = "THISWEEK"
+  title = "This week's Prospect Actions"
+else
+  show = "ALL"
+  title = "All Prospect Actions"
+end
+
+_html do
+  _head_ do
+    _title title
+    _style %{
+      th {border-bottom: solid black}
+      table {border-spacing: 1em 0.2em }
+      th span {float: right}
+      th span:after {padding-left: 0.5em; content: "\u2195"}
+      tr:hover {background-color: #FF8}
+      .headerSortUp span:after {content: " \u2198"}
+      .headerSortDown span:after {content: " \u2197"}
+      .remind {color: red}
+    }
+    _script src: '/jquery.min.js'
+    _script src: '/jquery.tablesorter.js'
+  end
+  _body? do
+    # common banner
+    _a href: 'https://whimsy.apache.org/' do
+      _img alt: "ASF Logo", src: "https://id.apache.org/img/asf_logo_wide.png"
+    end
+
+    _h1_ title
+    # parse prospect records
+    prospect_repo = 'private/foundation/Fundraising/prospects'
+    sponsorship_repo = 'private/foundation/Fundraising/sponsorship'
+    prospects = Dir["#{ASF::SVN[prospect_repo]}/*.yml"].map do |name| 
+      file = File.read(name.untaint)
+      file.gsub! /:\s*\?\s*\n/, ": '?'\n"    # make parseable
+      data = YAML.load(file)
+      next if String === data
+      basename = File.basename(name.untaint)
+      sponsor_file_path = "#{ASF::SVN[sponsorship_repo]}/#{basename}"
+      if File.exists?(sponsor_file_path)
+        sponsor_data = YAML.load(File.read(sponsor_file_path))
+      else
+        sponsor_data = {"name"=>basename}
+      end
+      [basename, data, sponsor_data]
+    end
+
+    _p do
+      _a "all", href: "all"
+      _ "|"
+      _a "due by today", href: "today"
+      _ "|"
+      _a "this week", href: "this-week"
+    end
+
+   _table_ do
+      _thead_ do
+        _tr do
+          _th 'By'
+          _th 'Date'
+          _th 'Prospect'
+          _th 'Comment'
+        end
+      end
+      _tbody do
+        count=0
+        prospects.compact.each do |file, data, sponsor|
+          actions = data['action']
+          if actions
+            actions.each do |action|
+              date = Date.parse(action['by-date'])
+              today = Date.today()
+              endofweek = (today + (5- today.cwday) %7)
+              next if show == "TODAY" and date > today
+              next if show == "THISWEEK" and date > endofweek
+              _tr_ do
+                _td action['by']
+                if date < today
+                  _td.remind action['by-date']
+                else
+                  _td action['by-date']
+                end
+                _td! do
+                  _div sponsor
+                  _a "#{sponsor['name']}", href: "https://svn.apache.org/repos/#{prospect_repo}/#{file}"
+                end
+                _td action['comment']
+              end
+              count=count+1
+            end
+          end
+        end
+      end
+    end
+ 
+    _script %{
+      $("table").tablesorter({sortList: [[0,1]]});
+      $('th').append('<span></span>');
+    }
+  end
+end
diff --git a/www/fundraising/sponsorship.cgi b/www/fundraising/sponsorship.cgi
new file mode 100755
index 0000000..5b88ae7
--- /dev/null
+++ b/www/fundraising/sponsorship.cgi
@@ -0,0 +1,156 @@
+#!/usr/bin/ruby1.9.1
+require 'wunderbar'
+require 'whimsy/asf'
+require 'whimsy/asf/podlings'
+require 'whimsy/asf/site'
+require 'yaml'
+require 'date'
+
+user = ASF::Person.new($USER)
+unless user.asf_member? or ASF.pmc_chairs.include? user or $USER=='ea'
+  print "Status: 401 Unauthorized\r\n"
+  print "WWW-Authenticate: Basic realm=\"ASF Members and Officers\"\r\n\r\n"
+  exit
+end
+
+level= nil
+case ENV['PATH_INFO']
+when '/'
+  show = "ALL"
+  title = "All Sponsors"
+when "/overdue"
+  show = "OVERDUE"
+  title = "Overdue Sponsors"
+when "/active"
+  show = "ACTIVE"
+  title = "Active Sponsors"
+when "/unclear"
+  show = "UNCLEAR"
+  title = "Sponsors of Unknown Status"
+else
+  show = "ALL"
+  level = ENV['PATH_INFO'][1,100]
+  title = "All Sponsors: #{level}"
+end
+
+_html do
+  _head_ do
+    _title title
+    _style %{
+      th {border-bottom: solid black}
+      table {border-spacing: 1em 0.2em }
+      th span {float: right}
+      th span:after {padding-left: 0.5em; content: "\u2195"}
+      tr:hover {background-color: #FF8}
+      .headerSortUp span:after {content: " \u2198"}
+      .headerSortDown span:after {content: " \u2197"}
+      .remind {color: red}
+    }
+    _script src: '/jquery.min.js'
+    _script src: '/jquery.tablesorter.js'
+  end
+  _body? do
+    # common banner
+    _a href: 'https://whimsy.apache.org/' do
+      _img alt: "Logo", src: "https://id.apache.org/img/asf_logo_wide.png"
+    end
+
+    _h1_ title
+    # parse sponsorship records
+    sponsorship = 'private/foundation/Fundraising/sponsorship'
+    sponsors = Dir["#{ASF::SVN[sponsorship]}/*.yml"].map do |name| 
+      file = File.read(name.untaint)
+      file.gsub! /:\s*\?\s*\n/, ": '?'\n"    # make parseable
+      data = YAML.load(file)
+      next if String === data
+      data['date'] ||= data['invoice date']  # make uniform
+      [File.basename(name), data]
+    end
+
+    _p do
+      _a "all", href: "all"
+      _ "|"
+      _a "overdue", href: "overdue"
+      _ "|"
+      _a "active", href: "active"
+      _ "|"
+      _a "unclear", href: "unclear"
+    end
+
+    _p do
+      _a "platinum", href: "platinum"
+      _ "|"
+      _a "gold", href: "gold"
+      _ "|"
+      _a "silver", href: "silver"
+      _ "|"
+      _a "bronze", href: "bronze"
+      _ "|"
+      _a "service", href: "service"
+      _ "|"
+      _a "event", href: "event"
+    end
+ 
+    _table_ do
+      _thead_ do
+        _tr do
+          _th 'Sponsorship Date'
+          _th 'Renewal Date'
+          _th 'Sponsor'
+          _th 'Level'
+          _th 'Status'
+        end
+      end
+
+      count = 0
+      _tbody do
+        sponsors.compact.each do |file, data|
+          next if show == "ACTIVE" and data['status'] != 'active'
+
+          startdate = data['sponsorship-start']
+          if startdate
+            startdate = Date.parse(startdate)
+            enddate = startdate.next_year
+            isoverdue = enddate < (Date.today + 62)
+          else
+            enddate = nil
+            isoverdue = false
+          end
+
+          next if show == "OVERDUE" and not isoverdue
+
+          next if show == "UNCLEAR" and (data['sponsorship-start']!=nil and data['status']!=nil)
+
+          next if not level.nil? and level != data['level']
+          _tr_ do
+            _td startdate
+            if data['level'] == "event"
+              _td "n/a"
+            elsif isoverdue and (data['status'] == "active" or data['status']=='')
+              _td.remind enddate
+            else
+              _td enddate
+            end
+
+            _td! do
+              _a data['name'], 
+                href: "https://svn.apache.org/repos/#{sponsorship}/#{file}"
+            end
+
+            _td data['level']
+            _td data['status']
+            count=count+1
+          end
+        end
+        if count == 0
+          _td "No sponsors found"
+        end
+      end
+    end
+
+    _script %{
+      $("table").tablesorter({sortList: [[0,1]]});
+      $('th').append('<span></span>');
+    }
+  end
+end
diff --git a/www/incubator/moderators.cgi b/www/incubator/moderators.cgi
new file mode 100755
index 0000000..19568a0
--- /dev/null
+++ b/www/incubator/moderators.cgi
@@ -0,0 +1,141 @@
+#!/usr/bin/ruby1.9.1
+require 'wunderbar'
+require 'whimsy/asf'
+require 'nokogiri'
+
+user = ASF::Person.new($USER)
+unless user.asf_member? or ASF::Committee['incubator'].members.include? user
+  print "Status: 401 Unauthorized\r\n"
+  print "WWW-Authenticate: Basic realm=\"ASF Members and Officers\"\r\n\r\n"
+  exit
+end
+
+SUBSCRIPTIONS = '/home/apmail/subscriptions/incubator-mods'
+PODLINGS = "#{ASF::SVN['asf/incubator/public/trunk/content']}/podlings.xml"
+
+exceptions = {
+  "beanvalidation" => "bval",
+  "manifoldcf" => "connectors",
+  "odftoolkit" => "odf",
+  "openofficeorg" => "ooo",
+  "zetacomponents" => "zeta"
+}
+
+_html do
+  _head do
+    _title 'Apache Incubator moderators'
+    _link rel: "stylesheet", type: 'text/css',
+      href: "http://incubator.apache.org/style/bootstrap-1-3-0-min.css"
+    _link rel: "stylesheet", type: 'text/css',
+      href: "http://incubator.apache.org/style/style.css"
+    _style %{
+      body { margin: 0 2em }
+      p, h3 {margin-left: 2em}
+      table {margin-left: 4em}
+      hr {margin-top: 1.5em}
+    }
+  end
+
+  _body? do
+    # Standard Incubator header
+    _div class: 'container' do
+      _div class: 'row' do
+        _div class: 'span12' do
+          _a href: "http://www.apache.org/" do
+            _img alt: "The Apache Software Foundation", border: "0",
+              src: "http://www.apache.org/images/asf_logo_wide.gif"
+          end
+        end
+        _div class: 'span4' do
+          _a href: "http://incubator.apache.org/" do
+            _img alt: "Apache Incubator", border: "0",
+              src: "http://incubator.apache.org/images/apache-incubator-logo.png"
+          end
+        end
+      end
+      _div class: 'row' do
+        _div class: 'span16' do
+          _hr noshade: 'noshade', size: '1'
+        end
+      end
+    end
+
+    podlings = Hash[Nokogiri::XML(File.read(PODLINGS)).search('podling').
+      map {|podling| [podling["resource"], podling["status"]]}]
+
+    _h1 'Apache Incubator moderators'
+
+    moderators = Hash[File.read(SUBSCRIPTIONS).split(/\n\n/).
+      map {|stanza| [stanza[/incubator.apache.org\/(.*)\//,1],
+      stanza.scan(/^(.*@.*)/).flatten]}]
+
+    _h1 'Index'
+
+    cols = 6
+    slice = (podlings.keys.length+cols-1)/cols
+    _table do
+      (0...slice).each do |i|
+        _tr do
+          (0...cols).each do |j|
+            _td do
+              podling = podlings.keys.sort[i+j*slice]
+	      anchor = exceptions[podling] || podling
+	      if moderators.keys.any? {|list| anchor == list.split('-').first}
+	        _a podling, href: "##{anchor}"
+              else
+	        _indented_text podling
+	      end
+            end
+	  end
+	end
+      end
+    end
+
+    current = nil
+    moderators.keys.sort.each do |list|
+      next unless list.include? '-'
+      podling = list.split('-').first
+      unless podling == current
+        _hr_ if current
+	name = podling if podlings.include? podling
+	name ||= exceptions.invert[podling]
+	if name
+          _h2 id: podling do
+	    _a podling, 
+	      href: "http://incubator.apache.org/projects/#{name}.html"
+	  end
+	else
+          _h2 podling, id: podling
+	end
+        _p "Podling Status: #{podlings[name] || 'unknown'}"
+        current = podling
+      end
+
+      _h3_ list.sub(podling, '')
+
+      _table do
+        moderators[list].sort.each do |moderator|
+          person = ASF::Person.find_by_email(moderator)
+	  _tr_ do
+            if person and person.id != 'notinavail'
+              _td! {_a person.id, href: "/roster/committer/#{person.id}"}
+              if person.asf_member?
+                if person.asf_member? == true
+                  _td! {_b person.public_name}
+                else
+                  _td! {_em person.public_name}
+                end
+              else
+                _td person.public_name
+              end
+            else
+              _td
+              _td! {_em 'unknown'}
+            end
+	    _td moderator
+	  end
+        end
+      end
+    end
+  end
+end
diff --git a/www/incubator/podlings/by-age.cgi b/www/incubator/podlings/by-age.cgi
new file mode 100755
index 0000000..24e9cd7
--- /dev/null
+++ b/www/incubator/podlings/by-age.cgi
@@ -0,0 +1,130 @@
+#!/usr/bin/ruby1.9.1
+require 'nokogiri'
+require 'date'
+require 'net/http'
+require 'wunderbar'
+
+projects = URI.parse('http://incubator.apache.org/projects/')
+table = Nokogiri::HTML(Net::HTTP.get(projects)).at('table')
+
+# extract a list of [podling names, table row]
+podlings = table.search('tr').map do |tr|
+  tds = tr.search('td')
+  next if tds.empty?
+  [tds.last.text, tr]
+end
+
+# extract sorted list of durations, tally counts of podlings by years
+duration = []
+by_age = {}
+podlings.compact.sort.each do |date, tr|
+  # NOTE this makes the stats inaccurate if you don't have valid inputs
+  begin
+    date_started = Date.parse(date)
+  rescue ArgumentError
+    next
+  end
+  duration << Date.today - date_started
+  years = (duration.last / 365.25).to_i
+  by_age[years] = 1 + (by_age[years] or 0)
+end
+
+_html do
+  _head_ do
+    _meta charset: 'utf=8'
+    _title 'Incubated Projects - Apache Incubator'
+    _link rel: "stylesheet", type: 'text/css',
+      href: "http://incubator.apache.org/style/bootstrap-1-3-0-min.css"
+    _link rel: "stylesheet", type: 'text/css',
+      href: "http://incubator.apache.org/style/style.css"
+    _style %{
+      svg { float: right; width: 8em; height: 8em; padding-right: 5%; }
+      body { margin: 0 2em }
+    }
+  end
+
+  _body? do
+    # Standard Incubator header
+    _div.container do
+      _div.row do
+        _div.span12 do
+          _a href: "http://www.apache.org/" do
+            _img alt: "The Apache Software Foundation", border: "0",
+              src: "http://www.apache.org/images/asf_logo_wide.gif"
+          end
+        end
+        _div.span4 do
+          _a href: "http://incubator.apache.org/" do
+            _img alt: "Apache Incubator", border: "0",
+              src: "http://incubator.apache.org/images/apache-incubator-logo.png"
+          end
+        end
+      end
+
+      _div.row do
+        _div.span16 do
+          _hr noshade: 'noshade', size: '1'
+        end
+      end
+    end
+
+    # pie chart
+    theta = 0
+    colors = ['0F0', 'FF0', 'F80', 'F50', 'F00', '800']
+
+    _svg_ viewBox: '-500 -500 1000 1000' do
+      _circle r: 480, stroke: "#000", fill: "#000"
+      by_age.keys.sort.each do |age|
+        p1 = [Math.sin(theta)*475, -Math.cos(theta)*475].map(&:round).join(',')
+        theta += Math::PI*2 * by_age[age]/duration.length
+        p2 = [Math.sin(theta)*475, -Math.cos(theta)*475].map(&:round).join(',')
+        _path d: "M0,0 L#{p1} A475,475 0 0 1 #{p2} Z", 
+          fill: "##{colors[age]}", title: "#{by_age[age]} PMCs aged " +
+            "#{age} to #{age+1} year#{'s' if age>0}"
+      end
+    end
+
+    # statistics
+    if duration.length % 2 == 0
+      mean = (duration[duration.length/2-1] + duration[duration.length/2])/2
+    else
+      mean = duration[duration.length/2]
+    end
+
+    _h2 'Statistics'
+    _p! do
+      _ "Count:      #{duration.length} PPMCs ("
+      _a 'history', href: 'http://incubator.apache.org/history/'
+      _ ")"
+    end
+    _p "Mean age:   #{(mean+0.5).to_i} days"
+    _p "Median age: #{(duration.reduce(:+)/duration.length + 0.5).to_i} days"
+
+    # Sorted list of podlings
+    _h2_! do
+      _a 'Currently in incubation',
+       href: 'http://incubator.apache.org/projects/#current'
+      _ ', sorted by age'
+    end
+
+    _table do
+      _tr do
+        table.at('tr').search('th').each do |th|
+          _th th.text
+        end
+      end
+      podlings.compact.sort.each do |date, tr|
+        _tr_ do
+          tr.search('td').each do |td|
+            a = td.at('a')
+            if a
+              _td! {_a a.text, href: (projects + a['href']).to_s}
+            else
+              _td td.text
+            end
+          end
+        end
+      end
+    end
+  end
+end
diff --git a/www/incubator/signoff.cgi b/www/incubator/signoff.cgi
new file mode 100755
index 0000000..2895bfd
--- /dev/null
+++ b/www/incubator/signoff.cgi
@@ -0,0 +1,98 @@
+#!/usr/bin/ruby1.9.1
+
+# quick and dirty script to tally up which mentors have been providing
+# signoffs and which have not.
+
+require 'whimsy/asf'
+
+# authenticate
+user = ASF::Person.find($USER)
+incubator = ASF::Committee.find('incubator').members
+unless user.asf_member? or incubator.include? user
+  print "Status: 401 Unauthorized\r\n"
+  print "WWW-Authenticate: Basic realm=\"Incubator PMC and Members\"\r\n\r\n"
+  exit
+end
+
+BOARD = ASF::SVN['private/foundation/board']
+
+agendas = Dir["#{BOARD}/board_agenda_*.txt",
+  "#{BOARD}/archived_agendas/board_agenda_*.txt"]
+
+agendas = agendas.sort_by {|file| File.basename(file)}[-13..-1]
+
+if File.read(agendas.last).include? 'The Apache Incubator is the entry path'
+  agendas.shift
+else
+  agendas.pop
+end
+
+ASF::Person.preload('cn')
+ASF::ICLA.preload()
+people = Hash[ASF::Person.list.map {|person| [person.public_name, person.id]}]
+mentors = {}
+
+agendas.each do |file|
+  date = file[/\d+_\d+_\d+/].gsub('_', '-')
+  agenda = File.read(file)
+  signoffs = agenda.scan(/^Signed-off-by:\s+.*?\n\n/m).join
+  signoffs.scan(/\[(.+?)\]\((.*?)\) (.*)/).each do |check, podling, name|
+    name.strip!
+    name.sub! /\s+\(.*?\)/, ''
+    mentors[name] = [] unless mentors[name]
+    mentors[name] << {
+      date: date,
+      checked: !check.strip.empty?,
+      podling: podling.strip
+    }
+  end
+end
+
+roster = 'https://whimsy.apache.org/roster/committer/'
+
+_html do
+  # http://bconnelly.net/2013/10/creating-colorblind-friendly-figures/
+  _style %{
+    .check {color: rgb(0,114,178)}
+    .blank {color: rgb(230,159,0); font-style: italic; font-weight: bold}
+  }
+
+  _h1 'Mentor signoffs over the last twelve months'
+
+  _p! do
+    _span.check 'Blue'
+    _ ' means signoff is present, '
+    _span.blank 'orange'
+    _ ' means signoff is absent.'
+  end
+
+  _p 'Hover over podling name to see date.'
+
+  _table_ do
+    mentors.sort.each do |name, entries|
+      _tr_ do
+        _td do
+          if people[name]
+            if ASF::Person.find(people[name]).asf_member?
+              _b! {_a name, href: roster + people[name]}
+            else
+              _a name, href: roster + people[name]
+            end
+          else
+            _a name, href: roster + '?q=' + URI.encode(name)
+          end
+        end
+
+        _td do
+          entries.each do |entry|
+            if entry[:checked]
+              _span.check entry[:podling], title: entry[:date]
+            else
+              _span.blank entry[:podling], title: entry[:date]
+            end
+          end
+        end
+      end
+    end
+  end
+end
diff --git a/www/index.html b/www/index.html
new file mode 100644
index 0000000..3c09082
--- /dev/null
+++ b/www/index.html
@@ -0,0 +1,93 @@
+<!DOCTYPE html>
+<html xmlns="http://www.w3.org/1999/xhtml">
+  <head>
+    <meta charset="utf-8"/>
+    <title>Whimsy</title>
+    <style type="text/css">
+      h2 {text-decoration: underline}
+      header h2 span {display: none}
+      header:hover h2 span {display: inline}
+      aside {display: none}
+      header:hover aside {margin-left: 4em; display: block; border: 3px solid #B7B; padding: 1em; border-radius: 1em}
+      aside ol {margin-bottom: 0}
+    </style>
+  </head>
+
+  <body>
+    <img title="ASF Logo" src="https://id.apache.org/img/asf_logo_wide.png"/>
+    <a href="http://whimsy.apache.org/">
+      <img src="whimsy.svg" width="80" title="whimsy"/>
+    </a>
+
+    <header>
+      <h2><a href="http://dictionary.reference.com/browse/whimsy">Whim<span>·</span>sy</a></h2>
+      <aside>
+        [hwim-zee, wim-] noun, plural whim·sies.
+        <ol>
+          <li>capricious humor or disposition; extravagant, fanciful, or
+          excessively playful expression: a play with lots of whimsy.</li>
+          <li>an odd or fanciful notion.</li>
+          <li>anything odd or fanciful; a product of playful or capricious
+          fancy: a whimsy from an otherwise thoughtful writer.</li>
+        </ol>
+      </aside>
+
+      <blockquote>
+        Whimsy is a site where a set of absolutely unnecessary yet often quite
+        handy applications are deployed. 
+      </blockquote>
+    </header>
+
+    <blockquote>
+     Feel free to <a href="technology.html">look under the hood</a>.
+    </blockquote>
+
+    <blockquote>
+     <a href="https://infra.apache.org/">Infrastructure-related apps</a>
+     are listed separately.
+    </blockquote>
+
+    <h2>Open to the Public</h2>
+    <ul>
+      <li><a href="board/minutes/">Board Minutes Collated by PMC/officer/topic</a></li>
+      <li><a href="incubator/podlings/by-age">Incubator podlings by age</a></li>
+      <li><a href="new-account-request-queue">New Account Requests Queue</a></li>
+    </ul>
+
+    <h2>Open to Committers</h2>
+    <ul>
+      <li><a href="roster/committer/">Email address lookup</a></li>
+      <li><a href="roster/committee/">PMC Roster</a></li>
+      <li><a href="committers/subscribe">Mailing list subscription</a></li>
+      <li><a href="committers/X_______">Release signing</a></li>
+    </ul>
+
+    <h2>Open to Officers and Members</h2>
+    <ul>
+      <li><a href="board/agenda/">Board Agenda</a></li>
+      <li><a href="fundraising/invoice/">Fundraising Invoice</a></li>
+      <li><a href="board/subscriptions/">PMC-chair vs board subscriptions</a></li>
+<!-- retired
+      <li><a href="board/draft-minutes">Board Minutes - draft</a></li>
+      <li><a href="fundraising/sponsorship/">Fundraising Sponsorship</a></li>
+      <li><a href="fundraising/prospects/">Fundraising Prospects</a></li>
+      <li><a href="treasurer/expenses/">Treasurer Expenses</a></li>
+      <li><a href="treasurer/paypal/">Treasurer PayPal</a></li>
+      <li><a href="treasurer/statements/">Treasurer Statements</a></li>
+-->
+    </ul>
+
+    <h2>Member Only</h2>
+    <ul>
+      <li><a href="members/subscriptions/">Member subscription cross-checks</a></li>
+      <li><a href="members/watch/">Member watch</a></li>
+      <li><a href="voter/whatif">STV Explorer</a></li>
+    </ul>
+
+    <h2>Other</h2>
+    <ul>
+      <li><a href="incubator/moderators">Incubator moderators</a></li>
+      <li><a href="secretary/workbench/">Secretary Workbench</a></li>
+    </ul>
+  </body>
+</html>
diff --git a/www/jquery-min.js b/www/jquery-min.js
new file mode 120000
index 0000000..1e5328f
--- /dev/null
+++ b/www/jquery-min.js
@@ -0,0 +1 @@
+jquery.min.js
\ No newline at end of file
diff --git a/www/jquery-ui.css b/www/jquery-ui.css
new file mode 100644
index 0000000..572ed8a
--- /dev/null
+++ b/www/jquery-ui.css
@@ -0,0 +1,1177 @@
+/*! jQuery UI - v1.10.3 - 2013-05-03
+* http://jqueryui.com
+* Includes: jquery.ui.core.css, jquery.ui.accordion.css, jquery.ui.autocomplete.css, jquery.ui.button.css, jquery.ui.datepicker.css, jquery.ui.dialog.css, jquery.ui.menu.css, jquery.ui.progressbar.css, jquery.ui.resizable.css, jquery.ui.selectable.css, jquery.ui.slider.css, jquery.ui.spinner.css, jquery.ui.tabs.css, jquery.ui.tooltip.css
+* To view and modify this theme, visit http://jqueryui.com/themeroller/?ffDefault=Verdana%2CArial%2Csans-serif&fwDefault=normal&fsDefault=1.1em&cornerRadius=4px&bgColorHeader=cccccc&bgTextureHeader=highlight_soft&bgImgOpacityHeader=75&borderColorHeader=aaaaaa&fcHeader=222222&iconColorHeader=222222&bgColorContent=ffffff&bgTextureContent=flat&bgImgOpacityContent=75&borderColorContent=aaaaaa&fcContent=222222&iconColorContent=222222&bgColorDefault=e6e6e6&bgTextureDefault=glass&bgImgOpacityDefault=75&borderColorDefault=d3d3d3&fcDefault=555555&iconColorDefault=888888&bgColorHover=dadada&bgTextureHover=glass&bgImgOpacityHover=75&borderColorHover=999999&fcHover=212121&iconColorHover=454545&bgColorActive=ffffff&bgTextureActive=glass&bgImgOpacityActive=65&borderColorActive=aaaaaa&fcActive=212121&iconColorActive=454545&bgColorHighlight=fbf9ee&bgTextureHighlight=glass&bgImgOpacityHighlight=55&borderColorHighlight=fcefa1&fcHighlight=363636&iconColorHighlight=2e83ff&bgColorError=fef1ec&bgTextureE
 rror=glass&bgImgOpacityError=95&borderColorError=cd0a0a&fcError=cd0a0a&iconColorError=cd0a0a&bgColorOverlay=aaaaaa&bgTextureOverlay=flat&bgImgOpacityOverlay=0&opacityOverlay=30&bgColorShadow=aaaaaa&bgTextureShadow=flat&bgImgOpacityShadow=0&opacityShadow=30&thicknessShadow=8px&offsetTopShadow=-8px&offsetLeftShadow=-8px&cornerRadiusShadow=8px
+* Copyright 2013 jQuery Foundation and other contributors Licensed MIT */
+
+/* Layout helpers
+----------------------------------*/
+.ui-helper-hidden {
+	display: none;
+}
+.ui-helper-hidden-accessible {
+	border: 0;
+	clip: rect(0 0 0 0);
+	height: 1px;
+	margin: -1px;
+	overflow: hidden;
+	padding: 0;
+	position: absolute;
+	width: 1px;
+}
+.ui-helper-reset {
+	margin: 0;
+	padding: 0;
+	border: 0;
+	outline: 0;
+	line-height: 1.3;
+	text-decoration: none;
+	font-size: 100%;
+	list-style: none;
+}
+.ui-helper-clearfix:before,
+.ui-helper-clearfix:after {
+	content: "";
+	display: table;
+	border-collapse: collapse;
+}
+.ui-helper-clearfix:after {
+	clear: both;
+}
+.ui-helper-clearfix {
+	min-height: 0; /* support: IE7 */
+}
+.ui-helper-zfix {
+	width: 100%;
+	height: 100%;
+	top: 0;
+	left: 0;
+	position: absolute;
+	opacity: 0;
+	filter:Alpha(Opacity=0);
+}
+
+.ui-front {
+	z-index: 100;
+}
+
+
+/* Interaction Cues
+----------------------------------*/
+.ui-state-disabled {
+	cursor: default !important;
+}
+
+
+/* Icons
+----------------------------------*/
+
+/* states and images */
+.ui-icon {
+	display: block;
+	text-indent: -99999px;
+	overflow: hidden;
+	background-repeat: no-repeat;
+}
+
+
+/* Misc visuals
+----------------------------------*/
+
+/* Overlays */
+.ui-widget-overlay {
+	position: fixed;
+	top: 0;
+	left: 0;
+	width: 100%;
+	height: 100%;
+}
+.ui-accordion .ui-accordion-header {
+	display: block;
+	cursor: pointer;
+	position: relative;
+	margin-top: 2px;
+	padding: .5em .5em .5em .7em;
+	min-height: 0; /* support: IE7 */
+}
+.ui-accordion .ui-accordion-icons {
+	padding-left: 2.2em;
+}
+.ui-accordion .ui-accordion-noicons {
+	padding-left: .7em;
+}
+.ui-accordion .ui-accordion-icons .ui-accordion-icons {
+	padding-left: 2.2em;
+}
+.ui-accordion .ui-accordion-header .ui-accordion-header-icon {
+	position: absolute;
+	left: .5em;
+	top: 50%;
+	margin-top: -8px;
+}
+.ui-accordion .ui-accordion-content {
+	padding: 1em 2.2em;
+	border-top: 0;
+	overflow: auto;
+}
+.ui-autocomplete {
+	position: absolute;
+	top: 0;
+	left: 0;
+	cursor: default;
+}
+.ui-button {
+	display: inline-block;
+	position: relative;
+	padding: 0;
+	line-height: normal;
+	margin-right: .1em;
+	cursor: pointer;
+	vertical-align: middle;
+	text-align: center;
+	overflow: visible; /* removes extra width in IE */
+}
+.ui-button,
+.ui-button:link,
+.ui-button:visited,
+.ui-button:hover,
+.ui-button:active {
+	text-decoration: none;
+}
+/* to make room for the icon, a width needs to be set here */
+.ui-button-icon-only {
+	width: 2.2em;
+}
+/* button elements seem to need a little more width */
+button.ui-button-icon-only {
+	width: 2.4em;
+}
+.ui-button-icons-only {
+	width: 3.4em;
+}
+button.ui-button-icons-only {
+	width: 3.7em;
+}
+
+/* button text element */
+.ui-button .ui-button-text {
+	display: block;
+	line-height: normal;
+}
+.ui-button-text-only .ui-button-text {
+	padding: .4em 1em;
+}
+.ui-button-icon-only .ui-button-text,
+.ui-button-icons-only .ui-button-text {
+	padding: .4em;
+	text-indent: -9999999px;
+}
+.ui-button-text-icon-primary .ui-button-text,
+.ui-button-text-icons .ui-button-text {
+	padding: .4em 1em .4em 2.1em;
+}
+.ui-button-text-icon-secondary .ui-button-text,
+.ui-button-text-icons .ui-button-text {
+	padding: .4em 2.1em .4em 1em;
+}
+.ui-button-text-icons .ui-button-text {
+	padding-left: 2.1em;
+	padding-right: 2.1em;
+}
+/* no icon support for input elements, provide padding by default */
+input.ui-button {
+	padding: .4em 1em;
+}
+
+/* button icon element(s) */
+.ui-button-icon-only .ui-icon,
+.ui-button-text-icon-primary .ui-icon,
+.ui-button-text-icon-secondary .ui-icon,
+.ui-button-text-icons .ui-icon,
+.ui-button-icons-only .ui-icon {
+	position: absolute;
+	top: 50%;
+	margin-top: -8px;
+}
+.ui-button-icon-only .ui-icon {
+	left: 50%;
+	margin-left: -8px;
+}
+.ui-button-text-icon-primary .ui-button-icon-primary,
+.ui-button-text-icons .ui-button-icon-primary,
+.ui-button-icons-only .ui-button-icon-primary {
+	left: .5em;
+}
+.ui-button-text-icon-secondary .ui-button-icon-secondary,
+.ui-button-text-icons .ui-button-icon-secondary,
+.ui-button-icons-only .ui-button-icon-secondary {
+	right: .5em;
+}
+
+/* button sets */
+.ui-buttonset {
+	margin-right: 7px;
+}
+.ui-buttonset .ui-button {
+	margin-left: 0;
+	margin-right: -.3em;
+}
+
+/* workarounds */
+/* reset extra padding in Firefox, see h5bp.com/l */
+input.ui-button::-moz-focus-inner,
+button.ui-button::-moz-focus-inner {
+	border: 0;
+	padding: 0;
+}
+.ui-datepicker {
+	width: 17em;
+	padding: .2em .2em 0;
+	display: none;
+}
+.ui-datepicker .ui-datepicker-header {
+	position: relative;
+	padding: .2em 0;
+}
+.ui-datepicker .ui-datepicker-prev,
+.ui-datepicker .ui-datepicker-next {
+	position: absolute;
+	top: 2px;
+	width: 1.8em;
+	height: 1.8em;
+}
+.ui-datepicker .ui-datepicker-prev-hover,
+.ui-datepicker .ui-datepicker-next-hover {
+	top: 1px;
+}
+.ui-datepicker .ui-datepicker-prev {
+	left: 2px;
+}
+.ui-datepicker .ui-datepicker-next {
+	right: 2px;
+}
+.ui-datepicker .ui-datepicker-prev-hover {
+	left: 1px;
+}
+.ui-datepicker .ui-datepicker-next-hover {
+	right: 1px;
+}
+.ui-datepicker .ui-datepicker-prev span,
+.ui-datepicker .ui-datepicker-next span {
+	display: block;
+	position: absolute;
+	left: 50%;
+	margin-left: -8px;
+	top: 50%;
+	margin-top: -8px;
+}
+.ui-datepicker .ui-datepicker-title {
+	margin: 0 2.3em;
+	line-height: 1.8em;
+	text-align: center;
+}
+.ui-datepicker .ui-datepicker-title select {
+	font-size: 1em;
+	margin: 1px 0;
+}
+.ui-datepicker select.ui-datepicker-month-year {
+	width: 100%;
+}
+.ui-datepicker select.ui-datepicker-month,
+.ui-datepicker select.ui-datepicker-year {
+	width: 49%;
+}
+.ui-datepicker table {
+	width: 100%;
+	font-size: .9em;
+	border-collapse: collapse;
+	margin: 0 0 .4em;
+}
+.ui-datepicker th {
+	padding: .7em .3em;
+	text-align: center;
+	font-weight: bold;
+	border: 0;
+}
+.ui-datepicker td {
+	border: 0;
+	padding: 1px;
+}
+.ui-datepicker td span,
+.ui-datepicker td a {
+	display: block;
+	padding: .2em;
+	text-align: right;
+	text-decoration: none;
+}
+.ui-datepicker .ui-datepicker-buttonpane {
+	background-image: none;
+	margin: .7em 0 0 0;
+	padding: 0 .2em;
+	border-left: 0;
+	border-right: 0;
+	border-bottom: 0;
+}
+.ui-datepicker .ui-datepicker-buttonpane button {
+	float: right;
+	margin: .5em .2em .4em;
+	cursor: pointer;
+	padding: .2em .6em .3em .6em;
+	width: auto;
+	overflow: visible;
+}
+.ui-datepicker .ui-datepicker-buttonpane button.ui-datepicker-current {
+	float: left;
+}
+
+/* with multiple calendars */
+.ui-datepicker.ui-datepicker-multi {
+	width: auto;
+}
+.ui-datepicker-multi .ui-datepicker-group {
+	float: left;
+}
+.ui-datepicker-multi .ui-datepicker-group table {
+	width: 95%;
+	margin: 0 auto .4em;
+}
+.ui-datepicker-multi-2 .ui-datepicker-group {
+	width: 50%;
+}
+.ui-datepicker-multi-3 .ui-datepicker-group {
+	width: 33.3%;
+}
+.ui-datepicker-multi-4 .ui-datepicker-group {
+	width: 25%;
+}
+.ui-datepicker-multi .ui-datepicker-group-last .ui-datepicker-header,
+.ui-datepicker-multi .ui-datepicker-group-middle .ui-datepicker-header {
+	border-left-width: 0;
+}
+.ui-datepicker-multi .ui-datepicker-buttonpane {
+	clear: left;
+}
+.ui-datepicker-row-break {
+	clear: both;
+	width: 100%;
+	font-size: 0;
+}
+
+/* RTL support */
+.ui-datepicker-rtl {
+	direction: rtl;
+}
+.ui-datepicker-rtl .ui-datepicker-prev {
+	right: 2px;
+	left: auto;
+}
+.ui-datepicker-rtl .ui-datepicker-next {
+	left: 2px;
+	right: auto;
+}
+.ui-datepicker-rtl .ui-datepicker-prev:hover {
+	right: 1px;
+	left: auto;
+}
+.ui-datepicker-rtl .ui-datepicker-next:hover {
+	left: 1px;
+	right: auto;
+}
+.ui-datepicker-rtl .ui-datepicker-buttonpane {
+	clear: right;
+}
+.ui-datepicker-rtl .ui-datepicker-buttonpane button {
+	float: left;
+}
+.ui-datepicker-rtl .ui-datepicker-buttonpane button.ui-datepicker-current,
+.ui-datepicker-rtl .ui-datepicker-group {
+	float: right;
+}
+.ui-datepicker-rtl .ui-datepicker-group-last .ui-datepicker-header,
+.ui-datepicker-rtl .ui-datepicker-group-middle .ui-datepicker-header {
+	border-right-width: 0;
+	border-left-width: 1px;
+}
+.ui-dialog {
+	position: absolute;
+	top: 0;
+	left: 0;
+	padding: .2em;
+	outline: 0;
+}
+.ui-dialog .ui-dialog-titlebar {
+	padding: .4em 1em;
+	position: relative;
+}
+.ui-dialog .ui-dialog-title {
+	float: left;
+	margin: .1em 0;
+	white-space: nowrap;
+	width: 90%;
+	overflow: hidden;
+	text-overflow: ellipsis;
+}
+.ui-dialog .ui-dialog-titlebar-close {
+	position: absolute;
+	right: .3em;
+	top: 50%;
+	width: 21px;
+	margin: -10px 0 0 0;
+	padding: 1px;
+	height: 20px;
+}
+.ui-dialog .ui-dialog-content {
+	position: relative;
+	border: 0;
+	padding: .5em 1em;
+	background: none;
+	overflow: auto;
+}
+.ui-dialog .ui-dialog-buttonpane {
+	text-align: left;
+	border-width: 1px 0 0 0;
+	background-image: none;
+	margin-top: .5em;
+	padding: .3em 1em .5em .4em;
+}
+.ui-dialog .ui-dialog-buttonpane .ui-dialog-buttonset {
+	float: right;
+}
+.ui-dialog .ui-dialog-buttonpane button {
+	margin: .5em .4em .5em 0;
+	cursor: pointer;
+}
+.ui-dialog .ui-resizable-se {
+	width: 12px;
+	height: 12px;
+	right: -5px;
+	bottom: -5px;
+	background-position: 16px 16px;
+}
+.ui-draggable .ui-dialog-titlebar {
+	cursor: move;
+}
+.ui-menu {
+	list-style: none;
+	padding: 2px;
+	margin: 0;
+	display: block;
+	outline: none;
+}
+.ui-menu .ui-menu {
+	margin-top: -3px;
+	position: absolute;
+}
+.ui-menu .ui-menu-item {
+	margin: 0;
+	padding: 0;
+	width: 100%;
+	/* support: IE10, see #8844 */
+	list-style-image: url(data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7);
+}
+.ui-menu .ui-menu-divider {
+	margin: 5px -2px 5px -2px;
+	height: 0;
+	font-size: 0;
+	line-height: 0;
+	border-width: 1px 0 0 0;
+}
+.ui-menu .ui-menu-item a {
+	text-decoration: none;
+	display: block;
+	padding: 2px .4em;
+	line-height: 1.5;
+	min-height: 0; /* support: IE7 */
+	font-weight: normal;
+}
+.ui-menu .ui-menu-item a.ui-state-focus,
+.ui-menu .ui-menu-item a.ui-state-active {
+	font-weight: normal;
+	margin: -1px;
+}
+
+.ui-menu .ui-state-disabled {
+	font-weight: normal;
+	margin: .4em 0 .2em;
+	line-height: 1.5;
+}
+.ui-menu .ui-state-disabled a {
+	cursor: default;
+}
+
+/* icon support */
+.ui-menu-icons {
+	position: relative;
+}
+.ui-menu-icons .ui-menu-item a {
+	position: relative;
+	padding-left: 2em;
+}
+
+/* left-aligned */
+.ui-menu .ui-icon {
+	position: absolute;
+	top: .2em;
+	left: .2em;
+}
+
+/* right-aligned */
+.ui-menu .ui-menu-icon {
+	position: static;
+	float: right;
+}
+.ui-progressbar {
+	height: 2em;
+	text-align: left;
+	overflow: hidden;
+}
+.ui-progressbar .ui-progressbar-value {
+	margin: -1px;
+	height: 100%;
+}
+.ui-progressbar .ui-progressbar-overlay {
+	background: url("images/animated-overlay.gif");
+	height: 100%;
+	filter: alpha(opacity=25);
+	opacity: 0.25;
+}
+.ui-progressbar-indeterminate .ui-progressbar-value {
+	background-image: none;
+}
+.ui-resizable {
+	position: relative;
+}
+.ui-resizable-handle {
+	position: absolute;
+	font-size: 0.1px;
+	display: block;
+}
+.ui-resizable-disabled .ui-resizable-handle,
+.ui-resizable-autohide .ui-resizable-handle {
+	display: none;
+}
+.ui-resizable-n {
+	cursor: n-resize;
+	height: 7px;
+	width: 100%;
+	top: -5px;
+	left: 0;
+}
+.ui-resizable-s {
+	cursor: s-resize;
+	height: 7px;
+	width: 100%;
+	bottom: -5px;
+	left: 0;
+}
+.ui-resizable-e {
+	cursor: e-resize;
+	width: 7px;
+	right: -5px;
+	top: 0;
+	height: 100%;
+}
+.ui-resizable-w {
+	cursor: w-resize;
+	width: 7px;
+	left: -5px;
+	top: 0;
+	height: 100%;
+}
+.ui-resizable-se {
+	cursor: se-resize;
+	width: 12px;
+	height: 12px;
+	right: 1px;
+	bottom: 1px;
+}
+.ui-resizable-sw {
+	cursor: sw-resize;
+	width: 9px;
+	height: 9px;
+	left: -5px;
+	bottom: -5px;
+}
+.ui-resizable-nw {
+	cursor: nw-resize;
+	width: 9px;
+	height: 9px;
+	left: -5px;
+	top: -5px;
+}
+.ui-resizable-ne {
+	cursor: ne-resize;
+	width: 9px;
+	height: 9px;
+	right: -5px;
+	top: -5px;
+}
+.ui-selectable-helper {
+	position: absolute;
+	z-index: 100;
+	border: 1px dotted black;
+}
+.ui-slider {
+	position: relative;
+	text-align: left;
+}
+.ui-slider .ui-slider-handle {
+	position: absolute;
+	z-index: 2;
+	width: 1.2em;
+	height: 1.2em;
+	cursor: default;
+}
+.ui-slider .ui-slider-range {
+	position: absolute;
+	z-index: 1;
+	font-size: .7em;
+	display: block;
+	border: 0;
+	background-position: 0 0;
+}
+
+/* For IE8 - See #6727 */
+.ui-slider.ui-state-disabled .ui-slider-handle,
+.ui-slider.ui-state-disabled .ui-slider-range {
+	filter: inherit;
+}
+
+.ui-slider-horizontal {
+	height: .8em;
+}
+.ui-slider-horizontal .ui-slider-handle {
+	top: -.3em;
+	margin-left: -.6em;
+}
+.ui-slider-horizontal .ui-slider-range {
+	top: 0;
+	height: 100%;
+}
+.ui-slider-horizontal .ui-slider-range-min {
+	left: 0;
+}
+.ui-slider-horizontal .ui-slider-range-max {
+	right: 0;
+}
+
+.ui-slider-vertical {
+	width: .8em;
+	height: 100px;
+}
+.ui-slider-vertical .ui-slider-handle {
+	left: -.3em;
+	margin-left: 0;
+	margin-bottom: -.6em;
+}
+.ui-slider-vertical .ui-slider-range {
+	left: 0;
+	width: 100%;
+}
+.ui-slider-vertical .ui-slider-range-min {
+	bottom: 0;
+}
+.ui-slider-vertical .ui-slider-range-max {
+	top: 0;
+}
+.ui-spinner {
+	position: relative;
+	display: inline-block;
+	overflow: hidden;
+	padding: 0;
+	vertical-align: middle;
+}
+.ui-spinner-input {
+	border: none;
+	background: none;
+	color: inherit;
+	padding: 0;
+	margin: .2em 0;
+	vertical-align: middle;
+	margin-left: .4em;
+	margin-right: 22px;
+}
+.ui-spinner-button {
+	width: 16px;
+	height: 50%;
+	font-size: .5em;
+	padding: 0;
+	margin: 0;
+	text-align: center;
+	position: absolute;
+	cursor: default;
+	display: block;
+	overflow: hidden;
+	right: 0;
+}
+/* more specificity required here to overide default borders */
+.ui-spinner a.ui-spinner-button {
+	border-top: none;
+	border-bottom: none;
+	border-right: none;
+}
+/* vertical centre icon */
+.ui-spinner .ui-icon {
+	position: absolute;
+	margin-top: -8px;
+	top: 50%;
+	left: 0;
+}
+.ui-spinner-up {
+	top: 0;
+}
+.ui-spinner-down {
+	bottom: 0;
+}
+
+/* TR overrides */
+.ui-spinner .ui-icon-triangle-1-s {
+	/* need to fix icons sprite */
+	background-position: -65px -16px;
+}
+.ui-tabs {
+	position: relative;/* position: relative prevents IE scroll bug (element with position: relative inside container with overflow: auto appear as "fixed") */
+	padding: .2em;
+}
+.ui-tabs .ui-tabs-nav {
+	margin: 0;
+	padding: .2em .2em 0;
+}
+.ui-tabs .ui-tabs-nav li {
+	list-style: none;
+	float: left;
+	position: relative;
+	top: 0;
+	margin: 1px .2em 0 0;
+	border-bottom-width: 0;
+	padding: 0;
+	white-space: nowrap;
+}
+.ui-tabs .ui-tabs-nav li a {
+	float: left;
+	padding: .5em 1em;
+	text-decoration: none;
+}
+.ui-tabs .ui-tabs-nav li.ui-tabs-active {
+	margin-bottom: -1px;
+	padding-bottom: 1px;
+}
+.ui-tabs .ui-tabs-nav li.ui-tabs-active a,
+.ui-tabs .ui-tabs-nav li.ui-state-disabled a,
+.ui-tabs .ui-tabs-nav li.ui-tabs-loading a {
+	cursor: text;
+}
+.ui-tabs .ui-tabs-nav li a, /* first selector in group seems obsolete, but required to overcome bug in Opera applying cursor: text overall if defined elsewhere... */
+.ui-tabs-collapsible .ui-tabs-nav li.ui-tabs-active a {
+	cursor: pointer;
+}
+.ui-tabs .ui-tabs-panel {
+	display: block;
+	border-width: 0;
+	padding: 1em 1.4em;
+	background: none;
+}
+.ui-tooltip {
+	padding: 8px;
+	position: absolute;
+	z-index: 9999;
+	max-width: 300px;
+	-webkit-box-shadow: 0 0 5px #aaa;
+	box-shadow: 0 0 5px #aaa;
+}
+body .ui-tooltip {
+	border-width: 2px;
+}
+
+/* Component containers
+----------------------------------*/
+.ui-widget {
+	font-family: Verdana,Arial,sans-serif;
+	font-size: 1.1em;
+}
+.ui-widget .ui-widget {
+	font-size: 1em;
+}
+.ui-widget input,
+.ui-widget select,
+.ui-widget textarea,
+.ui-widget button {
+	font-family: Verdana,Arial,sans-serif;
+	font-size: 1em;
+}
+.ui-widget-content {
+	border: 1px solid #aaaaaa;
+	background: #ffffff url(images/ui-bg_flat_75_ffffff_40x100.png) 50% 50% repeat-x;
+	color: #222222;
+}
+.ui-widget-content a {
+	color: #222222;
+}
+.ui-widget-header {
+	border: 1px solid #aaaaaa;
+	background: #cccccc url(images/ui-bg_highlight-soft_75_cccccc_1x100.png) 50% 50% repeat-x;
+	color: #222222;
+	font-weight: bold;
+}
+.ui-widget-header a {
+	color: #222222;
+}
+
+/* Interaction states
+----------------------------------*/
+.ui-state-default,
+.ui-widget-content .ui-state-default,
+.ui-widget-header .ui-state-default {
+	border: 1px solid #d3d3d3;
+	background: #e6e6e6 url(images/ui-bg_glass_75_e6e6e6_1x400.png) 50% 50% repeat-x;
+	font-weight: normal;
+	color: #555555;
+}
+.ui-state-default a,
+.ui-state-default a:link,
+.ui-state-default a:visited {
+	color: #555555;
+	text-decoration: none;
+}
+.ui-state-hover,
+.ui-widget-content .ui-state-hover,
+.ui-widget-header .ui-state-hover,
+.ui-state-focus,
+.ui-widget-content .ui-state-focus,
+.ui-widget-header .ui-state-focus {
+	border: 1px solid #999999;
+	background: #dadada url(images/ui-bg_glass_75_dadada_1x400.png) 50% 50% repeat-x;
+	font-weight: normal;
+	color: #212121;
+}
+.ui-state-hover a,
+.ui-state-hover a:hover,
+.ui-state-hover a:link,
+.ui-state-hover a:visited {
+	color: #212121;
+	text-decoration: none;
+}
+.ui-state-active,
+.ui-widget-content .ui-state-active,
+.ui-widget-header .ui-state-active {
+	border: 1px solid #aaaaaa;
+	background: #ffffff url(images/ui-bg_glass_65_ffffff_1x400.png) 50% 50% repeat-x;
+	font-weight: normal;
+	color: #212121;
+}
+.ui-state-active a,
+.ui-state-active a:link,
+.ui-state-active a:visited {
+	color: #212121;
+	text-decoration: none;
+}
+
+/* Interaction Cues
+----------------------------------*/
+.ui-state-highlight,
+.ui-widget-content .ui-state-highlight,
+.ui-widget-header .ui-state-highlight {
+	border: 1px solid #fcefa1;
+	background: #fbf9ee url(images/ui-bg_glass_55_fbf9ee_1x400.png) 50% 50% repeat-x;
+	color: #363636;
+}
+.ui-state-highlight a,
+.ui-widget-content .ui-state-highlight a,
+.ui-widget-header .ui-state-highlight a {
+	color: #363636;
+}
+.ui-state-error,
+.ui-widget-content .ui-state-error,
+.ui-widget-header .ui-state-error {
+	border: 1px solid #cd0a0a;
+	background: #fef1ec url(images/ui-bg_glass_95_fef1ec_1x400.png) 50% 50% repeat-x;
+	color: #cd0a0a;
+}
+.ui-state-error a,
+.ui-widget-content .ui-state-error a,
+.ui-widget-header .ui-state-error a {
+	color: #cd0a0a;
+}
+.ui-state-error-text,
+.ui-widget-content .ui-state-error-text,
+.ui-widget-header .ui-state-error-text {
+	color: #cd0a0a;
+}
+.ui-priority-primary,
+.ui-widget-content .ui-priority-primary,
+.ui-widget-header .ui-priority-primary {
+	font-weight: bold;
+}
+.ui-priority-secondary,
+.ui-widget-content .ui-priority-secondary,
+.ui-widget-header .ui-priority-secondary {
+	opacity: .7;
+	filter:Alpha(Opacity=70);
+	font-weight: normal;
+}
+.ui-state-disabled,
+.ui-widget-content .ui-state-disabled,
+.ui-widget-header .ui-state-disabled {
+	opacity: .35;
+	filter:Alpha(Opacity=35);
+	background-image: none;
+}
+.ui-state-disabled .ui-icon {
+	filter:Alpha(Opacity=35); /* For IE8 - See #6059 */
+}
+
+/* Icons
+----------------------------------*/
+
+/* states and images */
+.ui-icon {
+	width: 16px;
+	height: 16px;
+}
+.ui-icon,
+.ui-widget-content .ui-icon {
+	background-image: url(images/ui-icons_222222_256x240.png);
+}
+.ui-widget-header .ui-icon {
+	background-image: url(images/ui-icons_222222_256x240.png);
+}
+.ui-state-default .ui-icon {
+	background-image: url(images/ui-icons_888888_256x240.png);
+}
+.ui-state-hover .ui-icon,
+.ui-state-focus .ui-icon {
+	background-image: url(images/ui-icons_454545_256x240.png);
+}
+.ui-state-active .ui-icon {
+	background-image: url(images/ui-icons_454545_256x240.png);
+}
+.ui-state-highlight .ui-icon {
+	background-image: url(images/ui-icons_2e83ff_256x240.png);
+}
+.ui-state-error .ui-icon,
+.ui-state-error-text .ui-icon {
+	background-image: url(images/ui-icons_cd0a0a_256x240.png);
+}
+
+/* positioning */
+.ui-icon-blank { background-position: 16px 16px; }
+.ui-icon-carat-1-n { background-position: 0 0; }
+.ui-icon-carat-1-ne { background-position: -16px 0; }
+.ui-icon-carat-1-e { background-position: -32px 0; }
+.ui-icon-carat-1-se { background-position: -48px 0; }
+.ui-icon-carat-1-s { background-position: -64px 0; }
+.ui-icon-carat-1-sw { background-position: -80px 0; }
+.ui-icon-carat-1-w { background-position: -96px 0; }
+.ui-icon-carat-1-nw { background-position: -112px 0; }
+.ui-icon-carat-2-n-s { background-position: -128px 0; }
+.ui-icon-carat-2-e-w { background-position: -144px 0; }
+.ui-icon-triangle-1-n { background-position: 0 -16px; }
+.ui-icon-triangle-1-ne { background-position: -16px -16px; }
+.ui-icon-triangle-1-e { background-position: -32px -16px; }
+.ui-icon-triangle-1-se { background-position: -48px -16px; }
+.ui-icon-triangle-1-s { background-position: -64px -16px; }
+.ui-icon-triangle-1-sw { background-position: -80px -16px; }
+.ui-icon-triangle-1-w { background-position: -96px -16px; }
+.ui-icon-triangle-1-nw { background-position: -112px -16px; }
+.ui-icon-triangle-2-n-s { background-position: -128px -16px; }
+.ui-icon-triangle-2-e-w { background-position: -144px -16px; }
+.ui-icon-arrow-1-n { background-position: 0 -32px; }
+.ui-icon-arrow-1-ne { background-position: -16px -32px; }
+.ui-icon-arrow-1-e { background-position: -32px -32px; }
+.ui-icon-arrow-1-se { background-position: -48px -32px; }
+.ui-icon-arrow-1-s { background-position: -64px -32px; }
+.ui-icon-arrow-1-sw { background-position: -80px -32px; }
+.ui-icon-arrow-1-w { background-position: -96px -32px; }
+.ui-icon-arrow-1-nw { background-position: -112px -32px; }
+.ui-icon-arrow-2-n-s { background-position: -128px -32px; }
+.ui-icon-arrow-2-ne-sw { background-position: -144px -32px; }
+.ui-icon-arrow-2-e-w { background-position: -160px -32px; }
+.ui-icon-arrow-2-se-nw { background-position: -176px -32px; }
+.ui-icon-arrowstop-1-n { background-position: -192px -32px; }
+.ui-icon-arrowstop-1-e { background-position: -208px -32px; }
+.ui-icon-arrowstop-1-s { background-position: -224px -32px; }
+.ui-icon-arrowstop-1-w { background-position: -240px -32px; }
+.ui-icon-arrowthick-1-n { background-position: 0 -48px; }
+.ui-icon-arrowthick-1-ne { background-position: -16px -48px; }
+.ui-icon-arrowthick-1-e { background-position: -32px -48px; }
+.ui-icon-arrowthick-1-se { background-position: -48px -48px; }
+.ui-icon-arrowthick-1-s { background-position: -64px -48px; }
+.ui-icon-arrowthick-1-sw { background-position: -80px -48px; }
+.ui-icon-arrowthick-1-w { background-position: -96px -48px; }
+.ui-icon-arrowthick-1-nw { background-position: -112px -48px; }
+.ui-icon-arrowthick-2-n-s { background-position: -128px -48px; }
+.ui-icon-arrowthick-2-ne-sw { background-position: -144px -48px; }
+.ui-icon-arrowthick-2-e-w { background-position: -160px -48px; }
+.ui-icon-arrowthick-2-se-nw { background-position: -176px -48px; }
+.ui-icon-arrowthickstop-1-n { background-position: -192px -48px; }
+.ui-icon-arrowthickstop-1-e { background-position: -208px -48px; }
+.ui-icon-arrowthickstop-1-s { background-position: -224px -48px; }
+.ui-icon-arrowthickstop-1-w { background-position: -240px -48px; }
+.ui-icon-arrowreturnthick-1-w { background-position: 0 -64px; }
+.ui-icon-arrowreturnthick-1-n { background-position: -16px -64px; }
+.ui-icon-arrowreturnthick-1-e { background-position: -32px -64px; }
+.ui-icon-arrowreturnthick-1-s { background-position: -48px -64px; }
+.ui-icon-arrowreturn-1-w { background-position: -64px -64px; }
+.ui-icon-arrowreturn-1-n { background-position: -80px -64px; }
+.ui-icon-arrowreturn-1-e { background-position: -96px -64px; }
+.ui-icon-arrowreturn-1-s { background-position: -112px -64px; }
+.ui-icon-arrowrefresh-1-w { background-position: -128px -64px; }
+.ui-icon-arrowrefresh-1-n { background-position: -144px -64px; }
+.ui-icon-arrowrefresh-1-e { background-position: -160px -64px; }
+.ui-icon-arrowrefresh-1-s { background-position: -176px -64px; }
+.ui-icon-arrow-4 { background-position: 0 -80px; }
+.ui-icon-arrow-4-diag { background-position: -16px -80px; }
+.ui-icon-extlink { background-position: -32px -80px; }
+.ui-icon-newwin { background-position: -48px -80px; }
+.ui-icon-refresh { background-position: -64px -80px; }
+.ui-icon-shuffle { background-position: -80px -80px; }
+.ui-icon-transfer-e-w { background-position: -96px -80px; }
+.ui-icon-transferthick-e-w { background-position: -112px -80px; }
+.ui-icon-folder-collapsed { background-position: 0 -96px; }
+.ui-icon-folder-open { background-position: -16px -96px; }
+.ui-icon-document { background-position: -32px -96px; }
+.ui-icon-document-b { background-position: -48px -96px; }
+.ui-icon-note { background-position: -64px -96px; }
+.ui-icon-mail-closed { background-position: -80px -96px; }
+.ui-icon-mail-open { background-position: -96px -96px; }
+.ui-icon-suitcase { background-position: -112px -96px; }
+.ui-icon-comment { background-position: -128px -96px; }
+.ui-icon-person { background-position: -144px -96px; }
+.ui-icon-print { background-position: -160px -96px; }
+.ui-icon-trash { background-position: -176px -96px; }
+.ui-icon-locked { background-position: -192px -96px; }
+.ui-icon-unlocked { background-position: -208px -96px; }
+.ui-icon-bookmark { background-position: -224px -96px; }
+.ui-icon-tag { background-position: -240px -96px; }
+.ui-icon-home { background-position: 0 -112px; }
+.ui-icon-flag { background-position: -16px -112px; }
+.ui-icon-calendar { background-position: -32px -112px; }
+.ui-icon-cart { background-position: -48px -112px; }
+.ui-icon-pencil { background-position: -64px -112px; }
+.ui-icon-clock { background-position: -80px -112px; }
+.ui-icon-disk { background-position: -96px -112px; }
+.ui-icon-calculator { background-position: -112px -112px; }
+.ui-icon-zoomin { background-position: -128px -112px; }
+.ui-icon-zoomout { background-position: -144px -112px; }
+.ui-icon-search { background-position: -160px -112px; }
+.ui-icon-wrench { background-position: -176px -112px; }
+.ui-icon-gear { background-position: -192px -112px; }
+.ui-icon-heart { background-position: -208px -112px; }
+.ui-icon-star { background-position: -224px -112px; }
+.ui-icon-link { background-position: -240px -112px; }
+.ui-icon-cancel { background-position: 0 -128px; }
+.ui-icon-plus { background-position: -16px -128px; }
+.ui-icon-plusthick { background-position: -32px -128px; }
+.ui-icon-minus { background-position: -48px -128px; }
+.ui-icon-minusthick { background-position: -64px -128px; }
+.ui-icon-close { background-position: -80px -128px; }
+.ui-icon-closethick { background-position: -96px -128px; }
+.ui-icon-key { background-position: -112px -128px; }
+.ui-icon-lightbulb { background-position: -128px -128px; }
+.ui-icon-scissors { background-position: -144px -128px; }
+.ui-icon-clipboard { background-position: -160px -128px; }
+.ui-icon-copy { background-position: -176px -128px; }
+.ui-icon-contact { background-position: -192px -128px; }
+.ui-icon-image { background-position: -208px -128px; }
+.ui-icon-video { background-position: -224px -128px; }
+.ui-icon-script { background-position: -240px -128px; }
+.ui-icon-alert { background-position: 0 -144px; }
+.ui-icon-info { background-position: -16px -144px; }
+.ui-icon-notice { background-position: -32px -144px; }
+.ui-icon-help { background-position: -48px -144px; }
+.ui-icon-check { background-position: -64px -144px; }
+.ui-icon-bullet { background-position: -80px -144px; }
+.ui-icon-radio-on { background-position: -96px -144px; }
+.ui-icon-radio-off { background-position: -112px -144px; }
+.ui-icon-pin-w { background-position: -128px -144px; }
+.ui-icon-pin-s { background-position: -144px -144px; }
+.ui-icon-play { background-position: 0 -160px; }
+.ui-icon-pause { background-position: -16px -160px; }
+.ui-icon-seek-next { background-position: -32px -160px; }
+.ui-icon-seek-prev { background-position: -48px -160px; }
+.ui-icon-seek-end { background-position: -64px -160px; }
+.ui-icon-seek-start { background-position: -80px -160px; }
+/* ui-icon-seek-first is deprecated, use ui-icon-seek-start instead */
+.ui-icon-seek-first { background-position: -80px -160px; }
+.ui-icon-stop { background-position: -96px -160px; }
+.ui-icon-eject { background-position: -112px -160px; }
+.ui-icon-volume-off { background-position: -128px -160px; }
+.ui-icon-volume-on { background-position: -144px -160px; }
+.ui-icon-power { background-position: 0 -176px; }
+.ui-icon-signal-diag { background-position: -16px -176px; }
+.ui-icon-signal { background-position: -32px -176px; }
+.ui-icon-battery-0 { background-position: -48px -176px; }
+.ui-icon-battery-1 { background-position: -64px -176px; }
+.ui-icon-battery-2 { background-position: -80px -176px; }
+.ui-icon-battery-3 { background-position: -96px -176px; }
+.ui-icon-circle-plus { background-position: 0 -192px; }
+.ui-icon-circle-minus { background-position: -16px -192px; }
+.ui-icon-circle-close { background-position: -32px -192px; }
+.ui-icon-circle-triangle-e { background-position: -48px -192px; }
+.ui-icon-circle-triangle-s { background-position: -64px -192px; }
+.ui-icon-circle-triangle-w { background-position: -80px -192px; }
+.ui-icon-circle-triangle-n { background-position: -96px -192px; }
+.ui-icon-circle-arrow-e { background-position: -112px -192px; }
+.ui-icon-circle-arrow-s { background-position: -128px -192px; }
+.ui-icon-circle-arrow-w { background-position: -144px -192px; }
+.ui-icon-circle-arrow-n { background-position: -160px -192px; }
+.ui-icon-circle-zoomin { background-position: -176px -192px; }
+.ui-icon-circle-zoomout { background-position: -192px -192px; }
+.ui-icon-circle-check { background-position: -208px -192px; }
+.ui-icon-circlesmall-plus { background-position: 0 -208px; }
+.ui-icon-circlesmall-minus { background-position: -16px -208px; }
+.ui-icon-circlesmall-close { background-position: -32px -208px; }
+.ui-icon-squaresmall-plus { background-position: -48px -208px; }
+.ui-icon-squaresmall-minus { background-position: -64px -208px; }
+.ui-icon-squaresmall-close { background-position: -80px -208px; }
+.ui-icon-grip-dotted-vertical { background-position: 0 -224px; }
+.ui-icon-grip-dotted-horizontal { background-position: -16px -224px; }
+.ui-icon-grip-solid-vertical { background-position: -32px -224px; }
+.ui-icon-grip-solid-horizontal { background-position: -48px -224px; }
+.ui-icon-gripsmall-diagonal-se { background-position: -64px -224px; }
+.ui-icon-grip-diagonal-se { background-position: -80px -224px; }
+
+
+/* Misc visuals
+----------------------------------*/
+
+/* Corner radius */
+.ui-corner-all,
+.ui-corner-top,
+.ui-corner-left,
+.ui-corner-tl {
+	border-top-left-radius: 4px;
+}
+.ui-corner-all,
+.ui-corner-top,
+.ui-corner-right,
+.ui-corner-tr {
+	border-top-right-radius: 4px;
+}
+.ui-corner-all,
+.ui-corner-bottom,
+.ui-corner-left,
+.ui-corner-bl {
+	border-bottom-left-radius: 4px;
+}
+.ui-corner-all,
+.ui-corner-bottom,
+.ui-corner-right,
+.ui-corner-br {
+	border-bottom-right-radius: 4px;
+}
+
+/* Overlays */
+.ui-widget-overlay {
+	background: #aaaaaa url(images/ui-bg_flat_0_aaaaaa_40x100.png) 50% 50% repeat-x;
+	opacity: .3;
+	filter: Alpha(Opacity=30);
+}
+.ui-widget-shadow {
+	margin: -8px 0 0 -8px;
+	padding: 8px;
+	background: #aaaaaa url(images/ui-bg_flat_0_aaaaaa_40x100.png) 50% 50% repeat-x;
+	opacity: .3;
+	filter: Alpha(Opacity=30);
+	border-radius: 8px;
+}
diff --git a/www/jquery-ui.min.js b/www/jquery-ui.min.js
new file mode 100644
index 0000000..8b173d9
--- /dev/null
+++ b/www/jquery-ui.min.js
@@ -0,0 +1,125 @@
+/*! jQuery UI - v1.8.20 - 2012-04-30
+* https://github.com/jquery/jquery-ui
+* Includes: jquery.ui.core.js
+* Copyright (c) 2012 AUTHORS.txt; Licensed MIT, GPL */
+(function(a,b){function c(b,c){var e=b.nodeName.toLowerCase();if("area"===e){var f=b.parentNode,g=f.name,h;return!b.href||!g||f.nodeName.toLowerCase()!=="map"?!1:(h=a("img[usemap=#"+g+"]")[0],!!h&&d(h))}return(/input|select|textarea|button|object/.test(e)?!b.disabled:"a"==e?b.href||c:c)&&d(b)}function d(b){return!a(b).parents().andSelf().filter(function(){return a.curCSS(this,"visibility")==="hidden"||a.expr.filters.hidden(this)}).length}a.ui=a.ui||{};if(a.ui.version)return;a.extend(a.ui,{version:"1.8.20",keyCode:{ALT:18,BACKSPACE:8,CAPS_LOCK:20,COMMA:188,COMMAND:91,COMMAND_LEFT:91,COMMAND_RIGHT:93,CONTROL:17,DELETE:46,DOWN:40,END:35,ENTER:13,ESCAPE:27,HOME:36,INSERT:45,LEFT:37,MENU:93,NUMPAD_ADD:107,NUMPAD_DECIMAL:110,NUMPAD_DIVIDE:111,NUMPAD_ENTER:108,NUMPAD_MULTIPLY:106,NUMPAD_SUBTRACT:109,PAGE_DOWN:34,PAGE_UP:33,PERIOD:190,RIGHT:39,SHIFT:16,SPACE:32,TAB:9,UP:38,WINDOWS:91}}),a.fn.extend({propAttr:a.fn.prop||a.fn.attr,_focus:a.fn.focus,focus:function(b,c){return typeof b=="number
 "?this.each(function(){var d=this;setTimeout(function(){a(d).focus(),c&&c.call(d)},b)}):this._focus.apply(this,arguments)},scrollParent:function(){var b;return a.browser.msie&&/(static|relative)/.test(this.css("position"))||/absolute/.test(this.css("position"))?b=this.parents().filter(function(){return/(relative|absolute|fixed)/.test(a.curCSS(this,"position",1))&&/(auto|scroll)/.test(a.curCSS(this,"overflow",1)+a.curCSS(this,"overflow-y",1)+a.curCSS(this,"overflow-x",1))}).eq(0):b=this.parents().filter(function(){return/(auto|scroll)/.test(a.curCSS(this,"overflow",1)+a.curCSS(this,"overflow-y",1)+a.curCSS(this,"overflow-x",1))}).eq(0),/fixed/.test(this.css("position"))||!b.length?a(document):b},zIndex:function(c){if(c!==b)return this.css("zIndex",c);if(this.length){var d=a(this[0]),e,f;while(d.length&&d[0]!==document){e=d.css("position");if(e==="absolute"||e==="relative"||e==="fixed"){f=parseInt(d.css("zIndex"),10);if(!isNaN(f)&&f!==0)return f}d=d.parent()}}return 0},disableSelectio
 n:function(){return this.bind((a.support.selectstart?"selectstart":"mousedown")+".ui-disableSelection",function(a){a.preventDefault()})},enableSelection:function(){return this.unbind(".ui-disableSelection")}}),a.each(["Width","Height"],function(c,d){function h(b,c,d,f){return a.each(e,function(){c-=parseFloat(a.curCSS(b,"padding"+this,!0))||0,d&&(c-=parseFloat(a.curCSS(b,"border"+this+"Width",!0))||0),f&&(c-=parseFloat(a.curCSS(b,"margin"+this,!0))||0)}),c}var e=d==="Width"?["Left","Right"]:["Top","Bottom"],f=d.toLowerCase(),g={innerWidth:a.fn.innerWidth,innerHeight:a.fn.innerHeight,outerWidth:a.fn.outerWidth,outerHeight:a.fn.outerHeight};a.fn["inner"+d]=function(c){return c===b?g["inner"+d].call(this):this.each(function(){a(this).css(f,h(this,c)+"px")})},a.fn["outer"+d]=function(b,c){return typeof b!="number"?g["outer"+d].call(this,b):this.each(function(){a(this).css(f,h(this,b,!0,c)+"px")})}}),a.extend(a.expr[":"],{data:function(b,c,d){return!!a.data(b,d[3])},focusable:function(b)
 {return c(b,!isNaN(a.attr(b,"tabindex")))},tabbable:function(b){var d=a.attr(b,"tabindex"),e=isNaN(d);return(e||d>=0)&&c(b,!e)}}),a(function(){var b=document.body,c=b.appendChild(c=document.createElement("div"));c.offsetHeight,a.extend(c.style,{minHeight:"100px",height:"auto",padding:0,borderWidth:0}),a.support.minHeight=c.offsetHeight===100,a.support.selectstart="onselectstart"in c,b.removeChild(c).style.display="none"}),a.extend(a.ui,{plugin:{add:function(b,c,d){var e=a.ui[b].prototype;for(var f in d)e.plugins[f]=e.plugins[f]||[],e.plugins[f].push([c,d[f]])},call:function(a,b,c){var d=a.plugins[b];if(!d||!a.element[0].parentNode)return;for(var e=0;e<d.length;e++)a.options[d[e][0]]&&d[e][1].apply(a.element,c)}},contains:function(a,b){return document.compareDocumentPosition?a.compareDocumentPosition(b)&16:a!==b&&a.contains(b)},hasScroll:function(b,c){if(a(b).css("overflow")==="hidden")return!1;var d=c&&c==="left"?"scrollLeft":"scrollTop",e=!1;return b[d]>0?!0:(b[d]=1,e=b[d]>0,b[d]=0
 ,e)},isOverAxis:function(a,b,c){return a>b&&a<b+c},isOver:function(b,c,d,e,f,g){return a.ui.isOverAxis(b,d,f)&&a.ui.isOverAxis(c,e,g)}})})(jQuery);;/*! jQuery UI - v1.8.20 - 2012-04-30
+* https://github.com/jquery/jquery-ui
+* Includes: jquery.ui.widget.js
+* Copyright (c) 2012 AUTHORS.txt; Licensed MIT, GPL */
+(function(a,b){if(a.cleanData){var c=a.cleanData;a.cleanData=function(b){for(var d=0,e;(e=b[d])!=null;d++)try{a(e).triggerHandler("remove")}catch(f){}c(b)}}else{var d=a.fn.remove;a.fn.remove=function(b,c){return this.each(function(){return c||(!b||a.filter(b,[this]).length)&&a("*",this).add([this]).each(function(){try{a(this).triggerHandler("remove")}catch(b){}}),d.call(a(this),b,c)})}}a.widget=function(b,c,d){var e=b.split(".")[0],f;b=b.split(".")[1],f=e+"-"+b,d||(d=c,c=a.Widget),a.expr[":"][f]=function(c){return!!a.data(c,b)},a[e]=a[e]||{},a[e][b]=function(a,b){arguments.length&&this._createWidget(a,b)};var g=new c;g.options=a.extend(!0,{},g.options),a[e][b].prototype=a.extend(!0,g,{namespace:e,widgetName:b,widgetEventPrefix:a[e][b].prototype.widgetEventPrefix||b,widgetBaseClass:f},d),a.widget.bridge(b,a[e][b])},a.widget.bridge=function(c,d){a.fn[c]=function(e){var f=typeof e=="string",g=Array.prototype.slice.call(arguments,1),h=this;return e=!f&&g.length?a.extend.apply(null,[!0,e
 ].concat(g)):e,f&&e.charAt(0)==="_"?h:(f?this.each(function(){var d=a.data(this,c),f=d&&a.isFunction(d[e])?d[e].apply(d,g):d;if(f!==d&&f!==b)return h=f,!1}):this.each(function(){var b=a.data(this,c);b?b.option(e||{})._init():a.data(this,c,new d(e,this))}),h)}},a.Widget=function(a,b){arguments.length&&this._createWidget(a,b)},a.Widget.prototype={widgetName:"widget",widgetEventPrefix:"",options:{disabled:!1},_createWidget:function(b,c){a.data(c,this.widgetName,this),this.element=a(c),this.options=a.extend(!0,{},this.options,this._getCreateOptions(),b);var d=this;this.element.bind("remove."+this.widgetName,function(){d.destroy()}),this._create(),this._trigger("create"),this._init()},_getCreateOptions:function(){return a.metadata&&a.metadata.get(this.element[0])[this.widgetName]},_create:function(){},_init:function(){},destroy:function(){this.element.unbind("."+this.widgetName).removeData(this.widgetName),this.widget().unbind("."+this.widgetName).removeAttr("aria-disabled").removeClass(
 this.widgetBaseClass+"-disabled "+"ui-state-disabled")},widget:function(){return this.element},option:function(c,d){var e=c;if(arguments.length===0)return a.extend({},this.options);if(typeof c=="string"){if(d===b)return this.options[c];e={},e[c]=d}return this._setOptions(e),this},_setOptions:function(b){var c=this;return a.each(b,function(a,b){c._setOption(a,b)}),this},_setOption:function(a,b){return this.options[a]=b,a==="disabled"&&this.widget()[b?"addClass":"removeClass"](this.widgetBaseClass+"-disabled"+" "+"ui-state-disabled").attr("aria-disabled",b),this},enable:function(){return this._setOption("disabled",!1)},disable:function(){return this._setOption("disabled",!0)},_trigger:function(b,c,d){var e,f,g=this.options[b];d=d||{},c=a.Event(c),c.type=(b===this.widgetEventPrefix?b:this.widgetEventPrefix+b).toLowerCase(),c.target=this.element[0],f=c.originalEvent;if(f)for(e in f)e in c||(c[e]=f[e]);return this.element.trigger(c,d),!(a.isFunction(g)&&g.call(this.element[0],c,d)===!1||
 c.isDefaultPrevented())}}})(jQuery);;/*! jQuery UI - v1.8.20 - 2012-04-30
+* https://github.com/jquery/jquery-ui
+* Includes: jquery.ui.mouse.js
+* Copyright (c) 2012 AUTHORS.txt; Licensed MIT, GPL */
+(function(a,b){var c=!1;a(document).mouseup(function(a){c=!1}),a.widget("ui.mouse",{options:{cancel:":input,option",distance:1,delay:0},_mouseInit:function(){var b=this;this.element.bind("mousedown."+this.widgetName,function(a){return b._mouseDown(a)}).bind("click."+this.widgetName,function(c){if(!0===a.data(c.target,b.widgetName+".preventClickEvent"))return a.removeData(c.target,b.widgetName+".preventClickEvent"),c.stopImmediatePropagation(),!1}),this.started=!1},_mouseDestroy:function(){this.element.unbind("."+this.widgetName),a(document).unbind("mousemove."+this.widgetName,this._mouseMoveDelegate).unbind("mouseup."+this.widgetName,this._mouseUpDelegate)},_mouseDown:function(b){if(c)return;this._mouseStarted&&this._mouseUp(b),this._mouseDownEvent=b;var d=this,e=b.which==1,f=typeof this.options.cancel=="string"&&b.target.nodeName?a(b.target).closest(this.options.cancel).length:!1;if(!e||f||!this._mouseCapture(b))return!0;this.mouseDelayMet=!this.options.delay,this.mouseDelayMet||(t
 his._mouseDelayTimer=setTimeout(function(){d.mouseDelayMet=!0},this.options.delay));if(this._mouseDistanceMet(b)&&this._mouseDelayMet(b)){this._mouseStarted=this._mouseStart(b)!==!1;if(!this._mouseStarted)return b.preventDefault(),!0}return!0===a.data(b.target,this.widgetName+".preventClickEvent")&&a.removeData(b.target,this.widgetName+".preventClickEvent"),this._mouseMoveDelegate=function(a){return d._mouseMove(a)},this._mouseUpDelegate=function(a){return d._mouseUp(a)},a(document).bind("mousemove."+this.widgetName,this._mouseMoveDelegate).bind("mouseup."+this.widgetName,this._mouseUpDelegate),b.preventDefault(),c=!0,!0},_mouseMove:function(b){return!a.browser.msie||document.documentMode>=9||!!b.button?this._mouseStarted?(this._mouseDrag(b),b.preventDefault()):(this._mouseDistanceMet(b)&&this._mouseDelayMet(b)&&(this._mouseStarted=this._mouseStart(this._mouseDownEvent,b)!==!1,this._mouseStarted?this._mouseDrag(b):this._mouseUp(b)),!this._mouseStarted):this._mouseUp(b)},_mouseUp:fun
 ction(b){return a(document).unbind("mousemove."+this.widgetName,this._mouseMoveDelegate).unbind("mouseup."+this.widgetName,this._mouseUpDelegate),this._mouseStarted&&(this._mouseStarted=!1,b.target==this._mouseDownEvent.target&&a.data(b.target,this.widgetName+".preventClickEvent",!0),this._mouseStop(b)),!1},_mouseDistanceMet:function(a){return Math.max(Math.abs(this._mouseDownEvent.pageX-a.pageX),Math.abs(this._mouseDownEvent.pageY-a.pageY))>=this.options.distance},_mouseDelayMet:function(a){return this.mouseDelayMet},_mouseStart:function(a){},_mouseDrag:function(a){},_mouseStop:function(a){},_mouseCapture:function(a){return!0}})})(jQuery);;/*! jQuery UI - v1.8.20 - 2012-04-30
+* https://github.com/jquery/jquery-ui
+* Includes: jquery.ui.position.js
+* Copyright (c) 2012 AUTHORS.txt; Licensed MIT, GPL */
+(function(a,b){a.ui=a.ui||{};var c=/left|center|right/,d=/top|center|bottom/,e="center",f={},g=a.fn.position,h=a.fn.offset;a.fn.position=function(b){if(!b||!b.of)return g.apply(this,arguments);b=a.extend({},b);var h=a(b.of),i=h[0],j=(b.collision||"flip").split(" "),k=b.offset?b.offset.split(" "):[0,0],l,m,n;return i.nodeType===9?(l=h.width(),m=h.height(),n={top:0,left:0}):i.setTimeout?(l=h.width(),m=h.height(),n={top:h.scrollTop(),left:h.scrollLeft()}):i.preventDefault?(b.at="left top",l=m=0,n={top:b.of.pageY,left:b.of.pageX}):(l=h.outerWidth(),m=h.outerHeight(),n=h.offset()),a.each(["my","at"],function(){var a=(b[this]||"").split(" ");a.length===1&&(a=c.test(a[0])?a.concat([e]):d.test(a[0])?[e].concat(a):[e,e]),a[0]=c.test(a[0])?a[0]:e,a[1]=d.test(a[1])?a[1]:e,b[this]=a}),j.length===1&&(j[1]=j[0]),k[0]=parseInt(k[0],10)||0,k.length===1&&(k[1]=k[0]),k[1]=parseInt(k[1],10)||0,b.at[0]==="right"?n.left+=l:b.at[0]===e&&(n.left+=l/2),b.at[1]==="bottom"?n.top+=m:b.at[1]===e&&(n.top+=m/2),
 n.left+=k[0],n.top+=k[1],this.each(function(){var c=a(this),d=c.outerWidth(),g=c.outerHeight(),h=parseInt(a.curCSS(this,"marginLeft",!0))||0,i=parseInt(a.curCSS(this,"marginTop",!0))||0,o=d+h+(parseInt(a.curCSS(this,"marginRight",!0))||0),p=g+i+(parseInt(a.curCSS(this,"marginBottom",!0))||0),q=a.extend({},n),r;b.my[0]==="right"?q.left-=d:b.my[0]===e&&(q.left-=d/2),b.my[1]==="bottom"?q.top-=g:b.my[1]===e&&(q.top-=g/2),f.fractions||(q.left=Math.round(q.left),q.top=Math.round(q.top)),r={left:q.left-h,top:q.top-i},a.each(["left","top"],function(c,e){a.ui.position[j[c]]&&a.ui.position[j[c]][e](q,{targetWidth:l,targetHeight:m,elemWidth:d,elemHeight:g,collisionPosition:r,collisionWidth:o,collisionHeight:p,offset:k,my:b.my,at:b.at})}),a.fn.bgiframe&&c.bgiframe(),c.offset(a.extend(q,{using:b.using}))})},a.ui.position={fit:{left:function(b,c){var d=a(window),e=c.collisionPosition.left+c.collisionWidth-d.width()-d.scrollLeft();b.left=e>0?b.left-e:Math.max(b.left-c.collisionPosition.left,b.left
 )},top:function(b,c){var d=a(window),e=c.collisionPosition.top+c.collisionHeight-d.height()-d.scrollTop();b.top=e>0?b.top-e:Math.max(b.top-c.collisionPosition.top,b.top)}},flip:{left:function(b,c){if(c.at[0]===e)return;var d=a(window),f=c.collisionPosition.left+c.collisionWidth-d.width()-d.scrollLeft(),g=c.my[0]==="left"?-c.elemWidth:c.my[0]==="right"?c.elemWidth:0,h=c.at[0]==="left"?c.targetWidth:-c.targetWidth,i=-2*c.offset[0];b.left+=c.collisionPosition.left<0?g+h+i:f>0?g+h+i:0},top:function(b,c){if(c.at[1]===e)return;var d=a(window),f=c.collisionPosition.top+c.collisionHeight-d.height()-d.scrollTop(),g=c.my[1]==="top"?-c.elemHeight:c.my[1]==="bottom"?c.elemHeight:0,h=c.at[1]==="top"?c.targetHeight:-c.targetHeight,i=-2*c.offset[1];b.top+=c.collisionPosition.top<0?g+h+i:f>0?g+h+i:0}}},a.offset.setOffset||(a.offset.setOffset=function(b,c){/static/.test(a.curCSS(b,"position"))&&(b.style.position="relative");var d=a(b),e=d.offset(),f=parseInt(a.curCSS(b,"top",!0),10)||0,g=parseInt(a.
 curCSS(b,"left",!0),10)||0,h={top:c.top-e.top+f,left:c.left-e.left+g};"using"in c?c.using.call(b,h):d.css(h)},a.fn.offset=function(b){var c=this[0];return!c||!c.ownerDocument?null:b?this.each(function(){a.offset.setOffset(this,b)}):h.call(this)}),function(){var b=document.getElementsByTagName("body")[0],c=document.createElement("div"),d,e,g,h,i;d=document.createElement(b?"div":"body"),g={visibility:"hidden",width:0,height:0,border:0,margin:0,background:"none"},b&&a.extend(g,{position:"absolute",left:"-1000px",top:"-1000px"});for(var j in g)d.style[j]=g[j];d.appendChild(c),e=b||document.documentElement,e.insertBefore(d,e.firstChild),c.style.cssText="position: absolute; left: 10.7432222px; top: 10.432325px; height: 30px; width: 201px;",h=a(c).offset(function(a,b){return b}).offset(),d.innerHTML="",e.removeChild(d),i=h.top+h.left+(b?2e3:0),f.fractions=i>21&&i<22}()})(jQuery);;/*! jQuery UI - v1.8.20 - 2012-04-30
+* https://github.com/jquery/jquery-ui
+* Includes: jquery.ui.draggable.js
+* Copyright (c) 2012 AUTHORS.txt; Licensed MIT, GPL */
+(function(a,b){a.widget("ui.draggable",a.ui.mouse,{widgetEventPrefix:"drag",options:{addClasses:!0,appendTo:"parent",axis:!1,connectToSortable:!1,containment:!1,cursor:"auto",cursorAt:!1,grid:!1,handle:!1,helper:"original",iframeFix:!1,opacity:!1,refreshPositions:!1,revert:!1,revertDuration:500,scope:"default",scroll:!0,scrollSensitivity:20,scrollSpeed:20,snap:!1,snapMode:"both",snapTolerance:20,stack:!1,zIndex:!1},_create:function(){this.options.helper=="original"&&!/^(?:r|a|f)/.test(this.element.css("position"))&&(this.element[0].style.position="relative"),this.options.addClasses&&this.element.addClass("ui-draggable"),this.options.disabled&&this.element.addClass("ui-draggable-disabled"),this._mouseInit()},destroy:function(){if(!this.element.data("draggable"))return;return this.element.removeData("draggable").unbind(".draggable").removeClass("ui-draggable ui-draggable-dragging ui-draggable-disabled"),this._mouseDestroy(),this},_mouseCapture:function(b){var c=this.options;return thi
 s.helper||c.disabled||a(b.target).is(".ui-resizable-handle")?!1:(this.handle=this._getHandle(b),this.handle?(c.iframeFix&&a(c.iframeFix===!0?"iframe":c.iframeFix).each(function(){a('<div class="ui-draggable-iframeFix" style="background: #fff;"></div>').css({width:this.offsetWidth+"px",height:this.offsetHeight+"px",position:"absolute",opacity:"0.001",zIndex:1e3}).css(a(this).offset()).appendTo("body")}),!0):!1)},_mouseStart:function(b){var c=this.options;return this.helper=this._createHelper(b),this._cacheHelperProportions(),a.ui.ddmanager&&(a.ui.ddmanager.current=this),this._cacheMargins(),this.cssPosition=this.helper.css("position"),this.scrollParent=this.helper.scrollParent(),this.offset=this.positionAbs=this.element.offset(),this.offset={top:this.offset.top-this.margins.top,left:this.offset.left-this.margins.left},a.extend(this.offset,{click:{left:b.pageX-this.offset.left,top:b.pageY-this.offset.top},parent:this._getParentOffset(),relative:this._getRelativeOffset()}),this.origina
 lPosition=this.position=this._generatePosition(b),this.originalPageX=b.pageX,this.originalPageY=b.pageY,c.cursorAt&&this._adjustOffsetFromHelper(c.cursorAt),c.containment&&this._setContainment(),this._trigger("start",b)===!1?(this._clear(),!1):(this._cacheHelperProportions(),a.ui.ddmanager&&!c.dropBehaviour&&a.ui.ddmanager.prepareOffsets(this,b),this.helper.addClass("ui-draggable-dragging"),this._mouseDrag(b,!0),a.ui.ddmanager&&a.ui.ddmanager.dragStart(this,b),!0)},_mouseDrag:function(b,c){this.position=this._generatePosition(b),this.positionAbs=this._convertPositionTo("absolute");if(!c){var d=this._uiHash();if(this._trigger("drag",b,d)===!1)return this._mouseUp({}),!1;this.position=d.position}if(!this.options.axis||this.options.axis!="y")this.helper[0].style.left=this.position.left+"px";if(!this.options.axis||this.options.axis!="x")this.helper[0].style.top=this.position.top+"px";return a.ui.ddmanager&&a.ui.ddmanager.drag(this,b),!1},_mouseStop:function(b){var c=!1;a.ui.ddmanager&&!
 this.options.dropBehaviour&&(c=a.ui.ddmanager.drop(this,b)),this.dropped&&(c=this.dropped,this.dropped=!1);var d=this.element[0],e=!1;while(d&&(d=d.parentNode))d==document&&(e=!0);if(!e&&this.options.helper==="original")return!1;if(this.options.revert=="invalid"&&!c||this.options.revert=="valid"&&c||this.options.revert===!0||a.isFunction(this.options.revert)&&this.options.revert.call(this.element,c)){var f=this;a(this.helper).animate(this.originalPosition,parseInt(this.options.revertDuration,10),function(){f._trigger("stop",b)!==!1&&f._clear()})}else this._trigger("stop",b)!==!1&&this._clear();return!1},_mouseUp:function(b){return this.options.iframeFix===!0&&a("div.ui-draggable-iframeFix").each(function(){this.parentNode.removeChild(this)}),a.ui.ddmanager&&a.ui.ddmanager.dragStop(this,b),a.ui.mouse.prototype._mouseUp.call(this,b)},cancel:function(){return this.helper.is(".ui-draggable-dragging")?this._mouseUp({}):this._clear(),this},_getHandle:function(b){var c=!this.options.handle
 ||!a(this.options.handle,this.element).length?!0:!1;return a(this.options.handle,this.element).find("*").andSelf().each(function(){this==b.target&&(c=!0)}),c},_createHelper:function(b){var c=this.options,d=a.isFunction(c.helper)?a(c.helper.apply(this.element[0],[b])):c.helper=="clone"?this.element.clone().removeAttr("id"):this.element;return d.parents("body").length||d.appendTo(c.appendTo=="parent"?this.element[0].parentNode:c.appendTo),d[0]!=this.element[0]&&!/(fixed|absolute)/.test(d.css("position"))&&d.css("position","absolute"),d},_adjustOffsetFromHelper:function(b){typeof b=="string"&&(b=b.split(" ")),a.isArray(b)&&(b={left:+b[0],top:+b[1]||0}),"left"in b&&(this.offset.click.left=b.left+this.margins.left),"right"in b&&(this.offset.click.left=this.helperProportions.width-b.right+this.margins.left),"top"in b&&(this.offset.click.top=b.top+this.margins.top),"bottom"in b&&(this.offset.click.top=this.helperProportions.height-b.bottom+this.margins.top)},_getParentOffset:function(){thi
 s.offsetParent=this.helper.offsetParent();var b=this.offsetParent.offset();this.cssPosition=="absolute"&&this.scrollParent[0]!=document&&a.ui.contains(this.scrollParent[0],this.offsetParent[0])&&(b.left+=this.scrollParent.scrollLeft(),b.top+=this.scrollParent.scrollTop());if(this.offsetParent[0]==document.body||this.offsetParent[0].tagName&&this.offsetParent[0].tagName.toLowerCase()=="html"&&a.browser.msie)b={top:0,left:0};return{top:b.top+(parseInt(this.offsetParent.css("borderTopWidth"),10)||0),left:b.left+(parseInt(this.offsetParent.css("borderLeftWidth"),10)||0)}},_getRelativeOffset:function(){if(this.cssPosition=="relative"){var a=this.element.position();return{top:a.top-(parseInt(this.helper.css("top"),10)||0)+this.scrollParent.scrollTop(),left:a.left-(parseInt(this.helper.css("left"),10)||0)+this.scrollParent.scrollLeft()}}return{top:0,left:0}},_cacheMargins:function(){this.margins={left:parseInt(this.element.css("marginLeft"),10)||0,top:parseInt(this.element.css("marginTop")
 ,10)||0,right:parseInt(this.element.css("marginRight"),10)||0,bottom:parseInt(this.element.css("marginBottom"),10)||0}},_cacheHelperProportions:function(){this.helperProportions={width:this.helper.outerWidth(),height:this.helper.outerHeight()}},_setContainment:function(){var b=this.options;b.containment=="parent"&&(b.containment=this.helper[0].parentNode);if(b.containment=="document"||b.containment=="window")this.containment=[b.containment=="document"?0:a(window).scrollLeft()-this.offset.relative.left-this.offset.parent.left,b.containment=="document"?0:a(window).scrollTop()-this.offset.relative.top-this.offset.parent.top,(b.containment=="document"?0:a(window).scrollLeft())+a(b.containment=="document"?document:window).width()-this.helperProportions.width-this.margins.left,(b.containment=="document"?0:a(window).scrollTop())+(a(b.containment=="document"?document:window).height()||document.body.parentNode.scrollHeight)-this.helperProportions.height-this.margins.top];if(!/^(document|wind
 ow|parent)$/.test(b.containment)&&b.containment.constructor!=Array){var c=a(b.containment),d=c[0];if(!d)return;var e=c.offset(),f=a(d).css("overflow")!="hidden";this.containment=[(parseInt(a(d).css("borderLeftWidth"),10)||0)+(parseInt(a(d).css("paddingLeft"),10)||0),(parseInt(a(d).css("borderTopWidth"),10)||0)+(parseInt(a(d).css("paddingTop"),10)||0),(f?Math.max(d.scrollWidth,d.offsetWidth):d.offsetWidth)-(parseInt(a(d).css("borderLeftWidth"),10)||0)-(parseInt(a(d).css("paddingRight"),10)||0)-this.helperProportions.width-this.margins.left-this.margins.right,(f?Math.max(d.scrollHeight,d.offsetHeight):d.offsetHeight)-(parseInt(a(d).css("borderTopWidth"),10)||0)-(parseInt(a(d).css("paddingBottom"),10)||0)-this.helperProportions.height-this.margins.top-this.margins.bottom],this.relative_container=c}else b.containment.constructor==Array&&(this.containment=b.containment)},_convertPositionTo:function(b,c){c||(c=this.position);var d=b=="absolute"?1:-1,e=this.options,f=this.cssPosition=="abs
 olute"&&(this.scrollParent[0]==document||!a.ui.contains(this.scrollParent[0],this.offsetParent[0]))?this.offsetParent:this.scrollParent,g=/(html|body)/i.test(f[0].tagName);return{top:c.top+this.offset.relative.top*d+this.offset.parent.top*d-(a.browser.safari&&a.browser.version<526&&this.cssPosition=="fixed"?0:(this.cssPosition=="fixed"?-this.scrollParent.scrollTop():g?0:f.scrollTop())*d),left:c.left+this.offset.relative.left*d+this.offset.parent.left*d-(a.browser.safari&&a.browser.version<526&&this.cssPosition=="fixed"?0:(this.cssPosition=="fixed"?-this.scrollParent.scrollLeft():g?0:f.scrollLeft())*d)}},_generatePosition:function(b){var c=this.options,d=this.cssPosition=="absolute"&&(this.scrollParent[0]==document||!a.ui.contains(this.scrollParent[0],this.offsetParent[0]))?this.offsetParent:this.scrollParent,e=/(html|body)/i.test(d[0].tagName),f=b.pageX,g=b.pageY;if(this.originalPosition){var h;if(this.containment){if(this.relative_container){var i=this.relative_container.offset();h
 =[this.containment[0]+i.left,this.containment[1]+i.top,this.containment[2]+i.left,this.containment[3]+i.top]}else h=this.containment;b.pageX-this.offset.click.left<h[0]&&(f=h[0]+this.offset.click.left),b.pageY-this.offset.click.top<h[1]&&(g=h[1]+this.offset.click.top),b.pageX-this.offset.click.left>h[2]&&(f=h[2]+this.offset.click.left),b.pageY-this.offset.click.top>h[3]&&(g=h[3]+this.offset.click.top)}if(c.grid){var j=c.grid[1]?this.originalPageY+Math.round((g-this.originalPageY)/c.grid[1])*c.grid[1]:this.originalPageY;g=h?j-this.offset.click.top<h[1]||j-this.offset.click.top>h[3]?j-this.offset.click.top<h[1]?j+c.grid[1]:j-c.grid[1]:j:j;var k=c.grid[0]?this.originalPageX+Math.round((f-this.originalPageX)/c.grid[0])*c.grid[0]:this.originalPageX;f=h?k-this.offset.click.left<h[0]||k-this.offset.click.left>h[2]?k-this.offset.click.left<h[0]?k+c.grid[0]:k-c.grid[0]:k:k}}return{top:g-this.offset.click.top-this.offset.relative.top-this.offset.parent.top+(a.browser.safari&&a.browser.version
 <526&&this.cssPosition=="fixed"?0:this.cssPosition=="fixed"?-this.scrollParent.scrollTop():e?0:d.scrollTop()),left:f-this.offset.click.left-this.offset.relative.left-this.offset.parent.left+(a.browser.safari&&a.browser.version<526&&this.cssPosition=="fixed"?0:this.cssPosition=="fixed"?-this.scrollParent.scrollLeft():e?0:d.scrollLeft())}},_clear:function(){this.helper.removeClass("ui-draggable-dragging"),this.helper[0]!=this.element[0]&&!this.cancelHelperRemoval&&this.helper.remove(),this.helper=null,this.cancelHelperRemoval=!1},_trigger:function(b,c,d){return d=d||this._uiHash(),a.ui.plugin.call(this,b,[c,d]),b=="drag"&&(this.positionAbs=this._convertPositionTo("absolute")),a.Widget.prototype._trigger.call(this,b,c,d)},plugins:{},_uiHash:function(a){return{helper:this.helper,position:this.position,originalPosition:this.originalPosition,offset:this.positionAbs}}}),a.extend(a.ui.draggable,{version:"1.8.20"}),a.ui.plugin.add("draggable","connectToSortable",{start:function(b,c){var d=a(
 this).data("draggable"),e=d.options,f=a.extend({},c,{item:d.element});d.sortables=[],a(e.connectToSortable).each(function(){var c=a.data(this,"sortable");c&&!c.options.disabled&&(d.sortables.push({instance:c,shouldRevert:c.options.revert}),c.refreshPositions(),c._trigger("activate",b,f))})},stop:function(b,c){var d=a(this).data("draggable"),e=a.extend({},c,{item:d.element});a.each(d.sortables,function(){this.instance.isOver?(this.instance.isOver=0,d.cancelHelperRemoval=!0,this.instance.cancelHelperRemoval=!1,this.shouldRevert&&(this.instance.options.revert=!0),this.instance._mouseStop(b),this.instance.options.helper=this.instance.options._helper,d.options.helper=="original"&&this.instance.currentItem.css({top:"auto",left:"auto"})):(this.instance.cancelHelperRemoval=!1,this.instance._trigger("deactivate",b,e))})},drag:function(b,c){var d=a(this).data("draggable"),e=this,f=function(b){var c=this.offset.click.top,d=this.offset.click.left,e=this.positionAbs.top,f=this.positionAbs.left,g
 =b.height,h=b.width,i=b.top,j=b.left;return a.ui.isOver(e+c,f+d,i,j,g,h)};a.each(d.sortables,function(f){this.instance.positionAbs=d.positionAbs,this.instance.helperProportions=d.helperProportions,this.instance.offset.click=d.offset.click,this.instance._intersectsWith(this.instance.containerCache)?(this.instance.isOver||(this.instance.isOver=1,this.instance.currentItem=a(e).clone().removeAttr("id").appendTo(this.instance.element).data("sortable-item",!0),this.instance.options._helper=this.instance.options.helper,this.instance.options.helper=function(){return c.helper[0]},b.target=this.instance.currentItem[0],this.instance._mouseCapture(b,!0),this.instance._mouseStart(b,!0,!0),this.instance.offset.click.top=d.offset.click.top,this.instance.offset.click.left=d.offset.click.left,this.instance.offset.parent.left-=d.offset.parent.left-this.instance.offset.parent.left,this.instance.offset.parent.top-=d.offset.parent.top-this.instance.offset.parent.top,d._trigger("toSortable",b),d.dropped=
 this.instance.element,d.currentItem=d.element,this.instance.fromOutside=d),this.instance.currentItem&&this.instance._mouseDrag(b)):this.instance.isOver&&(this.instance.isOver=0,this.instance.cancelHelperRemoval=!0,this.instance.options.revert=!1,this.instance._trigger("out",b,this.instance._uiHash(this.instance)),this.instance._mouseStop(b,!0),this.instance.options.helper=this.instance.options._helper,this.instance.currentItem.remove(),this.instance.placeholder&&this.instance.placeholder.remove(),d._trigger("fromSortable",b),d.dropped=!1)})}}),a.ui.plugin.add("draggable","cursor",{start:function(b,c){var d=a("body"),e=a(this).data("draggable").options;d.css("cursor")&&(e._cursor=d.css("cursor")),d.css("cursor",e.cursor)},stop:function(b,c){var d=a(this).data("draggable").options;d._cursor&&a("body").css("cursor",d._cursor)}}),a.ui.plugin.add("draggable","opacity",{start:function(b,c){var d=a(c.helper),e=a(this).data("draggable").options;d.css("opacity")&&(e._opacity=d.css("opacity")
 ),d.css("opacity",e.opacity)},stop:function(b,c){var d=a(this).data("draggable").options;d._opacity&&a(c.helper).css("opacity",d._opacity)}}),a.ui.plugin.add("draggable","scroll",{start:function(b,c){var d=a(this).data("draggable");d.scrollParent[0]!=document&&d.scrollParent[0].tagName!="HTML"&&(d.overflowOffset=d.scrollParent.offset())},drag:function(b,c){var d=a(this).data("draggable"),e=d.options,f=!1;if(d.scrollParent[0]!=document&&d.scrollParent[0].tagName!="HTML"){if(!e.axis||e.axis!="x")d.overflowOffset.top+d.scrollParent[0].offsetHeight-b.pageY<e.scrollSensitivity?d.scrollParent[0].scrollTop=f=d.scrollParent[0].scrollTop+e.scrollSpeed:b.pageY-d.overflowOffset.top<e.scrollSensitivity&&(d.scrollParent[0].scrollTop=f=d.scrollParent[0].scrollTop-e.scrollSpeed);if(!e.axis||e.axis!="y")d.overflowOffset.left+d.scrollParent[0].offsetWidth-b.pageX<e.scrollSensitivity?d.scrollParent[0].scrollLeft=f=d.scrollParent[0].scrollLeft+e.scrollSpeed:b.pageX-d.overflowOffset.left<e.scrollSensit
 ivity&&(d.scrollParent[0].scrollLeft=f=d.scrollParent[0].scrollLeft-e.scrollSpeed)}else{if(!e.axis||e.axis!="x")b.pageY-a(document).scrollTop()<e.scrollSensitivity?f=a(document).scrollTop(a(document).scrollTop()-e.scrollSpeed):a(window).height()-(b.pageY-a(document).scrollTop())<e.scrollSensitivity&&(f=a(document).scrollTop(a(document).scrollTop()+e.scrollSpeed));if(!e.axis||e.axis!="y")b.pageX-a(document).scrollLeft()<e.scrollSensitivity?f=a(document).scrollLeft(a(document).scrollLeft()-e.scrollSpeed):a(window).width()-(b.pageX-a(document).scrollLeft())<e.scrollSensitivity&&(f=a(document).scrollLeft(a(document).scrollLeft()+e.scrollSpeed))}f!==!1&&a.ui.ddmanager&&!e.dropBehaviour&&a.ui.ddmanager.prepareOffsets(d,b)}}),a.ui.plugin.add("draggable","snap",{start:function(b,c){var d=a(this).data("draggable"),e=d.options;d.snapElements=[],a(e.snap.constructor!=String?e.snap.items||":data(draggable)":e.snap).each(function(){var b=a(this),c=b.offset();this!=d.element[0]&&d.snapElements.pu
 sh({item:this,width:b.outerWidth(),height:b.outerHeight(),top:c.top,left:c.left})})},drag:function(b,c){var d=a(this).data("draggable"),e=d.options,f=e.snapTolerance,g=c.offset.left,h=g+d.helperProportions.width,i=c.offset.top,j=i+d.helperProportions.height;for(var k=d.snapElements.length-1;k>=0;k--){var l=d.snapElements[k].left,m=l+d.snapElements[k].width,n=d.snapElements[k].top,o=n+d.snapElements[k].height;if(!(l-f<g&&g<m+f&&n-f<i&&i<o+f||l-f<g&&g<m+f&&n-f<j&&j<o+f||l-f<h&&h<m+f&&n-f<i&&i<o+f||l-f<h&&h<m+f&&n-f<j&&j<o+f)){d.snapElements[k].snapping&&d.options.snap.release&&d.options.snap.release.call(d.element,b,a.extend(d._uiHash(),{snapItem:d.snapElements[k].item})),d.snapElements[k].snapping=!1;continue}if(e.snapMode!="inner"){var p=Math.abs(n-j)<=f,q=Math.abs(o-i)<=f,r=Math.abs(l-h)<=f,s=Math.abs(m-g)<=f;p&&(c.position.top=d._convertPositionTo("relative",{top:n-d.helperProportions.height,left:0}).top-d.margins.top),q&&(c.position.top=d._convertPositionTo("relative",{top:o,left
 :0}).top-d.margins.top),r&&(c.position.left=d._convertPositionTo("relative",{top:0,left:l-d.helperProportions.width}).left-d.margins.left),s&&(c.position.left=d._convertPositionTo("relative",{top:0,left:m}).left-d.margins.left)}var t=p||q||r||s;if(e.snapMode!="outer"){var p=Math.abs(n-i)<=f,q=Math.abs(o-j)<=f,r=Math.abs(l-g)<=f,s=Math.abs(m-h)<=f;p&&(c.position.top=d._convertPositionTo("relative",{top:n,left:0}).top-d.margins.top),q&&(c.position.top=d._convertPositionTo("relative",{top:o-d.helperProportions.height,left:0}).top-d.margins.top),r&&(c.position.left=d._convertPositionTo("relative",{top:0,left:l}).left-d.margins.left),s&&(c.position.left=d._convertPositionTo("relative",{top:0,left:m-d.helperProportions.width}).left-d.margins.left)}!d.snapElements[k].snapping&&(p||q||r||s||t)&&d.options.snap.snap&&d.options.snap.snap.call(d.element,b,a.extend(d._uiHash(),{snapItem:d.snapElements[k].item})),d.snapElements[k].snapping=p||q||r||s||t}}}),a.ui.plugin.add("draggable","stack",{st
 art:function(b,c){var d=a(this).data("draggable").options,e=a.makeArray(a(d.stack)).sort(function(b,c){return(parseInt(a(b).css("zIndex"),10)||0)-(parseInt(a(c).css("zIndex"),10)||0)});if(!e.length)return;var f=parseInt(e[0].style.zIndex)||0;a(e).each(function(a){this.style.zIndex=f+a}),this[0].style.zIndex=f+e.length}}),a.ui.plugin.add("draggable","zIndex",{start:function(b,c){var d=a(c.helper),e=a(this).data("draggable").options;d.css("zIndex")&&(e._zIndex=d.css("zIndex")),d.css("zIndex",e.zIndex)},stop:function(b,c){var d=a(this).data("draggable").options;d._zIndex&&a(c.helper).css("zIndex",d._zIndex)}})})(jQuery);;/*! jQuery UI - v1.8.20 - 2012-04-30
+* https://github.com/jquery/jquery-ui
+* Includes: jquery.ui.droppable.js
+* Copyright (c) 2012 AUTHORS.txt; Licensed MIT, GPL */
+(function(a,b){a.widget("ui.droppable",{widgetEventPrefix:"drop",options:{accept:"*",activeClass:!1,addClasses:!0,greedy:!1,hoverClass:!1,scope:"default",tolerance:"intersect"},_create:function(){var b=this.options,c=b.accept;this.isover=0,this.isout=1,this.accept=a.isFunction(c)?c:function(a){return a.is(c)},this.proportions={width:this.element[0].offsetWidth,height:this.element[0].offsetHeight},a.ui.ddmanager.droppables[b.scope]=a.ui.ddmanager.droppables[b.scope]||[],a.ui.ddmanager.droppables[b.scope].push(this),b.addClasses&&this.element.addClass("ui-droppable")},destroy:function(){var b=a.ui.ddmanager.droppables[this.options.scope];for(var c=0;c<b.length;c++)b[c]==this&&b.splice(c,1);return this.element.removeClass("ui-droppable ui-droppable-disabled").removeData("droppable").unbind(".droppable"),this},_setOption:function(b,c){b=="accept"&&(this.accept=a.isFunction(c)?c:function(a){return a.is(c)}),a.Widget.prototype._setOption.apply(this,arguments)},_activate:function(b){var c=
 a.ui.ddmanager.current;this.options.activeClass&&this.element.addClass(this.options.activeClass),c&&this._trigger("activate",b,this.ui(c))},_deactivate:function(b){var c=a.ui.ddmanager.current;this.options.activeClass&&this.element.removeClass(this.options.activeClass),c&&this._trigger("deactivate",b,this.ui(c))},_over:function(b){var c=a.ui.ddmanager.current;if(!c||(c.currentItem||c.element)[0]==this.element[0])return;this.accept.call(this.element[0],c.currentItem||c.element)&&(this.options.hoverClass&&this.element.addClass(this.options.hoverClass),this._trigger("over",b,this.ui(c)))},_out:function(b){var c=a.ui.ddmanager.current;if(!c||(c.currentItem||c.element)[0]==this.element[0])return;this.accept.call(this.element[0],c.currentItem||c.element)&&(this.options.hoverClass&&this.element.removeClass(this.options.hoverClass),this._trigger("out",b,this.ui(c)))},_drop:function(b,c){var d=c||a.ui.ddmanager.current;if(!d||(d.currentItem||d.element)[0]==this.element[0])return!1;var e=!1;r
 eturn this.element.find(":data(droppable)").not(".ui-draggable-dragging").each(function(){var b=a.data(this,"droppable");if(b.options.greedy&&!b.options.disabled&&b.options.scope==d.options.scope&&b.accept.call(b.element[0],d.currentItem||d.element)&&a.ui.intersect(d,a.extend(b,{offset:b.element.offset()}),b.options.tolerance))return e=!0,!1}),e?!1:this.accept.call(this.element[0],d.currentItem||d.element)?(this.options.activeClass&&this.element.removeClass(this.options.activeClass),this.options.hoverClass&&this.element.removeClass(this.options.hoverClass),this._trigger("drop",b,this.ui(d)),this.element):!1},ui:function(a){return{draggable:a.currentItem||a.element,helper:a.helper,position:a.position,offset:a.positionAbs}}}),a.extend(a.ui.droppable,{version:"1.8.20"}),a.ui.intersect=function(b,c,d){if(!c.offset)return!1;var e=(b.positionAbs||b.position.absolute).left,f=e+b.helperProportions.width,g=(b.positionAbs||b.position.absolute).top,h=g+b.helperProportions.height,i=c.offset.lef
 t,j=i+c.proportions.width,k=c.offset.top,l=k+c.proportions.height;switch(d){case"fit":return i<=e&&f<=j&&k<=g&&h<=l;case"intersect":return i<e+b.helperProportions.width/2&&f-b.helperProportions.width/2<j&&k<g+b.helperProportions.height/2&&h-b.helperProportions.height/2<l;case"pointer":var m=(b.positionAbs||b.position.absolute).left+(b.clickOffset||b.offset.click).left,n=(b.positionAbs||b.position.absolute).top+(b.clickOffset||b.offset.click).top,o=a.ui.isOver(n,m,k,i,c.proportions.height,c.proportions.width);return o;case"touch":return(g>=k&&g<=l||h>=k&&h<=l||g<k&&h>l)&&(e>=i&&e<=j||f>=i&&f<=j||e<i&&f>j);default:return!1}},a.ui.ddmanager={current:null,droppables:{"default":[]},prepareOffsets:function(b,c){var d=a.ui.ddmanager.droppables[b.options.scope]||[],e=c?c.type:null,f=(b.currentItem||b.element).find(":data(droppable)").andSelf();g:for(var h=0;h<d.length;h++){if(d[h].options.disabled||b&&!d[h].accept.call(d[h].element[0],b.currentItem||b.element))continue;for(var i=0;i<f.lengt
 h;i++)if(f[i]==d[h].element[0]){d[h].proportions.height=0;continue g}d[h].visible=d[h].element.css("display")!="none";if(!d[h].visible)continue;e=="mousedown"&&d[h]._activate.call(d[h],c),d[h].offset=d[h].element.offset(),d[h].proportions={width:d[h].element[0].offsetWidth,height:d[h].element[0].offsetHeight}}},drop:function(b,c){var d=!1;return a.each(a.ui.ddmanager.droppables[b.options.scope]||[],function(){if(!this.options)return;!this.options.disabled&&this.visible&&a.ui.intersect(b,this,this.options.tolerance)&&(d=this._drop.call(this,c)||d),!this.options.disabled&&this.visible&&this.accept.call(this.element[0],b.currentItem||b.element)&&(this.isout=1,this.isover=0,this._deactivate.call(this,c))}),d},dragStart:function(b,c){b.element.parents(":not(body,html)").bind("scroll.droppable",function(){b.options.refreshPositions||a.ui.ddmanager.prepareOffsets(b,c)})},drag:function(b,c){b.options.refreshPositions&&a.ui.ddmanager.prepareOffsets(b,c),a.each(a.ui.ddmanager.droppables[b.opt
 ions.scope]||[],function(){if(this.options.disabled||this.greedyChild||!this.visible)return;var d=a.ui.intersect(b,this,this.options.tolerance),e=!d&&this.isover==1?"isout":d&&this.isover==0?"isover":null;if(!e)return;var f;if(this.options.greedy){var g=this.element.parents(":data(droppable):eq(0)");g.length&&(f=a.data(g[0],"droppable"),f.greedyChild=e=="isover"?1:0)}f&&e=="isover"&&(f.isover=0,f.isout=1,f._out.call(f,c)),this[e]=1,this[e=="isout"?"isover":"isout"]=0,this[e=="isover"?"_over":"_out"].call(this,c),f&&e=="isout"&&(f.isout=0,f.isover=1,f._over.call(f,c))})},dragStop:function(b,c){b.element.parents(":not(body,html)").unbind("scroll.droppable"),b.options.refreshPositions||a.ui.ddmanager.prepareOffsets(b,c)}}})(jQuery);;/*! jQuery UI - v1.8.20 - 2012-04-30
+* https://github.com/jquery/jquery-ui
+* Includes: jquery.ui.resizable.js
+* Copyright (c) 2012 AUTHORS.txt; Licensed MIT, GPL */
+(function(a,b){a.widget("ui.resizable",a.ui.mouse,{widgetEventPrefix:"resize",options:{alsoResize:!1,animate:!1,animateDuration:"slow",animateEasing:"swing",aspectRatio:!1,autoHide:!1,containment:!1,ghost:!1,grid:!1,handles:"e,s,se",helper:!1,maxHeight:null,maxWidth:null,minHeight:10,minWidth:10,zIndex:1e3},_create:function(){var b=this,c=this.options;this.element.addClass("ui-resizable"),a.extend(this,{_aspectRatio:!!c.aspectRatio,aspectRatio:c.aspectRatio,originalElement:this.element,_proportionallyResizeElements:[],_helper:c.helper||c.ghost||c.animate?c.helper||"ui-resizable-helper":null}),this.element[0].nodeName.match(/canvas|textarea|input|select|button|img/i)&&(this.element.wrap(a('<div class="ui-wrapper" style="overflow: hidden;"></div>').css({position:this.element.css("position"),width:this.element.outerWidth(),height:this.element.outerHeight(),top:this.element.css("top"),left:this.element.css("left")})),this.element=this.element.parent().data("resizable",this.element.data(
 "resizable")),this.elementIsWrapper=!0,this.element.css({marginLeft:this.originalElement.css("marginLeft"),marginTop:this.originalElement.css("marginTop"),marginRight:this.originalElement.css("marginRight"),marginBottom:this.originalElement.css("marginBottom")}),this.originalElement.css({marginLeft:0,marginTop:0,marginRight:0,marginBottom:0}),this.originalResizeStyle=this.originalElement.css("resize"),this.originalElement.css("resize","none"),this._proportionallyResizeElements.push(this.originalElement.css({position:"static",zoom:1,display:"block"})),this.originalElement.css({margin:this.originalElement.css("margin")}),this._proportionallyResize()),this.handles=c.handles||(a(".ui-resizable-handle",this.element).length?{n:".ui-resizable-n",e:".ui-resizable-e",s:".ui-resizable-s",w:".ui-resizable-w",se:".ui-resizable-se",sw:".ui-resizable-sw",ne:".ui-resizable-ne",nw:".ui-resizable-nw"}:"e,s,se");if(this.handles.constructor==String){this.handles=="all"&&(this.handles="n,e,s,w,se,sw,ne
 ,nw");var d=this.handles.split(",");this.handles={};for(var e=0;e<d.length;e++){var f=a.trim(d[e]),g="ui-resizable-"+f,h=a('<div class="ui-resizable-handle '+g+'"></div>');h.css({zIndex:c.zIndex}),"se"==f&&h.addClass("ui-icon ui-icon-gripsmall-diagonal-se"),this.handles[f]=".ui-resizable-"+f,this.element.append(h)}}this._renderAxis=function(b){b=b||this.element;for(var c in this.handles){this.handles[c].constructor==String&&(this.handles[c]=a(this.handles[c],this.element).show());if(this.elementIsWrapper&&this.originalElement[0].nodeName.match(/textarea|input|select|button/i)){var d=a(this.handles[c],this.element),e=0;e=/sw|ne|nw|se|n|s/.test(c)?d.outerHeight():d.outerWidth();var f=["padding",/ne|nw|n/.test(c)?"Top":/se|sw|s/.test(c)?"Bottom":/^e$/.test(c)?"Right":"Left"].join("");b.css(f,e),this._proportionallyResize()}if(!a(this.handles[c]).length)continue}},this._renderAxis(this.element),this._handles=a(".ui-resizable-handle",this.element).disableSelection(),this._handles.mouseov
 er(function(){if(!b.resizing){if(this.className)var a=this.className.match(/ui-resizable-(se|sw|ne|nw|n|e|s|w)/i);b.axis=a&&a[1]?a[1]:"se"}}),c.autoHide&&(this._handles.hide(),a(this.element).addClass("ui-resizable-autohide").hover(function(){if(c.disabled)return;a(this).removeClass("ui-resizable-autohide"),b._handles.show()},function(){if(c.disabled)return;b.resizing||(a(this).addClass("ui-resizable-autohide"),b._handles.hide())})),this._mouseInit()},destroy:function(){this._mouseDestroy();var b=function(b){a(b).removeClass("ui-resizable ui-resizable-disabled ui-resizable-resizing").removeData("resizable").unbind(".resizable").find(".ui-resizable-handle").remove()};if(this.elementIsWrapper){b(this.element);var c=this.element;c.after(this.originalElement.css({position:c.css("position"),width:c.outerWidth(),height:c.outerHeight(),top:c.css("top"),left:c.css("left")})).remove()}return this.originalElement.css("resize",this.originalResizeStyle),b(this.originalElement),this},_mouseCaptu
 re:function(b){var c=!1;for(var d in this.handles)a(this.handles[d])[0]==b.target&&(c=!0);return!this.options.disabled&&c},_mouseStart:function(b){var d=this.options,e=this.element.position(),f=this.element;this.resizing=!0,this.documentScroll={top:a(document).scrollTop(),left:a(document).scrollLeft()},(f.is(".ui-draggable")||/absolute/.test(f.css("position")))&&f.css({position:"absolute",top:e.top,left:e.left}),this._renderProxy();var g=c(this.helper.css("left")),h=c(this.helper.css("top"));d.containment&&(g+=a(d.containment).scrollLeft()||0,h+=a(d.containment).scrollTop()||0),this.offset=this.helper.offset(),this.position={left:g,top:h},this.size=this._helper?{width:f.outerWidth(),height:f.outerHeight()}:{width:f.width(),height:f.height()},this.originalSize=this._helper?{width:f.outerWidth(),height:f.outerHeight()}:{width:f.width(),height:f.height()},this.originalPosition={left:g,top:h},this.sizeDiff={width:f.outerWidth()-f.width(),height:f.outerHeight()-f.height()},this.originalM
 ousePosition={left:b.pageX,top:b.pageY},this.aspectRatio=typeof d.aspectRatio=="number"?d.aspectRatio:this.originalSize.width/this.originalSize.height||1;var i=a(".ui-resizable-"+this.axis).css("cursor");return a("body").css("cursor",i=="auto"?this.axis+"-resize":i),f.addClass("ui-resizable-resizing"),this._propagate("start",b),!0},_mouseDrag:function(b){var c=this.helper,d=this.options,e={},f=this,g=this.originalMousePosition,h=this.axis,i=b.pageX-g.left||0,j=b.pageY-g.top||0,k=this._change[h];if(!k)return!1;var l=k.apply(this,[b,i,j]),m=a.browser.msie&&a.browser.version<7,n=this.sizeDiff;this._updateVirtualBoundaries(b.shiftKey);if(this._aspectRatio||b.shiftKey)l=this._updateRatio(l,b);return l=this._respectSize(l,b),this._propagate("resize",b),c.css({top:this.position.top+"px",left:this.position.left+"px",width:this.size.width+"px",height:this.size.height+"px"}),!this._helper&&this._proportionallyResizeElements.length&&this._proportionallyResize(),this._updateCache(l),this._trigg
 er("resize",b,this.ui()),!1},_mouseStop:function(b){this.resizing=!1;var c=this.options,d=this;if(this._helper){var e=this._proportionallyResizeElements,f=e.length&&/textarea/i.test(e[0].nodeName),g=f&&a.ui.hasScroll(e[0],"left")?0:d.sizeDiff.height,h=f?0:d.sizeDiff.width,i={width:d.helper.width()-h,height:d.helper.height()-g},j=parseInt(d.element.css("left"),10)+(d.position.left-d.originalPosition.left)||null,k=parseInt(d.element.css("top"),10)+(d.position.top-d.originalPosition.top)||null;c.animate||this.element.css(a.extend(i,{top:k,left:j})),d.helper.height(d.size.height),d.helper.width(d.size.width),this._helper&&!c.animate&&this._proportionallyResize()}return a("body").css("cursor","auto"),this.element.removeClass("ui-resizable-resizing"),this._propagate("stop",b),this._helper&&this.helper.remove(),!1},_updateVirtualBoundaries:function(a){var b=this.options,c,e,f,g,h;h={minWidth:d(b.minWidth)?b.minWidth:0,maxWidth:d(b.maxWidth)?b.maxWidth:Infinity,minHeight:d(b.minHeight)?b.mi
 nHeight:0,maxHeight:d(b.maxHeight)?b.maxHeight:Infinity};if(this._aspectRatio||a)c=h.minHeight*this.aspectRatio,f=h.minWidth/this.aspectRatio,e=h.maxHeight*this.aspectRatio,g=h.maxWidth/this.aspectRatio,c>h.minWidth&&(h.minWidth=c),f>h.minHeight&&(h.minHeight=f),e<h.maxWidth&&(h.maxWidth=e),g<h.maxHeight&&(h.maxHeight=g);this._vBoundaries=h},_updateCache:function(a){var b=this.options;this.offset=this.helper.offset(),d(a.left)&&(this.position.left=a.left),d(a.top)&&(this.position.top=a.top),d(a.height)&&(this.size.height=a.height),d(a.width)&&(this.size.width=a.width)},_updateRatio:function(a,b){var c=this.options,e=this.position,f=this.size,g=this.axis;return d(a.height)?a.width=a.height*this.aspectRatio:d(a.width)&&(a.height=a.width/this.aspectRatio),g=="sw"&&(a.left=e.left+(f.width-a.width),a.top=null),g=="nw"&&(a.top=e.top+(f.height-a.height),a.left=e.left+(f.width-a.width)),a},_respectSize:function(a,b){var c=this.helper,e=this._vBoundaries,f=this._aspectRatio||b.shiftKey,g=thi
 s.axis,h=d(a.width)&&e.maxWidth&&e.maxWidth<a.width,i=d(a.height)&&e.maxHeight&&e.maxHeight<a.height,j=d(a.width)&&e.minWidth&&e.minWidth>a.width,k=d(a.height)&&e.minHeight&&e.minHeight>a.height;j&&(a.width=e.minWidth),k&&(a.height=e.minHeight),h&&(a.width=e.maxWidth),i&&(a.height=e.maxHeight);var l=this.originalPosition.left+this.originalSize.width,m=this.position.top+this.size.height,n=/sw|nw|w/.test(g),o=/nw|ne|n/.test(g);j&&n&&(a.left=l-e.minWidth),h&&n&&(a.left=l-e.maxWidth),k&&o&&(a.top=m-e.minHeight),i&&o&&(a.top=m-e.maxHeight);var p=!a.width&&!a.height;return p&&!a.left&&a.top?a.top=null:p&&!a.top&&a.left&&(a.left=null),a},_proportionallyResize:function(){var b=this.options;if(!this._proportionallyResizeElements.length)return;var c=this.helper||this.element;for(var d=0;d<this._proportionallyResizeElements.length;d++){var e=this._proportionallyResizeElements[d];if(!this.borderDif){var f=[e.css("borderTopWidth"),e.css("borderRightWidth"),e.css("borderBottomWidth"),e.css("borde
 rLeftWidth")],g=[e.css("paddingTop"),e.css("paddingRight"),e.css("paddingBottom"),e.css("paddingLeft")];this.borderDif=a.map(f,function(a,b){var c=parseInt(a,10)||0,d=parseInt(g[b],10)||0;return c+d})}if(!a.browser.msie||!a(c).is(":hidden")&&!a(c).parents(":hidden").length)e.css({height:c.height()-this.borderDif[0]-this.borderDif[2]||0,width:c.width()-this.borderDif[1]-this.borderDif[3]||0});else continue}},_renderProxy:function(){var b=this.element,c=this.options;this.elementOffset=b.offset();if(this._helper){this.helper=this.helper||a('<div style="overflow:hidden;"></div>');var d=a.browser.msie&&a.browser.version<7,e=d?1:0,f=d?2:-1;this.helper.addClass(this._helper).css({width:this.element.outerWidth()+f,height:this.element.outerHeight()+f,position:"absolute",left:this.elementOffset.left-e+"px",top:this.elementOffset.top-e+"px",zIndex:++c.zIndex}),this.helper.appendTo("body").disableSelection()}else this.helper=this.element},_change:{e:function(a,b,c){return{width:this.originalSiz
 e.width+b}},w:function(a,b,c){var d=this.options,e=this.originalSize,f=this.originalPosition;return{left:f.left+b,width:e.width-b}},n:function(a,b,c){var d=this.options,e=this.originalSize,f=this.originalPosition;return{top:f.top+c,height:e.height-c}},s:function(a,b,c){return{height:this.originalSize.height+c}},se:function(b,c,d){return a.extend(this._change.s.apply(this,arguments),this._change.e.apply(this,[b,c,d]))},sw:function(b,c,d){return a.extend(this._change.s.apply(this,arguments),this._change.w.apply(this,[b,c,d]))},ne:function(b,c,d){return a.extend(this._change.n.apply(this,arguments),this._change.e.apply(this,[b,c,d]))},nw:function(b,c,d){return a.extend(this._change.n.apply(this,arguments),this._change.w.apply(this,[b,c,d]))}},_propagate:function(b,c){a.ui.plugin.call(this,b,[c,this.ui()]),b!="resize"&&this._trigger(b,c,this.ui())},plugins:{},ui:function(){return{originalElement:this.originalElement,element:this.element,helper:this.helper,position:this.position,size:thi
 s.size,originalSize:this.originalSize,originalPosition:this.originalPosition}}}),a.extend(a.ui.resizable,{version:"1.8.20"}),a.ui.plugin.add("resizable","alsoResize",{start:function(b,c){var d=a(this).data("resizable"),e=d.options,f=function(b){a(b).each(function(){var b=a(this);b.data("resizable-alsoresize",{width:parseInt(b.width(),10),height:parseInt(b.height(),10),left:parseInt(b.css("left"),10),top:parseInt(b.css("top"),10)})})};typeof e.alsoResize=="object"&&!e.alsoResize.parentNode?e.alsoResize.length?(e.alsoResize=e.alsoResize[0],f(e.alsoResize)):a.each(e.alsoResize,function(a){f(a)}):f(e.alsoResize)},resize:function(b,c){var d=a(this).data("resizable"),e=d.options,f=d.originalSize,g=d.originalPosition,h={height:d.size.height-f.height||0,width:d.size.width-f.width||0,top:d.position.top-g.top||0,left:d.position.left-g.left||0},i=function(b,d){a(b).each(function(){var b=a(this),e=a(this).data("resizable-alsoresize"),f={},g=d&&d.length?d:b.parents(c.originalElement[0]).length?[
 "width","height"]:["width","height","top","left"];a.each(g,function(a,b){var c=(e[b]||0)+(h[b]||0);c&&c>=0&&(f[b]=c||null)}),b.css(f)})};typeof e.alsoResize=="object"&&!e.alsoResize.nodeType?a.each(e.alsoResize,function(a,b){i(a,b)}):i(e.alsoResize)},stop:function(b,c){a(this).removeData("resizable-alsoresize")}}),a.ui.plugin.add("resizable","animate",{stop:function(b,c){var d=a(this).data("resizable"),e=d.options,f=d._proportionallyResizeElements,g=f.length&&/textarea/i.test(f[0].nodeName),h=g&&a.ui.hasScroll(f[0],"left")?0:d.sizeDiff.height,i=g?0:d.sizeDiff.width,j={width:d.size.width-i,height:d.size.height-h},k=parseInt(d.element.css("left"),10)+(d.position.left-d.originalPosition.left)||null,l=parseInt(d.element.css("top"),10)+(d.position.top-d.originalPosition.top)||null;d.element.animate(a.extend(j,l&&k?{top:l,left:k}:{}),{duration:e.animateDuration,easing:e.animateEasing,step:function(){var c={width:parseInt(d.element.css("width"),10),height:parseInt(d.element.css("height"),1
 0),top:parseInt(d.element.css("top"),10),left:parseInt(d.element.css("left"),10)};f&&f.length&&a(f[0]).css({width:c.width,height:c.height}),d._updateCache(c),d._propagate("resize",b)}})}}),a.ui.plugin.add("resizable","containment",{start:function(b,d){var e=a(this).data("resizable"),f=e.options,g=e.element,h=f.containment,i=h instanceof a?h.get(0):/parent/.test(h)?g.parent().get(0):h;if(!i)return;e.containerElement=a(i);if(/document/.test(h)||h==document)e.containerOffset={left:0,top:0},e.containerPosition={left:0,top:0},e.parentData={element:a(document),left:0,top:0,width:a(document).width(),height:a(document).height()||document.body.parentNode.scrollHeight};else{var j=a(i),k=[];a(["Top","Right","Left","Bottom"]).each(function(a,b){k[a]=c(j.css("padding"+b))}),e.containerOffset=j.offset(),e.containerPosition=j.position(),e.containerSize={height:j.innerHeight()-k[3],width:j.innerWidth()-k[1]};var l=e.containerOffset,m=e.containerSize.height,n=e.containerSize.width,o=a.ui.hasScroll(i
 ,"left")?i.scrollWidth:n,p=a.ui.hasScroll(i)?i.scrollHeight:m;e.parentData={element:i,left:l.left,top:l.top,width:o,height:p}}},resize:function(b,c){var d=a(this).data("resizable"),e=d.options,f=d.containerSize,g=d.containerOffset,h=d.size,i=d.position,j=d._aspectRatio||b.shiftKey,k={top:0,left:0},l=d.containerElement;l[0]!=document&&/static/.test(l.css("position"))&&(k=g),i.left<(d._helper?g.left:0)&&(d.size.width=d.size.width+(d._helper?d.position.left-g.left:d.position.left-k.left),j&&(d.size.height=d.size.width/d.aspectRatio),d.position.left=e.helper?g.left:0),i.top<(d._helper?g.top:0)&&(d.size.height=d.size.height+(d._helper?d.position.top-g.top:d.position.top),j&&(d.size.width=d.size.height*d.aspectRatio),d.position.top=d._helper?g.top:0),d.offset.left=d.parentData.left+d.position.left,d.offset.top=d.parentData.top+d.position.top;var m=Math.abs((d._helper?d.offset.left-k.left:d.offset.left-k.left)+d.sizeDiff.width),n=Math.abs((d._helper?d.offset.top-k.top:d.offset.top-g.top)+d
 .sizeDiff.height),o=d.containerElement.get(0)==d.element.parent().get(0),p=/relative|absolute/.test(d.containerElement.css("position"));o&&p&&(m-=d.parentData.left),m+d.size.width>=d.parentData.width&&(d.size.width=d.parentData.width-m,j&&(d.size.height=d.size.width/d.aspectRatio)),n+d.size.height>=d.parentData.height&&(d.size.height=d.parentData.height-n,j&&(d.size.width=d.size.height*d.aspectRatio))},stop:function(b,c){var d=a(this).data("resizable"),e=d.options,f=d.position,g=d.containerOffset,h=d.containerPosition,i=d.containerElement,j=a(d.helper),k=j.offset(),l=j.outerWidth()-d.sizeDiff.width,m=j.outerHeight()-d.sizeDiff.height;d._helper&&!e.animate&&/relative/.test(i.css("position"))&&a(this).css({left:k.left-h.left-g.left,width:l,height:m}),d._helper&&!e.animate&&/static/.test(i.css("position"))&&a(this).css({left:k.left-h.left-g.left,width:l,height:m})}}),a.ui.plugin.add("resizable","ghost",{start:function(b,c){var d=a(this).data("resizable"),e=d.options,f=d.size;d.ghost=d.
 originalElement.clone(),d.ghost.css({opacity:.25,display:"block",position:"relative",height:f.height,width:f.width,margin:0,left:0,top:0}).addClass("ui-resizable-ghost").addClass(typeof e.ghost=="string"?e.ghost:""),d.ghost.appendTo(d.helper)},resize:function(b,c){var d=a(this).data("resizable"),e=d.options;d.ghost&&d.ghost.css({position:"relative",height:d.size.height,width:d.size.width})},stop:function(b,c){var d=a(this).data("resizable"),e=d.options;d.ghost&&d.helper&&d.helper.get(0).removeChild(d.ghost.get(0))}}),a.ui.plugin.add("resizable","grid",{resize:function(b,c){var d=a(this).data("resizable"),e=d.options,f=d.size,g=d.originalSize,h=d.originalPosition,i=d.axis,j=e._aspectRatio||b.shiftKey;e.grid=typeof e.grid=="number"?[e.grid,e.grid]:e.grid;var k=Math.round((f.width-g.width)/(e.grid[0]||1))*(e.grid[0]||1),l=Math.round((f.height-g.height)/(e.grid[1]||1))*(e.grid[1]||1);/^(se|s|e)$/.test(i)?(d.size.width=g.width+k,d.size.height=g.height+l):/^(ne)$/.test(i)?(d.size.width=g.
 width+k,d.size.height=g.height+l,d.position.top=h.top-l):/^(sw)$/.test(i)?(d.size.width=g.width+k,d.size.height=g.height+l,d.position.left=h.left-k):(d.size.width=g.width+k,d.size.height=g.height+l,d.position.top=h.top-l,d.position.left=h.left-k)}});var c=function(a){return parseInt(a,10)||0},d=function(a){return!isNaN(parseInt(a,10))}})(jQuery);;/*! jQuery UI - v1.8.20 - 2012-04-30
+* https://github.com/jquery/jquery-ui
+* Includes: jquery.ui.selectable.js
+* Copyright (c) 2012 AUTHORS.txt; Licensed MIT, GPL */
+(function(a,b){a.widget("ui.selectable",a.ui.mouse,{options:{appendTo:"body",autoRefresh:!0,distance:0,filter:"*",tolerance:"touch"},_create:function(){var b=this;this.element.addClass("ui-selectable"),this.dragged=!1;var c;this.refresh=function(){c=a(b.options.filter,b.element[0]),c.addClass("ui-selectee"),c.each(function(){var b=a(this),c=b.offset();a.data(this,"selectable-item",{element:this,$element:b,left:c.left,top:c.top,right:c.left+b.outerWidth(),bottom:c.top+b.outerHeight(),startselected:!1,selected:b.hasClass("ui-selected"),selecting:b.hasClass("ui-selecting"),unselecting:b.hasClass("ui-unselecting")})})},this.refresh(),this.selectees=c.addClass("ui-selectee"),this._mouseInit(),this.helper=a("<div class='ui-selectable-helper'></div>")},destroy:function(){return this.selectees.removeClass("ui-selectee").removeData("selectable-item"),this.element.removeClass("ui-selectable ui-selectable-disabled").removeData("selectable").unbind(".selectable"),this._mouseDestroy(),this},_mou
 seStart:function(b){var c=this;this.opos=[b.pageX,b.pageY];if(this.options.disabled)return;var d=this.options;this.selectees=a(d.filter,this.element[0]),this._trigger("start",b),a(d.appendTo).append(this.helper),this.helper.css({left:b.clientX,top:b.clientY,width:0,height:0}),d.autoRefresh&&this.refresh(),this.selectees.filter(".ui-selected").each(function(){var d=a.data(this,"selectable-item");d.startselected=!0,!b.metaKey&&!b.ctrlKey&&(d.$element.removeClass("ui-selected"),d.selected=!1,d.$element.addClass("ui-unselecting"),d.unselecting=!0,c._trigger("unselecting",b,{unselecting:d.element}))}),a(b.target).parents().andSelf().each(function(){var d=a.data(this,"selectable-item");if(d){var e=!b.metaKey&&!b.ctrlKey||!d.$element.hasClass("ui-selected");return d.$element.removeClass(e?"ui-unselecting":"ui-selected").addClass(e?"ui-selecting":"ui-unselecting"),d.unselecting=!e,d.selecting=e,d.selected=e,e?c._trigger("selecting",b,{selecting:d.element}):c._trigger("unselecting",b,{unsele
 cting:d.element}),!1}})},_mouseDrag:function(b){var c=this;this.dragged=!0;if(this.options.disabled)return;var d=this.options,e=this.opos[0],f=this.opos[1],g=b.pageX,h=b.pageY;if(e>g){var i=g;g=e,e=i}if(f>h){var i=h;h=f,f=i}return this.helper.css({left:e,top:f,width:g-e,height:h-f}),this.selectees.each(function(){var i=a.data(this,"selectable-item");if(!i||i.element==c.element[0])return;var j=!1;d.tolerance=="touch"?j=!(i.left>g||i.right<e||i.top>h||i.bottom<f):d.tolerance=="fit"&&(j=i.left>e&&i.right<g&&i.top>f&&i.bottom<h),j?(i.selected&&(i.$element.removeClass("ui-selected"),i.selected=!1),i.unselecting&&(i.$element.removeClass("ui-unselecting"),i.unselecting=!1),i.selecting||(i.$element.addClass("ui-selecting"),i.selecting=!0,c._trigger("selecting",b,{selecting:i.element}))):(i.selecting&&((b.metaKey||b.ctrlKey)&&i.startselected?(i.$element.removeClass("ui-selecting"),i.selecting=!1,i.$element.addClass("ui-selected"),i.selected=!0):(i.$element.removeClass("ui-selecting"),i.selec
 ting=!1,i.startselected&&(i.$element.addClass("ui-unselecting"),i.unselecting=!0),c._trigger("unselecting",b,{unselecting:i.element}))),i.selected&&!b.metaKey&&!b.ctrlKey&&!i.startselected&&(i.$element.removeClass("ui-selected"),i.selected=!1,i.$element.addClass("ui-unselecting"),i.unselecting=!0,c._trigger("unselecting",b,{unselecting:i.element})))}),!1},_mouseStop:function(b){var c=this;this.dragged=!1;var d=this.options;return a(".ui-unselecting",this.element[0]).each(function(){var d=a.data(this,"selectable-item");d.$element.removeClass("ui-unselecting"),d.unselecting=!1,d.startselected=!1,c._trigger("unselected",b,{unselected:d.element})}),a(".ui-selecting",this.element[0]).each(function(){var d=a.data(this,"selectable-item");d.$element.removeClass("ui-selecting").addClass("ui-selected"),d.selecting=!1,d.selected=!0,d.startselected=!0,c._trigger("selected",b,{selected:d.element})}),this._trigger("stop",b),this.helper.remove(),!1}}),a.extend(a.ui.selectable,{version:"1.8.20"})})
 (jQuery);;/*! jQuery UI - v1.8.20 - 2012-04-30
+* https://github.com/jquery/jquery-ui
+* Includes: jquery.ui.sortable.js
+* Copyright (c) 2012 AUTHORS.txt; Licensed MIT, GPL */
+(function(a,b){a.widget("ui.sortable",a.ui.mouse,{widgetEventPrefix:"sort",ready:!1,options:{appendTo:"parent",axis:!1,connectWith:!1,containment:!1,cursor:"auto",cursorAt:!1,dropOnEmpty:!0,forcePlaceholderSize:!1,forceHelperSize:!1,grid:!1,handle:!1,helper:"original",items:"> *",opacity:!1,placeholder:!1,revert:!1,scroll:!0,scrollSensitivity:20,scrollSpeed:20,scope:"default",tolerance:"intersect",zIndex:1e3},_create:function(){var a=this.options;this.containerCache={},this.element.addClass("ui-sortable"),this.refresh(),this.floating=this.items.length?a.axis==="x"||/left|right/.test(this.items[0].item.css("float"))||/inline|table-cell/.test(this.items[0].item.css("display")):!1,this.offset=this.element.offset(),this._mouseInit(),this.ready=!0},destroy:function(){a.Widget.prototype.destroy.call(this),this.element.removeClass("ui-sortable ui-sortable-disabled"),this._mouseDestroy();for(var b=this.items.length-1;b>=0;b--)this.items[b].item.removeData(this.widgetName+"-item");return thi
 s},_setOption:function(b,c){b==="disabled"?(this.options[b]=c,this.widget()[c?"addClass":"removeClass"]("ui-sortable-disabled")):a.Widget.prototype._setOption.apply(this,arguments)},_mouseCapture:function(b,c){var d=this;if(this.reverting)return!1;if(this.options.disabled||this.options.type=="static")return!1;this._refreshItems(b);var e=null,f=this,g=a(b.target).parents().each(function(){if(a.data(this,d.widgetName+"-item")==f)return e=a(this),!1});a.data(b.target,d.widgetName+"-item")==f&&(e=a(b.target));if(!e)return!1;if(this.options.handle&&!c){var h=!1;a(this.options.handle,e).find("*").andSelf().each(function(){this==b.target&&(h=!0)});if(!h)return!1}return this.currentItem=e,this._removeCurrentsFromItems(),!0},_mouseStart:function(b,c,d){var e=this.options,f=this;this.currentContainer=this,this.refreshPositions(),this.helper=this._createHelper(b),this._cacheHelperProportions(),this._cacheMargins(),this.scrollParent=this.helper.scrollParent(),this.offset=this.currentItem.offset
 (),this.offset={top:this.offset.top-this.margins.top,left:this.offset.left-this.margins.left},this.helper.css("position","absolute"),this.cssPosition=this.helper.css("position"),a.extend(this.offset,{click:{left:b.pageX-this.offset.left,top:b.pageY-this.offset.top},parent:this._getParentOffset(),relative:this._getRelativeOffset()}),this.originalPosition=this._generatePosition(b),this.originalPageX=b.pageX,this.originalPageY=b.pageY,e.cursorAt&&this._adjustOffsetFromHelper(e.cursorAt),this.domPosition={prev:this.currentItem.prev()[0],parent:this.currentItem.parent()[0]},this.helper[0]!=this.currentItem[0]&&this.currentItem.hide(),this._createPlaceholder(),e.containment&&this._setContainment(),e.cursor&&(a("body").css("cursor")&&(this._storedCursor=a("body").css("cursor")),a("body").css("cursor",e.cursor)),e.opacity&&(this.helper.css("opacity")&&(this._storedOpacity=this.helper.css("opacity")),this.helper.css("opacity",e.opacity)),e.zIndex&&(this.helper.css("zIndex")&&(this._storedZIn
 dex=this.helper.css("zIndex")),this.helper.css("zIndex",e.zIndex)),this.scrollParent[0]!=document&&this.scrollParent[0].tagName!="HTML"&&(this.overflowOffset=this.scrollParent.offset()),this._trigger("start",b,this._uiHash()),this._preserveHelperProportions||this._cacheHelperProportions();if(!d)for(var g=this.containers.length-1;g>=0;g--)this.containers[g]._trigger("activate",b,f._uiHash(this));return a.ui.ddmanager&&(a.ui.ddmanager.current=this),a.ui.ddmanager&&!e.dropBehaviour&&a.ui.ddmanager.prepareOffsets(this,b),this.dragging=!0,this.helper.addClass("ui-sortable-helper"),this._mouseDrag(b),!0},_mouseDrag:function(b){this.position=this._generatePosition(b),this.positionAbs=this._convertPositionTo("absolute"),this.lastPositionAbs||(this.lastPositionAbs=this.positionAbs);if(this.options.scroll){var c=this.options,d=!1;this.scrollParent[0]!=document&&this.scrollParent[0].tagName!="HTML"?(this.overflowOffset.top+this.scrollParent[0].offsetHeight-b.pageY<c.scrollSensitivity?this.scro
 llParent[0].scrollTop=d=this.scrollParent[0].scrollTop+c.scrollSpeed:b.pageY-this.overflowOffset.top<c.scrollSensitivity&&(this.scrollParent[0].scrollTop=d=this.scrollParent[0].scrollTop-c.scrollSpeed),this.overflowOffset.left+this.scrollParent[0].offsetWidth-b.pageX<c.scrollSensitivity?this.scrollParent[0].scrollLeft=d=this.scrollParent[0].scrollLeft+c.scrollSpeed:b.pageX-this.overflowOffset.left<c.scrollSensitivity&&(this.scrollParent[0].scrollLeft=d=this.scrollParent[0].scrollLeft-c.scrollSpeed)):(b.pageY-a(document).scrollTop()<c.scrollSensitivity?d=a(document).scrollTop(a(document).scrollTop()-c.scrollSpeed):a(window).height()-(b.pageY-a(document).scrollTop())<c.scrollSensitivity&&(d=a(document).scrollTop(a(document).scrollTop()+c.scrollSpeed)),b.pageX-a(document).scrollLeft()<c.scrollSensitivity?d=a(document).scrollLeft(a(document).scrollLeft()-c.scrollSpeed):a(window).width()-(b.pageX-a(document).scrollLeft())<c.scrollSensitivity&&(d=a(document).scrollLeft(a(document).scrollL
 eft()+c.scrollSpeed))),d!==!1&&a.ui.ddmanager&&!c.dropBehaviour&&a.ui.ddmanager.prepareOffsets(this,b)}this.positionAbs=this._convertPositionTo("absolute");if(!this.options.axis||this.options.axis!="y")this.helper[0].style.left=this.position.left+"px";if(!this.options.axis||this.options.axis!="x")this.helper[0].style.top=this.position.top+"px";for(var e=this.items.length-1;e>=0;e--){var f=this.items[e],g=f.item[0],h=this._intersectsWithPointer(f);if(!h)continue;if(g!=this.currentItem[0]&&this.placeholder[h==1?"next":"prev"]()[0]!=g&&!a.ui.contains(this.placeholder[0],g)&&(this.options.type=="semi-dynamic"?!a.ui.contains(this.element[0],g):!0)){this.direction=h==1?"down":"up";if(this.options.tolerance=="pointer"||this._intersectsWithSides(f))this._rearrange(b,f);else break;this._trigger("change",b,this._uiHash());break}}return this._contactContainers(b),a.ui.ddmanager&&a.ui.ddmanager.drag(this,b),this._trigger("sort",b,this._uiHash()),this.lastPositionAbs=this.positionAbs,!1},_mouseS
 top:function(b,c){if(!b)return;a.ui.ddmanager&&!this.options.dropBehaviour&&a.ui.ddmanager.drop(this,b);if(this.options.revert){var d=this,e=d.placeholder.offset();d.reverting=!0,a(this.helper).animate({left:e.left-this.offset.parent.left-d.margins.left+(this.offsetParent[0]==document.body?0:this.offsetParent[0].scrollLeft),top:e.top-this.offset.parent.top-d.margins.top+(this.offsetParent[0]==document.body?0:this.offsetParent[0].scrollTop)},parseInt(this.options.revert,10)||500,function(){d._clear(b)})}else this._clear(b,c);return!1},cancel:function(){var b=this;if(this.dragging){this._mouseUp({target:null}),this.options.helper=="original"?this.currentItem.css(this._storedCSS).removeClass("ui-sortable-helper"):this.currentItem.show();for(var c=this.containers.length-1;c>=0;c--)this.containers[c]._trigger("deactivate",null,b._uiHash(this)),this.containers[c].containerCache.over&&(this.containers[c]._trigger("out",null,b._uiHash(this)),this.containers[c].containerCache.over=0)}return 
 this.placeholder&&(this.placeholder[0].parentNode&&this.placeholder[0].parentNode.removeChild(this.placeholder[0]),this.options.helper!="original"&&this.helper&&this.helper[0].parentNode&&this.helper.remove(),a.extend(this,{helper:null,dragging:!1,reverting:!1,_noFinalSort:null}),this.domPosition.prev?a(this.domPosition.prev).after(this.currentItem):a(this.domPosition.parent).prepend(this.currentItem)),this},serialize:function(b){var c=this._getItemsAsjQuery(b&&b.connected),d=[];return b=b||{},a(c).each(function(){var c=(a(b.item||this).attr(b.attribute||"id")||"").match(b.expression||/(.+)[-=_](.+)/);c&&d.push((b.key||c[1]+"[]")+"="+(b.key&&b.expression?c[1]:c[2]))}),!d.length&&b.key&&d.push(b.key+"="),d.join("&")},toArray:function(b){var c=this._getItemsAsjQuery(b&&b.connected),d=[];return b=b||{},c.each(function(){d.push(a(b.item||this).attr(b.attribute||"id")||"")}),d},_intersectsWith:function(a){var b=this.positionAbs.left,c=b+this.helperProportions.width,d=this.positionAbs.top
 ,e=d+this.helperProportions.height,f=a.left,g=f+a.width,h=a.top,i=h+a.height,j=this.offset.click.top,k=this.offset.click.left,l=d+j>h&&d+j<i&&b+k>f&&b+k<g;return this.options.tolerance=="pointer"||this.options.forcePointerForContainers||this.options.tolerance!="pointer"&&this.helperProportions[this.floating?"width":"height"]>a[this.floating?"width":"height"]?l:f<b+this.helperProportions.width/2&&c-this.helperProportions.width/2<g&&h<d+this.helperProportions.height/2&&e-this.helperProportions.height/2<i},_intersectsWithPointer:function(b){var c=this.options.axis==="x"||a.ui.isOverAxis(this.positionAbs.top+this.offset.click.top,b.top,b.height),d=this.options.axis==="y"||a.ui.isOverAxis(this.positionAbs.left+this.offset.click.left,b.left,b.width),e=c&&d,f=this._getDragVerticalDirection(),g=this._getDragHorizontalDirection();return e?this.floating?g&&g=="right"||f=="down"?2:1:f&&(f=="down"?2:1):!1},_intersectsWithSides:function(b){var c=a.ui.isOverAxis(this.positionAbs.top+this.offset.c
 lick.top,b.top+b.height/2,b.height),d=a.ui.isOverAxis(this.positionAbs.left+this.offset.click.left,b.left+b.width/2,b.width),e=this._getDragVerticalDirection(),f=this._getDragHorizontalDirection();return this.floating&&f?f=="right"&&d||f=="left"&&!d:e&&(e=="down"&&c||e=="up"&&!c)},_getDragVerticalDirection:function(){var a=this.positionAbs.top-this.lastPositionAbs.top;return a!=0&&(a>0?"down":"up")},_getDragHorizontalDirection:function(){var a=this.positionAbs.left-this.lastPositionAbs.left;return a!=0&&(a>0?"right":"left")},refresh:function(a){return this._refreshItems(a),this.refreshPositions(),this},_connectWith:function(){var a=this.options;return a.connectWith.constructor==String?[a.connectWith]:a.connectWith},_getItemsAsjQuery:function(b){var c=this,d=[],e=[],f=this._connectWith();if(f&&b)for(var g=f.length-1;g>=0;g--){var h=a(f[g]);for(var i=h.length-1;i>=0;i--){var j=a.data(h[i],this.widgetName);j&&j!=this&&!j.options.disabled&&e.push([a.isFunction(j.options.items)?j.options
 .items.call(j.element):a(j.options.items,j.element).not(".ui-sortable-helper").not(".ui-sortable-placeholder"),j])}}e.push([a.isFunction(this.options.items)?this.options.items.call(this.element,null,{options:this.options,item:this.currentItem}):a(this.options.items,this.element).not(".ui-sortable-helper").not(".ui-sortable-placeholder"),this]);for(var g=e.length-1;g>=0;g--)e[g][0].each(function(){d.push(this)});return a(d)},_removeCurrentsFromItems:function(){var a=this.currentItem.find(":data("+this.widgetName+"-item)");for(var b=0;b<this.items.length;b++)for(var c=0;c<a.length;c++)a[c]==this.items[b].item[0]&&this.items.splice(b,1)},_refreshItems:function(b){this.items=[],this.containers=[this];var c=this.items,d=this,e=[[a.isFunction(this.options.items)?this.options.items.call(this.element[0],b,{item:this.currentItem}):a(this.options.items,this.element),this]],f=this._connectWith();if(f&&this.ready)for(var g=f.length-1;g>=0;g--){var h=a(f[g]);for(var i=h.length-1;i>=0;i--){var j=
 a.data(h[i],this.widgetName);j&&j!=this&&!j.options.disabled&&(e.push([a.isFunction(j.options.items)?j.options.items.call(j.element[0],b,{item:this.currentItem}):a(j.options.items,j.element),j]),this.containers.push(j))}}for(var g=e.length-1;g>=0;g--){var k=e[g][1],l=e[g][0];for(var i=0,m=l.length;i<m;i++){var n=a(l[i]);n.data(this.widgetName+"-item",k),c.push({item:n,instance:k,width:0,height:0,left:0,top:0})}}},refreshPositions:function(b){this.offsetParent&&this.helper&&(this.offset.parent=this._getParentOffset());for(var c=this.items.length-1;c>=0;c--){var d=this.items[c];if(d.instance!=this.currentContainer&&this.currentContainer&&d.item[0]!=this.currentItem[0])continue;var e=this.options.toleranceElement?a(this.options.toleranceElement,d.item):d.item;b||(d.width=e.outerWidth(),d.height=e.outerHeight());var f=e.offset();d.left=f.left,d.top=f.top}if(this.options.custom&&this.options.custom.refreshContainers)this.options.custom.refreshContainers.call(this);else for(var c=this.con
 tainers.length-1;c>=0;c--){var f=this.containers[c].element.offset();this.containers[c].containerCache.left=f.left,this.containers[c].containerCache.top=f.top,this.containers[c].containerCache.width=this.containers[c].element.outerWidth(),this.containers[c].containerCache.height=this.containers[c].element.outerHeight()}return this},_createPlaceholder:function(b){var c=b||this,d=c.options;if(!d.placeholder||d.placeholder.constructor==String){var e=d.placeholder;d.placeholder={element:function(){var b=a(document.createElement(c.currentItem[0].nodeName)).addClass(e||c.currentItem[0].className+" ui-sortable-placeholder").removeClass("ui-sortable-helper")[0];return e||(b.style.visibility="hidden"),b},update:function(a,b){if(e&&!d.forcePlaceholderSize)return;b.height()||b.height(c.currentItem.innerHeight()-parseInt(c.currentItem.css("paddingTop")||0,10)-parseInt(c.currentItem.css("paddingBottom")||0,10)),b.width()||b.width(c.currentItem.innerWidth()-parseInt(c.currentItem.css("paddingLeft
 ")||0,10)-parseInt(c.currentItem.css("paddingRight")||0,10))}}}c.placeholder=a(d.placeholder.element.call(c.element,c.currentItem)),c.currentItem.after(c.placeholder),d.placeholder.update(c,c.placeholder)},_contactContainers:function(b){var c=null,d=null;for(var e=this.containers.length-1;e>=0;e--){if(a.ui.contains(this.currentItem[0],this.containers[e].element[0]))continue;if(this._intersectsWith(this.containers[e].containerCache)){if(c&&a.ui.contains(this.containers[e].element[0],c.element[0]))continue;c=this.containers[e],d=e}else this.containers[e].containerCache.over&&(this.containers[e]._trigger("out",b,this._uiHash(this)),this.containers[e].containerCache.over=0)}if(!c)return;if(this.containers.length===1)this.containers[d]._trigger("over",b,this._uiHash(this)),this.containers[d].containerCache.over=1;else if(this.currentContainer!=this.containers[d]){var f=1e4,g=null,h=this.positionAbs[this.containers[d].floating?"left":"top"];for(var i=this.items.length-1;i>=0;i--){if(!a.ui
 .contains(this.containers[d].element[0],this.items[i].item[0]))continue;var j=this.items[i][this.containers[d].floating?"left":"top"];Math.abs(j-h)<f&&(f=Math.abs(j-h),g=this.items[i])}if(!g&&!this.options.dropOnEmpty)return;this.currentContainer=this.containers[d],g?this._rearrange(b,g,null,!0):this._rearrange(b,null,this.containers[d].element,!0),this._trigger("change",b,this._uiHash()),this.containers[d]._trigger("change",b,this._uiHash(this)),this.options.placeholder.update(this.currentContainer,this.placeholder),this.containers[d]._trigger("over",b,this._uiHash(this)),this.containers[d].containerCache.over=1}},_createHelper:function(b){var c=this.options,d=a.isFunction(c.helper)?a(c.helper.apply(this.element[0],[b,this.currentItem])):c.helper=="clone"?this.currentItem.clone():this.currentItem;return d.parents("body").length||a(c.appendTo!="parent"?c.appendTo:this.currentItem[0].parentNode)[0].appendChild(d[0]),d[0]==this.currentItem[0]&&(this._storedCSS={width:this.currentItem[
 0].style.width,height:this.currentItem[0].style.height,position:this.currentItem.css("position"),top:this.currentItem.css("top"),left:this.currentItem.css("left")}),(d[0].style.width==""||c.forceHelperSize)&&d.width(this.currentItem.width()),(d[0].style.height==""||c.forceHelperSize)&&d.height(this.currentItem.height()),d},_adjustOffsetFromHelper:function(b){typeof b=="string"&&(b=b.split(" ")),a.isArray(b)&&(b={left:+b[0],top:+b[1]||0}),"left"in b&&(this.offset.click.left=b.left+this.margins.left),"right"in b&&(this.offset.click.left=this.helperProportions.width-b.right+this.margins.left),"top"in b&&(this.offset.click.top=b.top+this.margins.top),"bottom"in b&&(this.offset.click.top=this.helperProportions.height-b.bottom+this.margins.top)},_getParentOffset:function(){this.offsetParent=this.helper.offsetParent();var b=this.offsetParent.offset();this.cssPosition=="absolute"&&this.scrollParent[0]!=document&&a.ui.contains(this.scrollParent[0],this.offsetParent[0])&&(b.left+=this.scrollP
 arent.scrollLeft(),b.top+=this.scrollParent.scrollTop());if(this.offsetParent[0]==document.body||this.offsetParent[0].tagName&&this.offsetParent[0].tagName.toLowerCase()=="html"&&a.browser.msie)b={top:0,left:0};return{top:b.top+(parseInt(this.offsetParent.css("borderTopWidth"),10)||0),left:b.left+(parseInt(this.offsetParent.css("borderLeftWidth"),10)||0)}},_getRelativeOffset:function(){if(this.cssPosition=="relative"){var a=this.currentItem.position();return{top:a.top-(parseInt(this.helper.css("top"),10)||0)+this.scrollParent.scrollTop(),left:a.left-(parseInt(this.helper.css("left"),10)||0)+this.scrollParent.scrollLeft()}}return{top:0,left:0}},_cacheMargins:function(){this.margins={left:parseInt(this.currentItem.css("marginLeft"),10)||0,top:parseInt(this.currentItem.css("marginTop"),10)||0}},_cacheHelperProportions:function(){this.helperProportions={width:this.helper.outerWidth(),height:this.helper.outerHeight()}},_setContainment:function(){var b=this.options;b.containment=="parent"
 &&(b.containment=this.helper[0].parentNode);if(b.containment=="document"||b.containment=="window")this.containment=[0-this.offset.relative.left-this.offset.parent.left,0-this.offset.relative.top-this.offset.parent.top,a(b.containment=="document"?document:window).width()-this.helperProportions.width-this.margins.left,(a(b.containment=="document"?document:window).height()||document.body.parentNode.scrollHeight)-this.helperProportions.height-this.margins.top];if(!/^(document|window|parent)$/.test(b.containment)){var c=a(b.containment)[0],d=a(b.containment).offset(),e=a(c).css("overflow")!="hidden";this.containment=[d.left+(parseInt(a(c).css("borderLeftWidth"),10)||0)+(parseInt(a(c).css("paddingLeft"),10)||0)-this.margins.left,d.top+(parseInt(a(c).css("borderTopWidth"),10)||0)+(parseInt(a(c).css("paddingTop"),10)||0)-this.margins.top,d.left+(e?Math.max(c.scrollWidth,c.offsetWidth):c.offsetWidth)-(parseInt(a(c).css("borderLeftWidth"),10)||0)-(parseInt(a(c).css("paddingRight"),10)||0)-thi
 s.helperProportions.width-this.margins.left,d.top+(e?Math.max(c.scrollHeight,c.offsetHeight):c.offsetHeight)-(parseInt(a(c).css("borderTopWidth"),10)||0)-(parseInt(a(c).css("paddingBottom"),10)||0)-this.helperProportions.height-this.margins.top]}},_convertPositionTo:function(b,c){c||(c=this.position);var d=b=="absolute"?1:-1,e=this.options,f=this.cssPosition=="absolute"&&(this.scrollParent[0]==document||!a.ui.contains(this.scrollParent[0],this.offsetParent[0]))?this.offsetParent:this.scrollParent,g=/(html|body)/i.test(f[0].tagName);return{top:c.top+this.offset.relative.top*d+this.offset.parent.top*d-(a.browser.safari&&this.cssPosition=="fixed"?0:(this.cssPosition=="fixed"?-this.scrollParent.scrollTop():g?0:f.scrollTop())*d),left:c.left+this.offset.relative.left*d+this.offset.parent.left*d-(a.browser.safari&&this.cssPosition=="fixed"?0:(this.cssPosition=="fixed"?-this.scrollParent.scrollLeft():g?0:f.scrollLeft())*d)}},_generatePosition:function(b){var c=this.options,d=this.cssPositio
 n=="absolute"&&(this.scrollParent[0]==document||!a.ui.contains(this.scrollParent[0],this.offsetParent[0]))?this.offsetParent:this.scrollParent,e=/(html|body)/i.test(d[0].tagName);this.cssPosition=="relative"&&(this.scrollParent[0]==document||this.scrollParent[0]==this.offsetParent[0])&&(this.offset.relative=this._getRelativeOffset());var f=b.pageX,g=b.pageY;if(this.originalPosition){this.containment&&(b.pageX-this.offset.click.left<this.containment[0]&&(f=this.containment[0]+this.offset.click.left),b.pageY-this.offset.click.top<this.containment[1]&&(g=this.containment[1]+this.offset.click.top),b.pageX-this.offset.click.left>this.containment[2]&&(f=this.containment[2]+this.offset.click.left),b.pageY-this.offset.click.top>this.containment[3]&&(g=this.containment[3]+this.offset.click.top));if(c.grid){var h=this.originalPageY+Math.round((g-this.originalPageY)/c.grid[1])*c.grid[1];g=this.containment?h-this.offset.click.top<this.containment[1]||h-this.offset.click.top>this.containment[3]?
 h-this.offset.click.top<this.containment[1]?h+c.grid[1]:h-c.grid[1]:h:h;var i=this.originalPageX+Math.round((f-this.originalPageX)/c.grid[0])*c.grid[0];f=this.containment?i-this.offset.click.left<this.containment[0]||i-this.offset.click.left>this.containment[2]?i-this.offset.click.left<this.containment[0]?i+c.grid[0]:i-c.grid[0]:i:i}}return{top:g-this.offset.click.top-this.offset.relative.top-this.offset.parent.top+(a.browser.safari&&this.cssPosition=="fixed"?0:this.cssPosition=="fixed"?-this.scrollParent.scrollTop():e?0:d.scrollTop()),left:f-this.offset.click.left-this.offset.relative.left-this.offset.parent.left+(a.browser.safari&&this.cssPosition=="fixed"?0:this.cssPosition=="fixed"?-this.scrollParent.scrollLeft():e?0:d.scrollLeft())}},_rearrange:function(a,b,c,d){c?c[0].appendChild(this.placeholder[0]):b.item[0].parentNode.insertBefore(this.placeholder[0],this.direction=="down"?b.item[0]:b.item[0].nextSibling),this.counter=this.counter?++this.counter:1;var e=this,f=this.counter;
 window.setTimeout(function(){f==e.counter&&e.refreshPositions(!d)},0)},_clear:function(b,c){this.reverting=!1;var d=[],e=this;!this._noFinalSort&&this.currentItem.parent().length&&this.placeholder.before(this.currentItem),this._noFinalSort=null;if(this.helper[0]==this.currentItem[0]){for(var f in this._storedCSS)if(this._storedCSS[f]=="auto"||this._storedCSS[f]=="static")this._storedCSS[f]="";this.currentItem.css(this._storedCSS).removeClass("ui-sortable-helper")}else this.currentItem.show();this.fromOutside&&!c&&d.push(function(a){this._trigger("receive",a,this._uiHash(this.fromOutside))}),(this.fromOutside||this.domPosition.prev!=this.currentItem.prev().not(".ui-sortable-helper")[0]||this.domPosition.parent!=this.currentItem.parent()[0])&&!c&&d.push(function(a){this._trigger("update",a,this._uiHash())});if(!a.ui.contains(this.element[0],this.currentItem[0])){c||d.push(function(a){this._trigger("remove",a,this._uiHash())});for(var f=this.containers.length-1;f>=0;f--)a.ui.contains(t
 his.containers[f].element[0],this.currentItem[0])&&!c&&(d.push(function(a){return function(b){a._trigger("receive",b,this._uiHash(this))}}.call(this,this.containers[f])),d.push(function(a){return function(b){a._trigger("update",b,this._uiHash(this))}}.call(this,this.containers[f])))}for(var f=this.containers.length-1;f>=0;f--)c||d.push(function(a){return function(b){a._trigger("deactivate",b,this._uiHash(this))}}.call(this,this.containers[f])),this.containers[f].containerCache.over&&(d.push(function(a){return function(b){a._trigger("out",b,this._uiHash(this))}}.call(this,this.containers[f])),this.containers[f].containerCache.over=0);this._storedCursor&&a("body").css("cursor",this._storedCursor),this._storedOpacity&&this.helper.css("opacity",this._storedOpacity),this._storedZIndex&&this.helper.css("zIndex",this._storedZIndex=="auto"?"":this._storedZIndex),this.dragging=!1;if(this.cancelHelperRemoval){if(!c){this._trigger("beforeStop",b,this._uiHash());for(var f=0;f<d.length;f++)d[f].
 call(this,b);this._trigger("stop",b,this._uiHash())}return!1}c||this._trigger("beforeStop",b,this._uiHash()),this.placeholder[0].parentNode.removeChild(this.placeholder[0]),this.helper[0]!=this.currentItem[0]&&this.helper.remove(),this.helper=null;if(!c){for(var f=0;f<d.length;f++)d[f].call(this,b);this._trigger("stop",b,this._uiHash())}return this.fromOutside=!1,!0},_trigger:function(){a.Widget.prototype._trigger.apply(this,arguments)===!1&&this.cancel()},_uiHash:function(b){var c=b||this;return{helper:c.helper,placeholder:c.placeholder||a([]),position:c.position,originalPosition:c.originalPosition,offset:c.positionAbs,item:c.currentItem,sender:b?b.element:null}}}),a.extend(a.ui.sortable,{version:"1.8.20"})})(jQuery);;/*! jQuery UI - v1.8.20 - 2012-04-30
+* https://github.com/jquery/jquery-ui
+* Includes: jquery.ui.accordion.js
+* Copyright (c) 2012 AUTHORS.txt; Licensed MIT, GPL */
+(function(a,b){a.widget("ui.accordion",{options:{active:0,animated:"slide",autoHeight:!0,clearStyle:!1,collapsible:!1,event:"click",fillSpace:!1,header:"> li > :first-child,> :not(li):even",icons:{header:"ui-icon-triangle-1-e",headerSelected:"ui-icon-triangle-1-s"},navigation:!1,navigationFilter:function(){return this.href.toLowerCase()===location.href.toLowerCase()}},_create:function(){var b=this,c=b.options;b.running=0,b.element.addClass("ui-accordion ui-widget ui-helper-reset").children("li").addClass("ui-accordion-li-fix"),b.headers=b.element.find(c.header).addClass("ui-accordion-header ui-helper-reset ui-state-default ui-corner-all").bind("mouseenter.accordion",function(){if(c.disabled)return;a(this).addClass("ui-state-hover")}).bind("mouseleave.accordion",function(){if(c.disabled)return;a(this).removeClass("ui-state-hover")}).bind("focus.accordion",function(){if(c.disabled)return;a(this).addClass("ui-state-focus")}).bind("blur.accordion",function(){if(c.disabled)return;a(this)
 .removeClass("ui-state-focus")}),b.headers.next().addClass("ui-accordion-content ui-helper-reset ui-widget-content ui-corner-bottom");if(c.navigation){var d=b.element.find("a").filter(c.navigationFilter).eq(0);if(d.length){var e=d.closest(".ui-accordion-header");e.length?b.active=e:b.active=d.closest(".ui-accordion-content").prev()}}b.active=b._findActive(b.active||c.active).addClass("ui-state-default ui-state-active").toggleClass("ui-corner-all").toggleClass("ui-corner-top"),b.active.next().addClass("ui-accordion-content-active"),b._createIcons(),b.resize(),b.element.attr("role","tablist"),b.headers.attr("role","tab").bind("keydown.accordion",function(a){return b._keydown(a)}).next().attr("role","tabpanel"),b.headers.not(b.active||"").attr({"aria-expanded":"false","aria-selected":"false",tabIndex:-1}).next().hide(),b.active.length?b.active.attr({"aria-expanded":"true","aria-selected":"true",tabIndex:0}):b.headers.eq(0).attr("tabIndex",0),a.browser.safari||b.headers.find("a").attr("
 tabIndex",-1),c.event&&b.headers.bind(c.event.split(" ").join(".accordion ")+".accordion",function(a){b._clickHandler.call(b,a,this),a.preventDefault()})},_createIcons:function(){var b=this.options;b.icons&&(a("<span></span>").addClass("ui-icon "+b.icons.header).prependTo(this.headers),this.active.children(".ui-icon").toggleClass(b.icons.header).toggleClass(b.icons.headerSelected),this.element.addClass("ui-accordion-icons"))},_destroyIcons:function(){this.headers.children(".ui-icon").remove(),this.element.removeClass("ui-accordion-icons")},destroy:function(){var b=this.options;this.element.removeClass("ui-accordion ui-widget ui-helper-reset").removeAttr("role"),this.headers.unbind(".accordion").removeClass("ui-accordion-header ui-accordion-disabled ui-helper-reset ui-state-default ui-corner-all ui-state-active ui-state-disabled ui-corner-top").removeAttr("role").removeAttr("aria-expanded").removeAttr("aria-selected").removeAttr("tabIndex"),this.headers.find("a").removeAttr("tabIndex
 "),this._destroyIcons();var c=this.headers.next().css("display","").removeAttr("role").removeClass("ui-helper-reset ui-widget-content ui-corner-bottom ui-accordion-content ui-accordion-content-active ui-accordion-disabled ui-state-disabled");return(b.autoHeight||b.fillHeight)&&c.css("height",""),a.Widget.prototype.destroy.call(this)},_setOption:function(b,c){a.Widget.prototype._setOption.apply(this,arguments),b=="active"&&this.activate(c),b=="icons"&&(this._destroyIcons(),c&&this._createIcons()),b=="disabled"&&this.headers.add(this.headers.next())[c?"addClass":"removeClass"]("ui-accordion-disabled ui-state-disabled")},_keydown:function(b){if(this.options.disabled||b.altKey||b.ctrlKey)return;var c=a.ui.keyCode,d=this.headers.length,e=this.headers.index(b.target),f=!1;switch(b.keyCode){case c.RIGHT:case c.DOWN:f=this.headers[(e+1)%d];break;case c.LEFT:case c.UP:f=this.headers[(e-1+d)%d];break;case c.SPACE:case c.ENTER:this._clickHandler({target:b.target},b.target),b.preventDefault()}r
 eturn f?(a(b.target).attr("tabIndex",-1),a(f).attr("tabIndex",0),f.focus(),!1):!0},resize:function(){var b=this.options,c;if(b.fillSpace){if(a.browser.msie){var d=this.element.parent().css("overflow");this.element.parent().css("overflow","hidden")}c=this.element.parent().height(),a.browser.msie&&this.element.parent().css("overflow",d),this.headers.each(function(){c-=a(this).outerHeight(!0)}),this.headers.next().each(function(){a(this).height(Math.max(0,c-a(this).innerHeight()+a(this).height()))}).css("overflow","auto")}else b.autoHeight&&(c=0,this.headers.next().each(function(){c=Math.max(c,a(this).height("").height())}).height(c));return this},activate:function(a){this.options.active=a;var b=this._findActive(a)[0];return this._clickHandler({target:b},b),this},_findActive:function(b){return b?typeof b=="number"?this.headers.filter(":eq("+b+")"):this.headers.not(this.headers.not(b)):b===!1?a([]):this.headers.filter(":eq(0)")},_clickHandler:function(b,c){var d=this.options;if(d.disabl
 ed)return;if(!b.target){if(!d.collapsible)return;this.active.removeClass("ui-state-active ui-corner-top").addClass("ui-state-default ui-corner-all").children(".ui-icon").removeClass(d.icons.headerSelected).addClass(d.icons.header),this.active.next().addClass("ui-accordion-content-active");var e=this.active.next(),f={options:d,newHeader:a([]),oldHeader:d.active,newContent:a([]),oldContent:e},g=this.active=a([]);this._toggle(g,e,f);return}var h=a(b.currentTarget||c),i=h[0]===this.active[0];d.active=d.collapsible&&i?!1:this.headers.index(h);if(this.running||!d.collapsible&&i)return;var j=this.active,g=h.next(),e=this.active.next(),f={options:d,newHeader:i&&d.collapsible?a([]):h,oldHeader:this.active,newContent:i&&d.collapsible?a([]):g,oldContent:e},k=this.headers.index(this.active[0])>this.headers.index(h[0]);this.active=i?a([]):h,this._toggle(g,e,f,i,k),j.removeClass("ui-state-active ui-corner-top").addClass("ui-state-default ui-corner-all").children(".ui-icon").removeClass(d.icons.he
 aderSelected).addClass(d.icons.header),i||(h.removeClass("ui-state-default ui-corner-all").addClass("ui-state-active ui-corner-top").children(".ui-icon").removeClass(d.icons.header).addClass(d.icons.headerSelected),h.next().addClass("ui-accordion-content-active"));return},_toggle:function(b,c,d,e,f){var g=this,h=g.options;g.toShow=b,g.toHide=c,g.data=d;var i=function(){if(!g)return;return g._completed.apply(g,arguments)};g._trigger("changestart",null,g.data),g.running=c.size()===0?b.size():c.size();if(h.animated){var j={};h.collapsible&&e?j={toShow:a([]),toHide:c,complete:i,down:f,autoHeight:h.autoHeight||h.fillSpace}:j={toShow:b,toHide:c,complete:i,down:f,autoHeight:h.autoHeight||h.fillSpace},h.proxied||(h.proxied=h.animated),h.proxiedDuration||(h.proxiedDuration=h.duration),h.animated=a.isFunction(h.proxied)?h.proxied(j):h.proxied,h.duration=a.isFunction(h.proxiedDuration)?h.proxiedDuration(j):h.proxiedDuration;var k=a.ui.accordion.animations,l=h.duration,m=h.animated;m&&!k[m]&&!a
 .easing[m]&&(m="slide"),k[m]||(k[m]=function(a){this.slide(a,{easing:m,duration:l||700})}),k[m](j)}else h.collapsible&&e?b.toggle():(c.hide(),b.show()),i(!0);c.prev().attr({"aria-expanded":"false","aria-selected":"false",tabIndex:-1}).blur(),b.prev().attr({"aria-expanded":"true","aria-selected":"true",tabIndex:0}).focus()},_completed:function(a){this.running=a?0:--this.running;if(this.running)return;this.options.clearStyle&&this.toShow.add(this.toHide).css({height:"",overflow:""}),this.toHide.removeClass("ui-accordion-content-active"),this.toHide.length&&(this.toHide.parent()[0].className=this.toHide.parent()[0].className),this._trigger("change",null,this.data)}}),a.extend(a.ui.accordion,{version:"1.8.20",animations:{slide:function(b,c){b=a.extend({easing:"swing",duration:300},b,c);if(!b.toHide.size()){b.toShow.animate({height:"show",paddingTop:"show",paddingBottom:"show"},b);return}if(!b.toShow.size()){b.toHide.animate({height:"hide",paddingTop:"hide",paddingBottom:"hide"},b);retur
 n}var d=b.toShow.css("overflow"),e=0,f={},g={},h=["height","paddingTop","paddingBottom"],i,j=b.toShow;i=j[0].style.width,j.width(j.parent().width()-parseFloat(j.css("paddingLeft"))-parseFloat(j.css("paddingRight"))-(parseFloat(j.css("borderLeftWidth"))||0)-(parseFloat(j.css("borderRightWidth"))||0)),a.each(h,function(c,d){g[d]="hide";var e=(""+a.css(b.toShow[0],d)).match(/^([\d+-.]+)(.*)$/);f[d]={value:e[1],unit:e[2]||"px"}}),b.toShow.css({height:0,overflow:"hidden"}).show(),b.toHide.filter(":hidden").each(b.complete).end().filter(":visible").animate(g,{step:function(a,c){c.prop=="height"&&(e=c.end-c.start===0?0:(c.now-c.start)/(c.end-c.start)),b.toShow[0].style[c.prop]=e*f[c.prop].value+f[c.prop].unit},duration:b.duration,easing:b.easing,complete:function(){b.autoHeight||b.toShow.css("height",""),b.toShow.css({width:i,overflow:d}),b.complete()}})},bounceslide:function(a){this.slide(a,{easing:a.down?"easeOutBounce":"swing",duration:a.down?1e3:200})}}})})(jQuery);;/*! jQuery UI - v1.
 8.20 - 2012-04-30
+* https://github.com/jquery/jquery-ui
+* Includes: jquery.ui.autocomplete.js
+* Copyright (c) 2012 AUTHORS.txt; Licensed MIT, GPL */
+(function(a,b){var c=0;a.widget("ui.autocomplete",{options:{appendTo:"body",autoFocus:!1,delay:300,minLength:1,position:{my:"left top",at:"left bottom",collision:"none"},source:null},pending:0,_create:function(){var b=this,c=this.element[0].ownerDocument,d;this.isMultiLine=this.element.is("textarea"),this.element.addClass("ui-autocomplete-input").attr("autocomplete","off").attr({role:"textbox","aria-autocomplete":"list","aria-haspopup":"true"}).bind("keydown.autocomplete",function(c){if(b.options.disabled||b.element.propAttr("readOnly"))return;d=!1;var e=a.ui.keyCode;switch(c.keyCode){case e.PAGE_UP:b._move("previousPage",c);break;case e.PAGE_DOWN:b._move("nextPage",c);break;case e.UP:b._keyEvent("previous",c);break;case e.DOWN:b._keyEvent("next",c);break;case e.ENTER:case e.NUMPAD_ENTER:b.menu.active&&(d=!0,c.preventDefault());case e.TAB:if(!b.menu.active)return;b.menu.select(c);break;case e.ESCAPE:b.element.val(b.term),b.close(c);break;default:clearTimeout(b.searching),b.searching
 =setTimeout(function(){b.term!=b.element.val()&&(b.selectedItem=null,b.search(null,c))},b.options.delay)}}).bind("keypress.autocomplete",function(a){d&&(d=!1,a.preventDefault())}).bind("focus.autocomplete",function(){if(b.options.disabled)return;b.selectedItem=null,b.previous=b.element.val()}).bind("blur.autocomplete",function(a){if(b.options.disabled)return;clearTimeout(b.searching),b.closing=setTimeout(function(){b.close(a),b._change(a)},150)}),this._initSource(),this.menu=a("<ul></ul>").addClass("ui-autocomplete").appendTo(a(this.options.appendTo||"body",c)[0]).mousedown(function(c){var d=b.menu.element[0];a(c.target).closest(".ui-menu-item").length||setTimeout(function(){a(document).one("mousedown",function(c){c.target!==b.element[0]&&c.target!==d&&!a.ui.contains(d,c.target)&&b.close()})},1),setTimeout(function(){clearTimeout(b.closing)},13)}).menu({focus:function(a,c){var d=c.item.data("item.autocomplete");!1!==b._trigger("focus",a,{item:d})&&/^key/.test(a.originalEvent.type)&&
 b.element.val(d.value)},selected:function(a,d){var e=d.item.data("item.autocomplete"),f=b.previous;b.element[0]!==c.activeElement&&(b.element.focus(),b.previous=f,setTimeout(function(){b.previous=f,b.selectedItem=e},1)),!1!==b._trigger("select",a,{item:e})&&b.element.val(e.value),b.term=b.element.val(),b.close(a),b.selectedItem=e},blur:function(a,c){b.menu.element.is(":visible")&&b.element.val()!==b.term&&b.element.val(b.term)}}).zIndex(this.element.zIndex()+1).css({top:0,left:0}).hide().data("menu"),a.fn.bgiframe&&this.menu.element.bgiframe(),b.beforeunloadHandler=function(){b.element.removeAttr("autocomplete")},a(window).bind("beforeunload",b.beforeunloadHandler)},destroy:function(){this.element.removeClass("ui-autocomplete-input").removeAttr("autocomplete").removeAttr("role").removeAttr("aria-autocomplete").removeAttr("aria-haspopup"),this.menu.element.remove(),a(window).unbind("beforeunload",this.beforeunloadHandler),a.Widget.prototype.destroy.call(this)},_setOption:function(b,c
 ){a.Widget.prototype._setOption.apply(this,arguments),b==="source"&&this._initSource(),b==="appendTo"&&this.menu.element.appendTo(a(c||"body",this.element[0].ownerDocument)[0]),b==="disabled"&&c&&this.xhr&&this.xhr.abort()},_initSource:function(){var b=this,c,d;a.isArray(this.options.source)?(c=this.options.source,this.source=function(b,d){d(a.ui.autocomplete.filter(c,b.term))}):typeof this.options.source=="string"?(d=this.options.source,this.source=function(c,e){b.xhr&&b.xhr.abort(),b.xhr=a.ajax({url:d,data:c,dataType:"json",success:function(a,b){e(a)},error:function(){e([])}})}):this.source=this.options.source},search:function(a,b){a=a!=null?a:this.element.val(),this.term=this.element.val();if(a.length<this.options.minLength)return this.close(b);clearTimeout(this.closing);if(this._trigger("search",b)===!1)return;return this._search(a)},_search:function(a){this.pending++,this.element.addClass("ui-autocomplete-loading"),this.source({term:a},this._response())},_response:function(){va
 r a=this,b=++c;return function(d){b===c&&a.__response(d),a.pending--,a.pending||a.element.removeClass("ui-autocomplete-loading")}},__response:function(a){!this.options.disabled&&a&&a.length?(a=this._normalize(a),this._suggest(a),this._trigger("open")):this.close()},close:function(a){clearTimeout(this.closing),this.menu.element.is(":visible")&&(this.menu.element.hide(),this.menu.deactivate(),this._trigger("close",a))},_change:function(a){this.previous!==this.element.val()&&this._trigger("change",a,{item:this.selectedItem})},_normalize:function(b){return b.length&&b[0].label&&b[0].value?b:a.map(b,function(b){return typeof b=="string"?{label:b,value:b}:a.extend({label:b.label||b.value,value:b.value||b.label},b)})},_suggest:function(b){var c=this.menu.element.empty().zIndex(this.element.zIndex()+1);this._renderMenu(c,b),this.menu.deactivate(),this.menu.refresh(),c.show(),this._resizeMenu(),c.position(a.extend({of:this.element},this.options.position)),this.options.autoFocus&&this.menu.ne
 xt(new a.Event("mouseover"))},_resizeMenu:function(){var a=this.menu.element;a.outerWidth(Math.max(a.width("").outerWidth()+1,this.element.outerWidth()))},_renderMenu:function(b,c){var d=this;a.each(c,function(a,c){d._renderItem(b,c)})},_renderItem:function(b,c){return a("<li></li>").data("item.autocomplete",c).append(a("<a></a>").text(c.label)).appendTo(b)},_move:function(a,b){if(!this.menu.element.is(":visible")){this.search(null,b);return}if(this.menu.first()&&/^previous/.test(a)||this.menu.last()&&/^next/.test(a)){this.element.val(this.term),this.menu.deactivate();return}this.menu[a](b)},widget:function(){return this.menu.element},_keyEvent:function(a,b){if(!this.isMultiLine||this.menu.element.is(":visible"))this._move(a,b),b.preventDefault()}}),a.extend(a.ui.autocomplete,{escapeRegex:function(a){return a.replace(/[-[\]{}()*+?.,\\^$|#\s]/g,"\\$&")},filter:function(b,c){var d=new RegExp(a.ui.autocomplete.escapeRegex(c),"i");return a.grep(b,function(a){return d.test(a.label||a.val
 ue||a)})}})})(jQuery),function(a){a.widget("ui.menu",{_create:function(){var b=this;this.element.addClass("ui-menu ui-widget ui-widget-content ui-corner-all").attr({role:"listbox","aria-activedescendant":"ui-active-menuitem"}).click(function(c){if(!a(c.target).closest(".ui-menu-item a").length)return;c.preventDefault(),b.select(c)}),this.refresh()},refresh:function(){var b=this,c=this.element.children("li:not(.ui-menu-item):has(a)").addClass("ui-menu-item").attr("role","menuitem");c.children("a").addClass("ui-corner-all").attr("tabindex",-1).mouseenter(function(c){b.activate(c,a(this).parent())}).mouseleave(function(){b.deactivate()})},activate:function(a,b){this.deactivate();if(this.hasScroll()){var c=b.offset().top-this.element.offset().top,d=this.element.scrollTop(),e=this.element.height();c<0?this.element.scrollTop(d+c):c>=e&&this.element.scrollTop(d+c-e+b.height())}this.active=b.eq(0).children("a").addClass("ui-state-hover").attr("id","ui-active-menuitem").end(),this._trigger("
 focus",a,{item:b})},deactivate:function(){if(!this.active)return;this.active.children("a").removeClass("ui-state-hover").removeAttr("id"),this._trigger("blur"),this.active=null},next:function(a){this.move("next",".ui-menu-item:first",a)},previous:function(a){this.move("prev",".ui-menu-item:last",a)},first:function(){return this.active&&!this.active.prevAll(".ui-menu-item").length},last:function(){return this.active&&!this.active.nextAll(".ui-menu-item").length},move:function(a,b,c){if(!this.active){this.activate(c,this.element.children(b));return}var d=this.active[a+"All"](".ui-menu-item").eq(0);d.length?this.activate(c,d):this.activate(c,this.element.children(b))},nextPage:function(b){if(this.hasScroll()){if(!this.active||this.last()){this.activate(b,this.element.children(".ui-menu-item:first"));return}var c=this.active.offset().top,d=this.element.height(),e=this.element.children(".ui-menu-item").filter(function(){var b=a(this).offset().top-c-d+a(this).height();return b<10&&b>-10})
 ;e.length||(e=this.element.children(".ui-menu-item:last")),this.activate(b,e)}else this.activate(b,this.element.children(".ui-menu-item").filter(!this.active||this.last()?":first":":last"))},previousPage:function(b){if(this.hasScroll()){if(!this.active||this.first()){this.activate(b,this.element.children(".ui-menu-item:last"));return}var c=this.active.offset().top,d=this.element.height(),e=this.element.children(".ui-menu-item").filter(function(){var b=a(this).offset().top-c+d-a(this).height();return b<10&&b>-10});e.length||(e=this.element.children(".ui-menu-item:first")),this.activate(b,e)}else this.activate(b,this.element.children(".ui-menu-item").filter(!this.active||this.first()?":last":":first"))},hasScroll:function(){return this.element.height()<this.element[a.fn.prop?"prop":"attr"]("scrollHeight")},select:function(a){this._trigger("selected",a,{item:this.active})}})}(jQuery);;/*! jQuery UI - v1.8.20 - 2012-04-30
+* https://github.com/jquery/jquery-ui
+* Includes: jquery.ui.button.js
+* Copyright (c) 2012 AUTHORS.txt; Licensed MIT, GPL */
+(function(a,b){var c,d,e,f,g="ui-button ui-widget ui-state-default ui-corner-all",h="ui-state-hover ui-state-active ",i="ui-button-icons-only ui-button-icon-only ui-button-text-icons ui-button-text-icon-primary ui-button-text-icon-secondary ui-button-text-only",j=function(){var b=a(this).find(":ui-button");setTimeout(function(){b.button("refresh")},1)},k=function(b){var c=b.name,d=b.form,e=a([]);return c&&(d?e=a(d).find("[name='"+c+"']"):e=a("[name='"+c+"']",b.ownerDocument).filter(function(){return!this.form})),e};a.widget("ui.button",{options:{disabled:null,text:!0,label:null,icons:{primary:null,secondary:null}},_create:function(){this.element.closest("form").unbind("reset.button").bind("reset.button",j),typeof this.options.disabled!="boolean"?this.options.disabled=!!this.element.propAttr("disabled"):this.element.propAttr("disabled",this.options.disabled),this._determineButtonType(),this.hasTitle=!!this.buttonElement.attr("title");var b=this,h=this.options,i=this.type==="checkbox"
 ||this.type==="radio",l="ui-state-hover"+(i?"":" ui-state-active"),m="ui-state-focus";h.label===null&&(h.label=this.buttonElement.html()),this.buttonElement.addClass(g).attr("role","button").bind("mouseenter.button",function(){if(h.disabled)return;a(this).addClass("ui-state-hover"),this===c&&a(this).addClass("ui-state-active")}).bind("mouseleave.button",function(){if(h.disabled)return;a(this).removeClass(l)}).bind("click.button",function(a){h.disabled&&(a.preventDefault(),a.stopImmediatePropagation())}),this.element.bind("focus.button",function(){b.buttonElement.addClass(m)}).bind("blur.button",function(){b.buttonElement.removeClass(m)}),i&&(this.element.bind("change.button",function(){if(f)return;b.refresh()}),this.buttonElement.bind("mousedown.button",function(a){if(h.disabled)return;f=!1,d=a.pageX,e=a.pageY}).bind("mouseup.button",function(a){if(h.disabled)return;if(d!==a.pageX||e!==a.pageY)f=!0})),this.type==="checkbox"?this.buttonElement.bind("click.button",function(){if(h.disa
 bled||f)return!1;a(this).toggleClass("ui-state-active"),b.buttonElement.attr("aria-pressed",b.element[0].checked)}):this.type==="radio"?this.buttonElement.bind("click.button",function(){if(h.disabled||f)return!1;a(this).addClass("ui-state-active"),b.buttonElement.attr("aria-pressed","true");var c=b.element[0];k(c).not(c).map(function(){return a(this).button("widget")[0]}).removeClass("ui-state-active").attr("aria-pressed","false")}):(this.buttonElement.bind("mousedown.button",function(){if(h.disabled)return!1;a(this).addClass("ui-state-active"),c=this,a(document).one("mouseup",function(){c=null})}).bind("mouseup.button",function(){if(h.disabled)return!1;a(this).removeClass("ui-state-active")}).bind("keydown.button",function(b){if(h.disabled)return!1;(b.keyCode==a.ui.keyCode.SPACE||b.keyCode==a.ui.keyCode.ENTER)&&a(this).addClass("ui-state-active")}).bind("keyup.button",function(){a(this).removeClass("ui-state-active")}),this.buttonElement.is("a")&&this.buttonElement.keyup(function(b
 ){b.keyCode===a.ui.keyCode.SPACE&&a(this).click()})),this._setOption("disabled",h.disabled),this._resetButton()},_determineButtonType:function(){this.element.is(":checkbox")?this.type="checkbox":this.element.is(":radio")?this.type="radio":this.element.is("input")?this.type="input":this.type="button";if(this.type==="checkbox"||this.type==="radio"){var a=this.element.parents().filter(":last"),b="label[for='"+this.element.attr("id")+"']";this.buttonElement=a.find(b),this.buttonElement.length||(a=a.length?a.siblings():this.element.siblings(),this.buttonElement=a.filter(b),this.buttonElement.length||(this.buttonElement=a.find(b))),this.element.addClass("ui-helper-hidden-accessible");var c=this.element.is(":checked");c&&this.buttonElement.addClass("ui-state-active"),this.buttonElement.attr("aria-pressed",c)}else this.buttonElement=this.element},widget:function(){return this.buttonElement},destroy:function(){this.element.removeClass("ui-helper-hidden-accessible"),this.buttonElement.removeC
 lass(g+" "+h+" "+i).removeAttr("role").removeAttr("aria-pressed").html(this.buttonElement.find(".ui-button-text").html()),this.hasTitle||this.buttonElement.removeAttr("title"),a.Widget.prototype.destroy.call(this)},_setOption:function(b,c){a.Widget.prototype._setOption.apply(this,arguments);if(b==="disabled"){c?this.element.propAttr("disabled",!0):this.element.propAttr("disabled",!1);return}this._resetButton()},refresh:function(){var b=this.element.is(":disabled");b!==this.options.disabled&&this._setOption("disabled",b),this.type==="radio"?k(this.element[0]).each(function(){a(this).is(":checked")?a(this).button("widget").addClass("ui-state-active").attr("aria-pressed","true"):a(this).button("widget").removeClass("ui-state-active").attr("aria-pressed","false")}):this.type==="checkbox"&&(this.element.is(":checked")?this.buttonElement.addClass("ui-state-active").attr("aria-pressed","true"):this.buttonElement.removeClass("ui-state-active").attr("aria-pressed","false"))},_resetButton:fun
 ction(){if(this.type==="input"){this.options.label&&this.element.val(this.options.label);return}var b=this.buttonElement.removeClass(i),c=a("<span></span>",this.element[0].ownerDocument).addClass("ui-button-text").html(this.options.label).appendTo(b.empty()).text(),d=this.options.icons,e=d.primary&&d.secondary,f=[];d.primary||d.secondary?(this.options.text&&f.push("ui-button-text-icon"+(e?"s":d.primary?"-primary":"-secondary")),d.primary&&b.prepend("<span class='ui-button-icon-primary ui-icon "+d.primary+"'></span>"),d.secondary&&b.append("<span class='ui-button-icon-secondary ui-icon "+d.secondary+"'></span>"),this.options.text||(f.push(e?"ui-button-icons-only":"ui-button-icon-only"),this.hasTitle||b.attr("title",c))):f.push("ui-button-text-only"),b.addClass(f.join(" "))}}),a.widget("ui.buttonset",{options:{items:":button, :submit, :reset, :checkbox, :radio, a, :data(button)"},_create:function(){this.element.addClass("ui-buttonset")},_init:function(){this.refresh()},_setOption:func
 tion(b,c){b==="disabled"&&this.buttons.button("option",b,c),a.Widget.prototype._setOption.apply(this,arguments)},refresh:function(){var b=this.element.css("direction")==="rtl";this.buttons=this.element.find(this.options.items).filter(":ui-button").button("refresh").end().not(":ui-button").button().end().map(function(){return a(this).button("widget")[0]}).removeClass("ui-corner-all ui-corner-left ui-corner-right").filter(":first").addClass(b?"ui-corner-right":"ui-corner-left").end().filter(":last").addClass(b?"ui-corner-left":"ui-corner-right").end().end()},destroy:function(){this.element.removeClass("ui-buttonset"),this.buttons.map(function(){return a(this).button("widget")[0]}).removeClass("ui-corner-left ui-corner-right").end().button("destroy"),a.Widget.prototype.destroy.call(this)}})})(jQuery);;/*! jQuery UI - v1.8.20 - 2012-04-30
+* https://github.com/jquery/jquery-ui
+* Includes: jquery.ui.dialog.js
+* Copyright (c) 2012 AUTHORS.txt; Licensed MIT, GPL */
+(function(a,b){var c="ui-dialog ui-widget ui-widget-content ui-corner-all ",d={buttons:!0,height:!0,maxHeight:!0,maxWidth:!0,minHeight:!0,minWidth:!0,width:!0},e={maxHeight:!0,maxWidth:!0,minHeight:!0,minWidth:!0},f=a.attrFn||{val:!0,css:!0,html:!0,text:!0,data:!0,width:!0,height:!0,offset:!0,click:!0};a.widget("ui.dialog",{options:{autoOpen:!0,buttons:{},closeOnEscape:!0,closeText:"close",dialogClass:"",draggable:!0,hide:null,height:"auto",maxHeight:!1,maxWidth:!1,minHeight:150,minWidth:150,modal:!1,position:{my:"center",at:"center",collision:"fit",using:function(b){var c=a(this).css(b).offset().top;c<0&&a(this).css("top",b.top-c)}},resizable:!0,show:null,stack:!0,title:"",width:300,zIndex:1e3},_create:function(){this.originalTitle=this.element.attr("title"),typeof this.originalTitle!="string"&&(this.originalTitle=""),this.options.title=this.options.title||this.originalTitle;var b=this,d=b.options,e=d.title||"&#160;",f=a.ui.dialog.getTitleId(b.element),g=(b.uiDialog=a("<div></div>"
 )).appendTo(document.body).hide().addClass(c+d.dialogClass).css({zIndex:d.zIndex}).attr("tabIndex",-1).css("outline",0).keydown(function(c){d.closeOnEscape&&!c.isDefaultPrevented()&&c.keyCode&&c.keyCode===a.ui.keyCode.ESCAPE&&(b.close(c),c.preventDefault())}).attr({role:"dialog","aria-labelledby":f}).mousedown(function(a){b.moveToTop(!1,a)}),h=b.element.show().removeAttr("title").addClass("ui-dialog-content ui-widget-content").appendTo(g),i=(b.uiDialogTitlebar=a("<div></div>")).addClass("ui-dialog-titlebar ui-widget-header ui-corner-all ui-helper-clearfix").prependTo(g),j=a('<a href="#"></a>').addClass("ui-dialog-titlebar-close ui-corner-all").attr("role","button").hover(function(){j.addClass("ui-state-hover")},function(){j.removeClass("ui-state-hover")}).focus(function(){j.addClass("ui-state-focus")}).blur(function(){j.removeClass("ui-state-focus")}).click(function(a){return b.close(a),!1}).appendTo(i),k=(b.uiDialogTitlebarCloseText=a("<span></span>")).addClass("ui-icon ui-icon-clo
 sethick").text(d.closeText).appendTo(j),l=a("<span></span>").addClass("ui-dialog-title").attr("id",f).html(e).prependTo(i);a.isFunction(d.beforeclose)&&!a.isFunction(d.beforeClose)&&(d.beforeClose=d.beforeclose),i.find("*").add(i).disableSelection(),d.draggable&&a.fn.draggable&&b._makeDraggable(),d.resizable&&a.fn.resizable&&b._makeResizable(),b._createButtons(d.buttons),b._isOpen=!1,a.fn.bgiframe&&g.bgiframe()},_init:function(){this.options.autoOpen&&this.open()},destroy:function(){var a=this;return a.overlay&&a.overlay.destroy(),a.uiDialog.hide(),a.element.unbind(".dialog").removeData("dialog").removeClass("ui-dialog-content ui-widget-content").hide().appendTo("body"),a.uiDialog.remove(),a.originalTitle&&a.element.attr("title",a.originalTitle),a},widget:function(){return this.uiDialog},close:function(b){var c=this,d,e;if(!1===c._trigger("beforeClose",b))return;return c.overlay&&c.overlay.destroy(),c.uiDialog.unbind("keypress.ui-dialog"),c._isOpen=!1,c.options.hide?c.uiDialog.hide(
 c.options.hide,function(){c._trigger("close",b)}):(c.uiDialog.hide(),c._trigger("close",b)),a.ui.dialog.overlay.resize(),c.options.modal&&(d=0,a(".ui-dialog").each(function(){this!==c.uiDialog[0]&&(e=a(this).css("z-index"),isNaN(e)||(d=Math.max(d,e)))}),a.ui.dialog.maxZ=d),c},isOpen:function(){return this._isOpen},moveToTop:function(b,c){var d=this,e=d.options,f;return e.modal&&!b||!e.stack&&!e.modal?d._trigger("focus",c):(e.zIndex>a.ui.dialog.maxZ&&(a.ui.dialog.maxZ=e.zIndex),d.overlay&&(a.ui.dialog.maxZ+=1,d.overlay.$el.css("z-index",a.ui.dialog.overlay.maxZ=a.ui.dialog.maxZ)),f={scrollTop:d.element.scrollTop(),scrollLeft:d.element.scrollLeft()},a.ui.dialog.maxZ+=1,d.uiDialog.css("z-index",a.ui.dialog.maxZ),d.element.attr(f),d._trigger("focus",c),d)},open:function(){if(this._isOpen)return;var b=this,c=b.options,d=b.uiDialog;return b.overlay=c.modal?new a.ui.dialog.overlay(b):null,b._size(),b._position(c.position),d.show(c.show),b.moveToTop(!0),c.modal&&d.bind("keydown.ui-dialog",f
 unction(b){if(b.keyCode!==a.ui.keyCode.TAB)return;var c=a(":tabbable",this),d=c.filter(":first"),e=c.filter(":last");if(b.target===e[0]&&!b.shiftKey)return d.focus(1),!1;if(b.target===d[0]&&b.shiftKey)return e.focus(1),!1}),a(b.element.find(":tabbable").get().concat(d.find(".ui-dialog-buttonpane :tabbable").get().concat(d.get()))).eq(0).focus(),b._isOpen=!0,b._trigger("open"),b},_createButtons:function(b){var c=this,d=!1,e=a("<div></div>").addClass("ui-dialog-buttonpane ui-widget-content ui-helper-clearfix"),g=a("<div></div>").addClass("ui-dialog-buttonset").appendTo(e);c.uiDialog.find(".ui-dialog-buttonpane").remove(),typeof b=="object"&&b!==null&&a.each(b,function(){return!(d=!0)}),d&&(a.each(b,function(b,d){d=a.isFunction(d)?{click:d,text:b}:d;var e=a('<button type="button"></button>').click(function(){d.click.apply(c.element[0],arguments)}).appendTo(g);a.each(d,function(a,b){if(a==="click")return;a in f?e[a](b):e.attr(a,b)}),a.fn.button&&e.button()}),e.appendTo(c.uiDialog))},_ma
 keDraggable:function(){function f(a){return{position:a.position,offset:a.offset}}var b=this,c=b.options,d=a(document),e;b.uiDialog.draggable({cancel:".ui-dialog-content, .ui-dialog-titlebar-close",handle:".ui-dialog-titlebar",containment:"document",start:function(d,g){e=c.height==="auto"?"auto":a(this).height(),a(this).height(a(this).height()).addClass("ui-dialog-dragging"),b._trigger("dragStart",d,f(g))},drag:function(a,c){b._trigger("drag",a,f(c))},stop:function(g,h){c.position=[h.position.left-d.scrollLeft(),h.position.top-d.scrollTop()],a(this).removeClass("ui-dialog-dragging").height(e),b._trigger("dragStop",g,f(h)),a.ui.dialog.overlay.resize()}})},_makeResizable:function(c){function h(a){return{originalPosition:a.originalPosition,originalSize:a.originalSize,position:a.position,size:a.size}}c=c===b?this.options.resizable:c;var d=this,e=d.options,f=d.uiDialog.css("position"),g=typeof c=="string"?c:"n,e,s,w,se,sw,ne,nw";d.uiDialog.resizable({cancel:".ui-dialog-content",containmen
 t:"document",alsoResize:d.element,maxWidth:e.maxWidth,maxHeight:e.maxHeight,minWidth:e.minWidth,minHeight:d._minHeight(),handles:g,start:function(b,c){a(this).addClass("ui-dialog-resizing"),d._trigger("resizeStart",b,h(c))},resize:function(a,b){d._trigger("resize",a,h(b))},stop:function(b,c){a(this).removeClass("ui-dialog-resizing"),e.height=a(this).height(),e.width=a(this).width(),d._trigger("resizeStop",b,h(c)),a.ui.dialog.overlay.resize()}}).css("position",f).find(".ui-resizable-se").addClass("ui-icon ui-icon-grip-diagonal-se")},_minHeight:function(){var a=this.options;return a.height==="auto"?a.minHeight:Math.min(a.minHeight,a.height)},_position:function(b){var c=[],d=[0,0],e;if(b){if(typeof b=="string"||typeof b=="object"&&"0"in b)c=b.split?b.split(" "):[b[0],b[1]],c.length===1&&(c[1]=c[0]),a.each(["left","top"],function(a,b){+c[a]===c[a]&&(d[a]=c[a],c[a]=b)}),b={my:c.join(" "),at:c.join(" "),offset:d.join(" ")};b=a.extend({},a.ui.dialog.prototype.options.position,b)}else b=a.u
 i.dialog.prototype.options.position;e=this.uiDialog.is(":visible"),e||this.uiDialog.show(),this.uiDialog.css({top:0,left:0}).position(a.extend({of:window},b)),e||this.uiDialog.hide()},_setOptions:function(b){var c=this,f={},g=!1;a.each(b,function(a,b){c._setOption(a,b),a in d&&(g=!0),a in e&&(f[a]=b)}),g&&this._size(),this.uiDialog.is(":data(resizable)")&&this.uiDialog.resizable("option",f)},_setOption:function(b,d){var e=this,f=e.uiDialog;switch(b){case"beforeclose":b="beforeClose";break;case"buttons":e._createButtons(d);break;case"closeText":e.uiDialogTitlebarCloseText.text(""+d);break;case"dialogClass":f.removeClass(e.options.dialogClass).addClass(c+d);break;case"disabled":d?f.addClass("ui-dialog-disabled"):f.removeClass("ui-dialog-disabled");break;case"draggable":var g=f.is(":data(draggable)");g&&!d&&f.draggable("destroy"),!g&&d&&e._makeDraggable();break;case"position":e._position(d);break;case"resizable":var h=f.is(":data(resizable)");h&&!d&&f.resizable("destroy"),h&&typeof d==
 "string"&&f.resizable("option","handles",d),!h&&d!==!1&&e._makeResizable(d);break;case"title":a(".ui-dialog-title",e.uiDialogTitlebar).html(""+(d||"&#160;"))}a.Widget.prototype._setOption.apply(e,arguments)},_size:function(){var b=this.options,c,d,e=this.uiDialog.is(":visible");this.element.show().css({width:"auto",minHeight:0,height:0}),b.minWidth>b.width&&(b.width=b.minWidth),c=this.uiDialog.css({height:"auto",width:b.width}).height(),d=Math.max(0,b.minHeight-c);if(b.height==="auto")if(a.support.minHeight)this.element.css({minHeight:d,height:"auto"});else{this.uiDialog.show();var f=this.element.css("height","auto").height();e||this.uiDialog.hide(),this.element.height(Math.max(f,d))}else this.element.height(Math.max(b.height-c,0));this.uiDialog.is(":data(resizable)")&&this.uiDialog.resizable("option","minHeight",this._minHeight())}}),a.extend(a.ui.dialog,{version:"1.8.20",uuid:0,maxZ:0,getTitleId:function(a){var b=a.attr("id");return b||(this.uuid+=1,b=this.uuid),"ui-dialog-title-"
 +b},overlay:function(b){this.$el=a.ui.dialog.overlay.create(b)}}),a.extend(a.ui.dialog.overlay,{instances:[],oldInstances:[],maxZ:0,events:a.map("focus,mousedown,mouseup,keydown,keypress,click".split(","),function(a){return a+".dialog-overlay"}).join(" "),create:function(b){this.instances.length===0&&(setTimeout(function(){a.ui.dialog.overlay.instances.length&&a(document).bind(a.ui.dialog.overlay.events,function(b){if(a(b.target).zIndex()<a.ui.dialog.overlay.maxZ)return!1})},1),a(document).bind("keydown.dialog-overlay",function(c){b.options.closeOnEscape&&!c.isDefaultPrevented()&&c.keyCode&&c.keyCode===a.ui.keyCode.ESCAPE&&(b.close(c),c.preventDefault())}),a(window).bind("resize.dialog-overlay",a.ui.dialog.overlay.resize));var c=(this.oldInstances.pop()||a("<div></div>").addClass("ui-widget-overlay")).appendTo(document.body).css({width:this.width(),height:this.height()});return a.fn.bgiframe&&c.bgiframe(),this.instances.push(c),c},destroy:function(b){var c=a.inArray(b,this.instances
 );c!=-1&&this.oldInstances.push(this.instances.splice(c,1)[0]),this.instances.length===0&&a([document,window]).unbind(".dialog-overlay"),b.remove();var d=0;a.each(this.instances,function(){d=Math.max(d,this.css("z-index"))}),this.maxZ=d},height:function(){var b,c;return a.browser.msie&&a.browser.version<7?(b=Math.max(document.documentElement.scrollHeight,document.body.scrollHeight),c=Math.max(document.documentElement.offsetHeight,document.body.offsetHeight),b<c?a(window).height()+"px":b+"px"):a(document).height()+"px"},width:function(){var b,c;return a.browser.msie?(b=Math.max(document.documentElement.scrollWidth,document.body.scrollWidth),c=Math.max(document.documentElement.offsetWidth,document.body.offsetWidth),b<c?a(window).width()+"px":b+"px"):a(document).width()+"px"},resize:function(){var b=a([]);a.each(a.ui.dialog.overlay.instances,function(){b=b.add(this)}),b.css({width:0,height:0}).css({width:a.ui.dialog.overlay.width(),height:a.ui.dialog.overlay.height()})}}),a.extend(a.ui
 .dialog.overlay.prototype,{destroy:function(){a.ui.dialog.overlay.destroy(this.$el)}})})(jQuery);;/*! jQuery UI - v1.8.20 - 2012-04-30
+* https://github.com/jquery/jquery-ui
+* Includes: jquery.ui.slider.js
+* Copyright (c) 2012 AUTHORS.txt; Licensed MIT, GPL */
+(function(a,b){var c=5;a.widget("ui.slider",a.ui.mouse,{widgetEventPrefix:"slide",options:{animate:!1,distance:0,max:100,min:0,orientation:"horizontal",range:!1,step:1,value:0,values:null},_create:function(){var b=this,d=this.options,e=this.element.find(".ui-slider-handle").addClass("ui-state-default ui-corner-all"),f="<a class='ui-slider-handle ui-state-default ui-corner-all' href='#'></a>",g=d.values&&d.values.length||1,h=[];this._keySliding=!1,this._mouseSliding=!1,this._animateOff=!0,this._handleIndex=null,this._detectOrientation(),this._mouseInit(),this.element.addClass("ui-slider ui-slider-"+this.orientation+" ui-widget"+" ui-widget-content"+" ui-corner-all"+(d.disabled?" ui-slider-disabled ui-disabled":"")),this.range=a([]),d.range&&(d.range===!0&&(d.values||(d.values=[this._valueMin(),this._valueMin()]),d.values.length&&d.values.length!==2&&(d.values=[d.values[0],d.values[0]])),this.range=a("<div></div>").appendTo(this.element).addClass("ui-slider-range ui-widget-header"+(d.
 range==="min"||d.range==="max"?" ui-slider-range-"+d.range:"")));for(var i=e.length;i<g;i+=1)h.push(f);this.handles=e.add(a(h.join("")).appendTo(b.element)),this.handle=this.handles.eq(0),this.handles.add(this.range).filter("a").click(function(a){a.preventDefault()}).hover(function(){d.disabled||a(this).addClass("ui-state-hover")},function(){a(this).removeClass("ui-state-hover")}).focus(function(){d.disabled?a(this).blur():(a(".ui-slider .ui-state-focus").removeClass("ui-state-focus"),a(this).addClass("ui-state-focus"))}).blur(function(){a(this).removeClass("ui-state-focus")}),this.handles.each(function(b){a(this).data("index.ui-slider-handle",b)}),this.handles.keydown(function(d){var e=a(this).data("index.ui-slider-handle"),f,g,h,i;if(b.options.disabled)return;switch(d.keyCode){case a.ui.keyCode.HOME:case a.ui.keyCode.END:case a.ui.keyCode.PAGE_UP:case a.ui.keyCode.PAGE_DOWN:case a.ui.keyCode.UP:case a.ui.keyCode.RIGHT:case a.ui.keyCode.DOWN:case a.ui.keyCode.LEFT:d.preventDefault(
 );if(!b._keySliding){b._keySliding=!0,a(this).addClass("ui-state-active"),f=b._start(d,e);if(f===!1)return}}i=b.options.step,b.options.values&&b.options.values.length?g=h=b.values(e):g=h=b.value();switch(d.keyCode){case a.ui.keyCode.HOME:h=b._valueMin();break;case a.ui.keyCode.END:h=b._valueMax();break;case a.ui.keyCode.PAGE_UP:h=b._trimAlignValue(g+(b._valueMax()-b._valueMin())/c);break;case a.ui.keyCode.PAGE_DOWN:h=b._trimAlignValue(g-(b._valueMax()-b._valueMin())/c);break;case a.ui.keyCode.UP:case a.ui.keyCode.RIGHT:if(g===b._valueMax())return;h=b._trimAlignValue(g+i);break;case a.ui.keyCode.DOWN:case a.ui.keyCode.LEFT:if(g===b._valueMin())return;h=b._trimAlignValue(g-i)}b._slide(d,e,h)}).keyup(function(c){var d=a(this).data("index.ui-slider-handle");b._keySliding&&(b._keySliding=!1,b._stop(c,d),b._change(c,d),a(this).removeClass("ui-state-active"))}),this._refreshValue(),this._animateOff=!1},destroy:function(){return this.handles.remove(),this.range.remove(),this.element.removeC
 lass("ui-slider ui-slider-horizontal ui-slider-vertical ui-slider-disabled ui-widget ui-widget-content ui-corner-all").removeData("slider").unbind(".slider"),this._mouseDestroy(),this},_mouseCapture:function(b){var c=this.options,d,e,f,g,h,i,j,k,l;return c.disabled?!1:(this.elementSize={width:this.element.outerWidth(),height:this.element.outerHeight()},this.elementOffset=this.element.offset(),d={x:b.pageX,y:b.pageY},e=this._normValueFromMouse(d),f=this._valueMax()-this._valueMin()+1,h=this,this.handles.each(function(b){var c=Math.abs(e-h.values(b));f>c&&(f=c,g=a(this),i=b)}),c.range===!0&&this.values(1)===c.min&&(i+=1,g=a(this.handles[i])),j=this._start(b,i),j===!1?!1:(this._mouseSliding=!0,h._handleIndex=i,g.addClass("ui-state-active").focus(),k=g.offset(),l=!a(b.target).parents().andSelf().is(".ui-slider-handle"),this._clickOffset=l?{left:0,top:0}:{left:b.pageX-k.left-g.width()/2,top:b.pageY-k.top-g.height()/2-(parseInt(g.css("borderTopWidth"),10)||0)-(parseInt(g.css("borderBottom
 Width"),10)||0)+(parseInt(g.css("marginTop"),10)||0)},this.handles.hasClass("ui-state-hover")||this._slide(b,i,e),this._animateOff=!0,!0))},_mouseStart:function(a){return!0},_mouseDrag:function(a){var b={x:a.pageX,y:a.pageY},c=this._normValueFromMouse(b);return this._slide(a,this._handleIndex,c),!1},_mouseStop:function(a){return this.handles.removeClass("ui-state-active"),this._mouseSliding=!1,this._stop(a,this._handleIndex),this._change(a,this._handleIndex),this._handleIndex=null,this._clickOffset=null,this._animateOff=!1,!1},_detectOrientation:function(){this.orientation=this.options.orientation==="vertical"?"vertical":"horizontal"},_normValueFromMouse:function(a){var b,c,d,e,f;return this.orientation==="horizontal"?(b=this.elementSize.width,c=a.x-this.elementOffset.left-(this._clickOffset?this._clickOffset.left:0)):(b=this.elementSize.height,c=a.y-this.elementOffset.top-(this._clickOffset?this._clickOffset.top:0)),d=c/b,d>1&&(d=1),d<0&&(d=0),this.orientation==="vertical"&&(d=1-d)
 ,e=this._valueMax()-this._valueMin(),f=this._valueMin()+d*e,this._trimAlignValue(f)},_start:function(a,b){var c={handle:this.handles[b],value:this.value()};return this.options.values&&this.options.values.length&&(c.value=this.values(b),c.values=this.values()),this._trigger("start",a,c)},_slide:function(a,b,c){var d,e,f;this.options.values&&this.options.values.length?(d=this.values(b?0:1),this.options.values.length===2&&this.options.range===!0&&(b===0&&c>d||b===1&&c<d)&&(c=d),c!==this.values(b)&&(e=this.values(),e[b]=c,f=this._trigger("slide",a,{handle:this.handles[b],value:c,values:e}),d=this.values(b?0:1),f!==!1&&this.values(b,c,!0))):c!==this.value()&&(f=this._trigger("slide",a,{handle:this.handles[b],value:c}),f!==!1&&this.value(c))},_stop:function(a,b){var c={handle:this.handles[b],value:this.value()};this.options.values&&this.options.values.length&&(c.value=this.values(b),c.values=this.values()),this._trigger("stop",a,c)},_change:function(a,b){if(!this._keySliding&&!this._mouse
 Sliding){var c={handle:this.handles[b],value:this.value()};this.options.values&&this.options.values.length&&(c.value=this.values(b),c.values=this.values()),this._trigger("change",a,c)}},value:function(a){if(arguments.length){this.options.value=this._trimAlignValue(a),this._refreshValue(),this._change(null,0);return}return this._value()},values:function(b,c){var d,e,f;if(arguments.length>1){this.options.values[b]=this._trimAlignValue(c),this._refreshValue(),this._change(null,b);return}if(!arguments.length)return this._values();if(!a.isArray(arguments[0]))return this.options.values&&this.options.values.length?this._values(b):this.value();d=this.options.values,e=arguments[0];for(f=0;f<d.length;f+=1)d[f]=this._trimAlignValue(e[f]),this._change(null,f);this._refreshValue()},_setOption:function(b,c){var d,e=0;a.isArray(this.options.values)&&(e=this.options.values.length),a.Widget.prototype._setOption.apply(this,arguments);switch(b){case"disabled":c?(this.handles.filter(".ui-state-focus").
 blur(),this.handles.removeClass("ui-state-hover"),this.handles.propAttr("disabled",!0),this.element.addClass("ui-disabled")):(this.handles.propAttr("disabled",!1),this.element.removeClass("ui-disabled"));break;case"orientation":this._detectOrientation(),this.element.removeClass("ui-slider-horizontal ui-slider-vertical").addClass("ui-slider-"+this.orientation),this._refreshValue();break;case"value":this._animateOff=!0,this._refreshValue(),this._change(null,0),this._animateOff=!1;break;case"values":this._animateOff=!0,this._refreshValue();for(d=0;d<e;d+=1)this._change(null,d);this._animateOff=!1}},_value:function(){var a=this.options.value;return a=this._trimAlignValue(a),a},_values:function(a){var b,c,d;if(arguments.length)return b=this.options.values[a],b=this._trimAlignValue(b),b;c=this.options.values.slice();for(d=0;d<c.length;d+=1)c[d]=this._trimAlignValue(c[d]);return c},_trimAlignValue:function(a){if(a<=this._valueMin())return this._valueMin();if(a>=this._valueMax())return this
 ._valueMax();var b=this.options.step>0?this.options.step:1,c=(a-this._valueMin())%b,d=a-c;return Math.abs(c)*2>=b&&(d+=c>0?b:-b),parseFloat(d.toFixed(5))},_valueMin:function(){return this.options.min},_valueMax:function(){return this.options.max},_refreshValue:function(){var b=this.options.range,c=this.options,d=this,e=this._animateOff?!1:c.animate,f,g={},h,i,j,k;this.options.values&&this.options.values.length?this.handles.each(function(b,i){f=(d.values(b)-d._valueMin())/(d._valueMax()-d._valueMin())*100,g[d.orientation==="horizontal"?"left":"bottom"]=f+"%",a(this).stop(1,1)[e?"animate":"css"](g,c.animate),d.options.range===!0&&(d.orientation==="horizontal"?(b===0&&d.range.stop(1,1)[e?"animate":"css"]({left:f+"%"},c.animate),b===1&&d.range[e?"animate":"css"]({width:f-h+"%"},{queue:!1,duration:c.animate})):(b===0&&d.range.stop(1,1)[e?"animate":"css"]({bottom:f+"%"},c.animate),b===1&&d.range[e?"animate":"css"]({height:f-h+"%"},{queue:!1,duration:c.animate}))),h=f}):(i=this.value(),j=t
 his._valueMin(),k=this._valueMax(),f=k!==j?(i-j)/(k-j)*100:0,g[d.orientation==="horizontal"?"left":"bottom"]=f+"%",this.handle.stop(1,1)[e?"animate":"css"](g,c.animate),b==="min"&&this.orientation==="horizontal"&&this.range.stop(1,1)[e?"animate":"css"]({width:f+"%"},c.animate),b==="max"&&this.orientation==="horizontal"&&this.range[e?"animate":"css"]({width:100-f+"%"},{queue:!1,duration:c.animate}),b==="min"&&this.orientation==="vertical"&&this.range.stop(1,1)[e?"animate":"css"]({height:f+"%"},c.animate),b==="max"&&this.orientation==="vertical"&&this.range[e?"animate":"css"]({height:100-f+"%"},{queue:!1,duration:c.animate}))}}),a.extend(a.ui.slider,{version:"1.8.20"})})(jQuery);;/*! jQuery UI - v1.8.20 - 2012-04-30
+* https://github.com/jquery/jquery-ui
+* Includes: jquery.ui.tabs.js
+* Copyright (c) 2012 AUTHORS.txt; Licensed MIT, GPL */
+(function(a,b){function e(){return++c}function f(){return++d}var c=0,d=0;a.widget("ui.tabs",{options:{add:null,ajaxOptions:null,cache:!1,cookie:null,collapsible:!1,disable:null,disabled:[],enable:null,event:"click",fx:null,idPrefix:"ui-tabs-",load:null,panelTemplate:"<div></div>",remove:null,select:null,show:null,spinner:"<em>Loading&#8230;</em>",tabTemplate:"<li><a href='#{href}'><span>#{label}</span></a></li>"},_create:function(){this._tabify(!0)},_setOption:function(a,b){if(a=="selected"){if(this.options.collapsible&&b==this.options.selected)return;this.select(b)}else this.options[a]=b,this._tabify()},_tabId:function(a){return a.title&&a.title.replace(/\s/g,"_").replace(/[^\w\u00c0-\uFFFF-]/g,"")||this.options.idPrefix+e()},_sanitizeSelector:function(a){return a.replace(/:/g,"\\:")},_cookie:function(){var b=this.cookie||(this.cookie=this.options.cookie.name||"ui-tabs-"+f());return a.cookie.apply(null,[b].concat(a.makeArray(arguments)))},_ui:function(a,b){return{tab:a,panel:b,inde
 x:this.anchors.index(a)}},_cleanup:function(){this.lis.filter(".ui-state-processing").removeClass("ui-state-processing").find("span:data(label.tabs)").each(function(){var b=a(this);b.html(b.data("label.tabs")).removeData("label.tabs")})},_tabify:function(c){function m(b,c){b.css("display",""),!a.support.opacity&&c.opacity&&b[0].style.removeAttribute("filter")}var d=this,e=this.options,f=/^#.+/;this.list=this.element.find("ol,ul").eq(0),this.lis=a(" > li:has(a[href])",this.list),this.anchors=this.lis.map(function(){return a("a",this)[0]}),this.panels=a([]),this.anchors.each(function(b,c){var g=a(c).attr("href"),h=g.split("#")[0],i;h&&(h===location.toString().split("#")[0]||(i=a("base")[0])&&h===i.href)&&(g=c.hash,c.href=g);if(f.test(g))d.panels=d.panels.add(d.element.find(d._sanitizeSelector(g)));else if(g&&g!=="#"){a.data(c,"href.tabs",g),a.data(c,"load.tabs",g.replace(/#.*$/,""));var j=d._tabId(c);c.href="#"+j;var k=d.element.find("#"+j);k.length||(k=a(e.panelTemplate).attr("id",j)
 .addClass("ui-tabs-panel ui-widget-content ui-corner-bottom").insertAfter(d.panels[b-1]||d.list),k.data("destroy.tabs",!0)),d.panels=d.panels.add(k)}else e.disabled.push(b)}),c?(this.element.addClass("ui-tabs ui-widget ui-widget-content ui-corner-all"),this.list.addClass("ui-tabs-nav ui-helper-reset ui-helper-clearfix ui-widget-header ui-corner-all"),this.lis.addClass("ui-state-default ui-corner-top"),this.panels.addClass("ui-tabs-panel ui-widget-content ui-corner-bottom"),e.selected===b?(location.hash&&this.anchors.each(function(a,b){if(b.hash==location.hash)return e.selected=a,!1}),typeof e.selected!="number"&&e.cookie&&(e.selected=parseInt(d._cookie(),10)),typeof e.selected!="number"&&this.lis.filter(".ui-tabs-selected").length&&(e.selected=this.lis.index(this.lis.filter(".ui-tabs-selected"))),e.selected=e.selected||(this.lis.length?0:-1)):e.selected===null&&(e.selected=-1),e.selected=e.selected>=0&&this.anchors[e.selected]||e.selected<0?e.selected:0,e.disabled=a.unique(e.disable
 d.concat(a.map(this.lis.filter(".ui-state-disabled"),function(a,b){return d.lis.index(a)}))).sort(),a.inArray(e.selected,e.disabled)!=-1&&e.disabled.splice(a.inArray(e.selected,e.disabled),1),this.panels.addClass("ui-tabs-hide"),this.lis.removeClass("ui-tabs-selected ui-state-active"),e.selected>=0&&this.anchors.length&&(d.element.find(d._sanitizeSelector(d.anchors[e.selected].hash)).removeClass("ui-tabs-hide"),this.lis.eq(e.selected).addClass("ui-tabs-selected ui-state-active"),d.element.queue("tabs",function(){d._trigger("show",null,d._ui(d.anchors[e.selected],d.element.find(d._sanitizeSelector(d.anchors[e.selected].hash))[0]))}),this.load(e.selected)),a(window).bind("unload",function(){d.lis.add(d.anchors).unbind(".tabs"),d.lis=d.anchors=d.panels=null})):e.selected=this.lis.index(this.lis.filter(".ui-tabs-selected")),this.element[e.collapsible?"addClass":"removeClass"]("ui-tabs-collapsible"),e.cookie&&this._cookie(e.selected,e.cookie);for(var g=0,h;h=this.lis[g];g++)a(h)[a.inArra
 y(g,e.disabled)!=-1&&!a(h).hasClass("ui-tabs-selected")?"addClass":"removeClass"]("ui-state-disabled");e.cache===!1&&this.anchors.removeData("cache.tabs"),this.lis.add(this.anchors).unbind(".tabs");if(e.event!=="mouseover"){var i=function(a,b){b.is(":not(.ui-state-disabled)")&&b.addClass("ui-state-"+a)},j=function(a,b){b.removeClass("ui-state-"+a)};this.lis.bind("mouseover.tabs",function(){i("hover",a(this))}),this.lis.bind("mouseout.tabs",function(){j("hover",a(this))}),this.anchors.bind("focus.tabs",function(){i("focus",a(this).closest("li"))}),this.anchors.bind("blur.tabs",function(){j("focus",a(this).closest("li"))})}var k,l;e.fx&&(a.isArray(e.fx)?(k=e.fx[0],l=e.fx[1]):k=l=e.fx);var n=l?function(b,c){a(b).closest("li").addClass("ui-tabs-selected ui-state-active"),c.hide().removeClass("ui-tabs-hide").animate(l,l.duration||"normal",function(){m(c,l),d._trigger("show",null,d._ui(b,c[0]))})}:function(b,c){a(b).closest("li").addClass("ui-tabs-selected ui-state-active"),c.removeClass(
 "ui-tabs-hide"),d._trigger("show",null,d._ui(b,c[0]))},o=k?function(a,b){b.animate(k,k.duration||"normal",function(){d.lis.removeClass("ui-tabs-selected ui-state-active"),b.addClass("ui-tabs-hide"),m(b,k),d.element.dequeue("tabs")})}:function(a,b,c){d.lis.removeClass("ui-tabs-selected ui-state-active"),b.addClass("ui-tabs-hide"),d.element.dequeue("tabs")};this.anchors.bind(e.event+".tabs",function(){var b=this,c=a(b).closest("li"),f=d.panels.filter(":not(.ui-tabs-hide)"),g=d.element.find(d._sanitizeSelector(b.hash));if(c.hasClass("ui-tabs-selected")&&!e.collapsible||c.hasClass("ui-state-disabled")||c.hasClass("ui-state-processing")||d.panels.filter(":animated").length||d._trigger("select",null,d._ui(this,g[0]))===!1)return this.blur(),!1;e.selected=d.anchors.index(this),d.abort();if(e.collapsible){if(c.hasClass("ui-tabs-selected"))return e.selected=-1,e.cookie&&d._cookie(e.selected,e.cookie),d.element.queue("tabs",function(){o(b,f)}).dequeue("tabs"),this.blur(),!1;if(!f.length)retur
 n e.cookie&&d._cookie(e.selected,e.cookie),d.element.queue("tabs",function(){n(b,g)}),d.load(d.anchors.index(this)),this.blur(),!1}e.cookie&&d._cookie(e.selected,e.cookie);if(g.length)f.length&&d.element.queue("tabs",function(){o(b,f)}),d.element.queue("tabs",function(){n(b,g)}),d.load(d.anchors.index(this));else throw"jQuery UI Tabs: Mismatching fragment identifier.";a.browser.msie&&this.blur()}),this.anchors.bind("click.tabs",function(){return!1})},_getIndex:function(a){return typeof a=="string"&&(a=this.anchors.index(this.anchors.filter("[href$='"+a+"']"))),a},destroy:function(){var b=this.options;return this.abort(),this.element.unbind(".tabs").removeClass("ui-tabs ui-widget ui-widget-content ui-corner-all ui-tabs-collapsible").removeData("tabs"),this.list.removeClass("ui-tabs-nav ui-helper-reset ui-helper-clearfix ui-widget-header ui-corner-all"),this.anchors.each(function(){var b=a.data(this,"href.tabs");b&&(this.href=b);var c=a(this).unbind(".tabs");a.each(["href","load","cac
 he"],function(a,b){c.removeData(b+".tabs")})}),this.lis.unbind(".tabs").add(this.panels).each(function(){a.data(this,"destroy.tabs")?a(this).remove():a(this).removeClass(["ui-state-default","ui-corner-top","ui-tabs-selected","ui-state-active","ui-state-hover","ui-state-focus","ui-state-disabled","ui-tabs-panel","ui-widget-content","ui-corner-bottom","ui-tabs-hide"].join(" "))}),b.cookie&&this._cookie(null,b.cookie),this},add:function(c,d,e){e===b&&(e=this.anchors.length);var f=this,g=this.options,h=a(g.tabTemplate.replace(/#\{href\}/g,c).replace(/#\{label\}/g,d)),i=c.indexOf("#")?this._tabId(a("a",h)[0]):c.replace("#","");h.addClass("ui-state-default ui-corner-top").data("destroy.tabs",!0);var j=f.element.find("#"+i);return j.length||(j=a(g.panelTemplate).attr("id",i).data("destroy.tabs",!0)),j.addClass("ui-tabs-panel ui-widget-content ui-corner-bottom ui-tabs-hide"),e>=this.lis.length?(h.appendTo(this.list),j.appendTo(this.list[0].parentNode)):(h.insertBefore(this.lis[e]),j.insertB
 efore(this.panels[e])),g.disabled=a.map(g.disabled,function(a,b){return a>=e?++a:a}),this._tabify(),this.anchors.length==1&&(g.selected=0,h.addClass("ui-tabs-selected ui-state-active"),j.removeClass("ui-tabs-hide"),this.element.queue("tabs",function(){f._trigger("show",null,f._ui(f.anchors[0],f.panels[0]))}),this.load(0)),this._trigger("add",null,this._ui(this.anchors[e],this.panels[e])),this},remove:function(b){b=this._getIndex(b);var c=this.options,d=this.lis.eq(b).remove(),e=this.panels.eq(b).remove();return d.hasClass("ui-tabs-selected")&&this.anchors.length>1&&this.select(b+(b+1<this.anchors.length?1:-1)),c.disabled=a.map(a.grep(c.disabled,function(a,c){return a!=b}),function(a,c){return a>=b?--a:a}),this._tabify(),this._trigger("remove",null,this._ui(d.find("a")[0],e[0])),this},enable:function(b){b=this._getIndex(b);var c=this.options;if(a.inArray(b,c.disabled)==-1)return;return this.lis.eq(b).removeClass("ui-state-disabled"),c.disabled=a.grep(c.disabled,function(a,c){return a
 !=b}),this._trigger("enable",null,this._ui(this.anchors[b],this.panels[b])),this},disable:function(a){a=this._getIndex(a);var b=this,c=this.options;return a!=c.selected&&(this.lis.eq(a).addClass("ui-state-disabled"),c.disabled.push(a),c.disabled.sort(),this._trigger("disable",null,this._ui(this.anchors[a],this.panels[a]))),this},select:function(a){a=this._getIndex(a);if(a==-1)if(this.options.collapsible&&this.options.selected!=-1)a=this.options.selected;else return this;return this.anchors.eq(a).trigger(this.options.event+".tabs"),this},load:function(b){b=this._getIndex(b);var c=this,d=this.options,e=this.anchors.eq(b)[0],f=a.data(e,"load.tabs");this.abort();if(!f||this.element.queue("tabs").length!==0&&a.data(e,"cache.tabs")){this.element.dequeue("tabs");return}this.lis.eq(b).addClass("ui-state-processing");if(d.spinner){var g=a("span",e);g.data("label.tabs",g.html()).html(d.spinner)}return this.xhr=a.ajax(a.extend({},d.ajaxOptions,{url:f,success:function(f,g){c.element.find(c._san
 itizeSelector(e.hash)).html(f),c._cleanup(),d.cache&&a.data(e,"cache.tabs",!0),c._trigger("load",null,c._ui(c.anchors[b],c.panels[b]));try{d.ajaxOptions.success(f,g)}catch(h){}},error:function(a,f,g){c._cleanup(),c._trigger("load",null,c._ui(c.anchors[b],c.panels[b]));try{d.ajaxOptions.error(a,f,b,e)}catch(g){}}})),c.element.dequeue("tabs"),this},abort:function(){return this.element.queue([]),this.panels.stop(!1,!0),this.element.queue("tabs",this.element.queue("tabs").splice(-2,2)),this.xhr&&(this.xhr.abort(),delete this.xhr),this._cleanup(),this},url:function(a,b){return this.anchors.eq(a).removeData("cache.tabs").data("load.tabs",b),this},length:function(){return this.anchors.length}}),a.extend(a.ui.tabs,{version:"1.8.20"}),a.extend(a.ui.tabs.prototype,{rotation:null,rotate:function(a,b){var c=this,d=this.options,e=c._rotate||(c._rotate=function(b){clearTimeout(c.rotation),c.rotation=setTimeout(function(){var a=d.selected;c.select(++a<c.anchors.length?a:0)},a),b&&b.stopPropagation
 ()}),f=c._unrotate||(c._unrotate=b?function(a){e()}:function(a){a.clientX&&c.rotate(null)});return a?(this.element.bind("tabsshow",e),this.anchors.bind(d.event+".tabs",f),e()):(clearTimeout(c.rotation),this.element.unbind("tabsshow",e),this.anchors.unbind(d.event+".tabs",f),delete this._rotate,delete this._unrotate),this}})})(jQuery);;/*! jQuery UI - v1.8.20 - 2012-04-30
+* https://github.com/jquery/jquery-ui
+* Includes: jquery.ui.datepicker.js
+* Copyright (c) 2012 AUTHORS.txt; Licensed MIT, GPL */
+(function($,undefined){function Datepicker(){this.debug=!1,this._curInst=null,this._keyEvent=!1,this._disabledInputs=[],this._datepickerShowing=!1,this._inDialog=!1,this._mainDivId="ui-datepicker-div",this._inlineClass="ui-datepicker-inline",this._appendClass="ui-datepicker-append",this._triggerClass="ui-datepicker-trigger",this._dialogClass="ui-datepicker-dialog",this._disableClass="ui-datepicker-disabled",this._unselectableClass="ui-datepicker-unselectable",this._currentClass="ui-datepicker-current-day",this._dayOverClass="ui-datepicker-days-cell-over",this.regional=[],this.regional[""]={closeText:"Done",prevText:"Prev",nextText:"Next",currentText:"Today",monthNames:["January","February","March","April","May","June","July","August","September","October","November","December"],monthNamesShort:["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],dayNames:["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],dayNamesShort:["Sun","Mon","Tue","We
 d","Thu","Fri","Sat"],dayNamesMin:["Su","Mo","Tu","We","Th","Fr","Sa"],weekHeader:"Wk",dateFormat:"mm/dd/yy",firstDay:0,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""},this._defaults={showOn:"focus",showAnim:"fadeIn",showOptions:{},defaultDate:null,appendText:"",buttonText:"...",buttonImage:"",buttonImageOnly:!1,hideIfNoPrevNext:!1,navigationAsDateFormat:!1,gotoCurrent:!1,changeMonth:!1,changeYear:!1,yearRange:"c-10:c+10",showOtherMonths:!1,selectOtherMonths:!1,showWeek:!1,calculateWeek:this.iso8601Week,shortYearCutoff:"+10",minDate:null,maxDate:null,duration:"fast",beforeShowDay:null,beforeShow:null,onSelect:null,onChangeMonthYear:null,onClose:null,numberOfMonths:1,showCurrentAtPos:0,stepMonths:1,stepBigMonths:12,altField:"",altFormat:"",constrainInput:!0,showButtonPanel:!1,autoSize:!1,disabled:!1},$.extend(this._defaults,this.regional[""]),this.dpDiv=bindHover($('<div id="'+this._mainDivId+'" class="ui-datepicker ui-widget ui-widget-content ui-helper-clearfix ui-corner-all"></div>')
 )}function bindHover(a){var b="button, .ui-datepicker-prev, .ui-datepicker-next, .ui-datepicker-calendar td a";return a.bind("mouseout",function(a){var c=$(a.target).closest(b);if(!c.length)return;c.removeClass("ui-state-hover ui-datepicker-prev-hover ui-datepicker-next-hover")}).bind("mouseover",function(c){var d=$(c.target).closest(b);if($.datepicker._isDisabledDatepicker(instActive.inline?a.parent()[0]:instActive.input[0])||!d.length)return;d.parents(".ui-datepicker-calendar").find("a").removeClass("ui-state-hover"),d.addClass("ui-state-hover"),d.hasClass("ui-datepicker-prev")&&d.addClass("ui-datepicker-prev-hover"),d.hasClass("ui-datepicker-next")&&d.addClass("ui-datepicker-next-hover")})}function extendRemove(a,b){$.extend(a,b);for(var c in b)if(b[c]==null||b[c]==undefined)a[c]=b[c];return a}function isArray(a){return a&&($.browser.safari&&typeof a=="object"&&a.length||a.constructor&&a.constructor.toString().match(/\Array\(\)/))}$.extend($.ui,{datepicker:{version:"1.8.20"}});va
 r PROP_NAME="datepicker",dpuuid=(new Date).getTime(),instActive;$.extend(Datepicker.prototype,{markerClassName:"hasDatepicker",maxRows:4,log:function(){this.debug&&console.log.apply("",arguments)},_widgetDatepicker:function(){return this.dpDiv},setDefaults:function(a){return extendRemove(this._defaults,a||{}),this},_attachDatepicker:function(target,settings){var inlineSettings=null;for(var attrName in this._defaults){var attrValue=target.getAttribute("date:"+attrName);if(attrValue){inlineSettings=inlineSettings||{};try{inlineSettings[attrName]=eval(attrValue)}catch(err){inlineSettings[attrName]=attrValue}}}var nodeName=target.nodeName.toLowerCase(),inline=nodeName=="div"||nodeName=="span";target.id||(this.uuid+=1,target.id="dp"+this.uuid);var inst=this._newInst($(target),inline);inst.settings=$.extend({},settings||{},inlineSettings||{}),nodeName=="input"?this._connectDatepicker(target,inst):inline&&this._inlineDatepicker(target,inst)},_newInst:function(a,b){var c=a[0].id.replace(/([
 ^A-Za-z0-9_-])/g,"\\\\$1");return{id:c,input:a,selectedDay:0,selectedMonth:0,selectedYear:0,drawMonth:0,drawYear:0,inline:b,dpDiv:b?bindHover($('<div class="'+this._inlineClass+' ui-datepicker ui-widget ui-widget-content ui-helper-clearfix ui-corner-all"></div>')):this.dpDiv}},_connectDatepicker:function(a,b){var c=$(a);b.append=$([]),b.trigger=$([]);if(c.hasClass(this.markerClassName))return;this._attachments(c,b),c.addClass(this.markerClassName).keydown(this._doKeyDown).keypress(this._doKeyPress).keyup(this._doKeyUp).bind("setData.datepicker",function(a,c,d){b.settings[c]=d}).bind("getData.datepicker",function(a,c){return this._get(b,c)}),this._autoSize(b),$.data(a,PROP_NAME,b),b.settings.disabled&&this._disableDatepicker(a)},_attachments:function(a,b){var c=this._get(b,"appendText"),d=this._get(b,"isRTL");b.append&&b.append.remove(),c&&(b.append=$('<span class="'+this._appendClass+'">'+c+"</span>"),a[d?"before":"after"](b.append)),a.unbind("focus",this._showDatepicker),b.trigger&
 &b.trigger.remove();var e=this._get(b,"showOn");(e=="focus"||e=="both")&&a.focus(this._showDatepicker);if(e=="button"||e=="both"){var f=this._get(b,"buttonText"),g=this._get(b,"buttonImage");b.trigger=$(this._get(b,"buttonImageOnly")?$("<img/>").addClass(this._triggerClass).attr({src:g,alt:f,title:f}):$('<button type="button"></button>').addClass(this._triggerClass).html(g==""?f:$("<img/>").attr({src:g,alt:f,title:f}))),a[d?"before":"after"](b.trigger),b.trigger.click(function(){return $.datepicker._datepickerShowing&&$.datepicker._lastInput==a[0]?$.datepicker._hideDatepicker():$.datepicker._datepickerShowing&&$.datepicker._lastInput!=a[0]?($.datepicker._hideDatepicker(),$.datepicker._showDatepicker(a[0])):$.datepicker._showDatepicker(a[0]),!1})}},_autoSize:function(a){if(this._get(a,"autoSize")&&!a.inline){var b=new Date(2009,11,20),c=this._get(a,"dateFormat");if(c.match(/[DM]/)){var d=function(a){var b=0,c=0;for(var d=0;d<a.length;d++)a[d].length>b&&(b=a[d].length,c=d);return c};b
 .setMonth(d(this._get(a,c.match(/MM/)?"monthNames":"monthNamesShort"))),b.setDate(d(this._get(a,c.match(/DD/)?"dayNames":"dayNamesShort"))+20-b.getDay())}a.input.attr("size",this._formatDate(a,b).length)}},_inlineDatepicker:function(a,b){var c=$(a);if(c.hasClass(this.markerClassName))return;c.addClass(this.markerClassName).append(b.dpDiv).bind("setData.datepicker",function(a,c,d){b.settings[c]=d}).bind("getData.datepicker",function(a,c){return this._get(b,c)}),$.data(a,PROP_NAME,b),this._setDate(b,this._getDefaultDate(b),!0),this._updateDatepicker(b),this._updateAlternate(b),b.settings.disabled&&this._disableDatepicker(a),b.dpDiv.css("display","block")},_dialogDatepicker:function(a,b,c,d,e){var f=this._dialogInst;if(!f){this.uuid+=1;var g="dp"+this.uuid;this._dialogInput=$('<input type="text" id="'+g+'" style="position: absolute; top: -100px; width: 0px; z-index: -10;"/>'),this._dialogInput.keydown(this._doKeyDown),$("body").append(this._dialogInput),f=this._dialogInst=this._newInst
 (this._dialogInput,!1),f.settings={},$.data(this._dialogInput[0],PROP_NAME,f)}extendRemove(f.settings,d||{}),b=b&&b.constructor==Date?this._formatDate(f,b):b,this._dialogInput.val(b),this._pos=e?e.length?e:[e.pageX,e.pageY]:null;if(!this._pos){var h=document.documentElement.clientWidth,i=document.documentElement.clientHeight,j=document.documentElement.scrollLeft||document.body.scrollLeft,k=document.documentElement.scrollTop||document.body.scrollTop;this._pos=[h/2-100+j,i/2-150+k]}return this._dialogInput.css("left",this._pos[0]+20+"px").css("top",this._pos[1]+"px"),f.settings.onSelect=c,this._inDialog=!0,this.dpDiv.addClass(this._dialogClass),this._showDatepicker(this._dialogInput[0]),$.blockUI&&$.blockUI(this.dpDiv),$.data(this._dialogInput[0],PROP_NAME,f),this},_destroyDatepicker:function(a){var b=$(a),c=$.data(a,PROP_NAME);if(!b.hasClass(this.markerClassName))return;var d=a.nodeName.toLowerCase();$.removeData(a,PROP_NAME),d=="input"?(c.append.remove(),c.trigger.remove(),b.removeC
 lass(this.markerClassName).unbind("focus",this._showDatepicker).unbind("keydown",this._doKeyDown).unbind("keypress",this._doKeyPress).unbind("keyup",this._doKeyUp)):(d=="div"||d=="span")&&b.removeClass(this.markerClassName).empty()},_enableDatepicker:function(a){var b=$(a),c=$.data(a,PROP_NAME);if(!b.hasClass(this.markerClassName))return;var d=a.nodeName.toLowerCase();if(d=="input")a.disabled=!1,c.trigger.filter("button").each(function(){this.disabled=!1}).end().filter("img").css({opacity:"1.0",cursor:""});else if(d=="div"||d=="span"){var e=b.children("."+this._inlineClass);e.children().removeClass("ui-state-disabled"),e.find("select.ui-datepicker-month, select.ui-datepicker-year").removeAttr("disabled")}this._disabledInputs=$.map(this._disabledInputs,function(b){return b==a?null:b})},_disableDatepicker:function(a){var b=$(a),c=$.data(a,PROP_NAME);if(!b.hasClass(this.markerClassName))return;var d=a.nodeName.toLowerCase();if(d=="input")a.disabled=!0,c.trigger.filter("button").each(fu
 nction(){this.disabled=!0}).end().filter("img").css({opacity:"0.5",cursor:"default"});else if(d=="div"||d=="span"){var e=b.children("."+this._inlineClass);e.children().addClass("ui-state-disabled"),e.find("select.ui-datepicker-month, select.ui-datepicker-year").attr("disabled","disabled")}this._disabledInputs=$.map(this._disabledInputs,function(b){return b==a?null:b}),this._disabledInputs[this._disabledInputs.length]=a},_isDisabledDatepicker:function(a){if(!a)return!1;for(var b=0;b<this._disabledInputs.length;b++)if(this._disabledInputs[b]==a)return!0;return!1},_getInst:function(a){try{return $.data(a,PROP_NAME)}catch(b){throw"Missing instance data for this datepicker"}},_optionDatepicker:function(a,b,c){var d=this._getInst(a);if(arguments.length==2&&typeof b=="string")return b=="defaults"?$.extend({},$.datepicker._defaults):d?b=="all"?$.extend({},d.settings):this._get(d,b):null;var e=b||{};typeof b=="string"&&(e={},e[b]=c);if(d){this._curInst==d&&this._hideDatepicker();var f=this._
 getDateDatepicker(a,!0),g=this._getMinMaxDate(d,"min"),h=this._getMinMaxDate(d,"max");extendRemove(d.settings,e),g!==null&&e.dateFormat!==undefined&&e.minDate===undefined&&(d.settings.minDate=this._formatDate(d,g)),h!==null&&e.dateFormat!==undefined&&e.maxDate===undefined&&(d.settings.maxDate=this._formatDate(d,h)),this._attachments($(a),d),this._autoSize(d),this._setDate(d,f),this._updateAlternate(d),this._updateDatepicker(d)}},_changeDatepicker:function(a,b,c){this._optionDatepicker(a,b,c)},_refreshDatepicker:function(a){var b=this._getInst(a);b&&this._updateDatepicker(b)},_setDateDatepicker:function(a,b){var c=this._getInst(a);c&&(this._setDate(c,b),this._updateDatepicker(c),this._updateAlternate(c))},_getDateDatepicker:function(a,b){var c=this._getInst(a);return c&&!c.inline&&this._setDateFromField(c,b),c?this._getDate(c):null},_doKeyDown:function(a){var b=$.datepicker._getInst(a.target),c=!0,d=b.dpDiv.is(".ui-datepicker-rtl");b._keyEvent=!0;if($.datepicker._datepickerShowing)sw
 itch(a.keyCode){case 9:$.datepicker._hideDatepicker(),c=!1;break;case 13:var e=$("td."+$.datepicker._dayOverClass+":not(."+$.datepicker._currentClass+")",b.dpDiv);e[0]&&$.datepicker._selectDay(a.target,b.selectedMonth,b.selectedYear,e[0]);var f=$.datepicker._get(b,"onSelect");if(f){var g=$.datepicker._formatDate(b);f.apply(b.input?b.input[0]:null,[g,b])}else $.datepicker._hideDatepicker();return!1;case 27:$.datepicker._hideDatepicker();break;case 33:$.datepicker._adjustDate(a.target,a.ctrlKey?-$.datepicker._get(b,"stepBigMonths"):-$.datepicker._get(b,"stepMonths"),"M");break;case 34:$.datepicker._adjustDate(a.target,a.ctrlKey?+$.datepicker._get(b,"stepBigMonths"):+$.datepicker._get(b,"stepMonths"),"M");break;case 35:(a.ctrlKey||a.metaKey)&&$.datepicker._clearDate(a.target),c=a.ctrlKey||a.metaKey;break;case 36:(a.ctrlKey||a.metaKey)&&$.datepicker._gotoToday(a.target),c=a.ctrlKey||a.metaKey;break;case 37:(a.ctrlKey||a.metaKey)&&$.datepicker._adjustDate(a.target,d?1:-1,"D"),c=a.ctrlKey
 ||a.metaKey,a.originalEvent.altKey&&$.datepicker._adjustDate(a.target,a.ctrlKey?-$.datepicker._get(b,"stepBigMonths"):-$.datepicker._get(b,"stepMonths"),"M");break;case 38:(a.ctrlKey||a.metaKey)&&$.datepicker._adjustDate(a.target,-7,"D"),c=a.ctrlKey||a.metaKey;break;case 39:(a.ctrlKey||a.metaKey)&&$.datepicker._adjustDate(a.target,d?-1:1,"D"),c=a.ctrlKey||a.metaKey,a.originalEvent.altKey&&$.datepicker._adjustDate(a.target,a.ctrlKey?+$.datepicker._get(b,"stepBigMonths"):+$.datepicker._get(b,"stepMonths"),"M");break;case 40:(a.ctrlKey||a.metaKey)&&$.datepicker._adjustDate(a.target,7,"D"),c=a.ctrlKey||a.metaKey;break;default:c=!1}else a.keyCode==36&&a.ctrlKey?$.datepicker._showDatepicker(this):c=!1;c&&(a.preventDefault(),a.stopPropagation())},_doKeyPress:function(a){var b=$.datepicker._getInst(a.target);if($.datepicker._get(b,"constrainInput")){var c=$.datepicker._possibleChars($.datepicker._get(b,"dateFormat")),d=String.fromCharCode(a.charCode==undefined?a.keyCode:a.charCode);return a
 .ctrlKey||a.metaKey||d<" "||!c||c.indexOf(d)>-1}},_doKeyUp:function(a){var b=$.datepicker._getInst(a.target);if(b.input.val()!=b.lastVal)try{var c=$.datepicker.parseDate($.datepicker._get(b,"dateFormat"),b.input?b.input.val():null,$.datepicker._getFormatConfig(b));c&&($.datepicker._setDateFromField(b),$.datepicker._updateAlternate(b),$.datepicker._updateDatepicker(b))}catch(d){$.datepicker.log(d)}return!0},_showDatepicker:function(a){a=a.target||a,a.nodeName.toLowerCase()!="input"&&(a=$("input",a.parentNode)[0]);if($.datepicker._isDisabledDatepicker(a)||$.datepicker._lastInput==a)return;var b=$.datepicker._getInst(a);$.datepicker._curInst&&$.datepicker._curInst!=b&&($.datepicker._curInst.dpDiv.stop(!0,!0),b&&$.datepicker._datepickerShowing&&$.datepicker._hideDatepicker($.datepicker._curInst.input[0]));var c=$.datepicker._get(b,"beforeShow"),d=c?c.apply(a,[a,b]):{};if(d===!1)return;extendRemove(b.settings,d),b.lastVal=null,$.datepicker._lastInput=a,$.datepicker._setDateFromField(b),$
 .datepicker._inDialog&&(a.value=""),$.datepicker._pos||($.datepicker._pos=$.datepicker._findPos(a),$.datepicker._pos[1]+=a.offsetHeight);var e=!1;$(a).parents().each(function(){return e|=$(this).css("position")=="fixed",!e}),e&&$.browser.opera&&($.datepicker._pos[0]-=document.documentElement.scrollLeft,$.datepicker._pos[1]-=document.documentElement.scrollTop);var f={left:$.datepicker._pos[0],top:$.datepicker._pos[1]};$.datepicker._pos=null,b.dpDiv.empty(),b.dpDiv.css({position:"absolute",display:"block",top:"-1000px"}),$.datepicker._updateDatepicker(b),f=$.datepicker._checkOffset(b,f,e),b.dpDiv.css({position:$.datepicker._inDialog&&$.blockUI?"static":e?"fixed":"absolute",display:"none",left:f.left+"px",top:f.top+"px"});if(!b.inline){var g=$.datepicker._get(b,"showAnim"),h=$.datepicker._get(b,"duration"),i=function(){var a=b.dpDiv.find("iframe.ui-datepicker-cover");if(!!a.length){var c=$.datepicker._getBorders(b.dpDiv);a.css({left:-c[0],top:-c[1],width:b.dpDiv.outerWidth(),height:b.d
 pDiv.outerHeight()})}};b.dpDiv.zIndex($(a).zIndex()+1),$.datepicker._datepickerShowing=!0,$.effects&&$.effects[g]?b.dpDiv.show(g,$.datepicker._get(b,"showOptions"),h,i):b.dpDiv[g||"show"](g?h:null,i),(!g||!h)&&i(),b.input.is(":visible")&&!b.input.is(":disabled")&&b.input.focus(),$.datepicker._curInst=b}},_updateDatepicker:function(a){var b=this;b.maxRows=4;var c=$.datepicker._getBorders(a.dpDiv);instActive=a,a.dpDiv.empty().append(this._generateHTML(a));var d=a.dpDiv.find("iframe.ui-datepicker-cover");!d.length||d.css({left:-c[0],top:-c[1],width:a.dpDiv.outerWidth(),height:a.dpDiv.outerHeight()}),a.dpDiv.find("."+this._dayOverClass+" a").mouseover();var e=this._getNumberOfMonths(a),f=e[1],g=17;a.dpDiv.removeClass("ui-datepicker-multi-2 ui-datepicker-multi-3 ui-datepicker-multi-4").width(""),f>1&&a.dpDiv.addClass("ui-datepicker-multi-"+f).css("width",g*f+"em"),a.dpDiv[(e[0]!=1||e[1]!=1?"add":"remove")+"Class"]("ui-datepicker-multi"),a.dpDiv[(this._get(a,"isRTL")?"add":"remove")+"Clas
 s"]("ui-datepicker-rtl"),a==$.datepicker._curInst&&$.datepicker._datepickerShowing&&a.input&&a.input.is(":visible")&&!a.input.is(":disabled")&&a.input[0]!=document.activeElement&&a.input.focus();if(a.yearshtml){var h=a.yearshtml;setTimeout(function(){h===a.yearshtml&&a.yearshtml&&a.dpDiv.find("select.ui-datepicker-year:first").replaceWith(a.yearshtml),h=a.yearshtml=null},0)}},_getBorders:function(a){var b=function(a){return{thin:1,medium:2,thick:3}[a]||a};return[parseFloat(b(a.css("border-left-width"))),parseFloat(b(a.css("border-top-width")))]},_checkOffset:function(a,b,c){var d=a.dpDiv.outerWidth(),e=a.dpDiv.outerHeight(),f=a.input?a.input.outerWidth():0,g=a.input?a.input.outerHeight():0,h=document.documentElement.clientWidth+$(document).scrollLeft(),i=document.documentElement.clientHeight+$(document).scrollTop();return b.left-=this._get(a,"isRTL")?d-f:0,b.left-=c&&b.left==a.input.offset().left?$(document).scrollLeft():0,b.top-=c&&b.top==a.input.offset().top+g?$(document).scrollTo
 p():0,b.left-=Math.min(b.left,b.left+d>h&&h>d?Math.abs(b.left+d-h):0),b.top-=Math.min(b.top,b.top+e>i&&i>e?Math.abs(e+g):0),b},_findPos:function(a){var b=this._getInst(a),c=this._get(b,"isRTL");while(a&&(a.type=="hidden"||a.nodeType!=1||$.expr.filters.hidden(a)))a=a[c?"previousSibling":"nextSibling"];var d=$(a).offset();return[d.left,d.top]},_hideDatepicker:function(a){var b=this._curInst;if(!b||a&&b!=$.data(a,PROP_NAME))return;if(this._datepickerShowing){var c=this._get(b,"showAnim"),d=this._get(b,"duration"),e=function(){$.datepicker._tidyDialog(b)};$.effects&&$.effects[c]?b.dpDiv.hide(c,$.datepicker._get(b,"showOptions"),d,e):b.dpDiv[c=="slideDown"?"slideUp":c=="fadeIn"?"fadeOut":"hide"](c?d:null,e),c||e(),this._datepickerShowing=!1;var f=this._get(b,"onClose");f&&f.apply(b.input?b.input[0]:null,[b.input?b.input.val():"",b]),this._lastInput=null,this._inDialog&&(this._dialogInput.css({position:"absolute",left:"0",top:"-100px"}),$.blockUI&&($.unblockUI(),$("body").append(this.dpDi
 v))),this._inDialog=!1}},_tidyDialog:function(a){a.dpDiv.removeClass(this._dialogClass).unbind(".ui-datepicker-calendar")},_checkExternalClick:function(a){if(!$.datepicker._curInst)return;var b=$(a.target),c=$.datepicker._getInst(b[0]);(b[0].id!=$.datepicker._mainDivId&&b.parents("#"+$.datepicker._mainDivId).length==0&&!b.hasClass($.datepicker.markerClassName)&&!b.closest("."+$.datepicker._triggerClass).length&&$.datepicker._datepickerShowing&&(!$.datepicker._inDialog||!$.blockUI)||b.hasClass($.datepicker.markerClassName)&&$.datepicker._curInst!=c)&&$.datepicker._hideDatepicker()},_adjustDate:function(a,b,c){var d=$(a),e=this._getInst(d[0]);if(this._isDisabledDatepicker(d[0]))return;this._adjustInstDate(e,b+(c=="M"?this._get(e,"showCurrentAtPos"):0),c),this._updateDatepicker(e)},_gotoToday:function(a){var b=$(a),c=this._getInst(b[0]);if(this._get(c,"gotoCurrent")&&c.currentDay)c.selectedDay=c.currentDay,c.drawMonth=c.selectedMonth=c.currentMonth,c.drawYear=c.selectedYear=c.currentYe
 ar;else{var d=new Date;c.selectedDay=d.getDate(),c.drawMonth=c.selectedMonth=d.getMonth(),c.drawYear=c.selectedYear=d.getFullYear()}this._notifyChange(c),this._adjustDate(b)},_selectMonthYear:function(a,b,c){var d=$(a),e=this._getInst(d[0]);e["selected"+(c=="M"?"Month":"Year")]=e["draw"+(c=="M"?"Month":"Year")]=parseInt(b.options[b.selectedIndex].value,10),this._notifyChange(e),this._adjustDate(d)},_selectDay:function(a,b,c,d){var e=$(a);if($(d).hasClass(this._unselectableClass)||this._isDisabledDatepicker(e[0]))return;var f=this._getInst(e[0]);f.selectedDay=f.currentDay=$("a",d).html(),f.selectedMonth=f.currentMonth=b,f.selectedYear=f.currentYear=c,this._selectDate(a,this._formatDate(f,f.currentDay,f.currentMonth,f.currentYear))},_clearDate:function(a){var b=$(a),c=this._getInst(b[0]);this._selectDate(b,"")},_selectDate:function(a,b){var c=$(a),d=this._getInst(c[0]);b=b!=null?b:this._formatDate(d),d.input&&d.input.val(b),this._updateAlternate(d);var e=this._get(d,"onSelect");e?e.ap
 ply(d.input?d.input[0]:null,[b,d]):d.input&&d.input.trigger("change"),d.inline?this._updateDatepicker(d):(this._hideDatepicker(),this._lastInput=d.input[0],typeof d.input[0]!="object"&&d.input.focus(),this._lastInput=null)},_updateAlternate:function(a){var b=this._get(a,"altField");if(b){var c=this._get(a,"altFormat")||this._get(a,"dateFormat"),d=this._getDate(a),e=this.formatDate(c,d,this._getFormatConfig(a));$(b).each(function(){$(this).val(e)})}},noWeekends:function(a){var b=a.getDay();return[b>0&&b<6,""]},iso8601Week:function(a){var b=new Date(a.getTime());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},parseDate:function(a,b,c){if(a==null||b==null)throw"Invalid arguments";b=typeof b=="object"?b.toString():b+"";if(b=="")return null;var d=(c?c.shortYearCutoff:null)||this._defaults.shortYearCutoff;d=typeof d!="string"?d:(new Date).getFullYear()%100+parseInt(d,10);var e=(c?c.dayNamesShort:null)||t
 his._defaults.dayNamesShort,f=(c?c.dayNames:null)||this._defaults.dayNames,g=(c?c.monthNamesShort:null)||this._defaults.monthNamesShort,h=(c?c.monthNames:null)||this._defaults.monthNames,i=-1,j=-1,k=-1,l=-1,m=!1,n=function(b){var c=s+1<a.length&&a.charAt(s+1)==b;return c&&s++,c},o=function(a){var c=n(a),d=a=="@"?14:a=="!"?20:a=="y"&&c?4:a=="o"?3:2,e=new RegExp("^\\d{1,"+d+"}"),f=b.substring(r).match(e);if(!f)throw"Missing number at position "+r;return r+=f[0].length,parseInt(f[0],10)},p=function(a,c,d){var e=$.map(n(a)?d:c,function(a,b){return[[b,a]]}).sort(function(a,b){return-(a[1].length-b[1].length)}),f=-1;$.each(e,function(a,c){var d=c[1];if(b.substr(r,d.length).toLowerCase()==d.toLowerCase())return f=c[0],r+=d.length,!1});if(f!=-1)return f+1;throw"Unknown name at position "+r},q=function(){if(b.charAt(r)!=a.charAt(s))throw"Unexpected literal at position "+r;r++},r=0;for(var s=0;s<a.length;s++)if(m)a.charAt(s)=="'"&&!n("'")?m=!1:q();else switch(a.charAt(s)){case"d":k=o("d");bre
 ak;case"D":p("D",e,f);break;case"o":l=o("o");break;case"m":j=o("m");break;case"M":j=p("M",g,h);break;case"y":i=o("y");break;case"@":var t=new Date(o("@"));i=t.getFullYear(),j=t.getMonth()+1,k=t.getDate();break;case"!":var t=new Date((o("!")-this._ticksTo1970)/1e4);i=t.getFullYear(),j=t.getMonth()+1,k=t.getDate();break;case"'":n("'")?q():m=!0;break;default:q()}if(r<b.length)throw"Extra/unparsed characters found in date: "+b.substring(r);i==-1?i=(new Date).getFullYear():i<100&&(i+=(new Date).getFullYear()-(new Date).getFullYear()%100+(i<=d?0:-100));if(l>-1){j=1,k=l;do{var u=this._getDaysInMonth(i,j-1);if(k<=u)break;j++,k-=u}while(!0)}var t=this._daylightSavingAdjust(new Date(i,j-1,k));if(t.getFullYear()!=i||t.getMonth()+1!=j||t.getDate()!=k)throw"Invalid date";return t},ATOM:"yy-mm-dd",COOKIE:"D, dd M yy",ISO_8601:"yy-mm-dd",RFC_822:"D, d M y",RFC_850:"DD, dd-M-y",RFC_1036:"D, d M y",RFC_1123:"D, d M yy",RFC_2822:"D, d M yy",RSS:"D, d M y",TICKS:"!",TIMESTAMP:"@",W3C:"yy-mm-dd",_ticks
 To1970:(718685+Math.floor(492.5)-Math.floor(19.7)+Math.floor(4.925))*24*60*60*1e7,formatDate:function(a,b,c){if(!b)return"";var d=(c?c.dayNamesShort:null)||this._defaults.dayNamesShort,e=(c?c.dayNames:null)||this._defaults.dayNames,f=(c?c.monthNamesShort:null)||this._defaults.monthNamesShort,g=(c?c.monthNames:null)||this._defaults.monthNames,h=function(b){var c=m+1<a.length&&a.charAt(m+1)==b;return c&&m++,c},i=function(a,b,c){var d=""+b;if(h(a))while(d.length<c)d="0"+d;return d},j=function(a,b,c,d){return h(a)?d[b]:c[b]},k="",l=!1;if(b)for(var m=0;m<a.length;m++)if(l)a.charAt(m)=="'"&&!h("'")?l=!1:k+=a.charAt(m);else switch(a.charAt(m)){case"d":k+=i("d",b.getDate(),2);break;case"D":k+=j("D",b.getDay(),d,e);break;case"o":k+=i("o",Math.round(((new Date(b.getFullYear(),b.getMonth(),b.getDate())).getTime()-(new Date(b.getFullYear(),0,0)).getTime())/864e5),3);break;case"m":k+=i("m",b.getMonth()+1,2);break;case"M":k+=j("M",b.getMonth(),f,g);break;case"y":k+=h("y")?b.getFullYear():(b.getYe
 ar()%100<10?"0":"")+b.getYear()%100;break;case"@":k+=b.getTime();break;case"!":k+=b.getTime()*1e4+this._ticksTo1970;break;case"'":h("'")?k+="'":l=!0;break;default:k+=a.charAt(m)}return k},_possibleChars:function(a){var b="",c=!1,d=function(b){var c=e+1<a.length&&a.charAt(e+1)==b;return c&&e++,c};for(var e=0;e<a.length;e++)if(c)a.charAt(e)=="'"&&!d("'")?c=!1:b+=a.charAt(e);else switch(a.charAt(e)){case"d":case"m":case"y":case"@":b+="0123456789";break;case"D":case"M":return null;case"'":d("'")?b+="'":c=!0;break;default:b+=a.charAt(e)}return b},_get:function(a,b){return a.settings[b]!==undefined?a.settings[b]:this._defaults[b]},_setDateFromField:function(a,b){if(a.input.val()==a.lastVal)return;var c=this._get(a,"dateFormat"),d=a.lastVal=a.input?a.input.val():null,e,f;e=f=this._getDefaultDate(a);var g=this._getFormatConfig(a);try{e=this.parseDate(c,d,g)||f}catch(h){this.log(h),d=b?"":d}a.selectedDay=e.getDate(),a.drawMonth=a.selectedMonth=e.getMonth(),a.drawYear=a.selectedYear=e.getFull
 Year(),a.currentDay=d?e.getDate():0,a.currentMonth=d?e.getMonth():0,a.currentYear=d?e.getFullYear():0,this._adjustInstDate(a)},_getDefaultDate:function(a){return this._restrictMinMax(a,this._determineDate(a,this._get(a,"defaultDate"),new Date))},_determineDate:function(a,b,c){var d=function(a){var b=new Date;return b.setDate(b.getDate()+a),b},e=function(b){try{return $.datepicker.parseDate($.datepicker._get(a,"dateFormat"),b,$.datepicker._getFormatConfig(a))}catch(c){}var d=(b.toLowerCase().match(/^c/)?$.datepicker._getDate(a):null)||new Date,e=d.getFullYear(),f=d.getMonth(),g=d.getDate(),h=/([+-]?[0-9]+)\s*(d|D|w|W|m|M|y|Y)?/g,i=h.exec(b);while(i){switch(i[2]||"d"){case"d":case"D":g+=parseInt(i[1],10);break;case"w":case"W":g+=parseInt(i[1],10)*7;break;case"m":case"M":f+=parseInt(i[1],10),g=Math.min(g,$.datepicker._getDaysInMonth(e,f));break;case"y":case"Y":e+=parseInt(i[1],10),g=Math.min(g,$.datepicker._getDaysInMonth(e,f))}i=h.exec(b)}return new Date(e,f,g)},f=b==null||b===""?c:ty
 peof b=="string"?e(b):typeof b=="number"?isNaN(b)?c:d(b):new Date(b.getTime());return f=f&&f.toString()=="Invalid Date"?c:f,f&&(f.setHours(0),f.setMinutes(0),f.setSeconds(0),f.setMilliseconds(0)),this._daylightSavingAdjust(f)},_daylightSavingAdjust:function(a){return a?(a.setHours(a.getHours()>12?a.getHours()+2:0),a):null},_setDate:function(a,b,c){var d=!b,e=a.selectedMonth,f=a.selectedYear,g=this._restrictMinMax(a,this._determineDate(a,b,new Date));a.selectedDay=a.currentDay=g.getDate(),a.drawMonth=a.selectedMonth=a.currentMonth=g.getMonth(),a.drawYear=a.selectedYear=a.currentYear=g.getFullYear(),(e!=a.selectedMonth||f!=a.selectedYear)&&!c&&this._notifyChange(a),this._adjustInstDate(a),a.input&&a.input.val(d?"":this._formatDate(a))},_getDate:function(a){var b=!a.currentYear||a.input&&a.input.val()==""?null:this._daylightSavingAdjust(new Date(a.currentYear,a.currentMonth,a.currentDay));return b},_generateHTML:function(a){var b=new Date;b=this._daylightSavingAdjust(new Date(b.getFull
 Year(),b.getMonth(),b.getDate()));var c=this._get(a,"isRTL"),d=this._get(a,"showButtonPanel"),e=this._get(a,"hideIfNoPrevNext"),f=this._get(a,"navigationAsDateFormat"),g=this._getNumberOfMonths(a),h=this._get(a,"showCurrentAtPos"),i=this._get(a,"stepMonths"),j=g[0]!=1||g[1]!=1,k=this._daylightSavingAdjust(a.currentDay?new Date(a.currentYear,a.currentMonth,a.currentDay):new Date(9999,9,9)),l=this._getMinMaxDate(a,"min"),m=this._getMinMaxDate(a,"max"),n=a.drawMonth-h,o=a.drawYear;n<0&&(n+=12,o--);if(m){var p=this._daylightSavingAdjust(new Date(m.getFullYear(),m.getMonth()-g[0]*g[1]+1,m.getDate()));p=l&&p<l?l:p;while(this._daylightSavingAdjust(new Date(o,n,1))>p)n--,n<0&&(n=11,o--)}a.drawMonth=n,a.drawYear=o;var q=this._get(a,"prevText");q=f?this.formatDate(q,this._daylightSavingAdjust(new Date(o,n-i,1)),this._getFormatConfig(a)):q;var r=this._canAdjustMonth(a,-1,o,n)?'<a class="ui-datepicker-prev ui-corner-all" onclick="DP_jQuery_'+dpuuid+".datepicker._adjustDate('#"+a.id+"', -"+i+", 
 'M');\""+' title="'+q+'"><span class="ui-icon ui-icon-circle-triangle-'+(c?"e":"w")+'">'+q+"</span></a>":e?"":'<a class="ui-datepicker-prev ui-corner-all ui-state-disabled" title="'+q+'"><span class="ui-icon ui-icon-circle-triangle-'+(c?"e":"w")+'">'+q+"</span></a>",s=this._get(a,"nextText");s=f?this.formatDate(s,this._daylightSavingAdjust(new Date(o,n+i,1)),this._getFormatConfig(a)):s;var t=this._canAdjustMonth(a,1,o,n)?'<a class="ui-datepicker-next ui-corner-all" onclick="DP_jQuery_'+dpuuid+".datepicker._adjustDate('#"+a.id+"', +"+i+", 'M');\""+' title="'+s+'"><span class="ui-icon ui-icon-circle-triangle-'+(c?"w":"e")+'">'+s+"</span></a>":e?"":'<a class="ui-datepicker-next ui-corner-all ui-state-disabled" title="'+s+'"><span class="ui-icon ui-icon-circle-triangle-'+(c?"w":"e")+'">'+s+"</span></a>",u=this._get(a,"currentText"),v=this._get(a,"gotoCurrent")&&a.currentDay?k:b;u=f?this.formatDate(u,v,this._getFormatConfig(a)):u;var w=a.inline?"":'<button type="button" class="ui-datepic
 ker-close ui-state-default ui-priority-primary ui-corner-all" onclick="DP_jQuery_'+dpuuid+'.datepicker._hideDatepicker();">'+this._get(a,"closeText")+"</button>",x=d?'<div class="ui-datepicker-buttonpane ui-widget-content">'+(c?w:"")+(this._isInRange(a,v)?'<button type="button" class="ui-datepicker-current ui-state-default ui-priority-secondary ui-corner-all" onclick="DP_jQuery_'+dpuuid+".datepicker._gotoToday('#"+a.id+"');\""+">"+u+"</button>":"")+(c?"":w)+"</div>":"",y=parseInt(this._get(a,"firstDay"),10);y=isNaN(y)?0:y;var z=this._get(a,"showWeek"),A=this._get(a,"dayNames"),B=this._get(a,"dayNamesShort"),C=this._get(a,"dayNamesMin"),D=this._get(a,"monthNames"),E=this._get(a,"monthNamesShort"),F=this._get(a,"beforeShowDay"),G=this._get(a,"showOtherMonths"),H=this._get(a,"selectOtherMonths"),I=this._get(a,"calculateWeek")||this.iso8601Week,J=this._getDefaultDate(a),K="";for(var L=0;L<g[0];L++){var M="";this.maxRows=4;for(var N=0;N<g[1];N++){var O=this._daylightSavingAdjust(new Date
 (o,n,a.selectedDay)),P=" ui-corner-all",Q="";if(j){Q+='<div class="ui-datepicker-group';if(g[1]>1)switch(N){case 0:Q+=" ui-datepicker-group-first",P=" ui-corner-"+(c?"right":"left");break;case g[1]-1:Q+=" ui-datepicker-group-last",P=" ui-corner-"+(c?"left":"right");break;default:Q+=" ui-datepicker-group-middle",P=""}Q+='">'}Q+='<div class="ui-datepicker-header ui-widget-header ui-helper-clearfix'+P+'">'+(/all|left/.test(P)&&L==0?c?t:r:"")+(/all|right/.test(P)&&L==0?c?r:t:"")+this._generateMonthYearHeader(a,n,o,l,m,L>0||N>0,D,E)+'</div><table class="ui-datepicker-calendar"><thead>'+"<tr>";var R=z?'<th class="ui-datepicker-week-col">'+this._get(a,"weekHeader")+"</th>":"";for(var S=0;S<7;S++){var T=(S+y)%7;R+="<th"+((S+y+6)%7>=5?' class="ui-datepicker-week-end"':"")+">"+'<span title="'+A[T]+'">'+C[T]+"</span></th>"}Q+=R+"</tr></thead><tbody>";var U=this._getDaysInMonth(o,n);o==a.selectedYear&&n==a.selectedMonth&&(a.selectedDay=Math.min(a.selectedDay,U));var V=(this._getFirstDayOfMonth(
 o,n)-y+7)%7,W=Math.ceil((V+U)/7),X=j?this.maxRows>W?this.maxRows:W:W;this.maxRows=X;var Y=this._daylightSavingAdjust(new Date(o,n,1-V));for(var Z=0;Z<X;Z++){Q+="<tr>";var _=z?'<td class="ui-datepicker-week-col">'+this._get(a,"calculateWeek")(Y)+"</td>":"";for(var S=0;S<7;S++){var ba=F?F.apply(a.input?a.input[0]:null,[Y]):[!0,""],bb=Y.getMonth()!=n,bc=bb&&!H||!ba[0]||l&&Y<l||m&&Y>m;_+='<td class="'+((S+y+6)%7>=5?" ui-datepicker-week-end":"")+(bb?" ui-datepicker-other-month":"")+(Y.getTime()==O.getTime()&&n==a.selectedMonth&&a._keyEvent||J.getTime()==Y.getTime()&&J.getTime()==O.getTime()?" "+this._dayOverClass:"")+(bc?" "+this._unselectableClass+" ui-state-disabled":"")+(bb&&!G?"":" "+ba[1]+(Y.getTime()==k.getTime()?" "+this._currentClass:"")+(Y.getTime()==b.getTime()?" ui-datepicker-today":""))+'"'+((!bb||G)&&ba[2]?' title="'+ba[2]+'"':"")+(bc?"":' onclick="DP_jQuery_'+dpuuid+".datepicker._selectDay('#"+a.id+"',"+Y.getMonth()+","+Y.getFullYear()+', this);return false;"')+">"+(bb&&!G?
 "&#xa0;":bc?'<span class="ui-state-default">'+Y.getDate()+"</span>":'<a class="ui-state-default'+(Y.getTime()==b.getTime()?" ui-state-highlight":"")+(Y.getTime()==k.getTime()?" ui-state-active":"")+(bb?" ui-priority-secondary":"")+'" href="#">'+Y.getDate()+"</a>")+"</td>",Y.setDate(Y.getDate()+1),Y=this._daylightSavingAdjust(Y)}Q+=_+"</tr>"}n++,n>11&&(n=0,o++),Q+="</tbody></table>"+(j?"</div>"+(g[0]>0&&N==g[1]-1?'<div class="ui-datepicker-row-break"></div>':""):""),M+=Q}K+=M}return K+=x+($.browser.msie&&parseInt($.browser.version,10)<7&&!a.inline?'<iframe src="javascript:false;" class="ui-datepicker-cover" frameborder="0"></iframe>':""),a._keyEvent=!1,K},_generateMonthYearHeader:function(a,b,c,d,e,f,g,h){var i=this._get(a,"changeMonth"),j=this._get(a,"changeYear"),k=this._get(a,"showMonthAfterYear"),l='<div class="ui-datepicker-title">',m="";if(f||!i)m+='<span class="ui-datepicker-month">'+g[b]+"</span>";else{var n=d&&d.getFullYear()==c,o=e&&e.getFullYear()==c;m+='<select class="ui-
 datepicker-month" onchange="DP_jQuery_'+dpuuid+".datepicker._selectMonthYear('#"+a.id+"', this, 'M');\" "+">";for(var p=0;p<12;p++)(!n||p>=d.getMonth())&&(!o||p<=e.getMonth())&&(m+='<option value="'+p+'"'+(p==b?' selected="selected"':"")+">"+h[p]+"</option>");m+="</select>"}k||(l+=m+(f||!i||!j?"&#xa0;":""));if(!a.yearshtml){a.yearshtml="";if(f||!j)l+='<span class="ui-datepicker-year">'+c+"</span>";else{var q=this._get(a,"yearRange").split(":"),r=(new Date).getFullYear(),s=function(a){var b=a.match(/c[+-].*/)?c+parseInt(a.substring(1),10):a.match(/[+-].*/)?r+parseInt(a,10):parseInt(a,10);return isNaN(b)?r:b},t=s(q[0]),u=Math.max(t,s(q[1]||""));t=d?Math.max(t,d.getFullYear()):t,u=e?Math.min(u,e.getFullYear()):u,a.yearshtml+='<select class="ui-datepicker-year" onchange="DP_jQuery_'+dpuuid+".datepicker._selectMonthYear('#"+a.id+"', this, 'Y');\" "+">";for(;t<=u;t++)a.yearshtml+='<option value="'+t+'"'+(t==c?' selected="selected"':"")+">"+t+"</option>";a.yearshtml+="</select>",l+=a.years
 html,a.yearshtml=null}}return l+=this._get(a,"yearSuffix"),k&&(l+=(f||!i||!j?"&#xa0;":"")+m),l+="</div>",l},_adjustInstDate:function(a,b,c){var d=a.drawYear+(c=="Y"?b:0),e=a.drawMonth+(c=="M"?b:0),f=Math.min(a.selectedDay,this._getDaysInMonth(d,e))+(c=="D"?b:0),g=this._restrictMinMax(a,this._daylightSavingAdjust(new Date(d,e,f)));a.selectedDay=g.getDate(),a.drawMonth=a.selectedMonth=g.getMonth(),a.drawYear=a.selectedYear=g.getFullYear(),(c=="M"||c=="Y")&&this._notifyChange(a)},_restrictMinMax:function(a,b){var c=this._getMinMaxDate(a,"min"),d=this._getMinMaxDate(a,"max"),e=c&&b<c?c:b;return e=d&&e>d?d:e,e},_notifyChange:function(a){var b=this._get(a,"onChangeMonthYear");b&&b.apply(a.input?a.input[0]:null,[a.selectedYear,a.selectedMonth+1,a])},_getNumberOfMonths:function(a){var b=this._get(a,"numberOfMonths");return b==null?[1,1]:typeof b=="number"?[1,b]:b},_getMinMaxDate:function(a,b){return this._determineDate(a,this._get(a,b+"Date"),null)},_getDaysInMonth:function(a,b){return 32-t
 his._daylightSavingAdjust(new Date(a,b,32)).getDate()},_getFirstDayOfMonth:function(a,b){return(new Date(a,b,1)).getDay()},_canAdjustMonth:function(a,b,c,d){var e=this._getNumberOfMonths(a),f=this._daylightSavingAdjust(new Date(c,d+(b<0?b:e[0]*e[1]),1));return b<0&&f.setDate(this._getDaysInMonth(f.getFullYear(),f.getMonth())),this._isInRange(a,f)},_isInRange:function(a,b){var c=this._getMinMaxDate(a,"min"),d=this._getMinMaxDate(a,"max");return(!c||b.getTime()>=c.getTime())&&(!d||b.getTime()<=d.getTime())},_getFormatConfig:function(a){var b=this._get(a,"shortYearCutoff");return b=typeof b!="string"?b:(new Date).getFullYear()%100+parseInt(b,10),{shortYearCutoff:b,dayNamesShort:this._get(a,"dayNamesShort"),dayNames:this._get(a,"dayNames"),monthNamesShort:this._get(a,"monthNamesShort"),monthNames:this._get(a,"monthNames")}},_formatDate:function(a,b,c,d){b||(a.currentDay=a.selectedDay,a.currentMonth=a.selectedMonth,a.currentYear=a.selectedYear);var e=b?typeof b=="object"?b:this._daylight
 SavingAdjust(new Date(d,c,b)):this._daylightSavingAdjust(new Date(a.currentYear,a.currentMonth,a.currentDay));return this.formatDate(this._get(a,"dateFormat"),e,this._getFormatConfig(a))}}),$.fn.datepicker=function(a){if(!this.length)return this;$.datepicker.initialized||($(document).mousedown($.datepicker._checkExternalClick).find("body").append($.datepicker.dpDiv),$.datepicker.initialized=!0);var b=Array.prototype.slice.call(arguments,1);return typeof a!="string"||a!="isDisabled"&&a!="getDate"&&a!="widget"?a=="option"&&arguments.length==2&&typeof arguments[1]=="string"?$.datepicker["_"+a+"Datepicker"].apply($.datepicker,[this[0]].concat(b)):this.each(function(){typeof a=="string"?$.datepicker["_"+a+"Datepicker"].apply($.datepicker,[this].concat(b)):$.datepicker._attachDatepicker(this,a)}):$.datepicker["_"+a+"Datepicker"].apply($.datepicker,[this[0]].concat(b))},$.datepicker=new Datepicker,$.datepicker.initialized=!1,$.datepicker.uuid=(new Date).getTime(),$.datepicker.version="1.8.
 20",window["DP_jQuery_"+dpuuid]=$})(jQuery);;/*! jQuery UI - v1.8.20 - 2012-04-30
+* https://github.com/jquery/jquery-ui
+* Includes: jquery.ui.progressbar.js
+* Copyright (c) 2012 AUTHORS.txt; Licensed MIT, GPL */
+(function(a,b){a.widget("ui.progressbar",{options:{value:0,max:100},min:0,_create:function(){this.element.addClass("ui-progressbar ui-widget ui-widget-content ui-corner-all").attr({role:"progressbar","aria-valuemin":this.min,"aria-valuemax":this.options.max,"aria-valuenow":this._value()}),this.valueDiv=a("<div class='ui-progressbar-value ui-widget-header ui-corner-left'></div>").appendTo(this.element),this.oldValue=this._value(),this._refreshValue()},destroy:function(){this.element.removeClass("ui-progressbar ui-widget ui-widget-content ui-corner-all").removeAttr("role").removeAttr("aria-valuemin").removeAttr("aria-valuemax").removeAttr("aria-valuenow"),this.valueDiv.remove(),a.Widget.prototype.destroy.apply(this,arguments)},value:function(a){return a===b?this._value():(this._setOption("value",a),this)},_setOption:function(b,c){b==="value"&&(this.options.value=c,this._refreshValue(),this._value()===this.options.max&&this._trigger("complete")),a.Widget.prototype._setOption.apply(this
 ,arguments)},_value:function(){var a=this.options.value;return typeof a!="number"&&(a=0),Math.min(this.options.max,Math.max(this.min,a))},_percentage:function(){return 100*this._value()/this.options.max},_refreshValue:function(){var a=this.value(),b=this._percentage();this.oldValue!==a&&(this.oldValue=a,this._trigger("change")),this.valueDiv.toggle(a>this.min).toggleClass("ui-corner-right",a===this.options.max).width(b.toFixed(0)+"%"),this.element.attr("aria-valuenow",a)}}),a.extend(a.ui.progressbar,{version:"1.8.20"})})(jQuery);;/*! jQuery UI - v1.8.20 - 2012-04-30
+* https://github.com/jquery/jquery-ui
+* Includes: jquery.effects.core.js
+* Copyright (c) 2012 AUTHORS.txt; Licensed MIT, GPL */
+jQuery.effects||function(a,b){function c(b){var c;return b&&b.constructor==Array&&b.length==3?b:(c=/rgb\(\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*\)/.exec(b))?[parseInt(c[1],10),parseInt(c[2],10),parseInt(c[3],10)]:(c=/rgb\(\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*\)/.exec(b))?[parseFloat(c[1])*2.55,parseFloat(c[2])*2.55,parseFloat(c[3])*2.55]:(c=/#([a-fA-F0-9]{2})([a-fA-F0-9]{2})([a-fA-F0-9]{2})/.exec(b))?[parseInt(c[1],16),parseInt(c[2],16),parseInt(c[3],16)]:(c=/#([a-fA-F0-9])([a-fA-F0-9])([a-fA-F0-9])/.exec(b))?[parseInt(c[1]+c[1],16),parseInt(c[2]+c[2],16),parseInt(c[3]+c[3],16)]:(c=/rgba\(0, 0, 0, 0\)/.exec(b))?e.transparent:e[a.trim(b).toLowerCase()]}function d(b,d){var e;do{e=a.curCSS(b,d);if(e!=""&&e!="transparent"||a.nodeName(b,"body"))break;d="backgroundColor"}while(b=b.parentNode);return c(e)}function h(){var a=document.defaultView?document.defaultView.getComputedStyle(this,null):this.currentStyle,b={},c,d;if
 (a&&a.length&&a[0]&&a[a[0]]){var e=a.length;while(e--)c=a[e],typeof a[c]=="string"&&(d=c.replace(/\-(\w)/g,function(a,b){return b.toUpperCase()}),b[d]=a[c])}else for(c in a)typeof a[c]=="string"&&(b[c]=a[c]);return b}function i(b){var c,d;for(c in b)d=b[c],(d==null||a.isFunction(d)||c in g||/scrollbar/.test(c)||!/color/i.test(c)&&isNaN(parseFloat(d)))&&delete b[c];return b}function j(a,b){var c={_:0},d;for(d in b)a[d]!=b[d]&&(c[d]=b[d]);return c}function k(b,c,d,e){typeof b=="object"&&(e=c,d=null,c=b,b=c.effect),a.isFunction(c)&&(e=c,d=null,c={});if(typeof c=="number"||a.fx.speeds[c])e=d,d=c,c={};return a.isFunction(d)&&(e=d,d=null),c=c||{},d=d||c.duration,d=a.fx.off?0:typeof d=="number"?d:d in a.fx.speeds?a.fx.speeds[d]:a.fx.speeds._default,e=e||c.complete,[b,c,d,e]}function l(b){return!b||typeof b=="number"||a.fx.speeds[b]?!0:typeof b=="string"&&!a.effects[b]?!0:!1}a.effects={},a.each(["backgroundColor","borderBottomColor","borderLeftColor","borderRightColor","borderTopColor","bor
 derColor","color","outlineColor"],function(b,e){a.fx.step[e]=function(a){a.colorInit||(a.start=d(a.elem,e),a.end=c(a.end),a.colorInit=!0),a.elem.style[e]="rgb("+Math.max(Math.min(parseInt(a.pos*(a.end[0]-a.start[0])+a.start[0],10),255),0)+","+Math.max(Math.min(parseInt(a.pos*(a.end[1]-a.start[1])+a.start[1],10),255),0)+","+Math.max(Math.min(parseInt(a.pos*(a.end[2]-a.start[2])+a.start[2],10),255),0)+")"}});var e={aqua:[0,255,255],azure:[240,255,255],beige:[245,245,220],black:[0,0,0],blue:[0,0,255],brown:[165,42,42],cyan:[0,255,255],darkblue:[0,0,139],darkcyan:[0,139,139],darkgrey:[169,169,169],darkgreen:[0,100,0],darkkhaki:[189,183,107],darkmagenta:[139,0,139],darkolivegreen:[85,107,47],darkorange:[255,140,0],darkorchid:[153,50,204],darkred:[139,0,0],darksalmon:[233,150,122],darkviolet:[148,0,211],fuchsia:[255,0,255],gold:[255,215,0],green:[0,128,0],indigo:[75,0,130],khaki:[240,230,140],lightblue:[173,216,230],lightcyan:[224,255,255],lightgreen:[144,238,144],lightgrey:[211,211,211],
 lightpink:[255,182,193],lightyellow:[255,255,224],lime:[0,255,0],magenta:[255,0,255],maroon:[128,0,0],navy:[0,0,128],olive:[128,128,0],orange:[255,165,0],pink:[255,192,203],purple:[128,0,128],violet:[128,0,128],red:[255,0,0],silver:[192,192,192],white:[255,255,255],yellow:[255,255,0],transparent:[255,255,255]},f=["add","remove","toggle"],g={border:1,borderBottom:1,borderColor:1,borderLeft:1,borderRight:1,borderTop:1,borderWidth:1,margin:1,padding:1};a.effects.animateClass=function(b,c,d,e){return a.isFunction(d)&&(e=d,d=null),this.queue(function(){var g=a(this),k=g.attr("style")||" ",l=i(h.call(this)),m,n=g.attr("class")||"";a.each(f,function(a,c){b[c]&&g[c+"Class"](b[c])}),m=i(h.call(this)),g.attr("class",n),g.animate(j(l,m),{queue:!1,duration:c,easing:d,complete:function(){a.each(f,function(a,c){b[c]&&g[c+"Class"](b[c])}),typeof g.attr("style")=="object"?(g.attr("style").cssText="",g.attr("style").cssText=k):g.attr("style",k),e&&e.apply(this,arguments),a.dequeue(this)}})})},a.fn.e
 xtend({_addClass:a.fn.addClass,addClass:function(b,c,d,e){return c?a.effects.animateClass.apply(this,[{add:b},c,d,e]):this._addClass(b)},_removeClass:a.fn.removeClass,removeClass:function(b,c,d,e){return c?a.effects.animateClass.apply(this,[{remove:b},c,d,e]):this._removeClass(b)},_toggleClass:a.fn.toggleClass,toggleClass:function(c,d,e,f,g){return typeof d=="boolean"||d===b?e?a.effects.animateClass.apply(this,[d?{add:c}:{remove:c},e,f,g]):this._toggleClass(c,d):a.effects.animateClass.apply(this,[{toggle:c},d,e,f])},switchClass:function(b,c,d,e,f){return a.effects.animateClass.apply(this,[{add:c,remove:b},d,e,f])}}),a.extend(a.effects,{version:"1.8.20",save:function(a,b){for(var c=0;c<b.length;c++)b[c]!==null&&a.data("ec.storage."+b[c],a[0].style[b[c]])},restore:function(a,b){for(var c=0;c<b.length;c++)b[c]!==null&&a.css(b[c],a.data("ec.storage."+b[c]))},setMode:function(a,b){return b=="toggle"&&(b=a.is(":hidden")?"show":"hide"),b},getBaseline:function(a,b){var c,d;switch(a[0]){case
 "top":c=0;break;case"middle":c=.5;break;case"bottom":c=1;break;default:c=a[0]/b.height}switch(a[1]){case"left":d=0;break;case"center":d=.5;break;case"right":d=1;break;default:d=a[1]/b.width}return{x:d,y:c}},createWrapper:function(b){if(b.parent().is(".ui-effects-wrapper"))return b.parent();var c={width:b.outerWidth(!0),height:b.outerHeight(!0),"float":b.css("float")},d=a("<div></div>").addClass("ui-effects-wrapper").css({fontSize:"100%",background:"transparent",border:"none",margin:0,padding:0}),e=document.activeElement;return b.wrap(d),(b[0]===e||a.contains(b[0],e))&&a(e).focus(),d=b.parent(),b.css("position")=="static"?(d.css({position:"relative"}),b.css({position:"relative"})):(a.extend(c,{position:b.css("position"),zIndex:b.css("z-index")}),a.each(["top","left","bottom","right"],function(a,d){c[d]=b.css(d),isNaN(parseInt(c[d],10))&&(c[d]="auto")}),b.css({position:"relative",top:0,left:0,right:"auto",bottom:"auto"})),d.css(c).show()},removeWrapper:function(b){var c,d=document.act
 iveElement;return b.parent().is(".ui-effects-wrapper")?(c=b.parent().replaceWith(b),(b[0]===d||a.contains(b[0],d))&&a(d).focus(),c):b},setTransition:function(b,c,d,e){return e=e||{},a.each(c,function(a,c){var f=b.cssUnit(c);f[0]>0&&(e[c]=f[0]*d+f[1])}),e}}),a.fn.extend({effect:function(b,c,d,e){var f=k.apply(this,arguments),g={options:f[1],duration:f[2],callback:f[3]},h=g.options.mode,i=a.effects[b];return a.fx.off||!i?h?this[h](g.duration,g.callback):this.each(function(){g.callback&&g.callback.call(this)}):i.call(this,g)},_show:a.fn.show,show:function(a){if(l(a))return this._show.apply(this,arguments);var b=k.apply(this,arguments);return b[1].mode="show",this.effect.apply(this,b)},_hide:a.fn.hide,hide:function(a){if(l(a))return this._hide.apply(this,arguments);var b=k.apply(this,arguments);return b[1].mode="hide",this.effect.apply(this,b)},__toggle:a.fn.toggle,toggle:function(b){if(l(b)||typeof b=="boolean"||a.isFunction(b))return this.__toggle.apply(this,arguments);var c=k.apply(t
 his,arguments);return c[1].mode="toggle",this.effect.apply(this,c)},cssUnit:function(b){var c=this.css(b),d=[];return a.each(["em","px","%","pt"],function(a,b){c.indexOf(b)>0&&(d=[parseFloat(c),b])}),d}}),a.easing.jswing=a.easing.swing,a.extend(a.easing,{def:"easeOutQuad",swing:function(b,c,d,e,f){return a.easing[a.easing.def](b,c,d,e,f)},easeInQuad:function(a,b,c,d,e){return d*(b/=e)*b+c},easeOutQuad:function(a,b,c,d,e){return-d*(b/=e)*(b-2)+c},easeInOutQuad:function(a,b,c,d,e){return(b/=e/2)<1?d/2*b*b+c:-d/2*(--b*(b-2)-1)+c},easeInCubic:function(a,b,c,d,e){return d*(b/=e)*b*b+c},easeOutCubic:function(a,b,c,d,e){return d*((b=b/e-1)*b*b+1)+c},easeInOutCubic:function(a,b,c,d,e){return(b/=e/2)<1?d/2*b*b*b+c:d/2*((b-=2)*b*b+2)+c},easeInQuart:function(a,b,c,d,e){return d*(b/=e)*b*b*b+c},easeOutQuart:function(a,b,c,d,e){return-d*((b=b/e-1)*b*b*b-1)+c},easeInOutQuart:function(a,b,c,d,e){return(b/=e/2)<1?d/2*b*b*b*b+c:-d/2*((b-=2)*b*b*b-2)+c},easeInQuint:function(a,b,c,d,e){return d*(b/=e)
 *b*b*b*b+c},easeOutQuint:function(a,b,c,d,e){return d*((b=b/e-1)*b*b*b*b+1)+c},easeInOutQuint:function(a,b,c,d,e){return(b/=e/2)<1?d/2*b*b*b*b*b+c:d/2*((b-=2)*b*b*b*b+2)+c},easeInSine:function(a,b,c,d,e){return-d*Math.cos(b/e*(Math.PI/2))+d+c},easeOutSine:function(a,b,c,d,e){return d*Math.sin(b/e*(Math.PI/2))+c},easeInOutSine:function(a,b,c,d,e){return-d/2*(Math.cos(Math.PI*b/e)-1)+c},easeInExpo:function(a,b,c,d,e){return b==0?c:d*Math.pow(2,10*(b/e-1))+c},easeOutExpo:function(a,b,c,d,e){return b==e?c+d:d*(-Math.pow(2,-10*b/e)+1)+c},easeInOutExpo:function(a,b,c,d,e){return b==0?c:b==e?c+d:(b/=e/2)<1?d/2*Math.pow(2,10*(b-1))+c:d/2*(-Math.pow(2,-10*--b)+2)+c},easeInCirc:function(a,b,c,d,e){return-d*(Math.sqrt(1-(b/=e)*b)-1)+c},easeOutCirc:function(a,b,c,d,e){return d*Math.sqrt(1-(b=b/e-1)*b)+c},easeInOutCirc:function(a,b,c,d,e){return(b/=e/2)<1?-d/2*(Math.sqrt(1-b*b)-1)+c:d/2*(Math.sqrt(1-(b-=2)*b)+1)+c},easeInElastic:function(a,b,c,d,e){var f=1.70158,g=0,h=d;if(b==0)return c;if((b/=e
 )==1)return c+d;g||(g=e*.3);if(h<Math.abs(d)){h=d;var f=g/4}else var f=g/(2*Math.PI)*Math.asin(d/h);return-(h*Math.pow(2,10*(b-=1))*Math.sin((b*e-f)*2*Math.PI/g))+c},easeOutElastic:function(a,b,c,d,e){var f=1.70158,g=0,h=d;if(b==0)return c;if((b/=e)==1)return c+d;g||(g=e*.3);if(h<Math.abs(d)){h=d;var f=g/4}else var f=g/(2*Math.PI)*Math.asin(d/h);return h*Math.pow(2,-10*b)*Math.sin((b*e-f)*2*Math.PI/g)+d+c},easeInOutElastic:function(a,b,c,d,e){var f=1.70158,g=0,h=d;if(b==0)return c;if((b/=e/2)==2)return c+d;g||(g=e*.3*1.5);if(h<Math.abs(d)){h=d;var f=g/4}else var f=g/(2*Math.PI)*Math.asin(d/h);return b<1?-0.5*h*Math.pow(2,10*(b-=1))*Math.sin((b*e-f)*2*Math.PI/g)+c:h*Math.pow(2,-10*(b-=1))*Math.sin((b*e-f)*2*Math.PI/g)*.5+d+c},easeInBack:function(a,c,d,e,f,g){return g==b&&(g=1.70158),e*(c/=f)*c*((g+1)*c-g)+d},easeOutBack:function(a,c,d,e,f,g){return g==b&&(g=1.70158),e*((c=c/f-1)*c*((g+1)*c+g)+1)+d},easeInOutBack:function(a,c,d,e,f,g){return g==b&&(g=1.70158),(c/=f/2)<1?e/2*c*c*(((g*=
 1.525)+1)*c-g)+d:e/2*((c-=2)*c*(((g*=1.525)+1)*c+g)+2)+d},easeInBounce:function(b,c,d,e,f){return e-a.easing.easeOutBounce(b,f-c,0,e,f)+d},easeOutBounce:function(a,b,c,d,e){return(b/=e)<1/2.75?d*7.5625*b*b+c:b<2/2.75?d*(7.5625*(b-=1.5/2.75)*b+.75)+c:b<2.5/2.75?d*(7.5625*(b-=2.25/2.75)*b+.9375)+c:d*(7.5625*(b-=2.625/2.75)*b+.984375)+c},easeInOutBounce:function(b,c,d,e,f){return c<f/2?a.easing.easeInBounce(b,c*2,0,e,f)*.5+d:a.easing.easeOutBounce(b,c*2-f,0,e,f)*.5+e*.5+d}})}(jQuery);;/*! jQuery UI - v1.8.20 - 2012-04-30
+* https://github.com/jquery/jquery-ui
+* Includes: jquery.effects.blind.js
+* Copyright (c) 2012 AUTHORS.txt; Licensed MIT, GPL */
+(function(a,b){a.effects.blind=function(b){return this.queue(function(){var c=a(this),d=["position","top","bottom","left","right"],e=a.effects.setMode(c,b.options.mode||"hide"),f=b.options.direction||"vertical";a.effects.save(c,d),c.show();var g=a.effects.createWrapper(c).css({overflow:"hidden"}),h=f=="vertical"?"height":"width",i=f=="vertical"?g.height():g.width();e=="show"&&g.css(h,0);var j={};j[h]=e=="show"?i:0,g.animate(j,b.duration,b.options.easing,function(){e=="hide"&&c.hide(),a.effects.restore(c,d),a.effects.removeWrapper(c),b.callback&&b.callback.apply(c[0],arguments),c.dequeue()})})}})(jQuery);;/*! jQuery UI - v1.8.20 - 2012-04-30
+* https://github.com/jquery/jquery-ui
+* Includes: jquery.effects.bounce.js
+* Copyright (c) 2012 AUTHORS.txt; Licensed MIT, GPL */
+(function(a,b){a.effects.bounce=function(b){return this.queue(function(){var c=a(this),d=["position","top","bottom","left","right"],e=a.effects.setMode(c,b.options.mode||"effect"),f=b.options.direction||"up",g=b.options.distance||20,h=b.options.times||5,i=b.duration||250;/show|hide/.test(e)&&d.push("opacity"),a.effects.save(c,d),c.show(),a.effects.createWrapper(c);var j=f=="up"||f=="down"?"top":"left",k=f=="up"||f=="left"?"pos":"neg",g=b.options.distance||(j=="top"?c.outerHeight({margin:!0})/3:c.outerWidth({margin:!0})/3);e=="show"&&c.css("opacity",0).css(j,k=="pos"?-g:g),e=="hide"&&(g=g/(h*2)),e!="hide"&&h--;if(e=="show"){var l={opacity:1};l[j]=(k=="pos"?"+=":"-=")+g,c.animate(l,i/2,b.options.easing),g=g/2,h--}for(var m=0;m<h;m++){var n={},p={};n[j]=(k=="pos"?"-=":"+=")+g,p[j]=(k=="pos"?"+=":"-=")+g,c.animate(n,i/2,b.options.easing).animate(p,i/2,b.options.easing),g=e=="hide"?g*2:g/2}if(e=="hide"){var l={opacity:0};l[j]=(k=="pos"?"-=":"+=")+g,c.animate(l,i/2,b.options.easing,functi
 on(){c.hide(),a.effects.restore(c,d),a.effects.removeWrapper(c),b.callback&&b.callback.apply(this,arguments)})}else{var n={},p={};n[j]=(k=="pos"?"-=":"+=")+g,p[j]=(k=="pos"?"+=":"-=")+g,c.animate(n,i/2,b.options.easing).animate(p,i/2,b.options.easing,function(){a.effects.restore(c,d),a.effects.removeWrapper(c),b.callback&&b.callback.apply(this,arguments)})}c.queue("fx",function(){c.dequeue()}),c.dequeue()})}})(jQuery);;/*! jQuery UI - v1.8.20 - 2012-04-30
+* https://github.com/jquery/jquery-ui
+* Includes: jquery.effects.clip.js
+* Copyright (c) 2012 AUTHORS.txt; Licensed MIT, GPL */
+(function(a,b){a.effects.clip=function(b){return this.queue(function(){var c=a(this),d=["position","top","bottom","left","right","height","width"],e=a.effects.setMode(c,b.options.mode||"hide"),f=b.options.direction||"vertical";a.effects.save(c,d),c.show();var g=a.effects.createWrapper(c).css({overflow:"hidden"}),h=c[0].tagName=="IMG"?g:c,i={size:f=="vertical"?"height":"width",position:f=="vertical"?"top":"left"},j=f=="vertical"?h.height():h.width();e=="show"&&(h.css(i.size,0),h.css(i.position,j/2));var k={};k[i.size]=e=="show"?j:0,k[i.position]=e=="show"?0:j/2,h.animate(k,{queue:!1,duration:b.duration,easing:b.options.easing,complete:function(){e=="hide"&&c.hide(),a.effects.restore(c,d),a.effects.removeWrapper(c),b.callback&&b.callback.apply(c[0],arguments),c.dequeue()}})})}})(jQuery);;/*! jQuery UI - v1.8.20 - 2012-04-30
+* https://github.com/jquery/jquery-ui
+* Includes: jquery.effects.drop.js
+* Copyright (c) 2012 AUTHORS.txt; Licensed MIT, GPL */
+(function(a,b){a.effects.drop=function(b){return this.queue(function(){var c=a(this),d=["position","top","bottom","left","right","opacity"],e=a.effects.setMode(c,b.options.mode||"hide"),f=b.options.direction||"left";a.effects.save(c,d),c.show(),a.effects.createWrapper(c);var g=f=="up"||f=="down"?"top":"left",h=f=="up"||f=="left"?"pos":"neg",i=b.options.distance||(g=="top"?c.outerHeight({margin:!0})/2:c.outerWidth({margin:!0})/2);e=="show"&&c.css("opacity",0).css(g,h=="pos"?-i:i);var j={opacity:e=="show"?1:0};j[g]=(e=="show"?h=="pos"?"+=":"-=":h=="pos"?"-=":"+=")+i,c.animate(j,{queue:!1,duration:b.duration,easing:b.options.easing,complete:function(){e=="hide"&&c.hide(),a.effects.restore(c,d),a.effects.removeWrapper(c),b.callback&&b.callback.apply(this,arguments),c.dequeue()}})})}})(jQuery);;/*! jQuery UI - v1.8.20 - 2012-04-30
+* https://github.com/jquery/jquery-ui
+* Includes: jquery.effects.explode.js
+* Copyright (c) 2012 AUTHORS.txt; Licensed MIT, GPL */
+(function(a,b){a.effects.explode=function(b){return this.queue(function(){var c=b.options.pieces?Math.round(Math.sqrt(b.options.pieces)):3,d=b.options.pieces?Math.round(Math.sqrt(b.options.pieces)):3;b.options.mode=b.options.mode=="toggle"?a(this).is(":visible")?"hide":"show":b.options.mode;var e=a(this).show().css("visibility","hidden"),f=e.offset();f.top-=parseInt(e.css("marginTop"),10)||0,f.left-=parseInt(e.css("marginLeft"),10)||0;var g=e.outerWidth(!0),h=e.outerHeight(!0);for(var i=0;i<c;i++)for(var j=0;j<d;j++)e.clone().appendTo("body").wrap("<div></div>").css({position:"absolute",visibility:"visible",left:-j*(g/d),top:-i*(h/c)}).parent().addClass("ui-effects-explode").css({position:"absolute",overflow:"hidden",width:g/d,height:h/c,left:f.left+j*(g/d)+(b.options.mode=="show"?(j-Math.floor(d/2))*(g/d):0),top:f.top+i*(h/c)+(b.options.mode=="show"?(i-Math.floor(c/2))*(h/c):0),opacity:b.options.mode=="show"?0:1}).animate({left:f.left+j*(g/d)+(b.options.mode=="show"?0:(j-Math.floor
 (d/2))*(g/d)),top:f.top+i*(h/c)+(b.options.mode=="show"?0:(i-Math.floor(c/2))*(h/c)),opacity:b.options.mode=="show"?1:0},b.duration||500);setTimeout(function(){b.options.mode=="show"?e.css({visibility:"visible"}):e.css({visibility:"visible"}).hide(),b.callback&&b.callback.apply(e[0]),e.dequeue(),a("div.ui-effects-explode").remove()},b.duration||500)})}})(jQuery);;/*! jQuery UI - v1.8.20 - 2012-04-30
+* https://github.com/jquery/jquery-ui
+* Includes: jquery.effects.fade.js
+* Copyright (c) 2012 AUTHORS.txt; Licensed MIT, GPL */
+(function(a,b){a.effects.fade=function(b){return this.queue(function(){var c=a(this),d=a.effects.setMode(c,b.options.mode||"hide");c.animate({opacity:d},{queue:!1,duration:b.duration,easing:b.options.easing,complete:function(){b.callback&&b.callback.apply(this,arguments),c.dequeue()}})})}})(jQuery);;/*! jQuery UI - v1.8.20 - 2012-04-30
+* https://github.com/jquery/jquery-ui
+* Includes: jquery.effects.fold.js
+* Copyright (c) 2012 AUTHORS.txt; Licensed MIT, GPL */
+(function(a,b){a.effects.fold=function(b){return this.queue(function(){var c=a(this),d=["position","top","bottom","left","right"],e=a.effects.setMode(c,b.options.mode||"hide"),f=b.options.size||15,g=!!b.options.horizFirst,h=b.duration?b.duration/2:a.fx.speeds._default/2;a.effects.save(c,d),c.show();var i=a.effects.createWrapper(c).css({overflow:"hidden"}),j=e=="show"!=g,k=j?["width","height"]:["height","width"],l=j?[i.width(),i.height()]:[i.height(),i.width()],m=/([0-9]+)%/.exec(f);m&&(f=parseInt(m[1],10)/100*l[e=="hide"?0:1]),e=="show"&&i.css(g?{height:0,width:f}:{height:f,width:0});var n={},p={};n[k[0]]=e=="show"?l[0]:f,p[k[1]]=e=="show"?l[1]:0,i.animate(n,h,b.options.easing).animate(p,h,b.options.easing,function(){e=="hide"&&c.hide(),a.effects.restore(c,d),a.effects.removeWrapper(c),b.callback&&b.callback.apply(c[0],arguments),c.dequeue()})})}})(jQuery);;/*! jQuery UI - v1.8.20 - 2012-04-30
+* https://github.com/jquery/jquery-ui
+* Includes: jquery.effects.highlight.js
+* Copyright (c) 2012 AUTHORS.txt; Licensed MIT, GPL */
+(function(a,b){a.effects.highlight=function(b){return this.queue(function(){var c=a(this),d=["backgroundImage","backgroundColor","opacity"],e=a.effects.setMode(c,b.options.mode||"show"),f={backgroundColor:c.css("backgroundColor")};e=="hide"&&(f.opacity=0),a.effects.save(c,d),c.show().css({backgroundImage:"none",backgroundColor:b.options.color||"#ffff99"}).animate(f,{queue:!1,duration:b.duration,easing:b.options.easing,complete:function(){e=="hide"&&c.hide(),a.effects.restore(c,d),e=="show"&&!a.support.opacity&&this.style.removeAttribute("filter"),b.callback&&b.callback.apply(this,arguments),c.dequeue()}})})}})(jQuery);;/*! jQuery UI - v1.8.20 - 2012-04-30
+* https://github.com/jquery/jquery-ui
+* Includes: jquery.effects.pulsate.js
+* Copyright (c) 2012 AUTHORS.txt; Licensed MIT, GPL */
+(function(a,b){a.effects.pulsate=function(b){return this.queue(function(){var c=a(this),d=a.effects.setMode(c,b.options.mode||"show"),e=(b.options.times||5)*2-1,f=b.duration?b.duration/2:a.fx.speeds._default/2,g=c.is(":visible"),h=0;g||(c.css("opacity",0).show(),h=1),(d=="hide"&&g||d=="show"&&!g)&&e--;for(var i=0;i<e;i++)c.animate({opacity:h},f,b.options.easing),h=(h+1)%2;c.animate({opacity:h},f,b.options.easing,function(){h==0&&c.hide(),b.callback&&b.callback.apply(this,arguments)}),c.queue("fx",function(){c.dequeue()}).dequeue()})}})(jQuery);;/*! jQuery UI - v1.8.20 - 2012-04-30
+* https://github.com/jquery/jquery-ui
+* Includes: jquery.effects.scale.js
+* Copyright (c) 2012 AUTHORS.txt; Licensed MIT, GPL */
+(function(a,b){a.effects.puff=function(b){return this.queue(function(){var c=a(this),d=a.effects.setMode(c,b.options.mode||"hide"),e=parseInt(b.options.percent,10)||150,f=e/100,g={height:c.height(),width:c.width()};a.extend(b.options,{fade:!0,mode:d,percent:d=="hide"?e:100,from:d=="hide"?g:{height:g.height*f,width:g.width*f}}),c.effect("scale",b.options,b.duration,b.callback),c.dequeue()})},a.effects.scale=function(b){return this.queue(function(){var c=a(this),d=a.extend(!0,{},b.options),e=a.effects.setMode(c,b.options.mode||"effect"),f=parseInt(b.options.percent,10)||(parseInt(b.options.percent,10)==0?0:e=="hide"?0:100),g=b.options.direction||"both",h=b.options.origin;e!="effect"&&(d.origin=h||["middle","center"],d.restore=!0);var i={height:c.height(),width:c.width()};c.from=b.options.from||(e=="show"?{height:0,width:0}:i);var j={y:g!="horizontal"?f/100:1,x:g!="vertical"?f/100:1};c.to={height:i.height*j.y,width:i.width*j.x},b.options.fade&&(e=="show"&&(c.from.opacity=0,c.to.opacity
 =1),e=="hide"&&(c.from.opacity=1,c.to.opacity=0)),d.from=c.from,d.to=c.to,d.mode=e,c.effect("size",d,b.duration,b.callback),c.dequeue()})},a.effects.size=function(b){return this.queue(function(){var c=a(this),d=["position","top","bottom","left","right","width","height","overflow","opacity"],e=["position","top","bottom","left","right","overflow","opacity"],f=["width","height","overflow"],g=["fontSize"],h=["borderTopWidth","borderBottomWidth","paddingTop","paddingBottom"],i=["borderLeftWidth","borderRightWidth","paddingLeft","paddingRight"],j=a.effects.setMode(c,b.options.mode||"effect"),k=b.options.restore||!1,l=b.options.scale||"both",m=b.options.origin,n={height:c.height(),width:c.width()};c.from=b.options.from||n,c.to=b.options.to||n;if(m){var p=a.effects.getBaseline(m,n);c.from.top=(n.height-c.from.height)*p.y,c.from.left=(n.width-c.from.width)*p.x,c.to.top=(n.height-c.to.height)*p.y,c.to.left=(n.width-c.to.width)*p.x}var q={from:{y:c.from.height/n.height,x:c.from.width/n.width},
 to:{y:c.to.height/n.height,x:c.to.width/n.width}};if(l=="box"||l=="both")q.from.y!=q.to.y&&(d=d.concat(h),c.from=a.effects.setTransition(c,h,q.from.y,c.from),c.to=a.effects.setTransition(c,h,q.to.y,c.to)),q.from.x!=q.to.x&&(d=d.concat(i),c.from=a.effects.setTransition(c,i,q.from.x,c.from),c.to=a.effects.setTransition(c,i,q.to.x,c.to));(l=="content"||l=="both")&&q.from.y!=q.to.y&&(d=d.concat(g),c.from=a.effects.setTransition(c,g,q.from.y,c.from),c.to=a.effects.setTransition(c,g,q.to.y,c.to)),a.effects.save(c,k?d:e),c.show(),a.effects.createWrapper(c),c.css("overflow","hidden").css(c.from);if(l=="content"||l=="both")h=h.concat(["marginTop","marginBottom"]).concat(g),i=i.concat(["marginLeft","marginRight"]),f=d.concat(h).concat(i),c.find("*[width]").each(function(){var c=a(this);k&&a.effects.save(c,f);var d={height:c.height(),width:c.width()};c.from={height:d.height*q.from.y,width:d.width*q.from.x},c.to={height:d.height*q.to.y,width:d.width*q.to.x},q.from.y!=q.to.y&&(c.from=a.effects.s
 etTransition(c,h,q.from.y,c.from),c.to=a.effects.setTransition(c,h,q.to.y,c.to)),q.from.x!=q.to.x&&(c.from=a.effects.setTransition(c,i,q.from.x,c.from),c.to=a.effects.setTransition(c,i,q.to.x,c.to)),c.css(c.from),c.animate(c.to,b.duration,b.options.easing,function(){k&&a.effects.restore(c,f)})});c.animate(c.to,{queue:!1,duration:b.duration,easing:b.options.easing,complete:function(){c.to.opacity===0&&c.css("opacity",c.from.opacity),j=="hide"&&c.hide(),a.effects.restore(c,k?d:e),a.effects.removeWrapper(c),b.callback&&b.callback.apply(this,arguments),c.dequeue()}})})}})(jQuery);;/*! jQuery UI - v1.8.20 - 2012-04-30
+* https://github.com/jquery/jquery-ui
+* Includes: jquery.effects.shake.js
+* Copyright (c) 2012 AUTHORS.txt; Licensed MIT, GPL */
+(function(a,b){a.effects.shake=function(b){return this.queue(function(){var c=a(this),d=["position","top","bottom","left","right"],e=a.effects.setMode(c,b.options.mode||"effect"),f=b.options.direction||"left",g=b.options.distance||20,h=b.options.times||3,i=b.duration||b.options.duration||140;a.effects.save(c,d),c.show(),a.effects.createWrapper(c);var j=f=="up"||f=="down"?"top":"left",k=f=="up"||f=="left"?"pos":"neg",l={},m={},n={};l[j]=(k=="pos"?"-=":"+=")+g,m[j]=(k=="pos"?"+=":"-=")+g*2,n[j]=(k=="pos"?"-=":"+=")+g*2,c.animate(l,i,b.options.easing);for(var p=1;p<h;p++)c.animate(m,i,b.options.easing).animate(n,i,b.options.easing);c.animate(m,i,b.options.easing).animate(l,i/2,b.options.easing,function(){a.effects.restore(c,d),a.effects.removeWrapper(c),b.callback&&b.callback.apply(this,arguments)}),c.queue("fx",function(){c.dequeue()}),c.dequeue()})}})(jQuery);;/*! jQuery UI - v1.8.20 - 2012-04-30
+* https://github.com/jquery/jquery-ui
+* Includes: jquery.effects.slide.js
+* Copyright (c) 2012 AUTHORS.txt; Licensed MIT, GPL */
+(function(a,b){a.effects.slide=function(b){return this.queue(function(){var c=a(this),d=["position","top","bottom","left","right"],e=a.effects.setMode(c,b.options.mode||"show"),f=b.options.direction||"left";a.effects.save(c,d),c.show(),a.effects.createWrapper(c).css({overflow:"hidden"});var g=f=="up"||f=="down"?"top":"left",h=f=="up"||f=="left"?"pos":"neg",i=b.options.distance||(g=="top"?c.outerHeight({margin:!0}):c.outerWidth({margin:!0}));e=="show"&&c.css(g,h=="pos"?isNaN(i)?"-"+i:-i:i);var j={};j[g]=(e=="show"?h=="pos"?"+=":"-=":h=="pos"?"-=":"+=")+i,c.animate(j,{queue:!1,duration:b.duration,easing:b.options.easing,complete:function(){e=="hide"&&c.hide(),a.effects.restore(c,d),a.effects.removeWrapper(c),b.callback&&b.callback.apply(this,arguments),c.dequeue()}})})}})(jQuery);;/*! jQuery UI - v1.8.20 - 2012-04-30
+* https://github.com/jquery/jquery-ui
+* Includes: jquery.effects.transfer.js
+* Copyright (c) 2012 AUTHORS.txt; Licensed MIT, GPL */
+(function(a,b){a.effects.transfer=function(b){return this.queue(function(){var c=a(this),d=a(b.options.to),e=d.offset(),f={top:e.top,left:e.left,height:d.innerHeight(),width:d.innerWidth()},g=c.offset(),h=a('<div class="ui-effects-transfer"></div>').appendTo(document.body).addClass(b.options.className).css({top:g.top,left:g.left,height:c.innerHeight(),width:c.innerWidth(),position:"absolute"}).animate(f,b.duration,b.options.easing,function(){h.remove(),b.callback&&b.callback.apply(c[0],arguments),c.dequeue()})})}})(jQuery);;
\ No newline at end of file
diff --git a/www/jquery.min.js b/www/jquery.min.js
new file mode 100644
index 0000000..2d323c7
--- /dev/null
+++ b/www/jquery.min.js
@@ -0,0 +1,4 @@
+/*! jQuery v1.7.1 jquery.com | jquery.org/license */
+(function(a,b){function cy(a){return f.isWindow(a)?a:a.nodeType===9?a.defaultView||a.parentWindow:!1}function cv(a){if(!ck[a]){var b=c.body,d=f("<"+a+">").appendTo(b),e=d.css("display");d.remove();if(e==="none"||e===""){cl||(cl=c.createElement("iframe"),cl.frameBorder=cl.width=cl.height=0),b.appendChild(cl);if(!cm||!cl.createElement)cm=(cl.contentWindow||cl.contentDocument).document,cm.write((c.compatMode==="CSS1Compat"?"<!doctype html>":"")+"<html><body>"),cm.close();d=cm.createElement(a),cm.body.appendChild(d),e=f.css(d,"display"),b.removeChild(cl)}ck[a]=e}return ck[a]}function cu(a,b){var c={};f.each(cq.concat.apply([],cq.slice(0,b)),function(){c[this]=a});return c}function ct(){cr=b}function cs(){setTimeout(ct,0);return cr=f.now()}function cj(){try{return new a.ActiveXObject("Microsoft.XMLHTTP")}catch(b){}}function ci(){try{return new a.XMLHttpRequest}catch(b){}}function cc(a,c){a.dataFilter&&(c=a.dataFilter(c,a.dataType));var d=a.dataTypes,e={},g,h,i=d.length,j,k=d[0],l,m,n,o,p
 ;for(g=1;g<i;g++){if(g===1)for(h in a.converters)typeof h=="string"&&(e[h.toLowerCase()]=a.converters[h]);l=k,k=d[g];if(k==="*")k=l;else if(l!=="*"&&l!==k){m=l+" "+k,n=e[m]||e["* "+k];if(!n){p=b;for(o in e){j=o.split(" ");if(j[0]===l||j[0]==="*"){p=e[j[1]+" "+k];if(p){o=e[o],o===!0?n=p:p===!0&&(n=o);break}}}}!n&&!p&&f.error("No conversion from "+m.replace(" "," to ")),n!==!0&&(c=n?n(c):p(o(c)))}}return c}function cb(a,c,d){var e=a.contents,f=a.dataTypes,g=a.responseFields,h,i,j,k;for(i in g)i in d&&(c[g[i]]=d[i]);while(f[0]==="*")f.shift(),h===b&&(h=a.mimeType||c.getResponseHeader("content-type"));if(h)for(i in e)if(e[i]&&e[i].test(h)){f.unshift(i);break}if(f[0]in d)j=f[0];else{for(i in d){if(!f[0]||a.converters[i+" "+f[0]]){j=i;break}k||(k=i)}j=j||k}if(j){j!==f[0]&&f.unshift(j);return d[j]}}function ca(a,b,c,d){if(f.isArray(b))f.each(b,function(b,e){c||bE.test(a)?d(a,e):ca(a+"["+(typeof e=="object"||f.isArray(e)?b:"")+"]",e,c,d)});else if(!c&&b!=null&&typeof b=="object")for(var e i
 n b)ca(a+"["+e+"]",b[e],c,d);else d(a,b)}function b_(a,c){var d,e,g=f.ajaxSettings.flatOptions||{};for(d in c)c[d]!==b&&((g[d]?a:e||(e={}))[d]=c[d]);e&&f.extend(!0,a,e)}function b$(a,c,d,e,f,g){f=f||c.dataTypes[0],g=g||{},g[f]=!0;var h=a[f],i=0,j=h?h.length:0,k=a===bT,l;for(;i<j&&(k||!l);i++)l=h[i](c,d,e),typeof l=="string"&&(!k||g[l]?l=b:(c.dataTypes.unshift(l),l=b$(a,c,d,e,l,g)));(k||!l)&&!g["*"]&&(l=b$(a,c,d,e,"*",g));return l}function bZ(a){return function(b,c){typeof b!="string"&&(c=b,b="*");if(f.isFunction(c)){var d=b.toLowerCase().split(bP),e=0,g=d.length,h,i,j;for(;e<g;e++)h=d[e],j=/^\+/.test(h),j&&(h=h.substr(1)||"*"),i=a[h]=a[h]||[],i[j?"unshift":"push"](c)}}}function bC(a,b,c){var d=b==="width"?a.offsetWidth:a.offsetHeight,e=b==="width"?bx:by,g=0,h=e.length;if(d>0){if(c!=="border")for(;g<h;g++)c||(d-=parseFloat(f.css(a,"padding"+e[g]))||0),c==="margin"?d+=parseFloat(f.css(a,c+e[g]))||0:d-=parseFloat(f.css(a,"border"+e[g]+"Width"))||0;return d+"px"}d=bz(a,b,b);if(d<0||d==n
 ull)d=a.style[b]||0;d=parseFloat(d)||0;if(c)for(;g<h;g++)d+=parseFloat(f.css(a,"padding"+e[g]))||0,c!=="padding"&&(d+=parseFloat(f.css(a,"border"+e[g]+"Width"))||0),c==="margin"&&(d+=parseFloat(f.css(a,c+e[g]))||0);return d+"px"}function bp(a,b){b.src?f.ajax({url:b.src,async:!1,dataType:"script"}):f.globalEval((b.text||b.textContent||b.innerHTML||"").replace(bf,"/*$0*/")),b.parentNode&&b.parentNode.removeChild(b)}function bo(a){var b=c.createElement("div");bh.appendChild(b),b.innerHTML=a.outerHTML;return b.firstChild}function bn(a){var b=(a.nodeName||"").toLowerCase();b==="input"?bm(a):b!=="script"&&typeof a.getElementsByTagName!="undefined"&&f.grep(a.getElementsByTagName("input"),bm)}function bm(a){if(a.type==="checkbox"||a.type==="radio")a.defaultChecked=a.checked}function bl(a){return typeof a.getElementsByTagName!="undefined"?a.getElementsByTagName("*"):typeof a.querySelectorAll!="undefined"?a.querySelectorAll("*"):[]}function bk(a,b){var c;if(b.nodeType===1){b.clearAttributes&&
 b.clearAttributes(),b.mergeAttributes&&b.mergeAttributes(a),c=b.nodeName.toLowerCase();if(c==="object")b.outerHTML=a.outerHTML;else if(c!=="input"||a.type!=="checkbox"&&a.type!=="radio"){if(c==="option")b.selected=a.defaultSelected;else if(c==="input"||c==="textarea")b.defaultValue=a.defaultValue}else a.checked&&(b.defaultChecked=b.checked=a.checked),b.value!==a.value&&(b.value=a.value);b.removeAttribute(f.expando)}}function bj(a,b){if(b.nodeType===1&&!!f.hasData(a)){var c,d,e,g=f._data(a),h=f._data(b,g),i=g.events;if(i){delete h.handle,h.events={};for(c in i)for(d=0,e=i[c].length;d<e;d++)f.event.add(b,c+(i[c][d].namespace?".":"")+i[c][d].namespace,i[c][d],i[c][d].data)}h.data&&(h.data=f.extend({},h.data))}}function bi(a,b){return f.nodeName(a,"table")?a.getElementsByTagName("tbody")[0]||a.appendChild(a.ownerDocument.createElement("tbody")):a}function U(a){var b=V.split("|"),c=a.createDocumentFragment();if(c.createElement)while(b.length)c.createElement(b.pop());return c}function T(a
 ,b,c){b=b||0;if(f.isFunction(b))return f.grep(a,function(a,d){var e=!!b.call(a,d,a);return e===c});if(b.nodeType)return f.grep(a,function(a,d){return a===b===c});if(typeof b=="string"){var d=f.grep(a,function(a){return a.nodeType===1});if(O.test(b))return f.filter(b,d,!c);b=f.filter(b,d)}return f.grep(a,function(a,d){return f.inArray(a,b)>=0===c})}function S(a){return!a||!a.parentNode||a.parentNode.nodeType===11}function K(){return!0}function J(){return!1}function n(a,b,c){var d=b+"defer",e=b+"queue",g=b+"mark",h=f._data(a,d);h&&(c==="queue"||!f._data(a,e))&&(c==="mark"||!f._data(a,g))&&setTimeout(function(){!f._data(a,e)&&!f._data(a,g)&&(f.removeData(a,d,!0),h.fire())},0)}function m(a){for(var b in a){if(b==="data"&&f.isEmptyObject(a[b]))continue;if(b!=="toJSON")return!1}return!0}function l(a,c,d){if(d===b&&a.nodeType===1){var e="data-"+c.replace(k,"-$1").toLowerCase();d=a.getAttribute(e);if(typeof d=="string"){try{d=d==="true"?!0:d==="false"?!1:d==="null"?null:f.isNumeric(d)?parse
 Float(d):j.test(d)?f.parseJSON(d):d}catch(g){}f.data(a,c,d)}else d=b}return d}function h(a){var b=g[a]={},c,d;a=a.split(/\s+/);for(c=0,d=a.length;c<d;c++)b[a[c]]=!0;return b}var c=a.document,d=a.navigator,e=a.location,f=function(){function J(){if(!e.isReady){try{c.documentElement.doScroll("left")}catch(a){setTimeout(J,1);return}e.ready()}}var e=function(a,b){return new e.fn.init(a,b,h)},f=a.jQuery,g=a.$,h,i=/^(?:[^#<]*(<[\w\W]+>)[^>]*$|#([\w\-]*)$)/,j=/\S/,k=/^\s+/,l=/\s+$/,m=/^<(\w+)\s*\/?>(?:<\/\1>)?$/,n=/^[\],:{}\s]*$/,o=/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g,p=/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,q=/(?:^|:|,)(?:\s*\[)+/g,r=/(webkit)[ \/]([\w.]+)/,s=/(opera)(?:.*version)?[ \/]([\w.]+)/,t=/(msie) ([\w.]+)/,u=/(mozilla)(?:.*? rv:([\w.]+))?/,v=/-([a-z]|[0-9])/ig,w=/^-ms-/,x=function(a,b){return(b+"").toUpperCase()},y=d.userAgent,z,A,B,C=Object.prototype.toString,D=Object.prototype.hasOwnProperty,E=Array.prototype.push,F=Array.prototype.slice,G=String.pro
 totype.trim,H=Array.prototype.indexOf,I={};e.fn=e.prototype={constructor:e,init:function(a,d,f){var g,h,j,k;if(!a)return this;if(a.nodeType){this.context=this[0]=a,this.length=1;return this}if(a==="body"&&!d&&c.body){this.context=c,this[0]=c.body,this.selector=a,this.length=1;return this}if(typeof a=="string"){a.charAt(0)!=="<"||a.charAt(a.length-1)!==">"||a.length<3?g=i.exec(a):g=[null,a,null];if(g&&(g[1]||!d)){if(g[1]){d=d instanceof e?d[0]:d,k=d?d.ownerDocument||d:c,j=m.exec(a),j?e.isPlainObject(d)?(a=[c.createElement(j[1])],e.fn.attr.call(a,d,!0)):a=[k.createElement(j[1])]:(j=e.buildFragment([g[1]],[k]),a=(j.cacheable?e.clone(j.fragment):j.fragment).childNodes);return e.merge(this,a)}h=c.getElementById(g[2]);if(h&&h.parentNode){if(h.id!==g[2])return f.find(a);this.length=1,this[0]=h}this.context=c,this.selector=a;return this}return!d||d.jquery?(d||f).find(a):this.constructor(d).find(a)}if(e.isFunction(a))return f.ready(a);a.selector!==b&&(this.selector=a.selector,this.context=a.
 context);return e.makeArray(a,this)},selector:"",jquery:"1.7.1",length:0,size:function(){return this.length},toArray:function(){return F.call(this,0)},get:function(a){return a==null?this.toArray():a<0?this[this.length+a]:this[a]},pushStack:function(a,b,c){var d=this.constructor();e.isArray(a)?E.apply(d,a):e.merge(d,a),d.prevObject=this,d.context=this.context,b==="find"?d.selector=this.selector+(this.selector?" ":"")+c:b&&(d.selector=this.selector+"."+b+"("+c+")");return d},each:function(a,b){return e.each(this,a,b)},ready:function(a){e.bindReady(),A.add(a);return this},eq:function(a){a=+a;return a===-1?this.slice(a):this.slice(a,a+1)},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},slice:function(){return this.pushStack(F.apply(this,arguments),"slice",F.call(arguments).join(","))},map:function(a){return this.pushStack(e.map(this,function(b,c){return a.call(b,c,b)}))},end:function(){return this.prevObject||this.constructor(null)},push:E,sort:[].sort,splice:[].
 splice},e.fn.init.prototype=e.fn,e.extend=e.fn.extend=function(){var a,c,d,f,g,h,i=arguments[0]||{},j=1,k=arguments.length,l=!1;typeof i=="boolean"&&(l=i,i=arguments[1]||{},j=2),typeof i!="object"&&!e.isFunction(i)&&(i={}),k===j&&(i=this,--j);for(;j<k;j++)if((a=arguments[j])!=null)for(c in a){d=i[c],f=a[c];if(i===f)continue;l&&f&&(e.isPlainObject(f)||(g=e.isArray(f)))?(g?(g=!1,h=d&&e.isArray(d)?d:[]):h=d&&e.isPlainObject(d)?d:{},i[c]=e.extend(l,h,f)):f!==b&&(i[c]=f)}return i},e.extend({noConflict:function(b){a.$===e&&(a.$=g),b&&a.jQuery===e&&(a.jQuery=f);return e},isReady:!1,readyWait:1,holdReady:function(a){a?e.readyWait++:e.ready(!0)},ready:function(a){if(a===!0&&!--e.readyWait||a!==!0&&!e.isReady){if(!c.body)return setTimeout(e.ready,1);e.isReady=!0;if(a!==!0&&--e.readyWait>0)return;A.fireWith(c,[e]),e.fn.trigger&&e(c).trigger("ready").off("ready")}},bindReady:function(){if(!A){A=e.Callbacks("once memory");if(c.readyState==="complete")return setTimeout(e.ready,1);if(c.addEventLis
 tener)c.addEventListener("DOMContentLoaded",B,!1),a.addEventListener("load",e.ready,!1);else if(c.attachEvent){c.attachEvent("onreadystatechange",B),a.attachEvent("onload",e.ready);var b=!1;try{b=a.frameElement==null}catch(d){}c.documentElement.doScroll&&b&&J()}}},isFunction:function(a){return e.type(a)==="function"},isArray:Array.isArray||function(a){return e.type(a)==="array"},isWindow:function(a){return a&&typeof a=="object"&&"setInterval"in a},isNumeric:function(a){return!isNaN(parseFloat(a))&&isFinite(a)},type:function(a){return a==null?String(a):I[C.call(a)]||"object"},isPlainObject:function(a){if(!a||e.type(a)!=="object"||a.nodeType||e.isWindow(a))return!1;try{if(a.constructor&&!D.call(a,"constructor")&&!D.call(a.constructor.prototype,"isPrototypeOf"))return!1}catch(c){return!1}var d;for(d in a);return d===b||D.call(a,d)},isEmptyObject:function(a){for(var b in a)return!1;return!0},error:function(a){throw new Error(a)},parseJSON:function(b){if(typeof b!="string"||!b)return nul
 l;b=e.trim(b);if(a.JSON&&a.JSON.parse)return a.JSON.parse(b);if(n.test(b.replace(o,"@").replace(p,"]").replace(q,"")))return(new Function("return "+b))();e.error("Invalid JSON: "+b)},parseXML:function(c){var d,f;try{a.DOMParser?(f=new DOMParser,d=f.parseFromString(c,"text/xml")):(d=new ActiveXObject("Microsoft.XMLDOM"),d.async="false",d.loadXML(c))}catch(g){d=b}(!d||!d.documentElement||d.getElementsByTagName("parsererror").length)&&e.error("Invalid XML: "+c);return d},noop:function(){},globalEval:function(b){b&&j.test(b)&&(a.execScript||function(b){a.eval.call(a,b)})(b)},camelCase:function(a){return a.replace(w,"ms-").replace(v,x)},nodeName:function(a,b){return a.nodeName&&a.nodeName.toUpperCase()===b.toUpperCase()},each:function(a,c,d){var f,g=0,h=a.length,i=h===b||e.isFunction(a);if(d){if(i){for(f in a)if(c.apply(a[f],d)===!1)break}else for(;g<h;)if(c.apply(a[g++],d)===!1)break}else if(i){for(f in a)if(c.call(a[f],f,a[f])===!1)break}else for(;g<h;)if(c.call(a[g],g,a[g++])===!1)bre
 ak;return a},trim:G?function(a){return a==null?"":G.call(a)}:function(a){return a==null?"":(a+"").replace(k,"").replace(l,"")},makeArray:function(a,b){var c=b||[];if(a!=null){var d=e.type(a);a.length==null||d==="string"||d==="function"||d==="regexp"||e.isWindow(a)?E.call(c,a):e.merge(c,a)}return c},inArray:function(a,b,c){var d;if(b){if(H)return H.call(b,a,c);d=b.length,c=c?c<0?Math.max(0,d+c):c:0;for(;c<d;c++)if(c in b&&b[c]===a)return c}return-1},merge:function(a,c){var d=a.length,e=0;if(typeof c.length=="number")for(var f=c.length;e<f;e++)a[d++]=c[e];else while(c[e]!==b)a[d++]=c[e++];a.length=d;return a},grep:function(a,b,c){var d=[],e;c=!!c;for(var f=0,g=a.length;f<g;f++)e=!!b(a[f],f),c!==e&&d.push(a[f]);return d},map:function(a,c,d){var f,g,h=[],i=0,j=a.length,k=a instanceof e||j!==b&&typeof j=="number"&&(j>0&&a[0]&&a[j-1]||j===0||e.isArray(a));if(k)for(;i<j;i++)f=c(a[i],i,d),f!=null&&(h[h.length]=f);else for(g in a)f=c(a[g],g,d),f!=null&&(h[h.length]=f);return h.concat.apply([
 ],h)},guid:1,proxy:function(a,c){if(typeof c=="string"){var d=a[c];c=a,a=d}if(!e.isFunction(a))return b;var f=F.call(arguments,2),g=function(){return a.apply(c,f.concat(F.call(arguments)))};g.guid=a.guid=a.guid||g.guid||e.guid++;return g},access:function(a,c,d,f,g,h){var i=a.length;if(typeof c=="object"){for(var j in c)e.access(a,j,c[j],f,g,d);return a}if(d!==b){f=!h&&f&&e.isFunction(d);for(var k=0;k<i;k++)g(a[k],c,f?d.call(a[k],k,g(a[k],c)):d,h);return a}return i?g(a[0],c):b},now:function(){return(new Date).getTime()},uaMatch:function(a){a=a.toLowerCase();var b=r.exec(a)||s.exec(a)||t.exec(a)||a.indexOf("compatible")<0&&u.exec(a)||[];return{browser:b[1]||"",version:b[2]||"0"}},sub:function(){function a(b,c){return new a.fn.init(b,c)}e.extend(!0,a,this),a.superclass=this,a.fn=a.prototype=this(),a.fn.constructor=a,a.sub=this.sub,a.fn.init=function(d,f){f&&f instanceof e&&!(f instanceof a)&&(f=a(f));return e.fn.init.call(this,d,f,b)},a.fn.init.prototype=a.fn;var b=a(c);return a},brows
 er:{}}),e.each("Boolean Number String Function Array Date RegExp Object".split(" "),function(a,b){I["[object "+b+"]"]=b.toLowerCase()}),z=e.uaMatch(y),z.browser&&(e.browser[z.browser]=!0,e.browser.version=z.version),e.browser.webkit&&(e.browser.safari=!0),j.test(" ")&&(k=/^[\s\xA0]+/,l=/[\s\xA0]+$/),h=e(c),c.addEventListener?B=function(){c.removeEventListener("DOMContentLoaded",B,!1),e.ready()}:c.attachEvent&&(B=function(){c.readyState==="complete"&&(c.detachEvent("onreadystatechange",B),e.ready())});return e}(),g={};f.Callbacks=function(a){a=a?g[a]||h(a):{};var c=[],d=[],e,i,j,k,l,m=function(b){var d,e,g,h,i;for(d=0,e=b.length;d<e;d++)g=b[d],h=f.type(g),h==="array"?m(g):h==="function"&&(!a.unique||!o.has(g))&&c.push(g)},n=function(b,f){f=f||[],e=!a.memory||[b,f],i=!0,l=j||0,j=0,k=c.length;for(;c&&l<k;l++)if(c[l].apply(b,f)===!1&&a.stopOnFalse){e=!0;break}i=!1,c&&(a.once?e===!0?o.disable():c=[]:d&&d.length&&(e=d.shift(),o.fireWith(e[0],e[1])))},o={add:function(){if(c){var a=c.lengt
 h;m(arguments),i?k=c.length:e&&e!==!0&&(j=a,n(e[0],e[1]))}return this},remove:function(){if(c){var b=arguments,d=0,e=b.length;for(;d<e;d++)for(var f=0;f<c.length;f++)if(b[d]===c[f]){i&&f<=k&&(k--,f<=l&&l--),c.splice(f--,1);if(a.unique)break}}return this},has:function(a){if(c){var b=0,d=c.length;for(;b<d;b++)if(a===c[b])return!0}return!1},empty:function(){c=[];return this},disable:function(){c=d=e=b;return this},disabled:function(){return!c},lock:function(){d=b,(!e||e===!0)&&o.disable();return this},locked:function(){return!d},fireWith:function(b,c){d&&(i?a.once||d.push([b,c]):(!a.once||!e)&&n(b,c));return this},fire:function(){o.fireWith(this,arguments);return this},fired:function(){return!!e}};return o};var i=[].slice;f.extend({Deferred:function(a){var b=f.Callbacks("once memory"),c=f.Callbacks("once memory"),d=f.Callbacks("memory"),e="pending",g={resolve:b,reject:c,notify:d},h={done:b.add,fail:c.add,progress:d.add,state:function(){return e},isResolved:b.fired,isRejected:c.fired,th
 en:function(a,b,c){i.done(a).fail(b).progress(c);return this},always:function(){i.done.apply(i,arguments).fail.apply(i,arguments);return this},pipe:function(a,b,c){return f.Deferred(function(d){f.each({done:[a,"resolve"],fail:[b,"reject"],progress:[c,"notify"]},function(a,b){var c=b[0],e=b[1],g;f.isFunction(c)?i[a](function(){g=c.apply(this,arguments),g&&f.isFunction(g.promise)?g.promise().then(d.resolve,d.reject,d.notify):d[e+"With"](this===i?d:this,[g])}):i[a](d[e])})}).promise()},promise:function(a){if(a==null)a=h;else for(var b in h)a[b]=h[b];return a}},i=h.promise({}),j;for(j in g)i[j]=g[j].fire,i[j+"With"]=g[j].fireWith;i.done(function(){e="resolved"},c.disable,d.lock).fail(function(){e="rejected"},b.disable,d.lock),a&&a.call(i,i);return i},when:function(a){function m(a){return function(b){e[a]=arguments.length>1?i.call(arguments,0):b,j.notifyWith(k,e)}}function l(a){return function(c){b[a]=arguments.length>1?i.call(arguments,0):c,--g||j.resolveWith(j,b)}}var b=i.call(argument
 s,0),c=0,d=b.length,e=Array(d),g=d,h=d,j=d<=1&&a&&f.isFunction(a.promise)?a:f.Deferred(),k=j.promise();if(d>1){for(;c<d;c++)b[c]&&b[c].promise&&f.isFunction(b[c].promise)?b[c].promise().then(l(c),j.reject,m(c)):--g;g||j.resolveWith(j,b)}else j!==a&&j.resolveWith(j,d?[a]:[]);return k}}),f.support=function(){var b,d,e,g,h,i,j,k,l,m,n,o,p,q=c.createElement("div"),r=c.documentElement;q.setAttribute("className","t"),q.innerHTML="   <link/><table></table><a href='/a' style='top:1px;float:left;opacity:.55;'>a</a><input type='checkbox'/>",d=q.getElementsByTagName("*"),e=q.getElementsByTagName("a")[0];if(!d||!d.length||!e)return{};g=c.createElement("select"),h=g.appendChild(c.createElement("option")),i=q.getElementsByTagName("input")[0],b={leadingWhitespace:q.firstChild.nodeType===3,tbody:!q.getElementsByTagName("tbody").length,htmlSerialize:!!q.getElementsByTagName("link").length,style:/top/.test(e.getAttribute("style")),hrefNormalized:e.getAttribute("href")==="/a",opacity:/^0.55/.test(e.st
 yle.opacity),cssFloat:!!e.style.cssFloat,checkOn:i.value==="on",optSelected:h.selected,getSetAttribute:q.className!=="t",enctype:!!c.createElement("form").enctype,html5Clone:c.createElement("nav").cloneNode(!0).outerHTML!=="<:nav></:nav>",submitBubbles:!0,changeBubbles:!0,focusinBubbles:!1,deleteExpando:!0,noCloneEvent:!0,inlineBlockNeedsLayout:!1,shrinkWrapBlocks:!1,reliableMarginRight:!0},i.checked=!0,b.noCloneChecked=i.cloneNode(!0).checked,g.disabled=!0,b.optDisabled=!h.disabled;try{delete q.test}catch(s){b.deleteExpando=!1}!q.addEventListener&&q.attachEvent&&q.fireEvent&&(q.attachEvent("onclick",function(){b.noCloneEvent=!1}),q.cloneNode(!0).fireEvent("onclick")),i=c.createElement("input"),i.value="t",i.setAttribute("type","radio"),b.radioValue=i.value==="t",i.setAttribute("checked","checked"),q.appendChild(i),k=c.createDocumentFragment(),k.appendChild(q.lastChild),b.checkClone=k.cloneNode(!0).cloneNode(!0).lastChild.checked,b.appendChecked=i.checked,k.removeChild(i),k.appendCh
 ild(q),q.innerHTML="",a.getComputedStyle&&(j=c.createElement("div"),j.style.width="0",j.style.marginRight="0",q.style.width="2px",q.appendChild(j),b.reliableMarginRight=(parseInt((a.getComputedStyle(j,null)||{marginRight:0}).marginRight,10)||0)===0);if(q.attachEvent)for(o in{submit:1,change:1,focusin:1})n="on"+o,p=n in q,p||(q.setAttribute(n,"return;"),p=typeof q[n]=="function"),b[o+"Bubbles"]=p;k.removeChild(q),k=g=h=j=q=i=null,f(function(){var a,d,e,g,h,i,j,k,m,n,o,r=c.getElementsByTagName("body")[0];!r||(j=1,k="position:absolute;top:0;left:0;width:1px;height:1px;margin:0;",m="visibility:hidden;border:0;",n="style='"+k+"border:5px solid #000;padding:0;'",o="<div "+n+"><div></div></div>"+"<table "+n+" cellpadding='0' cellspacing='0'>"+"<tr><td></td></tr></table>",a=c.createElement("div"),a.style.cssText=m+"width:0;height:0;position:static;top:0;margin-top:"+j+"px",r.insertBefore(a,r.firstChild),q=c.createElement("div"),a.appendChild(q),q.innerHTML="<table><tr><td style='padding:0;b
 order:0;display:none'></td><td>t</td></tr></table>",l=q.getElementsByTagName("td"),p=l[0].offsetHeight===0,l[0].style.display="",l[1].style.display="none",b.reliableHiddenOffsets=p&&l[0].offsetHeight===0,q.innerHTML="",q.style.width=q.style.paddingLeft="1px",f.boxModel=b.boxModel=q.offsetWidth===2,typeof q.style.zoom!="undefined"&&(q.style.display="inline",q.style.zoom=1,b.inlineBlockNeedsLayout=q.offsetWidth===2,q.style.display="",q.innerHTML="<div style='width:4px;'></div>",b.shrinkWrapBlocks=q.offsetWidth!==2),q.style.cssText=k+m,q.innerHTML=o,d=q.firstChild,e=d.firstChild,h=d.nextSibling.firstChild.firstChild,i={doesNotAddBorder:e.offsetTop!==5,doesAddBorderForTableAndCells:h.offsetTop===5},e.style.position="fixed",e.style.top="20px",i.fixedPosition=e.offsetTop===20||e.offsetTop===15,e.style.position=e.style.top="",d.style.overflow="hidden",d.style.position="relative",i.subtractsBorderForOverflowNotVisible=e.offsetTop===-5,i.doesNotIncludeMarginInBodyOffset=r.offsetTop!==j,r.rem
 oveChild(a),q=a=null,f.extend(b,i))});return b}();var j=/^(?:\{.*\}|\[.*\])$/,k=/([A-Z])/g;f.extend({cache:{},uuid:0,expando:"jQuery"+(f.fn.jquery+Math.random()).replace(/\D/g,""),noData:{embed:!0,object:"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000",applet:!0},hasData:function(a){a=a.nodeType?f.cache[a[f.expando]]:a[f.expando];return!!a&&!m(a)},data:function(a,c,d,e){if(!!f.acceptData(a)){var g,h,i,j=f.expando,k=typeof c=="string",l=a.nodeType,m=l?f.cache:a,n=l?a[j]:a[j]&&j,o=c==="events";if((!n||!m[n]||!o&&!e&&!m[n].data)&&k&&d===b)return;n||(l?a[j]=n=++f.uuid:n=j),m[n]||(m[n]={},l||(m[n].toJSON=f.noop));if(typeof c=="object"||typeof c=="function")e?m[n]=f.extend(m[n],c):m[n].data=f.extend(m[n].data,c);g=h=m[n],e||(h.data||(h.data={}),h=h.data),d!==b&&(h[f.camelCase(c)]=d);if(o&&!h[c])return g.events;k?(i=h[c],i==null&&(i=h[f.camelCase(c)])):i=h;return i}},removeData:function(a,b,c){if(!!f.acceptData(a)){var d,e,g,h=f.expando,i=a.nodeType,j=i?f.cache:a,k=i?a[h]:h;if(!j[k])return;if(
 b){d=c?j[k]:j[k].data;if(d){f.isArray(b)||(b in d?b=[b]:(b=f.camelCase(b),b in d?b=[b]:b=b.split(" ")));for(e=0,g=b.length;e<g;e++)delete d[b[e]];if(!(c?m:f.isEmptyObject)(d))return}}if(!c){delete j[k].data;if(!m(j[k]))return}f.support.deleteExpando||!j.setInterval?delete j[k]:j[k]=null,i&&(f.support.deleteExpando?delete a[h]:a.removeAttribute?a.removeAttribute(h):a[h]=null)}},_data:function(a,b,c){return f.data(a,b,c,!0)},acceptData:function(a){if(a.nodeName){var b=f.noData[a.nodeName.toLowerCase()];if(b)return b!==!0&&a.getAttribute("classid")===b}return!0}}),f.fn.extend({data:function(a,c){var d,e,g,h=null;if(typeof a=="undefined"){if(this.length){h=f.data(this[0]);if(this[0].nodeType===1&&!f._data(this[0],"parsedAttrs")){e=this[0].attributes;for(var i=0,j=e.length;i<j;i++)g=e[i].name,g.indexOf("data-")===0&&(g=f.camelCase(g.substring(5)),l(this[0],g,h[g]));f._data(this[0],"parsedAttrs",!0)}}return h}if(typeof a=="object")return this.each(function(){f.data(this,a)});d=a.split("."
 ),d[1]=d[1]?"."+d[1]:"";if(c===b){h=this.triggerHandler("getData"+d[1]+"!",[d[0]]),h===b&&this.length&&(h=f.data(this[0],a),h=l(this[0],a,h));return h===b&&d[1]?this.data(d[0]):h}return this.each(function(){var b=f(this),e=[d[0],c];b.triggerHandler("setData"+d[1]+"!",e),f.data(this,a,c),b.triggerHandler("changeData"+d[1]+"!",e)})},removeData:function(a){return this.each(function(){f.removeData(this,a)})}}),f.extend({_mark:function(a,b){a&&(b=(b||"fx")+"mark",f._data(a,b,(f._data(a,b)||0)+1))},_unmark:function(a,b,c){a!==!0&&(c=b,b=a,a=!1);if(b){c=c||"fx";var d=c+"mark",e=a?0:(f._data(b,d)||1)-1;e?f._data(b,d,e):(f.removeData(b,d,!0),n(b,c,"mark"))}},queue:function(a,b,c){var d;if(a){b=(b||"fx")+"queue",d=f._data(a,b),c&&(!d||f.isArray(c)?d=f._data(a,b,f.makeArray(c)):d.push(c));return d||[]}},dequeue:function(a,b){b=b||"fx";var c=f.queue(a,b),d=c.shift(),e={};d==="inprogress"&&(d=c.shift()),d&&(b==="fx"&&c.unshift("inprogress"),f._data(a,b+".run",e),d.call(a,function(){f.dequeue(a,b
 )},e)),c.length||(f.removeData(a,b+"queue "+b+".run",!0),n(a,b,"queue"))}}),f.fn.extend({queue:function(a,c){typeof a!="string"&&(c=a,a="fx");if(c===b)return f.queue(this[0],a);return this.each(function(){var b=f.queue(this,a,c);a==="fx"&&b[0]!=="inprogress"&&f.dequeue(this,a)})},dequeue:function(a){return this.each(function(){f.dequeue(this,a)})},delay:function(a,b){a=f.fx?f.fx.speeds[a]||a:a,b=b||"fx";return this.queue(b,function(b,c){var d=setTimeout(b,a);c.stop=function(){clearTimeout(d)}})},clearQueue:function(a){return this.queue(a||"fx",[])},promise:function(a,c){function m(){--h||d.resolveWith(e,[e])}typeof a!="string"&&(c=a,a=b),a=a||"fx";var d=f.Deferred(),e=this,g=e.length,h=1,i=a+"defer",j=a+"queue",k=a+"mark",l;while(g--)if(l=f.data(e[g],i,b,!0)||(f.data(e[g],j,b,!0)||f.data(e[g],k,b,!0))&&f.data(e[g],i,f.Callbacks("once memory"),!0))h++,l.add(m);m();return d.promise()}});var o=/[\n\t\r]/g,p=/\s+/,q=/\r/g,r=/^(?:button|input)$/i,s=/^(?:button|input|object|select|textare
 a)$/i,t=/^a(?:rea)?$/i,u=/^(?:autofocus|autoplay|async|checked|controls|defer|disabled|hidden|loop|multiple|open|readonly|required|scoped|selected)$/i,v=f.support.getSetAttribute,w,x,y;f.fn.extend({attr:function(a,b){return f.access(this,a,b,!0,f.attr)},removeAttr:function(a){return this.each(function(){f.removeAttr(this,a)})},prop:function(a,b){return f.access(this,a,b,!0,f.prop)},removeProp:function(a){a=f.propFix[a]||a;return this.each(function(){try{this[a]=b,delete this[a]}catch(c){}})},addClass:function(a){var b,c,d,e,g,h,i;if(f.isFunction(a))return this.each(function(b){f(this).addClass(a.call(this,b,this.className))});if(a&&typeof a=="string"){b=a.split(p);for(c=0,d=this.length;c<d;c++){e=this[c];if(e.nodeType===1)if(!e.className&&b.length===1)e.className=a;else{g=" "+e.className+" ";for(h=0,i=b.length;h<i;h++)~g.indexOf(" "+b[h]+" ")||(g+=b[h]+" ");e.className=f.trim(g)}}}return this},removeClass:function(a){var c,d,e,g,h,i,j;if(f.isFunction(a))return this.each(function(b){
 f(this).removeClass(a.call(this,b,this.className))});if(a&&typeof a=="string"||a===b){c=(a||"").split(p);for(d=0,e=this.length;d<e;d++){g=this[d];if(g.nodeType===1&&g.className)if(a){h=(" "+g.className+" ").replace(o," ");for(i=0,j=c.length;i<j;i++)h=h.replace(" "+c[i]+" "," ");g.className=f.trim(h)}else g.className=""}}return this},toggleClass:function(a,b){var c=typeof a,d=typeof b=="boolean";if(f.isFunction(a))return this.each(function(c){f(this).toggleClass(a.call(this,c,this.className,b),b)});return this.each(function(){if(c==="string"){var e,g=0,h=f(this),i=b,j=a.split(p);while(e=j[g++])i=d?i:!h.hasClass(e),h[i?"addClass":"removeClass"](e)}else if(c==="undefined"||c==="boolean")this.className&&f._data(this,"__className__",this.className),this.className=this.className||a===!1?"":f._data(this,"__className__")||""})},hasClass:function(a){var b=" "+a+" ",c=0,d=this.length;for(;c<d;c++)if(this[c].nodeType===1&&(" "+this[c].className+" ").replace(o," ").indexOf(b)>-1)return!0;return
 !1},val:function(a){var c,d,e,g=this[0];{if(!!arguments.length){e=f.isFunction(a);return this.each(function(d){var g=f(this),h;if(this.nodeType===1){e?h=a.call(this,d,g.val()):h=a,h==null?h="":typeof h=="number"?h+="":f.isArray(h)&&(h=f.map(h,function(a){return a==null?"":a+""})),c=f.valHooks[this.nodeName.toLowerCase()]||f.valHooks[this.type];if(!c||!("set"in c)||c.set(this,h,"value")===b)this.value=h}})}if(g){c=f.valHooks[g.nodeName.toLowerCase()]||f.valHooks[g.type];if(c&&"get"in c&&(d=c.get(g,"value"))!==b)return d;d=g.value;return typeof d=="string"?d.replace(q,""):d==null?"":d}}}}),f.extend({valHooks:{option:{get:function(a){var b=a.attributes.value;return!b||b.specified?a.value:a.text}},select:{get:function(a){var b,c,d,e,g=a.selectedIndex,h=[],i=a.options,j=a.type==="select-one";if(g<0)return null;c=j?g:0,d=j?g+1:i.length;for(;c<d;c++){e=i[c];if(e.selected&&(f.support.optDisabled?!e.disabled:e.getAttribute("disabled")===null)&&(!e.parentNode.disabled||!f.nodeName(e.parentNod
 e,"optgroup"))){b=f(e).val();if(j)return b;h.push(b)}}if(j&&!h.length&&i.length)return f(i[g]).val();return h},set:function(a,b){var c=f.makeArray(b);f(a).find("option").each(function(){this.selected=f.inArray(f(this).val(),c)>=0}),c.length||(a.selectedIndex=-1);return c}}},attrFn:{val:!0,css:!0,html:!0,text:!0,data:!0,width:!0,height:!0,offset:!0},attr:function(a,c,d,e){var g,h,i,j=a.nodeType;if(!!a&&j!==3&&j!==8&&j!==2){if(e&&c in f.attrFn)return f(a)[c](d);if(typeof a.getAttribute=="undefined")return f.prop(a,c,d);i=j!==1||!f.isXMLDoc(a),i&&(c=c.toLowerCase(),h=f.attrHooks[c]||(u.test(c)?x:w));if(d!==b){if(d===null){f.removeAttr(a,c);return}if(h&&"set"in h&&i&&(g=h.set(a,d,c))!==b)return g;a.setAttribute(c,""+d);return d}if(h&&"get"in h&&i&&(g=h.get(a,c))!==null)return g;g=a.getAttribute(c);return g===null?b:g}},removeAttr:function(a,b){var c,d,e,g,h=0;if(b&&a.nodeType===1){d=b.toLowerCase().split(p),g=d.length;for(;h<g;h++)e=d[h],e&&(c=f.propFix[e]||e,f.attr(a,e,""),a.removeAttr
 ibute(v?e:c),u.test(e)&&c in a&&(a[c]=!1))}},attrHooks:{type:{set:function(a,b){if(r.test(a.nodeName)&&a.parentNode)f.error("type property can't be changed");else if(!f.support.radioValue&&b==="radio"&&f.nodeName(a,"input")){var c=a.value;a.setAttribute("type",b),c&&(a.value=c);return b}}},value:{get:function(a,b){if(w&&f.nodeName(a,"button"))return w.get(a,b);return b in a?a.value:null},set:function(a,b,c){if(w&&f.nodeName(a,"button"))return w.set(a,b,c);a.value=b}}},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(a,c,d){var e,g,h,i=a.nodeType;if(!!a&&i!==3&&i!==8&&i!==2){h=i!==1||!f.isXMLDoc(a),h&&(c=f.propFix[c]||c,g=f.propHooks[c]);return d!==b?g&&"set"in g&&(e=g.set(a,d,c))!==b?e:a[c]=d:g&&"get"in g&&(e=g.get(a,c))!==null?e:a[c]}},propHooks:{ta
 bIndex:{get:function(a){var c=a.getAttributeNode("tabindex");return c&&c.specified?parseInt(c.value,10):s.test(a.nodeName)||t.test(a.nodeName)&&a.href?0:b}}}}),f.attrHooks.tabindex=f.propHooks.tabIndex,x={get:function(a,c){var d,e=f.prop(a,c);return e===!0||typeof e!="boolean"&&(d=a.getAttributeNode(c))&&d.nodeValue!==!1?c.toLowerCase():b},set:function(a,b,c){var d;b===!1?f.removeAttr(a,c):(d=f.propFix[c]||c,d in a&&(a[d]=!0),a.setAttribute(c,c.toLowerCase()));return c}},v||(y={name:!0,id:!0},w=f.valHooks.button={get:function(a,c){var d;d=a.getAttributeNode(c);return d&&(y[c]?d.nodeValue!=="":d.specified)?d.nodeValue:b},set:function(a,b,d){var e=a.getAttributeNode(d);e||(e=c.createAttribute(d),a.setAttributeNode(e));return e.nodeValue=b+""}},f.attrHooks.tabindex.set=w.set,f.each(["width","height"],function(a,b){f.attrHooks[b]=f.extend(f.attrHooks[b],{set:function(a,c){if(c===""){a.setAttribute(b,"auto");return c}}})}),f.attrHooks.contenteditable={get:w.get,set:function(a,b,c){b===""
 &&(b="false"),w.set(a,b,c)}}),f.support.hrefNormalized||f.each(["href","src","width","height"],function(a,c){f.attrHooks[c]=f.extend(f.attrHooks[c],{get:function(a){var d=a.getAttribute(c,2);return d===null?b:d}})}),f.support.style||(f.attrHooks.style={get:function(a){return a.style.cssText.toLowerCase()||b},set:function(a,b){return a.style.cssText=""+b}}),f.support.optSelected||(f.propHooks.selected=f.extend(f.propHooks.selected,{get:function(a){var b=a.parentNode;b&&(b.selectedIndex,b.parentNode&&b.parentNode.selectedIndex);return null}})),f.support.enctype||(f.propFix.enctype="encoding"),f.support.checkOn||f.each(["radio","checkbox"],function(){f.valHooks[this]={get:function(a){return a.getAttribute("value")===null?"on":a.value}}}),f.each(["radio","checkbox"],function(){f.valHooks[this]=f.extend(f.valHooks[this],{set:function(a,b){if(f.isArray(b))return a.checked=f.inArray(f(a).val(),b)>=0}})});var z=/^(?:textarea|input|select)$/i,A=/^([^\.]*)?(?:\.(.+))?$/,B=/\bhover(\.\S+)?\b/,
 C=/^key/,D=/^(?:mouse|contextmenu)|click/,E=/^(?:focusinfocus|focusoutblur)$/,F=/^(\w*)(?:#([\w\-]+))?(?:\.([\w\-]+))?$/,G=function(a){var b=F.exec(a);b&&(b[1]=(b[1]||"").toLowerCase(),b[3]=b[3]&&new RegExp("(?:^|\\s)"+b[3]+"(?:\\s|$)"));return b},H=function(a,b){var c=a.attributes||{};return(!b[1]||a.nodeName.toLowerCase()===b[1])&&(!b[2]||(c.id||{}).value===b[2])&&(!b[3]||b[3].test((c["class"]||{}).value))},I=function(a){return f.event.special.hover?a:a.replace(B,"mouseenter$1 mouseleave$1")};
+f.event={add:function(a,c,d,e,g){var h,i,j,k,l,m,n,o,p,q,r,s;if(!(a.nodeType===3||a.nodeType===8||!c||!d||!(h=f._data(a)))){d.handler&&(p=d,d=p.handler),d.guid||(d.guid=f.guid++),j=h.events,j||(h.events=j={}),i=h.handle,i||(h.handle=i=function(a){return typeof f!="undefined"&&(!a||f.event.triggered!==a.type)?f.event.dispatch.apply(i.elem,arguments):b},i.elem=a),c=f.trim(I(c)).split(" ");for(k=0;k<c.length;k++){l=A.exec(c[k])||[],m=l[1],n=(l[2]||"").split(".").sort(),s=f.event.special[m]||{},m=(g?s.delegateType:s.bindType)||m,s=f.event.special[m]||{},o=f.extend({type:m,origType:l[1],data:e,handler:d,guid:d.guid,selector:g,quick:G(g),namespace:n.join(".")},p),r=j[m];if(!r){r=j[m]=[],r.delegateCount=0;if(!s.setup||s.setup.call(a,e,n,i)===!1)a.addEventListener?a.addEventListener(m,i,!1):a.attachEvent&&a.attachEvent("on"+m,i)}s.add&&(s.add.call(a,o),o.handler.guid||(o.handler.guid=d.guid)),g?r.splice(r.delegateCount++,0,o):r.push(o),f.event.global[m]=!0}a=null}},global:{},remove:function
 (a,b,c,d,e){var g=f.hasData(a)&&f._data(a),h,i,j,k,l,m,n,o,p,q,r,s;if(!!g&&!!(o=g.events)){b=f.trim(I(b||"")).split(" ");for(h=0;h<b.length;h++){i=A.exec(b[h])||[],j=k=i[1],l=i[2];if(!j){for(j in o)f.event.remove(a,j+b[h],c,d,!0);continue}p=f.event.special[j]||{},j=(d?p.delegateType:p.bindType)||j,r=o[j]||[],m=r.length,l=l?new RegExp("(^|\\.)"+l.split(".").sort().join("\\.(?:.*\\.)?")+"(\\.|$)"):null;for(n=0;n<r.length;n++)s=r[n],(e||k===s.origType)&&(!c||c.guid===s.guid)&&(!l||l.test(s.namespace))&&(!d||d===s.selector||d==="**"&&s.selector)&&(r.splice(n--,1),s.selector&&r.delegateCount--,p.remove&&p.remove.call(a,s));r.length===0&&m!==r.length&&((!p.teardown||p.teardown.call(a,l)===!1)&&f.removeEvent(a,j,g.handle),delete o[j])}f.isEmptyObject(o)&&(q=g.handle,q&&(q.elem=null),f.removeData(a,["events","handle"],!0))}},customEvent:{getData:!0,setData:!0,changeData:!0},trigger:function(c,d,e,g){if(!e||e.nodeType!==3&&e.nodeType!==8){var h=c.type||c,i=[],j,k,l,m,n,o,p,q,r,s;if(E.test(h+
 f.event.triggered))return;h.indexOf("!")>=0&&(h=h.slice(0,-1),k=!0),h.indexOf(".")>=0&&(i=h.split("."),h=i.shift(),i.sort());if((!e||f.event.customEvent[h])&&!f.event.global[h])return;c=typeof c=="object"?c[f.expando]?c:new f.Event(h,c):new f.Event(h),c.type=h,c.isTrigger=!0,c.exclusive=k,c.namespace=i.join("."),c.namespace_re=c.namespace?new RegExp("(^|\\.)"+i.join("\\.(?:.*\\.)?")+"(\\.|$)"):null,o=h.indexOf(":")<0?"on"+h:"";if(!e){j=f.cache;for(l in j)j[l].events&&j[l].events[h]&&f.event.trigger(c,d,j[l].handle.elem,!0);return}c.result=b,c.target||(c.target=e),d=d!=null?f.makeArray(d):[],d.unshift(c),p=f.event.special[h]||{};if(p.trigger&&p.trigger.apply(e,d)===!1)return;r=[[e,p.bindType||h]];if(!g&&!p.noBubble&&!f.isWindow(e)){s=p.delegateType||h,m=E.test(s+h)?e:e.parentNode,n=null;for(;m;m=m.parentNode)r.push([m,s]),n=m;n&&n===e.ownerDocument&&r.push([n.defaultView||n.parentWindow||a,s])}for(l=0;l<r.length&&!c.isPropagationStopped();l++)m=r[l][0],c.type=r[l][1],q=(f._data(m,"ev
 ents")||{})[c.type]&&f._data(m,"handle"),q&&q.apply(m,d),q=o&&m[o],q&&f.acceptData(m)&&q.apply(m,d)===!1&&c.preventDefault();c.type=h,!g&&!c.isDefaultPrevented()&&(!p._default||p._default.apply(e.ownerDocument,d)===!1)&&(h!=="click"||!f.nodeName(e,"a"))&&f.acceptData(e)&&o&&e[h]&&(h!=="focus"&&h!=="blur"||c.target.offsetWidth!==0)&&!f.isWindow(e)&&(n=e[o],n&&(e[o]=null),f.event.triggered=h,e[h](),f.event.triggered=b,n&&(e[o]=n));return c.result}},dispatch:function(c){c=f.event.fix(c||a.event);var d=(f._data(this,"events")||{})[c.type]||[],e=d.delegateCount,g=[].slice.call(arguments,0),h=!c.exclusive&&!c.namespace,i=[],j,k,l,m,n,o,p,q,r,s,t;g[0]=c,c.delegateTarget=this;if(e&&!c.target.disabled&&(!c.button||c.type!=="click")){m=f(this),m.context=this.ownerDocument||this;for(l=c.target;l!=this;l=l.parentNode||this){o={},q=[],m[0]=l;for(j=0;j<e;j++)r=d[j],s=r.selector,o[s]===b&&(o[s]=r.quick?H(l,r.quick):m.is(s)),o[s]&&q.push(r);q.length&&i.push({elem:l,matches:q})}}d.length>e&&i.push({
 elem:this,matches:d.slice(e)});for(j=0;j<i.length&&!c.isPropagationStopped();j++){p=i[j],c.currentTarget=p.elem;for(k=0;k<p.matches.length&&!c.isImmediatePropagationStopped();k++){r=p.matches[k];if(h||!c.namespace&&!r.namespace||c.namespace_re&&c.namespace_re.test(r.namespace))c.data=r.data,c.handleObj=r,n=((f.event.special[r.origType]||{}).handle||r.handler).apply(p.elem,g),n!==b&&(c.result=n,n===!1&&(c.preventDefault(),c.stopPropagation()))}}return c.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(a,b){a.which==null&&(a.which=b.charCode!=null?b.charCode:b.keyCode);return a}},mouseHooks:{props:"button buttons clientX clientY fromElement offsetX offsetY pageX pageY screenX screenY toElement".split(" "),filter:function(a,d){var e,f,g,h=d.button,i=d.fromElement;a.pa
 geX==null&&d.clientX!=null&&(e=a.target.ownerDocument||c,f=e.documentElement,g=e.body,a.pageX=d.clientX+(f&&f.scrollLeft||g&&g.scrollLeft||0)-(f&&f.clientLeft||g&&g.clientLeft||0),a.pageY=d.clientY+(f&&f.scrollTop||g&&g.scrollTop||0)-(f&&f.clientTop||g&&g.clientTop||0)),!a.relatedTarget&&i&&(a.relatedTarget=i===a.target?d.toElement:i),!a.which&&h!==b&&(a.which=h&1?1:h&2?3:h&4?2:0);return a}},fix:function(a){if(a[f.expando])return a;var d,e,g=a,h=f.event.fixHooks[a.type]||{},i=h.props?this.props.concat(h.props):this.props;a=f.Event(g);for(d=i.length;d;)e=i[--d],a[e]=g[e];a.target||(a.target=g.srcElement||c),a.target.nodeType===3&&(a.target=a.target.parentNode),a.metaKey===b&&(a.metaKey=a.ctrlKey);return h.filter?h.filter(a,g):a},special:{ready:{setup:f.bindReady},load:{noBubble:!0},focus:{delegateType:"focusin"},blur:{delegateType:"focusout"},beforeunload:{setup:function(a,b,c){f.isWindow(this)&&(this.onbeforeunload=c)},teardown:function(a,b){this.onbeforeunload===b&&(this.onbeforeun
 load=null)}}},simulate:function(a,b,c,d){var e=f.extend(new f.Event,c,{type:a,isSimulated:!0,originalEvent:{}});d?f.event.trigger(e,null,b):f.event.dispatch.call(b,e),e.isDefaultPrevented()&&c.preventDefault()}},f.event.handle=f.event.dispatch,f.removeEvent=c.removeEventListener?function(a,b,c){a.removeEventListener&&a.removeEventListener(b,c,!1)}:function(a,b,c){a.detachEvent&&a.detachEvent("on"+b,c)},f.Event=function(a,b){if(!(this instanceof f.Event))return new f.Event(a,b);a&&a.type?(this.originalEvent=a,this.type=a.type,this.isDefaultPrevented=a.defaultPrevented||a.returnValue===!1||a.getPreventDefault&&a.getPreventDefault()?K:J):this.type=a,b&&f.extend(this,b),this.timeStamp=a&&a.timeStamp||f.now(),this[f.expando]=!0},f.Event.prototype={preventDefault:function(){this.isDefaultPrevented=K;var a=this.originalEvent;!a||(a.preventDefault?a.preventDefault():a.returnValue=!1)},stopPropagation:function(){this.isPropagationStopped=K;var a=this.originalEvent;!a||(a.stopPropagation&&a.s
 topPropagation(),a.cancelBubble=!0)},stopImmediatePropagation:function(){this.isImmediatePropagationStopped=K,this.stopPropagation()},isDefaultPrevented:J,isPropagationStopped:J,isImmediatePropagationStopped:J},f.each({mouseenter:"mouseover",mouseleave:"mouseout"},function(a,b){f.event.special[a]={delegateType:b,bindType:b,handle:function(a){var c=this,d=a.relatedTarget,e=a.handleObj,g=e.selector,h;if(!d||d!==c&&!f.contains(c,d))a.type=e.origType,h=e.handler.apply(this,arguments),a.type=b;return h}}}),f.support.submitBubbles||(f.event.special.submit={setup:function(){if(f.nodeName(this,"form"))return!1;f.event.add(this,"click._submit keypress._submit",function(a){var c=a.target,d=f.nodeName(c,"input")||f.nodeName(c,"button")?c.form:b;d&&!d._submit_attached&&(f.event.add(d,"submit._submit",function(a){this.parentNode&&!a.isTrigger&&f.event.simulate("submit",this.parentNode,a,!0)}),d._submit_attached=!0)})},teardown:function(){if(f.nodeName(this,"form"))return!1;f.event.remove(this,".
 _submit")}}),f.support.changeBubbles||(f.event.special.change={setup:function(){if(z.test(this.nodeName)){if(this.type==="checkbox"||this.type==="radio")f.event.add(this,"propertychange._change",function(a){a.originalEvent.propertyName==="checked"&&(this._just_changed=!0)}),f.event.add(this,"click._change",function(a){this._just_changed&&!a.isTrigger&&(this._just_changed=!1,f.event.simulate("change",this,a,!0))});return!1}f.event.add(this,"beforeactivate._change",function(a){var b=a.target;z.test(b.nodeName)&&!b._change_attached&&(f.event.add(b,"change._change",function(a){this.parentNode&&!a.isSimulated&&!a.isTrigger&&f.event.simulate("change",this.parentNode,a,!0)}),b._change_attached=!0)})},handle:function(a){var b=a.target;if(this!==b||a.isSimulated||a.isTrigger||b.type!=="radio"&&b.type!=="checkbox")return a.handleObj.handler.apply(this,arguments)},teardown:function(){f.event.remove(this,"._change");return z.test(this.nodeName)}}),f.support.focusinBubbles||f.each({focus:"focusi
 n",blur:"focusout"},function(a,b){var d=0,e=function(a){f.event.simulate(b,a.target,f.event.fix(a),!0)};f.event.special[b]={setup:function(){d++===0&&c.addEventListener(a,e,!0)},teardown:function(){--d===0&&c.removeEventListener(a,e,!0)}}}),f.fn.extend({on:function(a,c,d,e,g){var h,i;if(typeof a=="object"){typeof c!="string"&&(d=c,c=b);for(i in a)this.on(i,c,d,a[i],g);return this}d==null&&e==null?(e=c,d=c=b):e==null&&(typeof c=="string"?(e=d,d=b):(e=d,d=c,c=b));if(e===!1)e=J;else if(!e)return this;g===1&&(h=e,e=function(a){f().off(a);return h.apply(this,arguments)},e.guid=h.guid||(h.guid=f.guid++));return this.each(function(){f.event.add(this,a,e,d,c)})},one:function(a,b,c,d){return this.on.call(this,a,b,c,d,1)},off:function(a,c,d){if(a&&a.preventDefault&&a.handleObj){var e=a.handleObj;f(a.delegateTarget).off(e.namespace?e.type+"."+e.namespace:e.type,e.selector,e.handler);return this}if(typeof a=="object"){for(var g in a)this.off(g,c,a[g]);return this}if(c===!1||typeof c=="function"
 )d=c,c=b;d===!1&&(d=J);return this.each(function(){f.event.remove(this,a,d,c)})},bind:function(a,b,c){return this.on(a,null,b,c)},unbind:function(a,b){return this.off(a,null,b)},live:function(a,b,c){f(this.context).on(a,this.selector,b,c);return this},die:function(a,b){f(this.context).off(a,this.selector||"**",b);return this},delegate:function(a,b,c,d){return this.on(b,a,c,d)},undelegate:function(a,b,c){return arguments.length==1?this.off(a,"**"):this.off(b,a,c)},trigger:function(a,b){return this.each(function(){f.event.trigger(a,b,this)})},triggerHandler:function(a,b){if(this[0])return f.event.trigger(a,b,this[0],!0)},toggle:function(a){var b=arguments,c=a.guid||f.guid++,d=0,e=function(c){var e=(f._data(this,"lastToggle"+a.guid)||0)%d;f._data(this,"lastToggle"+a.guid,e+1),c.preventDefault();return b[e].apply(this,arguments)||!1};e.guid=c;while(d<b.length)b[d++].guid=c;return this.click(e)},hover:function(a,b){return this.mouseenter(a).mouseleave(b||a)}}),f.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(a,b){f.fn[b]=function(a,c){c==null&&(c=a,a=null);return arguments.length>0?this.on(b,null,a,c):this.trigger(b)},f.attrFn&&(f.attrFn[b]=!0),C.test(b)&&(f.event.fixHooks[b]=f.event.keyHooks),D.test(b)&&(f.event.fixHooks[b]=f.event.mouseHooks)}),function(){function x(a,b,c,e,f,g){for(var h=0,i=e.length;h<i;h++){var j=e[h];if(j){var k=!1;j=j[a];while(j){if(j[d]===c){k=e[j.sizset];break}if(j.nodeType===1){g||(j[d]=c,j.sizset=h);if(typeof b!="string"){if(j===b){k=!0;break}}else if(m.filter(b,[j]).length>0){k=j;break}}j=j[a]}e[h]=k}}}function w(a,b,c,e,f,g){for(var h=0,i=e.length;h<i;h++){var j=e[h];if(j){var k=!1;j=j[a];while(j){if(j[d]===c){k=e[j.sizset];break}j.nodeType===1&&!g&&(j[d]=c,j.sizset=h);if(j.nodeName.toLowerCase()===b){k=j;break}j=j[a]}e[h]=k}}}var a=/((?:\((?:\([^()]+\)|[^()]
 +)+\)|\[(?:\[[^\[\]]*\]|['"][^'"]*['"]|[^\[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g,d="sizcache"+(Math.random()+"").replace(".",""),e=0,g=Object.prototype.toString,h=!1,i=!0,j=/\\/g,k=/\r\n/g,l=/\W/;[0,0].sort(function(){i=!1;return 0});var m=function(b,d,e,f){e=e||[],d=d||c;var h=d;if(d.nodeType!==1&&d.nodeType!==9)return[];if(!b||typeof b!="string")return e;var i,j,k,l,n,q,r,t,u=!0,v=m.isXML(d),w=[],x=b;do{a.exec(""),i=a.exec(x);if(i){x=i[3],w.push(i[1]);if(i[2]){l=i[3];break}}}while(i);if(w.length>1&&p.exec(b))if(w.length===2&&o.relative[w[0]])j=y(w[0]+w[1],d,f);else{j=o.relative[w[0]]?[d]:m(w.shift(),d);while(w.length)b=w.shift(),o.relative[b]&&(b+=w.shift()),j=y(b,j,f)}else{!f&&w.length>1&&d.nodeType===9&&!v&&o.match.ID.test(w[0])&&!o.match.ID.test(w[w.length-1])&&(n=m.find(w.shift(),d,v),d=n.expr?m.filter(n.expr,n.set)[0]:n.set[0]);if(d){n=f?{expr:w.pop(),set:s(f)}:m.find(w.pop(),w.length===1&&(w[0]==="~"||w[0]==="+")&&d.parentNode?d.parentNode:d,v),j=n
 .expr?m.filter(n.expr,n.set):n.set,w.length>0?k=s(j):u=!1;while(w.length)q=w.pop(),r=q,o.relative[q]?r=w.pop():q="",r==null&&(r=d),o.relative[q](k,r,v)}else k=w=[]}k||(k=j),k||m.error(q||b);if(g.call(k)==="[object Array]")if(!u)e.push.apply(e,k);else if(d&&d.nodeType===1)for(t=0;k[t]!=null;t++)k[t]&&(k[t]===!0||k[t].nodeType===1&&m.contains(d,k[t]))&&e.push(j[t]);else for(t=0;k[t]!=null;t++)k[t]&&k[t].nodeType===1&&e.push(j[t]);else s(k,e);l&&(m(l,h,e,f),m.uniqueSort(e));return e};m.uniqueSort=function(a){if(u){h=i,a.sort(u);if(h)for(var b=1;b<a.length;b++)a[b]===a[b-1]&&a.splice(b--,1)}return a},m.matches=function(a,b){return m(a,null,null,b)},m.matchesSelector=function(a,b){return m(b,null,null,[a]).length>0},m.find=function(a,b,c){var d,e,f,g,h,i;if(!a)return[];for(e=0,f=o.order.length;e<f;e++){h=o.order[e];if(g=o.leftMatch[h].exec(a)){i=g[1],g.splice(1,1);if(i.substr(i.length-1)!=="\\"){g[1]=(g[1]||"").replace(j,""),d=o.find[h](g,b,c);if(d!=null){a=a.replace(o.match[h],"");break
 }}}}d||(d=typeof b.getElementsByTagName!="undefined"?b.getElementsByTagName("*"):[]);return{set:d,expr:a}},m.filter=function(a,c,d,e){var f,g,h,i,j,k,l,n,p,q=a,r=[],s=c,t=c&&c[0]&&m.isXML(c[0]);while(a&&c.length){for(h in o.filter)if((f=o.leftMatch[h].exec(a))!=null&&f[2]){k=o.filter[h],l=f[1],g=!1,f.splice(1,1);if(l.substr(l.length-1)==="\\")continue;s===r&&(r=[]);if(o.preFilter[h]){f=o.preFilter[h](f,s,d,r,e,t);if(!f)g=i=!0;else if(f===!0)continue}if(f)for(n=0;(j=s[n])!=null;n++)j&&(i=k(j,f,n,s),p=e^i,d&&i!=null?p?g=!0:s[n]=!1:p&&(r.push(j),g=!0));if(i!==b){d||(s=r),a=a.replace(o.match[h],"");if(!g)return[];break}}if(a===q)if(g==null)m.error(a);else break;q=a}return s},m.error=function(a){throw new Error("Syntax error, unrecognized expression: "+a)};var n=m.getText=function(a){var b,c,d=a.nodeType,e="";if(d){if(d===1||d===9){if(typeof a.textContent=="string")return a.textContent;if(typeof a.innerText=="string")return a.innerText.replace(k,"");for(a=a.firstChild;a;a=a.nextSibling)e
 +=n(a)}else if(d===3||d===4)return a.nodeValue}else for(b=0;c=a[b];b++)c.nodeType!==8&&(e+=n(c));return e},o=m.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(a){return a.getAttribute("href")},type:function(a){return a.getAttribute("type")}},relative:{"+":function(a,b){var c=typeof b=="string",d=c&&!l.test(b),e=c&&!d;d&&(b=b.toLowerCase());for(var f=0,g=a.len
 gth,h;f<g;f++)if(h=a[f]){while((h=h.previousSibling)&&h.nodeType!==1);a[f]=e||h&&h.nodeName.toLowerCase()===b?h||!1:h===b}e&&m.filter(b,a,!0)},">":function(a,b){var c,d=typeof b=="string",e=0,f=a.length;if(d&&!l.test(b)){b=b.toLowerCase();for(;e<f;e++){c=a[e];if(c){var g=c.parentNode;a[e]=g.nodeName.toLowerCase()===b?g:!1}}}else{for(;e<f;e++)c=a[e],c&&(a[e]=d?c.parentNode:c.parentNode===b);d&&m.filter(b,a,!0)}},"":function(a,b,c){var d,f=e++,g=x;typeof b=="string"&&!l.test(b)&&(b=b.toLowerCase(),d=b,g=w),g("parentNode",b,f,a,d,c)},"~":function(a,b,c){var d,f=e++,g=x;typeof b=="string"&&!l.test(b)&&(b=b.toLowerCase(),d=b,g=w),g("previousSibling",b,f,a,d,c)}},find:{ID:function(a,b,c){if(typeof b.getElementById!="undefined"&&!c){var d=b.getElementById(a[1]);return d&&d.parentNode?[d]:[]}},NAME:function(a,b){if(typeof b.getElementsByName!="undefined"){var c=[],d=b.getElementsByName(a[1]);for(var e=0,f=d.length;e<f;e++)d[e].getAttribute("name")===a[1]&&c.push(d[e]);return c.length===0?nu
 ll:c}},TAG:function(a,b){if(typeof b.getElementsByTagName!="undefined")return b.getElementsByTagName(a[1])}},preFilter:{CLASS:function(a,b,c,d,e,f){a=" "+a[1].replace(j,"")+" ";if(f)return a;for(var g=0,h;(h=b[g])!=null;g++)h&&(e^(h.className&&(" "+h.className+" ").replace(/[\t\n\r]/g," ").indexOf(a)>=0)?c||d.push(h):c&&(b[g]=!1));return!1},ID:function(a){return a[1].replace(j,"")},TAG:function(a,b){return a[1].replace(j,"").toLowerCase()},CHILD:function(a){if(a[1]==="nth"){a[2]||m.error(a[0]),a[2]=a[2].replace(/^\+|\s*/g,"");var b=/(-?)(\d*)(?:n([+\-]?\d*))?/.exec(a[2]==="even"&&"2n"||a[2]==="odd"&&"2n+1"||!/\D/.test(a[2])&&"0n+"+a[2]||a[2]);a[2]=b[1]+(b[2]||1)-0,a[3]=b[3]-0}else a[2]&&m.error(a[0]);a[0]=e++;return a},ATTR:function(a,b,c,d,e,f){var g=a[1]=a[1].replace(j,"");!f&&o.attrMap[g]&&(a[1]=o.attrMap[g]),a[4]=(a[4]||a[5]||"").replace(j,""),a[2]==="~="&&(a[4]=" "+a[4]+" ");return a},PSEUDO:function(b,c,d,e,f){if(b[1]==="not")if((a.exec(b[3])||"").length>1||/^\w/.test(b[3]))b[
 3]=m(b[3],null,null,c);else{var g=m.filter(b[3],c,d,!0^f);d||e.push.apply(e,g);return!1}else if(o.match.POS.test(b[0])||o.match.CHILD.test(b[0]))return!0;return b},POS:function(a){a.unshift(!0);return a}},filters:{enabled:function(a){return a.disabled===!1&&a.type!=="hidden"},disabled:function(a){return a.disabled===!0},checked:function(a){return a.checked===!0},selected:function(a){a.parentNode&&a.parentNode.selectedIndex;return a.selected===!0},parent:function(a){return!!a.firstChild},empty:function(a){return!a.firstChild},has:function(a,b,c){return!!m(c[3],a).length},header:function(a){return/h\d/i.test(a.nodeName)},text:function(a){var b=a.getAttribute("type"),c=a.type;return a.nodeName.toLowerCase()==="input"&&"text"===c&&(b===c||b===null)},radio:function(a){return a.nodeName.toLowerCase()==="input"&&"radio"===a.type},checkbox:function(a){return a.nodeName.toLowerCase()==="input"&&"checkbox"===a.type},file:function(a){return a.nodeName.toLowerCase()==="input"&&"file"===a.type},
 password:function(a){return a.nodeName.toLowerCase()==="input"&&"password"===a.type},submit:function(a){var b=a.nodeName.toLowerCase();return(b==="input"||b==="button")&&"submit"===a.type},image:function(a){return a.nodeName.toLowerCase()==="input"&&"image"===a.type},reset:function(a){var b=a.nodeName.toLowerCase();return(b==="input"||b==="button")&&"reset"===a.type},button:function(a){var b=a.nodeName.toLowerCase();return b==="input"&&"button"===a.type||b==="button"},input:function(a){return/input|select|textarea|button/i.test(a.nodeName)},focus:function(a){return a===a.ownerDocument.activeElement}},setFilters:{first:function(a,b){return b===0},last:function(a,b,c,d){return b===d.length-1},even:function(a,b){return b%2===0},odd:function(a,b){return b%2===1},lt:function(a,b,c){return b<c[3]-0},gt:function(a,b,c){return b>c[3]-0},nth:function(a,b,c){return c[3]-0===b},eq:function(a,b,c){return c[3]-0===b}},filter:{PSEUDO:function(a,b,c,d){var e=b[1],f=o.filters[e];if(f)return f(a,c,b
 ,d);if(e==="contains")return(a.textContent||a.innerText||n([a])||"").indexOf(b[3])>=0;if(e==="not"){var g=b[3];for(var h=0,i=g.length;h<i;h++)if(g[h]===a)return!1;return!0}m.error(e)},CHILD:function(a,b){var c,e,f,g,h,i,j,k=b[1],l=a;switch(k){case"only":case"first":while(l=l.previousSibling)if(l.nodeType===1)return!1;if(k==="first")return!0;l=a;case"last":while(l=l.nextSibling)if(l.nodeType===1)return!1;return!0;case"nth":c=b[2],e=b[3];if(c===1&&e===0)return!0;f=b[0],g=a.parentNode;if(g&&(g[d]!==f||!a.nodeIndex)){i=0;for(l=g.firstChild;l;l=l.nextSibling)l.nodeType===1&&(l.nodeIndex=++i);g[d]=f}j=a.nodeIndex-e;return c===0?j===0:j%c===0&&j/c>=0}},ID:function(a,b){return a.nodeType===1&&a.getAttribute("id")===b},TAG:function(a,b){return b==="*"&&a.nodeType===1||!!a.nodeName&&a.nodeName.toLowerCase()===b},CLASS:function(a,b){return(" "+(a.className||a.getAttribute("class"))+" ").indexOf(b)>-1},ATTR:function(a,b){var c=b[1],d=m.attr?m.attr(a,c):o.attrHandle[c]?o.attrHandle[c](a):a[c]!=n
 ull?a[c]:a.getAttribute(c),e=d+"",f=b[2],g=b[4];return d==null?f==="!=":!f&&m.attr?d!=null:f==="="?e===g:f==="*="?e.indexOf(g)>=0:f==="~="?(" "+e+" ").indexOf(g)>=0:g?f==="!="?e!==g:f==="^="?e.indexOf(g)===0:f==="$="?e.substr(e.length-g.length)===g:f==="|="?e===g||e.substr(0,g.length+1)===g+"-":!1:e&&d!==!1},POS:function(a,b,c,d){var e=b[2],f=o.setFilters[e];if(f)return f(a,c,b,d)}}},p=o.match.POS,q=function(a,b){return"\\"+(b-0+1)};for(var r in o.match)o.match[r]=new RegExp(o.match[r].source+/(?![^\[]*\])(?![^\(]*\))/.source),o.leftMatch[r]=new RegExp(/(^(?:.|\r|\n)*?)/.source+o.match[r].source.replace(/\\(\d+)/g,q));var s=function(a,b){a=Array.prototype.slice.call(a,0);if(b){b.push.apply(b,a);return b}return a};try{Array.prototype.slice.call(c.documentElement.childNodes,0)[0].nodeType}catch(t){s=function(a,b){var c=0,d=b||[];if(g.call(a)==="[object Array]")Array.prototype.push.apply(d,a);else if(typeof a.length=="number")for(var e=a.length;c<e;c++)d.push(a[c]);else for(;a[c];c++)d
 .push(a[c]);return d}}var u,v;c.documentElement.compareDocumentPosition?u=function(a,b){if(a===b){h=!0;return 0}if(!a.compareDocumentPosition||!b.compareDocumentPosition)return a.compareDocumentPosition?-1:1;return a.compareDocumentPosition(b)&4?-1:1}:(u=function(a,b){if(a===b){h=!0;return 0}if(a.sourceIndex&&b.sourceIndex)return a.sourceIndex-b.sourceIndex;var c,d,e=[],f=[],g=a.parentNode,i=b.parentNode,j=g;if(g===i)return v(a,b);if(!g)return-1;if(!i)return 1;while(j)e.unshift(j),j=j.parentNode;j=i;while(j)f.unshift(j),j=j.parentNode;c=e.length,d=f.length;for(var k=0;k<c&&k<d;k++)if(e[k]!==f[k])return v(e[k],f[k]);return k===c?v(a,f[k],-1):v(e[k],b,1)},v=function(a,b,c){if(a===b)return c;var d=a.nextSibling;while(d){if(d===b)return-1;d=d.nextSibling}return 1}),function(){var a=c.createElement("div"),d="script"+(new Date).getTime(),e=c.documentElement;a.innerHTML="<a name='"+d+"'/>",e.insertBefore(a,e.firstChild),c.getElementById(d)&&(o.find.ID=function(a,c,d){if(typeof c.getElement
 ById!="undefined"&&!d){var e=c.getElementById(a[1]);return e?e.id===a[1]||typeof e.getAttributeNode!="undefined"&&e.getAttributeNode("id").nodeValue===a[1]?[e]:b:[]}},o.filter.ID=function(a,b){var c=typeof a.getAttributeNode!="undefined"&&a.getAttributeNode("id");return a.nodeType===1&&c&&c.nodeValue===b}),e.removeChild(a),e=a=null}(),function(){var a=c.createElement("div");a.appendChild(c.createComment("")),a.getElementsByTagName("*").length>0&&(o.find.TAG=function(a,b){var c=b.getElementsByTagName(a[1]);if(a[1]==="*"){var d=[];for(var e=0;c[e];e++)c[e].nodeType===1&&d.push(c[e]);c=d}return c}),a.innerHTML="<a href='#'></a>",a.firstChild&&typeof a.firstChild.getAttribute!="undefined"&&a.firstChild.getAttribute("href")!=="#"&&(o.attrHandle.href=function(a){return a.getAttribute("href",2)}),a=null}(),c.querySelectorAll&&function(){var a=m,b=c.createElement("div"),d="__sizzle__";b.innerHTML="<p class='TEST'></p>";if(!b.querySelectorAll||b.querySelectorAll(".TEST").length!==0){m=functi
 on(b,e,f,g){e=e||c;if(!g&&!m.isXML(e)){var h=/^(\w+$)|^\.([\w\-]+$)|^#([\w\-]+$)/.exec(b);if(h&&(e.nodeType===1||e.nodeType===9)){if(h[1])return s(e.getElementsByTagName(b),f);if(h[2]&&o.find.CLASS&&e.getElementsByClassName)return s(e.getElementsByClassName(h[2]),f)}if(e.nodeType===9){if(b==="body"&&e.body)return s([e.body],f);if(h&&h[3]){var i=e.getElementById(h[3]);if(!i||!i.parentNode)return s([],f);if(i.id===h[3])return s([i],f)}try{return s(e.querySelectorAll(b),f)}catch(j){}}else if(e.nodeType===1&&e.nodeName.toLowerCase()!=="object"){var k=e,l=e.getAttribute("id"),n=l||d,p=e.parentNode,q=/^\s*[+~]/.test(b);l?n=n.replace(/'/g,"\\$&"):e.setAttribute("id",n),q&&p&&(e=e.parentNode);try{if(!q||p)return s(e.querySelectorAll("[id='"+n+"'] "+b),f)}catch(r){}finally{l||k.removeAttribute("id")}}}return a(b,e,f,g)};for(var e in a)m[e]=a[e];b=null}}(),function(){var a=c.documentElement,b=a.matchesSelector||a.mozMatchesSelector||a.webkitMatchesSelector||a.msMatchesSelector;if(b){var d=!b.
 call(c.createElement("div"),"div"),e=!1;try{b.call(c.documentElement,"[test!='']:sizzle")}catch(f){e=!0}m.matchesSelector=function(a,c){c=c.replace(/\=\s*([^'"\]]*)\s*\]/g,"='$1']");if(!m.isXML(a))try{if(e||!o.match.PSEUDO.test(c)&&!/!=/.test(c)){var f=b.call(a,c);if(f||!d||a.document&&a.document.nodeType!==11)return f}}catch(g){}return m(c,null,null,[a]).length>0}}}(),function(){var a=c.createElement("div");a.innerHTML="<div class='test e'></div><div class='test'></div>";if(!!a.getElementsByClassName&&a.getElementsByClassName("e").length!==0){a.lastChild.className="e";if(a.getElementsByClassName("e").length===1)return;o.order.splice(1,0,"CLASS"),o.find.CLASS=function(a,b,c){if(typeof b.getElementsByClassName!="undefined"&&!c)return b.getElementsByClassName(a[1])},a=null}}(),c.documentElement.contains?m.contains=function(a,b){return a!==b&&(a.contains?a.contains(b):!0)}:c.documentElement.compareDocumentPosition?m.contains=function(a,b){return!!(a.compareDocumentPosition(b)&16)}:m.co
 ntains=function(){return!1},m.isXML=function(a){var b=(a?a.ownerDocument||a:0).documentElement;return b?b.nodeName!=="HTML":!1};var y=function(a,b,c){var d,e=[],f="",g=b.nodeType?[b]:b;while(d=o.match.PSEUDO.exec(a))f+=d[0],a=a.replace(o.match.PSEUDO,"");a=o.relative[a]?a+"*":a;for(var h=0,i=g.length;h<i;h++)m(a,g[h],e,c);return m.filter(f,e)};m.attr=f.attr,m.selectors.attrMap={},f.find=m,f.expr=m.selectors,f.expr[":"]=f.expr.filters,f.unique=m.uniqueSort,f.text=m.getText,f.isXMLDoc=m.isXML,f.contains=m.contains}();var L=/Until$/,M=/^(?:parents|prevUntil|prevAll)/,N=/,/,O=/^.[^:#\[\.,]*$/,P=Array.prototype.slice,Q=f.expr.match.POS,R={children:!0,contents:!0,next:!0,prev:!0};f.fn.extend({find:function(a){var b=this,c,d;if(typeof a!="string")return f(a).filter(function(){for(c=0,d=b.length;c<d;c++)if(f.contains(b[c],this))return!0});var e=this.pushStack("","find",a),g,h,i;for(c=0,d=this.length;c<d;c++){g=e.length,f.find(a,this[c],e);if(c>0)for(h=g;h<e.length;h++)for(i=0;i<g;i++)if(e[i
 ]===e[h]){e.splice(h--,1);break}}return e},has:function(a){var b=f(a);return this.filter(function(){for(var a=0,c=b.length;a<c;a++)if(f.contains(this,b[a]))return!0})},not:function(a){return this.pushStack(T(this,a,!1),"not",a)},filter:function(a){return this.pushStack(T(this,a,!0),"filter",a)},is:function(a){return!!a&&(typeof a=="string"?Q.test(a)?f(a,this.context).index(this[0])>=0:f.filter(a,this).length>0:this.filter(a).length>0)},closest:function(a,b){var c=[],d,e,g=this[0];if(f.isArray(a)){var h=1;while(g&&g.ownerDocument&&g!==b){for(d=0;d<a.length;d++)f(g).is(a[d])&&c.push({selector:a[d],elem:g,level:h});g=g.parentNode,h++}return c}var i=Q.test(a)||typeof a!="string"?f(a,b||this.context):0;for(d=0,e=this.length;d<e;d++){g=this[d];while(g){if(i?i.index(g)>-1:f.find.matchesSelector(g,a)){c.push(g);break}g=g.parentNode;if(!g||!g.ownerDocument||g===b||g.nodeType===11)break}}c=c.length>1?f.unique(c):c;return this.pushStack(c,"closest",a)},index:function(a){if(!a)return this[0]&&t
 his[0].parentNode?this.prevAll().length:-1;if(typeof a=="string")return f.inArray(this[0],f(a));return f.inArray(a.jquery?a[0]:a,this)},add:function(a,b){var c=typeof a=="string"?f(a,b):f.makeArray(a&&a.nodeType?[a]:a),d=f.merge(this.get(),c);return this.pushStack(S(c[0])||S(d[0])?d:f.unique(d))},andSelf:function(){return this.add(this.prevObject)}}),f.each({parent:function(a){var b=a.parentNode;return b&&b.nodeType!==11?b:null},parents:function(a){return f.dir(a,"parentNode")},parentsUntil:function(a,b,c){return f.dir(a,"parentNode",c)},next:function(a){return f.nth(a,2,"nextSibling")},prev:function(a){return f.nth(a,2,"previousSibling")},nextAll:function(a){return f.dir(a,"nextSibling")},prevAll:function(a){return f.dir(a,"previousSibling")},nextUntil:function(a,b,c){return f.dir(a,"nextSibling",c)},prevUntil:function(a,b,c){return f.dir(a,"previousSibling",c)},siblings:function(a){return f.sibling(a.parentNode.firstChild,a)},children:function(a){return f.sibling(a.firstChild)},co
 ntents:function(a){return f.nodeName(a,"iframe")?a.contentDocument||a.contentWindow.document:f.makeArray(a.childNodes)}},function(a,b){f.fn[a]=function(c,d){var e=f.map(this,b,c);L.test(a)||(d=c),d&&typeof d=="string"&&(e=f.filter(d,e)),e=this.length>1&&!R[a]?f.unique(e):e,(this.length>1||N.test(d))&&M.test(a)&&(e=e.reverse());return this.pushStack(e,a,P.call(arguments).join(","))}}),f.extend({filter:function(a,b,c){c&&(a=":not("+a+")");return b.length===1?f.find.matchesSelector(b[0],a)?[b[0]]:[]:f.find.matches(a,b)},dir:function(a,c,d){var e=[],g=a[c];while(g&&g.nodeType!==9&&(d===b||g.nodeType!==1||!f(g).is(d)))g.nodeType===1&&e.push(g),g=g[c];return e},nth:function(a,b,c,d){b=b||1;var e=0;for(;a;a=a[c])if(a.nodeType===1&&++e===b)break;return a},sibling:function(a,b){var c=[];for(;a;a=a.nextSibling)a.nodeType===1&&a!==b&&c.push(a);return c}});var V="abbr|article|aside|audio|canvas|datalist|details|figcaption|figure|footer|header|hgroup|mark|meter|nav|output|progress|section|summar
 y|time|video",W=/ jQuery\d+="(?:\d+|null)"/g,X=/^\s+/,Y=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/ig,Z=/<([\w:]+)/,$=/<tbody/i,_=/<|&#?\w+;/,ba=/<(?:script|style)/i,bb=/<(?:script|object|embed|option|style)/i,bc=new RegExp("<(?:"+V+")","i"),bd=/checked\s*(?:[^=]|=\s*.checked.)/i,be=/\/(java|ecma)script/i,bf=/^\s*<!(?:\[CDATA\[|\-\-)/,bg={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,"",""]},bh=U(c);bg.optgroup=bg.option,bg.tbody=bg.tfoot=bg.colgroup=bg.caption=bg.thead,bg.th=bg.td,f.support.htmlSerialize||(bg._default=[1,"div<div>","</div>"]),f.fn.extend({text:function(a){if(f.isFunction(a))return this.each(function(b){var c=f(this);c.text(a.call(this,b,c.text()))});if(typeof a!="obje
 ct"&&a!==b)return this.empty().append((this[0]&&this[0].ownerDocument||c).createTextNode(a));return f.text(this)},wrapAll:function(a){if(f.isFunction(a))return this.each(function(b){f(this).wrapAll(a.call(this,b))});if(this[0]){var b=f(a,this[0].ownerDocument).eq(0).clone(!0);this[0].parentNode&&b.insertBefore(this[0]),b.map(function(){var a=this;while(a.firstChild&&a.firstChild.nodeType===1)a=a.firstChild;return a}).append(this)}return this},wrapInner:function(a){if(f.isFunction(a))return this.each(function(b){f(this).wrapInner(a.call(this,b))});return this.each(function(){var b=f(this),c=b.contents();c.length?c.wrapAll(a):b.append(a)})},wrap:function(a){var b=f.isFunction(a);return this.each(function(c){f(this).wrapAll(b?a.call(this,c):a)})},unwrap:function(){return this.parent().each(function(){f.nodeName(this,"body")||f(this).replaceWith(this.childNodes)}).end()},append:function(){return this.domManip(arguments,!0,function(a){this.nodeType===1&&this.appendChild(a)})},prepend:fun
 ction(){return this.domManip(arguments,!0,function(a){this.nodeType===1&&this.insertBefore(a,this.firstChild)})},before:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,!1,function(a){this.parentNode.insertBefore(a,this)});if(arguments.length){var a=f.clean(arguments);a.push.apply(a,this.toArray());return this.pushStack(a,"before",arguments)}},after:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,!1,function(a){this.parentNode.insertBefore(a,this.nextSibling)});if(arguments.length){var a=this.pushStack(this,"after",arguments);a.push.apply(a,f.clean(arguments));return a}},remove:function(a,b){for(var c=0,d;(d=this[c])!=null;c++)if(!a||f.filter(a,[d]).length)!b&&d.nodeType===1&&(f.cleanData(d.getElementsByTagName("*")),f.cleanData([d])),d.parentNode&&d.parentNode.removeChild(d);return this},empty:function()
+{for(var a=0,b;(b=this[a])!=null;a++){b.nodeType===1&&f.cleanData(b.getElementsByTagName("*"));while(b.firstChild)b.removeChild(b.firstChild)}return this},clone:function(a,b){a=a==null?!1:a,b=b==null?a:b;return this.map(function(){return f.clone(this,a,b)})},html:function(a){if(a===b)return this[0]&&this[0].nodeType===1?this[0].innerHTML.replace(W,""):null;if(typeof a=="string"&&!ba.test(a)&&(f.support.leadingWhitespace||!X.test(a))&&!bg[(Z.exec(a)||["",""])[1].toLowerCase()]){a=a.replace(Y,"<$1></$2>");try{for(var c=0,d=this.length;c<d;c++)this[c].nodeType===1&&(f.cleanData(this[c].getElementsByTagName("*")),this[c].innerHTML=a)}catch(e){this.empty().append(a)}}else f.isFunction(a)?this.each(function(b){var c=f(this);c.html(a.call(this,b,c.html()))}):this.empty().append(a);return this},replaceWith:function(a){if(this[0]&&this[0].parentNode){if(f.isFunction(a))return this.each(function(b){var c=f(this),d=c.html();c.replaceWith(a.call(this,b,d))});typeof a!="string"&&(a=f(a).detach()
 );return this.each(function(){var b=this.nextSibling,c=this.parentNode;f(this).remove(),b?f(b).before(a):f(c).append(a)})}return this.length?this.pushStack(f(f.isFunction(a)?a():a),"replaceWith",a):this},detach:function(a){return this.remove(a,!0)},domManip:function(a,c,d){var e,g,h,i,j=a[0],k=[];if(!f.support.checkClone&&arguments.length===3&&typeof j=="string"&&bd.test(j))return this.each(function(){f(this).domManip(a,c,d,!0)});if(f.isFunction(j))return this.each(function(e){var g=f(this);a[0]=j.call(this,e,c?g.html():b),g.domManip(a,c,d)});if(this[0]){i=j&&j.parentNode,f.support.parentNode&&i&&i.nodeType===11&&i.childNodes.length===this.length?e={fragment:i}:e=f.buildFragment(a,this,k),h=e.fragment,h.childNodes.length===1?g=h=h.firstChild:g=h.firstChild;if(g){c=c&&f.nodeName(g,"tr");for(var l=0,m=this.length,n=m-1;l<m;l++)d.call(c?bi(this[l],g):this[l],e.cacheable||m>1&&l<n?f.clone(h,!0,!0):h)}k.length&&f.each(k,bp)}return this}}),f.buildFragment=function(a,b,d){var e,g,h,i,j=a[0
 ];b&&b[0]&&(i=b[0].ownerDocument||b[0]),i.createDocumentFragment||(i=c),a.length===1&&typeof j=="string"&&j.length<512&&i===c&&j.charAt(0)==="<"&&!bb.test(j)&&(f.support.checkClone||!bd.test(j))&&(f.support.html5Clone||!bc.test(j))&&(g=!0,h=f.fragments[j],h&&h!==1&&(e=h)),e||(e=i.createDocumentFragment(),f.clean(a,i,e,d)),g&&(f.fragments[j]=h?e:1);return{fragment:e,cacheable:g}},f.fragments={},f.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(a,b){f.fn[a]=function(c){var d=[],e=f(c),g=this.length===1&&this[0].parentNode;if(g&&g.nodeType===11&&g.childNodes.length===1&&e.length===1){e[b](this[0]);return this}for(var h=0,i=e.length;h<i;h++){var j=(h>0?this.clone(!0):this).get();f(e[h])[b](j),d=d.concat(j)}return this.pushStack(d,a,e.selector)}}),f.extend({clone:function(a,b,c){var d,e,g,h=f.support.html5Clone||!bc.test("<"+a.nodeName)?a.cloneNode(!0):bo(a);if((!f.support.noCloneEvent||!f.support.noCloneChecked)&&(
 a.nodeType===1||a.nodeType===11)&&!f.isXMLDoc(a)){bk(a,h),d=bl(a),e=bl(h);for(g=0;d[g];++g)e[g]&&bk(d[g],e[g])}if(b){bj(a,h);if(c){d=bl(a),e=bl(h);for(g=0;d[g];++g)bj(d[g],e[g])}}d=e=null;return h},clean:function(a,b,d,e){var g;b=b||c,typeof b.createElement=="undefined"&&(b=b.ownerDocument||b[0]&&b[0].ownerDocument||c);var h=[],i;for(var j=0,k;(k=a[j])!=null;j++){typeof k=="number"&&(k+="");if(!k)continue;if(typeof k=="string")if(!_.test(k))k=b.createTextNode(k);else{k=k.replace(Y,"<$1></$2>");var l=(Z.exec(k)||["",""])[1].toLowerCase(),m=bg[l]||bg._default,n=m[0],o=b.createElement("div");b===c?bh.appendChild(o):U(b).appendChild(o),o.innerHTML=m[1]+k+m[2];while(n--)o=o.lastChild;if(!f.support.tbody){var p=$.test(k),q=l==="table"&&!p?o.firstChild&&o.firstChild.childNodes:m[1]==="<table>"&&!p?o.childNodes:[];for(i=q.length-1;i>=0;--i)f.nodeName(q[i],"tbody")&&!q[i].childNodes.length&&q[i].parentNode.removeChild(q[i])}!f.support.leadingWhitespace&&X.test(k)&&o.insertBefore(b.createText
 Node(X.exec(k)[0]),o.firstChild),k=o.childNodes}var r;if(!f.support.appendChecked)if(k[0]&&typeof (r=k.length)=="number")for(i=0;i<r;i++)bn(k[i]);else bn(k);k.nodeType?h.push(k):h=f.merge(h,k)}if(d){g=function(a){return!a.type||be.test(a.type)};for(j=0;h[j];j++)if(e&&f.nodeName(h[j],"script")&&(!h[j].type||h[j].type.toLowerCase()==="text/javascript"))e.push(h[j].parentNode?h[j].parentNode.removeChild(h[j]):h[j]);else{if(h[j].nodeType===1){var s=f.grep(h[j].getElementsByTagName("script"),g);h.splice.apply(h,[j+1,0].concat(s))}d.appendChild(h[j])}}return h},cleanData:function(a){var b,c,d=f.cache,e=f.event.special,g=f.support.deleteExpando;for(var h=0,i;(i=a[h])!=null;h++){if(i.nodeName&&f.noData[i.nodeName.toLowerCase()])continue;c=i[f.expando];if(c){b=d[c];if(b&&b.events){for(var j in b.events)e[j]?f.event.remove(i,j):f.removeEvent(i,j,b.handle);b.handle&&(b.handle.elem=null)}g?delete i[f.expando]:i.removeAttribute&&i.removeAttribute(f.expando),delete d[c]}}}});var bq=/alpha\([^)]*\
 )/i,br=/opacity=([^)]*)/,bs=/([A-Z]|^ms)/g,bt=/^-?\d+(?:px)?$/i,bu=/^-?\d/,bv=/^([\-+])=([\-+.\de]+)/,bw={position:"absolute",visibility:"hidden",display:"block"},bx=["Left","Right"],by=["Top","Bottom"],bz,bA,bB;f.fn.css=function(a,c){if(arguments.length===2&&c===b)return this;return f.access(this,a,c,!0,function(a,c,d){return d!==b?f.style(a,c,d):f.css(a,c)})},f.extend({cssHooks:{opacity:{get:function(a,b){if(b){var c=bz(a,"opacity","opacity");return c===""?"1":c}return a.style.opacity}}},cssNumber:{fillOpacity:!0,fontWeight:!0,lineHeight:!0,opacity:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{"float":f.support.cssFloat?"cssFloat":"styleFloat"},style:function(a,c,d,e){if(!!a&&a.nodeType!==3&&a.nodeType!==8&&!!a.style){var g,h,i=f.camelCase(c),j=a.style,k=f.cssHooks[i];c=f.cssProps[i]||i;if(d===b){if(k&&"get"in k&&(g=k.get(a,!1,e))!==b)return g;return j[c]}h=typeof d,h==="string"&&(g=bv.exec(d))&&(d=+(g[1]+1)*+g[2]+parseFloat(f.css(a,c)),h="number");if(d==null||h==="number"&
 &isNaN(d))return;h==="number"&&!f.cssNumber[i]&&(d+="px");if(!k||!("set"in k)||(d=k.set(a,d))!==b)try{j[c]=d}catch(l){}}},css:function(a,c,d){var e,g;c=f.camelCase(c),g=f.cssHooks[c],c=f.cssProps[c]||c,c==="cssFloat"&&(c="float");if(g&&"get"in g&&(e=g.get(a,!0,d))!==b)return e;if(bz)return bz(a,c)},swap:function(a,b,c){var d={};for(var e in b)d[e]=a.style[e],a.style[e]=b[e];c.call(a);for(e in b)a.style[e]=d[e]}}),f.curCSS=f.css,f.each(["height","width"],function(a,b){f.cssHooks[b]={get:function(a,c,d){var e;if(c){if(a.offsetWidth!==0)return bC(a,b,d);f.swap(a,bw,function(){e=bC(a,b,d)});return e}},set:function(a,b){if(!bt.test(b))return b;b=parseFloat(b);if(b>=0)return b+"px"}}}),f.support.opacity||(f.cssHooks.opacity={get:function(a,b){return br.test((b&&a.currentStyle?a.currentStyle.filter:a.style.filter)||"")?parseFloat(RegExp.$1)/100+"":b?"1":""},set:function(a,b){var c=a.style,d=a.currentStyle,e=f.isNumeric(b)?"alpha(opacity="+b*100+")":"",g=d&&d.filter||c.filter||"";c.zoom=1;i
 f(b>=1&&f.trim(g.replace(bq,""))===""){c.removeAttribute("filter");if(d&&!d.filter)return}c.filter=bq.test(g)?g.replace(bq,e):g+" "+e}}),f(function(){f.support.reliableMarginRight||(f.cssHooks.marginRight={get:function(a,b){var c;f.swap(a,{display:"inline-block"},function(){b?c=bz(a,"margin-right","marginRight"):c=a.style.marginRight});return c}})}),c.defaultView&&c.defaultView.getComputedStyle&&(bA=function(a,b){var c,d,e;b=b.replace(bs,"-$1").toLowerCase(),(d=a.ownerDocument.defaultView)&&(e=d.getComputedStyle(a,null))&&(c=e.getPropertyValue(b),c===""&&!f.contains(a.ownerDocument.documentElement,a)&&(c=f.style(a,b)));return c}),c.documentElement.currentStyle&&(bB=function(a,b){var c,d,e,f=a.currentStyle&&a.currentStyle[b],g=a.style;f===null&&g&&(e=g[b])&&(f=e),!bt.test(f)&&bu.test(f)&&(c=g.left,d=a.runtimeStyle&&a.runtimeStyle.left,d&&(a.runtimeStyle.left=a.currentStyle.left),g.left=b==="fontSize"?"1em":f||0,f=g.pixelLeft+"px",g.left=c,d&&(a.runtimeStyle.left=d));return f===""?"au
 to":f}),bz=bA||bB,f.expr&&f.expr.filters&&(f.expr.filters.hidden=function(a){var b=a.offsetWidth,c=a.offsetHeight;return b===0&&c===0||!f.support.reliableHiddenOffsets&&(a.style&&a.style.display||f.css(a,"display"))==="none"},f.expr.filters.visible=function(a){return!f.expr.filters.hidden(a)});var bD=/%20/g,bE=/\[\]$/,bF=/\r?\n/g,bG=/#.*$/,bH=/^(.*?):[ \t]*([^\r\n]*)\r?$/mg,bI=/^(?:color|date|datetime|datetime-local|email|hidden|month|number|password|range|search|tel|text|time|url|week)$/i,bJ=/^(?:about|app|app\-storage|.+\-extension|file|res|widget):$/,bK=/^(?:GET|HEAD)$/,bL=/^\/\//,bM=/\?/,bN=/<script\b[^<]*(?:(?!<\/script>)<[^<]*)*<\/script>/gi,bO=/^(?:select|textarea)/i,bP=/\s+/,bQ=/([?&])_=[^&]*/,bR=/^([\w\+\.\-]+:)(?:\/\/([^\/?#:]*)(?::(\d+))?)?/,bS=f.fn.load,bT={},bU={},bV,bW,bX=["*/"]+["*"];try{bV=e.href}catch(bY){bV=c.createElement("a"),bV.href="",bV=bV.href}bW=bR.exec(bV.toLowerCase())||[],f.fn.extend({load:function(a,c,d){if(typeof a!="string"&&bS)return bS.apply(this,arg
 uments);if(!this.length)return this;var e=a.indexOf(" ");if(e>=0){var g=a.slice(e,a.length);a=a.slice(0,e)}var h="GET";c&&(f.isFunction(c)?(d=c,c=b):typeof c=="object"&&(c=f.param(c,f.ajaxSettings.traditional),h="POST"));var i=this;f.ajax({url:a,type:h,dataType:"html",data:c,complete:function(a,b,c){c=a.responseText,a.isResolved()&&(a.done(function(a){c=a}),i.html(g?f("<div>").append(c.replace(bN,"")).find(g):c)),d&&i.each(d,[c,b,a])}});return this},serialize:function(){return f.param(this.serializeArray())},serializeArray:function(){return this.map(function(){return this.elements?f.makeArray(this.elements):this}).filter(function(){return this.name&&!this.disabled&&(this.checked||bO.test(this.nodeName)||bI.test(this.type))}).map(function(a,b){var c=f(this).val();return c==null?null:f.isArray(c)?f.map(c,function(a,c){return{name:b.name,value:a.replace(bF,"\r\n")}}):{name:b.name,value:c.replace(bF,"\r\n")}}).get()}}),f.each("ajaxStart ajaxStop ajaxComplete ajaxError ajaxSuccess ajaxSe
 nd".split(" "),function(a,b){f.fn[b]=function(a){return this.on(b,a)}}),f.each(["get","post"],function(a,c){f[c]=function(a,d,e,g){f.isFunction(d)&&(g=g||e,e=d,d=b);return f.ajax({type:c,url:a,data:d,success:e,dataType:g})}}),f.extend({getScript:function(a,c){return f.get(a,b,c,"script")},getJSON:function(a,b,c){return f.get(a,b,c,"json")},ajaxSetup:function(a,b){b?b_(a,f.ajaxSettings):(b=a,a=f.ajaxSettings),b_(a,b);return a},ajaxSettings:{url:bV,isLocal:bJ.test(bW[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","*":bX},contents:{xml:/xml/,html:/html/,json:/json/},responseFields:{xml:"responseXML",text:"responseText"},converters:{"* text":a.String,"text html":!0,"text json":f.parseJSON,"text xml":f.parseXML},flatOptions:{context:!0,url:!0}},ajaxPrefilter:bZ(bT),ajaxTransport:bZ(bU),ajax:function(a,c){function w(a,c,l,m)
 {if(s!==2){s=2,q&&clearTimeout(q),p=b,n=m||"",v.readyState=a>0?4:0;var o,r,u,w=c,x=l?cb(d,v,l):b,y,z;if(a>=200&&a<300||a===304){if(d.ifModified){if(y=v.getResponseHeader("Last-Modified"))f.lastModified[k]=y;if(z=v.getResponseHeader("Etag"))f.etag[k]=z}if(a===304)w="notmodified",o=!0;else try{r=cc(d,x),w="success",o=!0}catch(A){w="parsererror",u=A}}else{u=w;if(!w||a)w="error",a<0&&(a=0)}v.status=a,v.statusText=""+(c||w),o?h.resolveWith(e,[r,w,v]):h.rejectWith(e,[v,w,u]),v.statusCode(j),j=b,t&&g.trigger("ajax"+(o?"Success":"Error"),[v,d,o?r:u]),i.fireWith(e,[v,w]),t&&(g.trigger("ajaxComplete",[v,d]),--f.active||f.event.trigger("ajaxStop"))}}typeof a=="object"&&(c=a,a=b),c=c||{};var d=f.ajaxSetup({},c),e=d.context||d,g=e!==d&&(e.nodeType||e instanceof f)?f(e):f.event,h=f.Deferred(),i=f.Callbacks("once memory"),j=d.statusCode||{},k,l={},m={},n,o,p,q,r,s=0,t,u,v={readyState:0,setRequestHeader:function(a,b){if(!s){var c=a.toLowerCase();a=m[c]=m[c]||a,l[a]=b}return this},getAllResponseHead
 ers:function(){return s===2?n:null},getResponseHeader:function(a){var c;if(s===2){if(!o){o={};while(c=bH.exec(n))o[c[1].toLowerCase()]=c[2]}c=o[a.toLowerCase()]}return c===b?null:c},overrideMimeType:function(a){s||(d.mimeType=a);return this},abort:function(a){a=a||"abort",p&&p.abort(a),w(0,a);return this}};h.promise(v),v.success=v.done,v.error=v.fail,v.complete=i.add,v.statusCode=function(a){if(a){var b;if(s<2)for(b in a)j[b]=[j[b],a[b]];else b=a[v.status],v.then(b,b)}return this},d.url=((a||d.url)+"").replace(bG,"").replace(bL,bW[1]+"//"),d.dataTypes=f.trim(d.dataType||"*").toLowerCase().split(bP),d.crossDomain==null&&(r=bR.exec(d.url.toLowerCase()),d.crossDomain=!(!r||r[1]==bW[1]&&r[2]==bW[2]&&(r[3]||(r[1]==="http:"?80:443))==(bW[3]||(bW[1]==="http:"?80:443)))),d.data&&d.processData&&typeof d.data!="string"&&(d.data=f.param(d.data,d.traditional)),b$(bT,d,c,v);if(s===2)return!1;t=d.global,d.type=d.type.toUpperCase(),d.hasContent=!bK.test(d.type),t&&f.active++===0&&f.event.trigger("
 ajaxStart");if(!d.hasContent){d.data&&(d.url+=(bM.test(d.url)?"&":"?")+d.data,delete d.data),k=d.url;if(d.cache===!1){var x=f.now(),y=d.url.replace(bQ,"$1_="+x);d.url=y+(y===d.url?(bM.test(d.url)?"&":"?")+"_="+x:"")}}(d.data&&d.hasContent&&d.contentType!==!1||c.contentType)&&v.setRequestHeader("Content-Type",d.contentType),d.ifModified&&(k=k||d.url,f.lastModified[k]&&v.setRequestHeader("If-Modified-Since",f.lastModified[k]),f.etag[k]&&v.setRequestHeader("If-None-Match",f.etag[k])),v.setRequestHeader("Accept",d.dataTypes[0]&&d.accepts[d.dataTypes[0]]?d.accepts[d.dataTypes[0]]+(d.dataTypes[0]!=="*"?", "+bX+"; q=0.01":""):d.accepts["*"]);for(u in d.headers)v.setRequestHeader(u,d.headers[u]);if(d.beforeSend&&(d.beforeSend.call(e,v,d)===!1||s===2)){v.abort();return!1}for(u in{success:1,error:1,complete:1})v[u](d[u]);p=b$(bU,d,c,v);if(!p)w(-1,"No Transport");else{v.readyState=1,t&&g.trigger("ajaxSend",[v,d]),d.async&&d.timeout>0&&(q=setTimeout(function(){v.abort("timeout")},d.timeout));tr
 y{s=1,p.send(l,w)}catch(z){if(s<2)w(-1,z);else throw z}}return v},param:function(a,c){var d=[],e=function(a,b){b=f.isFunction(b)?b():b,d[d.length]=encodeURIComponent(a)+"="+encodeURIComponent(b)};c===b&&(c=f.ajaxSettings.traditional);if(f.isArray(a)||a.jquery&&!f.isPlainObject(a))f.each(a,function(){e(this.name,this.value)});else for(var g in a)ca(g,a[g],c,e);return d.join("&").replace(bD,"+")}}),f.extend({active:0,lastModified:{},etag:{}});var cd=f.now(),ce=/(\=)\?(&|$)|\?\?/i;f.ajaxSetup({jsonp:"callback",jsonpCallback:function(){return f.expando+"_"+cd++}}),f.ajaxPrefilter("json jsonp",function(b,c,d){var e=b.contentType==="application/x-www-form-urlencoded"&&typeof b.data=="string";if(b.dataTypes[0]==="jsonp"||b.jsonp!==!1&&(ce.test(b.url)||e&&ce.test(b.data))){var g,h=b.jsonpCallback=f.isFunction(b.jsonpCallback)?b.jsonpCallback():b.jsonpCallback,i=a[h],j=b.url,k=b.data,l="$1"+h+"$2";b.jsonp!==!1&&(j=j.replace(ce,l),b.url===j&&(e&&(k=k.replace(ce,l)),b.data===k&&(j+=(/\?/.test(
 j)?"&":"?")+b.jsonp+"="+h))),b.url=j,b.data=k,a[h]=function(a){g=[a]},d.always(function(){a[h]=i,g&&f.isFunction(i)&&a[h](g[0])}),b.converters["script json"]=function(){g||f.error(h+" was not called");return g[0]},b.dataTypes[0]="json";return"script"}}),f.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/javascript|ecmascript/},converters:{"text script":function(a){f.globalEval(a);return a}}}),f.ajaxPrefilter("script",function(a){a.cache===b&&(a.cache=!1),a.crossDomain&&(a.type="GET",a.global=!1)}),f.ajaxTransport("script",function(a){if(a.crossDomain){var d,e=c.head||c.getElementsByTagName("head")[0]||c.documentElement;return{send:function(f,g){d=c.createElement("script"),d.async="async",a.scriptCharset&&(d.charset=a.scriptCharset),d.src=a.url,d.onload=d.onreadystatechange=function(a,c){if(c||!d.readyState||/loaded|complete/.test(d.readyState))d.onload=d.onreadystatechange=null,e&&d.parentNode&&
 e.removeChild(d),d=b,c||g(200,"success")},e.insertBefore(d,e.firstChild)},abort:function(){d&&d.onload(0,1)}}}});var cf=a.ActiveXObject?function(){for(var a in ch)ch[a](0,1)}:!1,cg=0,ch;f.ajaxSettings.xhr=a.ActiveXObject?function(){return!this.isLocal&&ci()||cj()}:ci,function(a){f.extend(f.support,{ajax:!!a,cors:!!a&&"withCredentials"in a})}(f.ajaxSettings.xhr()),f.support.ajax&&f.ajaxTransport(function(c){if(!c.crossDomain||f.support.cors){var d;return{send:function(e,g){var h=c.xhr(),i,j;c.username?h.open(c.type,c.url,c.async,c.username,c.password):h.open(c.type,c.url,c.async);if(c.xhrFields)for(j in c.xhrFields)h[j]=c.xhrFields[j];c.mimeType&&h.overrideMimeType&&h.overrideMimeType(c.mimeType),!c.crossDomain&&!e["X-Requested-With"]&&(e["X-Requested-With"]="XMLHttpRequest");try{for(j in e)h.setRequestHeader(j,e[j])}catch(k){}h.send(c.hasContent&&c.data||null),d=function(a,e){var j,k,l,m,n;try{if(d&&(e||h.readyState===4)){d=b,i&&(h.onreadystatechange=f.noop,cf&&delete ch[i]);if(e)h.
 readyState!==4&&h.abort();else{j=h.status,l=h.getAllResponseHeaders(),m={},n=h.responseXML,n&&n.documentElement&&(m.xml=n),m.text=h.responseText;try{k=h.statusText}catch(o){k=""}!j&&c.isLocal&&!c.crossDomain?j=m.text?200:404:j===1223&&(j=204)}}}catch(p){e||g(-1,p)}m&&g(j,k,m,l)},!c.async||h.readyState===4?d():(i=++cg,cf&&(ch||(ch={},f(a).unload(cf)),ch[i]=d),h.onreadystatechange=d)},abort:function(){d&&d(0,1)}}}});var ck={},cl,cm,cn=/^(?:toggle|show|hide)$/,co=/^([+\-]=)?([\d+.\-]+)([a-z%]*)$/i,cp,cq=[["height","marginTop","marginBottom","paddingTop","paddingBottom"],["width","marginLeft","marginRight","paddingLeft","paddingRight"],["opacity"]],cr;f.fn.extend({show:function(a,b,c){var d,e;if(a||a===0)return this.animate(cu("show",3),a,b,c);for(var g=0,h=this.length;g<h;g++)d=this[g],d.style&&(e=d.style.display,!f._data(d,"olddisplay")&&e==="none"&&(e=d.style.display=""),e===""&&f.css(d,"display")==="none"&&f._data(d,"olddisplay",cv(d.nodeName)));for(g=0;g<h;g++){d=this[g];if(d.style
 ){e=d.style.display;if(e===""||e==="none")d.style.display=f._data(d,"olddisplay")||""}}return this},hide:function(a,b,c){if(a||a===0)return this.animate(cu("hide",3),a,b,c);var d,e,g=0,h=this.length;for(;g<h;g++)d=this[g],d.style&&(e=f.css(d,"display"),e!=="none"&&!f._data(d,"olddisplay")&&f._data(d,"olddisplay",e));for(g=0;g<h;g++)this[g].style&&(this[g].style.display="none");return this},_toggle:f.fn.toggle,toggle:function(a,b,c){var d=typeof a=="boolean";f.isFunction(a)&&f.isFunction(b)?this._toggle.apply(this,arguments):a==null||d?this.each(function(){var b=d?a:f(this).is(":hidden");f(this)[b?"show":"hide"]()}):this.animate(cu("toggle",3),a,b,c);return this},fadeTo:function(a,b,c,d){return this.filter(":hidden").css("opacity",0).show().end().animate({opacity:b},a,c,d)},animate:function(a,b,c,d){function g(){e.queue===!1&&f._mark(this);var b=f.extend({},e),c=this.nodeType===1,d=c&&f(this).is(":hidden"),g,h,i,j,k,l,m,n,o;b.animatedProperties={};for(i in a){g=f.camelCase(i),i!==g&&
 (a[g]=a[i],delete a[i]),h=a[g],f.isArray(h)?(b.animatedProperties[g]=h[1],h=a[g]=h[0]):b.animatedProperties[g]=b.specialEasing&&b.specialEasing[g]||b.easing||"swing";if(h==="hide"&&d||h==="show"&&!d)return b.complete.call(this);c&&(g==="height"||g==="width")&&(b.overflow=[this.style.overflow,this.style.overflowX,this.style.overflowY],f.css(this,"display")==="inline"&&f.css(this,"float")==="none"&&(!f.support.inlineBlockNeedsLayout||cv(this.nodeName)==="inline"?this.style.display="inline-block":this.style.zoom=1))}b.overflow!=null&&(this.style.overflow="hidden");for(i in a)j=new f.fx(this,b,i),h=a[i],cn.test(h)?(o=f._data(this,"toggle"+i)||(h==="toggle"?d?"show":"hide":0),o?(f._data(this,"toggle"+i,o==="show"?"hide":"show"),j[o]()):j[h]()):(k=co.exec(h),l=j.cur(),k?(m=parseFloat(k[2]),n=k[3]||(f.cssNumber[i]?"":"px"),n!=="px"&&(f.style(this,i,(m||1)+n),l=(m||1)/j.cur()*l,f.style(this,i,l+n)),k[1]&&(m=(k[1]==="-="?-1:1)*m+l),j.custom(l,m,n)):j.custom(l,h,""));return!0}var e=f.speed(b,
 c,d);if(f.isEmptyObject(a))return this.each(e.complete,[!1]);a=f.extend({},a);return e.queue===!1?this.each(g):this.queue(e.queue,g)},stop:function(a,c,d){typeof a!="string"&&(d=c,c=a,a=b),c&&a!==!1&&this.queue(a||"fx",[]);return this.each(function(){function h(a,b,c){var e=b[c];f.removeData(a,c,!0),e.stop(d)}var b,c=!1,e=f.timers,g=f._data(this);d||f._unmark(!0,this);if(a==null)for(b in g)g[b]&&g[b].stop&&b.indexOf(".run")===b.length-4&&h(this,g,b);else g[b=a+".run"]&&g[b].stop&&h(this,g,b);for(b=e.length;b--;)e[b].elem===this&&(a==null||e[b].queue===a)&&(d?e[b](!0):e[b].saveState(),c=!0,e.splice(b,1));(!d||!c)&&f.dequeue(this,a)})}}),f.each({slideDown:cu("show",1),slideUp:cu("hide",1),slideToggle:cu("toggle",1),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"},fadeToggle:{opacity:"toggle"}},function(a,b){f.fn[a]=function(a,c,d){return this.animate(b,a,c,d)}}),f.extend({speed:function(a,b,c){var d=a&&typeof a=="object"?f.extend({},a):{complete:c||!c&&b||f.isFunction(a)&&a,duration:a
 ,easing:c&&b||b&&!f.isFunction(b)&&b};d.duration=f.fx.off?0:typeof d.duration=="number"?d.duration:d.duration in f.fx.speeds?f.fx.speeds[d.duration]:f.fx.speeds._default;if(d.queue==null||d.queue===!0)d.queue="fx";d.old=d.complete,d.complete=function(a){f.isFunction(d.old)&&d.old.call(this),d.queue?f.dequeue(this,d.queue):a!==!1&&f._unmark(this)};return d},easing:{linear:function(a,b,c,d){return c+d*a},swing:function(a,b,c,d){return(-Math.cos(a*Math.PI)/2+.5)*d+c}},timers:[],fx:function(a,b,c){this.options=b,this.elem=a,this.prop=c,b.orig=b.orig||{}}}),f.fx.prototype={update:function(){this.options.step&&this.options.step.call(this.elem,this.now,this),(f.fx.step[this.prop]||f.fx.step._default)(this)},cur:function(){if(this.elem[this.prop]!=null&&(!this.elem.style||this.elem.style[this.prop]==null))return this.elem[this.prop];var a,b=f.css(this.elem,this.prop);return isNaN(a=parseFloat(b))?!b||b==="auto"?0:b:a},custom:function(a,c,d){function h(a){return e.step(a)}var e=this,g=f.fx;t
 his.startTime=cr||cs(),this.end=c,this.now=this.start=a,this.pos=this.state=0,this.unit=d||this.unit||(f.cssNumber[this.prop]?"":"px"),h.queue=this.options.queue,h.elem=this.elem,h.saveState=function(){e.options.hide&&f._data(e.elem,"fxshow"+e.prop)===b&&f._data(e.elem,"fxshow"+e.prop,e.start)},h()&&f.timers.push(h)&&!cp&&(cp=setInterval(g.tick,g.interval))},show:function(){var a=f._data(this.elem,"fxshow"+this.prop);this.options.orig[this.prop]=a||f.style(this.elem,this.prop),this.options.show=!0,a!==b?this.custom(this.cur(),a):this.custom(this.prop==="width"||this.prop==="height"?1:0,this.cur()),f(this.elem).show()},hide:function(){this.options.orig[this.prop]=f._data(this.elem,"fxshow"+this.prop)||f.style(this.elem,this.prop),this.options.hide=!0,this.custom(this.cur(),0)},step:function(a){var b,c,d,e=cr||cs(),g=!0,h=this.elem,i=this.options;if(a||e>=i.duration+this.startTime){this.now=this.end,this.pos=this.state=1,this.update(),i.animatedProperties[this.prop]=!0;for(b in i.anim
 atedProperties)i.animatedProperties[b]!==!0&&(g=!1);if(g){i.overflow!=null&&!f.support.shrinkWrapBlocks&&f.each(["","X","Y"],function(a,b){h.style["overflow"+b]=i.overflow[a]}),i.hide&&f(h).hide();if(i.hide||i.show)for(b in i.animatedProperties)f.style(h,b,i.orig[b]),f.removeData(h,"fxshow"+b,!0),f.removeData(h,"toggle"+b,!0);d=i.complete,d&&(i.complete=!1,d.call(h))}return!1}i.duration==Infinity?this.now=e:(c=e-this.startTime,this.state=c/i.duration,this.pos=f.easing[i.animatedProperties[this.prop]](this.state,c,0,1,i.duration),this.now=this.start+(this.end-this.start)*this.pos),this.update();return!0}},f.extend(f.fx,{tick:function(){var a,b=f.timers,c=0;for(;c<b.length;c++)a=b[c],!a()&&b[c]===a&&b.splice(c--,1);b.length||f.fx.stop()},interval:13,stop:function(){clearInterval(cp),cp=null},speeds:{slow:600,fast:200,_default:400},step:{opacity:function(a){f.style(a.elem,"opacity",a.now)},_default:function(a){a.elem.style&&a.elem.style[a.prop]!=null?a.elem.style[a.prop]=a.now+a.unit:a
 .elem[a.prop]=a.now}}}),f.each(["width","height"],function(a,b){f.fx.step[b]=function(a){f.style(a.elem,b,Math.max(0,a.now)+a.unit)}}),f.expr&&f.expr.filters&&(f.expr.filters.animated=function(a){return f.grep(f.timers,function(b){return a===b.elem}).length});var cw=/^t(?:able|d|h)$/i,cx=/^(?:body|html)$/i;"getBoundingClientRect"in c.documentElement?f.fn.offset=function(a){var b=this[0],c;if(a)return this.each(function(b){f.offset.setOffset(this,a,b)});if(!b||!b.ownerDocument)return null;if(b===b.ownerDocument.body)return f.offset.bodyOffset(b);try{c=b.getBoundingClientRect()}catch(d){}var e=b.ownerDocument,g=e.documentElement;if(!c||!f.contains(g,b))return c?{top:c.top,left:c.left}:{top:0,left:0};var h=e.body,i=cy(e),j=g.clientTop||h.clientTop||0,k=g.clientLeft||h.clientLeft||0,l=i.pageYOffset||f.support.boxModel&&g.scrollTop||h.scrollTop,m=i.pageXOffset||f.support.boxModel&&g.scrollLeft||h.scrollLeft,n=c.top+l-j,o=c.left+m-k;return{top:n,left:o}}:f.fn.offset=function(a){var b=this
 [0];if(a)return this.each(function(b){f.offset.setOffset(this,a,b)});if(!b||!b.ownerDocument)return null;if(b===b.ownerDocument.body)return f.offset.bodyOffset(b);var c,d=b.offsetParent,e=b,g=b.ownerDocument,h=g.documentElement,i=g.body,j=g.defaultView,k=j?j.getComputedStyle(b,null):b.currentStyle,l=b.offsetTop,m=b.offsetLeft;while((b=b.parentNode)&&b!==i&&b!==h){if(f.support.fixedPosition&&k.position==="fixed")break;c=j?j.getComputedStyle(b,null):b.currentStyle,l-=b.scrollTop,m-=b.scrollLeft,b===d&&(l+=b.offsetTop,m+=b.offsetLeft,f.support.doesNotAddBorder&&(!f.support.doesAddBorderForTableAndCells||!cw.test(b.nodeName))&&(l+=parseFloat(c.borderTopWidth)||0,m+=parseFloat(c.borderLeftWidth)||0),e=d,d=b.offsetParent),f.support.subtractsBorderForOverflowNotVisible&&c.overflow!=="visible"&&(l+=parseFloat(c.borderTopWidth)||0,m+=parseFloat(c.borderLeftWidth)||0),k=c}if(k.position==="relative"||k.position==="static")l+=i.offsetTop,m+=i.offsetLeft;f.support.fixedPosition&&k.position==="fi
 xed"&&(l+=Math.max(h.scrollTop,i.scrollTop),m+=Math.max(h.scrollLeft,i.scrollLeft));return{top:l,left:m}},f.offset={bodyOffset:function(a){var b=a.offsetTop,c=a.offsetLeft;f.support.doesNotIncludeMarginInBodyOffset&&(b+=parseFloat(f.css(a,"marginTop"))||0,c+=parseFloat(f.css(a,"marginLeft"))||0);return{top:b,left:c}},setOffset:function(a,b,c){var d=f.css(a,"position");d==="static"&&(a.style.position="relative");var e=f(a),g=e.offset(),h=f.css(a,"top"),i=f.css(a,"left"),j=(d==="absolute"||d==="fixed")&&f.inArray("auto",[h,i])>-1,k={},l={},m,n;j?(l=e.position(),m=l.top,n=l.left):(m=parseFloat(h)||0,n=parseFloat(i)||0),f.isFunction(b)&&(b=b.call(a,c,g)),b.top!=null&&(k.top=b.top-g.top+m),b.left!=null&&(k.left=b.left-g.left+n),"using"in b?b.using.call(a,k):e.css(k)}},f.fn.extend({position:function(){if(!this[0])return null;var a=this[0],b=this.offsetParent(),c=this.offset(),d=cx.test(b[0].nodeName)?{top:0,left:0}:b.offset();c.top-=parseFloat(f.css(a,"marginTop"))||0,c.left-=parseFloat(f
 .css(a,"marginLeft"))||0,d.top+=parseFloat(f.css(b[0],"borderTopWidth"))||0,d.left+=parseFloat(f.css(b[0],"borderLeftWidth"))||0;return{top:c.top-d.top,left:c.left-d.left}},offsetParent:function(){return this.map(function(){var a=this.offsetParent||c.body;while(a&&!cx.test(a.nodeName)&&f.css(a,"position")==="static")a=a.offsetParent;return a})}}),f.each(["Left","Top"],function(a,c){var d="scroll"+c;f.fn[d]=function(c){var e,g;if(c===b){e=this[0];if(!e)return null;g=cy(e);return g?"pageXOffset"in g?g[a?"pageYOffset":"pageXOffset"]:f.support.boxModel&&g.document.documentElement[d]||g.document.body[d]:e[d]}return this.each(function(){g=cy(this),g?g.scrollTo(a?f(g).scrollLeft():c,a?c:f(g).scrollTop()):this[d]=c})}}),f.each(["Height","Width"],function(a,c){var d=c.toLowerCase();f.fn["inner"+c]=function(){var a=this[0];return a?a.style?parseFloat(f.css(a,d,"padding")):this[d]():null},f.fn["outer"+c]=function(a){var b=this[0];return b?b.style?parseFloat(f.css(b,d,a?"margin":"border")):this
 [d]():null},f.fn[d]=function(a){var e=this[0];if(!e)return a==null?null:this;if(f.isFunction(a))return this.each(function(b){var c=f(this);c[d](a.call(this,b,c[d]()))});if(f.isWindow(e)){var g=e.document.documentElement["client"+c],h=e.document.body;return e.document.compatMode==="CSS1Compat"&&g||h&&h["client"+c]||g}if(e.nodeType===9)return Math.max(e.documentElement["client"+c],e.body["scroll"+c],e.documentElement["scroll"+c],e.body["offset"+c],e.documentElement["offset"+c]);if(a===b){var i=f.css(e,d),j=parseFloat(i);return f.isNumeric(j)?j:i}return this.css(d,typeof a=="string"?a:a+"px")}}),a.jQuery=a.$=f,typeof define=="function"&&define.amd&&define.amd.jQuery&&define("jquery",[],function(){return f})})(window);
diff --git a/www/jquery.tablesorter.js b/www/jquery.tablesorter.js
new file mode 100644
index 0000000..9b58731
--- /dev/null
+++ b/www/jquery.tablesorter.js
@@ -0,0 +1,1031 @@
+/*
+ * 
+ * TableSorter 2.0 - Client-side table sorting with ease!
+ * Version 2.0.5b
+ * @requires jQuery v1.2.3
+ * 
+ * Copyright (c) 2007 Christian Bach
+ * Examples and docs at: http://tablesorter.com
+ * Dual licensed under the MIT and GPL licenses:
+ * http://www.opensource.org/licenses/mit-license.php
+ * http://www.gnu.org/licenses/gpl.html
+ * 
+ */
+/**
+ * 
+ * @description Create a sortable table with multi-column sorting capabilitys
+ * 
+ * @example $('table').tablesorter();
+ * @desc Create a simple tablesorter interface.
+ * 
+ * @example $('table').tablesorter({ sortList:[[0,0],[1,0]] });
+ * @desc Create a tablesorter interface and sort on the first and secound column column headers.
+ * 
+ * @example $('table').tablesorter({ headers: { 0: { sorter: false}, 1: {sorter: false} } });
+ *          
+ * @desc Create a tablesorter interface and disableing the first and second  column headers.
+ *      
+ * 
+ * @example $('table').tablesorter({ headers: { 0: {sorter:"integer"}, 1: {sorter:"currency"} } });
+ * 
+ * @desc Create a tablesorter interface and set a column parser for the first
+ *       and second column.
+ * 
+ * 
+ * @param Object
+ *            settings An object literal containing key/value pairs to provide
+ *            optional settings.
+ * 
+ * 
+ * @option String cssHeader (optional) A string of the class name to be appended
+ *         to sortable tr elements in the thead of the table. Default value:
+ *         "header"
+ * 
+ * @option String cssAsc (optional) A string of the class name to be appended to
+ *         sortable tr elements in the thead on a ascending sort. Default value:
+ *         "headerSortUp"
+ * 
+ * @option String cssDesc (optional) A string of the class name to be appended
+ *         to sortable tr elements in the thead on a descending sort. Default
+ *         value: "headerSortDown"
+ * 
+ * @option String sortInitialOrder (optional) A string of the inital sorting
+ *         order can be asc or desc. Default value: "asc"
+ * 
+ * @option String sortMultisortKey (optional) A string of the multi-column sort
+ *         key. Default value: "shiftKey"
+ * 
+ * @option String textExtraction (optional) A string of the text-extraction
+ *         method to use. For complex html structures inside td cell set this
+ *         option to "complex", on large tables the complex option can be slow.
+ *         Default value: "simple"
+ * 
+ * @option Object headers (optional) An array containing the forces sorting
+ *         rules. This option let's you specify a default sorting rule. Default
+ *         value: null
+ * 
+ * @option Array sortList (optional) An array containing the forces sorting
+ *         rules. This option let's you specify a default sorting rule. Default
+ *         value: null
+ * 
+ * @option Array sortForce (optional) An array containing forced sorting rules.
+ *         This option let's you specify a default sorting rule, which is
+ *         prepended to user-selected rules. Default value: null
+ * 
+ * @option Boolean sortLocaleCompare (optional) Boolean flag indicating whatever
+ *         to use String.localeCampare method or not. Default set to true.
+ * 
+ * 
+ * @option Array sortAppend (optional) An array containing forced sorting rules.
+ *         This option let's you specify a default sorting rule, which is
+ *         appended to user-selected rules. Default value: null
+ * 
+ * @option Boolean widthFixed (optional) Boolean flag indicating if tablesorter
+ *         should apply fixed widths to the table columns. This is usefull when
+ *         using the pager companion plugin. This options requires the dimension
+ *         jquery plugin. Default value: false
+ * 
+ * @option Boolean cancelSelection (optional) Boolean flag indicating if
+ *         tablesorter should cancel selection of the table headers text.
+ *         Default value: true
+ * 
+ * @option Boolean debug (optional) Boolean flag indicating if tablesorter
+ *         should display debuging information usefull for development.
+ * 
+ * @type jQuery
+ * 
+ * @name tablesorter
+ * 
+ * @cat Plugins/Tablesorter
+ * 
+ * @author Christian Bach/christian.bach@polyester.se
+ */
+
+(function ($) {
+    $.extend({
+        tablesorter: new
+        function () {
+
+            var parsers = [],
+                widgets = [];
+
+            this.defaults = {
+                cssHeader: "header",
+                cssAsc: "headerSortUp",
+                cssDesc: "headerSortDown",
+                cssChildRow: "expand-child",
+                sortInitialOrder: "asc",
+                sortMultiSortKey: "shiftKey",
+                sortForce: null,
+                sortAppend: null,
+                sortLocaleCompare: true,
+                textExtraction: "simple",
+                parsers: {}, widgets: [],
+                widgetZebra: {
+                    css: ["even", "odd"]
+                }, headers: {}, widthFixed: false,
+                cancelSelection: true,
+                sortList: [],
+                headerList: [],
+                dateFormat: "us",
+                decimal: '/\.|\,/g',
+                onRenderHeader: null,
+                selectorHeaders: 'thead th',
+                debug: false
+            };
+
+            /* debuging utils */
+
+            function benchmark(s, d) {
+                log(s + "," + (new Date().getTime() - d.getTime()) + "ms");
+            }
+
+            this.benchmark = benchmark;
+
+            function log(s) {
+                if (typeof console != "undefined" && typeof console.debug != "undefined") {
+                    console.log(s);
+                } else {
+                    alert(s);
+                }
+            }
+
+            /* parsers utils */
+
+            function buildParserCache(table, $headers) {
+
+                if (table.config.debug) {
+                    var parsersDebug = "";
+                }
+
+                if (table.tBodies.length == 0) return; // In the case of empty tables
+                var rows = table.tBodies[0].rows;
+
+                if (rows[0]) {
+
+                    var list = [],
+                        cells = rows[0].cells,
+                        l = cells.length;
+
+                    for (var i = 0; i < l; i++) {
+
+                        var p = false;
+
+                        if ($.metadata && ($($headers[i]).metadata() && $($headers[i]).metadata().sorter)) {
+
+                            p = getParserById($($headers[i]).metadata().sorter);
+
+                        } else if ((table.config.headers[i] && table.config.headers[i].sorter)) {
+
+                            p = getParserById(table.config.headers[i].sorter);
+                        }
+                        if (!p) {
+
+                            p = detectParserForColumn(table, rows, -1, i);
+                        }
+
+                        if (table.config.debug) {
+                            parsersDebug += "column:" + i + " parser:" + p.id + "\n";
+                        }
+
+                        list.push(p);
+                    }
+                }
+
+                if (table.config.debug) {
+                    log(parsersDebug);
+                }
+
+                return list;
+            };
+
+            function detectParserForColumn(table, rows, rowIndex, cellIndex) {
+                var l = parsers.length,
+                    node = false,
+                    nodeValue = false,
+                    keepLooking = true;
+                while (nodeValue == '' && keepLooking) {
+                    rowIndex++;
+                    if (rows[rowIndex]) {
+                        node = getNodeFromRowAndCellIndex(rows, rowIndex, cellIndex);
+                        nodeValue = trimAndGetNodeText(table.config, node);
+                        if (table.config.debug) {
+                            log('Checking if value was empty on row:' + rowIndex);
+                        }
+                    } else {
+                        keepLooking = false;
+                    }
+                }
+                for (var i = 1; i < l; i++) {
+                    if (parsers[i].is(nodeValue, table, node)) {
+                        return parsers[i];
+                    }
+                }
+                // 0 is always the generic parser (text)
+                return parsers[0];
+            }
+
+            function getNodeFromRowAndCellIndex(rows, rowIndex, cellIndex) {
+                return rows[rowIndex].cells[cellIndex];
+            }
+
+            function trimAndGetNodeText(config, node) {
+                return $.trim(getElementText(config, node));
+            }
+
+            function getParserById(name) {
+                var l = parsers.length;
+                for (var i = 0; i < l; i++) {
+                    if (parsers[i].id.toLowerCase() == name.toLowerCase()) {
+                        return parsers[i];
+                    }
+                }
+                return false;
+            }
+
+            /* utils */
+
+            function buildCache(table) {
+
+                if (table.config.debug) {
+                    var cacheTime = new Date();
+                }
+
+                var totalRows = (table.tBodies[0] && table.tBodies[0].rows.length) || 0,
+                    totalCells = (table.tBodies[0].rows[0] && table.tBodies[0].rows[0].cells.length) || 0,
+                    parsers = table.config.parsers,
+                    cache = {
+                        row: [],
+                        normalized: []
+                    };
+
+                for (var i = 0; i < totalRows; ++i) {
+
+                    /** Add the table data to main data array */
+                    var c = $(table.tBodies[0].rows[i]),
+                        cols = [];
+
+                    // if this is a child row, add it to the last row's children and
+                    // continue to the next row
+                    if (c.hasClass(table.config.cssChildRow)) {
+                        cache.row[cache.row.length - 1] = cache.row[cache.row.length - 1].add(c);
+                        // go to the next for loop
+                        continue;
+                    }
+
+                    cache.row.push(c);
+
+                    for (var j = 0; j < totalCells; ++j) {
+                        cols.push(parsers[j].format(getElementText(table.config, c[0].cells[j]), table, c[0].cells[j]));
+                    }
+
+                    cols.push(cache.normalized.length); // add position for rowCache
+                    cache.normalized.push(cols);
+                    cols = null;
+                };
+
+                if (table.config.debug) {
+                    benchmark("Building cache for " + totalRows + " rows:", cacheTime);
+                }
+
+                return cache;
+            };
+
+            function getElementText(config, node) {
+
+                var text = "";
+
+                if (!node) return "";
+
+                if (!config.supportsTextContent) config.supportsTextContent = node.textContent || false;
+
+                if (config.textExtraction == "simple") {
+                    if (config.supportsTextContent) {
+                        text = node.textContent;
+                    } else {
+                        if (node.childNodes[0] && node.childNodes[0].hasChildNodes()) {
+                            text = node.childNodes[0].innerHTML;
+                        } else {
+                            text = node.innerHTML;
+                        }
+                    }
+                } else {
+                    if (typeof(config.textExtraction) == "function") {
+                        text = config.textExtraction(node);
+                    } else {
+                        text = $(node).text();
+                    }
+                }
+                return text;
+            }
+
+            function appendToTable(table, cache) {
+
+                if (table.config.debug) {
+                    var appendTime = new Date()
+                }
+
+                var c = cache,
+                    r = c.row,
+                    n = c.normalized,
+                    totalRows = n.length,
+                    checkCell = (n[0].length - 1),
+                    tableBody = $(table.tBodies[0]),
+                    rows = [];
+
+
+                for (var i = 0; i < totalRows; i++) {
+                    var pos = n[i][checkCell];
+
+                    rows.push(r[pos]);
+
+                    if (!table.config.appender) {
+
+                        //var o = ;
+                        var l = r[pos].length;
+                        for (var j = 0; j < l; j++) {
+                            tableBody[0].appendChild(r[pos][j]);
+                        }
+
+                        // 
+                    }
+                }
+
+
+
+                if (table.config.appender) {
+
+                    table.config.appender(table, rows);
+                }
+
+                rows = null;
+
+                if (table.config.debug) {
+                    benchmark("Rebuilt table:", appendTime);
+                }
+
+                // apply table widgets
+                applyWidget(table);
+
+                // trigger sortend
+                setTimeout(function () {
+                    $(table).trigger("sortEnd");
+                }, 0);
+
+            };
+
+            function buildHeaders(table) {
+
+                if (table.config.debug) {
+                    var time = new Date();
+                }
+
+                var meta = ($.metadata) ? true : false;
+                
+                var header_index = computeTableHeaderCellIndexes(table);
+
+                $tableHeaders = $(table.config.selectorHeaders, table).each(function (index) {
+
+                    this.column = header_index[this.parentNode.rowIndex + "-" + this.cellIndex];
+                    // this.column = index;
+                    this.order = formatSortingOrder(table.config.sortInitialOrder);
+                    
+					
+					this.count = this.order;
+
+                    if (checkHeaderMetadata(this) || checkHeaderOptions(table, index)) this.sortDisabled = true;
+					if (checkHeaderOptionsSortingLocked(table, index)) this.order = this.lockedOrder = checkHeaderOptionsSortingLocked(table, index);
+
+                    if (!this.sortDisabled) {
+                        var $th = $(this).addClass(table.config.cssHeader);
+                        if (table.config.onRenderHeader) table.config.onRenderHeader.apply($th);
+                    }
+
+                    // add cell to headerList
+                    table.config.headerList[index] = this;
+                });
+
+                if (table.config.debug) {
+                    benchmark("Built headers:", time);
+                    log($tableHeaders);
+                }
+
+                return $tableHeaders;
+
+            };
+
+            // from:
+            // http://www.javascripttoolbox.com/lib/table/examples.php
+            // http://www.javascripttoolbox.com/temp/table_cellindex.html
+
+
+            function computeTableHeaderCellIndexes(t) {
+                var matrix = [];
+                var lookup = {};
+                var thead = t.getElementsByTagName('THEAD')[0];
+                var trs = thead.getElementsByTagName('TR');
+
+                for (var i = 0; i < trs.length; i++) {
+                    var cells = trs[i].cells;
+                    for (var j = 0; j < cells.length; j++) {
+                        var c = cells[j];
+
+                        var rowIndex = c.parentNode.rowIndex;
+                        var cellId = rowIndex + "-" + c.cellIndex;
+                        var rowSpan = c.rowSpan || 1;
+                        var colSpan = c.colSpan || 1
+                        var firstAvailCol;
+                        if (typeof(matrix[rowIndex]) == "undefined") {
+                            matrix[rowIndex] = [];
+                        }
+                        // Find first available column in the first row
+                        for (var k = 0; k < matrix[rowIndex].length + 1; k++) {
+                            if (typeof(matrix[rowIndex][k]) == "undefined") {
+                                firstAvailCol = k;
+                                break;
+                            }
+                        }
+                        lookup[cellId] = firstAvailCol;
+                        for (var k = rowIndex; k < rowIndex + rowSpan; k++) {
+                            if (typeof(matrix[k]) == "undefined") {
+                                matrix[k] = [];
+                            }
+                            var matrixrow = matrix[k];
+                            for (var l = firstAvailCol; l < firstAvailCol + colSpan; l++) {
+                                matrixrow[l] = "x";
+                            }
+                        }
+                    }
+                }
+                return lookup;
+            }
+
+            function checkCellColSpan(table, rows, row) {
+                var arr = [],
+                    r = table.tHead.rows,
+                    c = r[row].cells;
+
+                for (var i = 0; i < c.length; i++) {
+                    var cell = c[i];
+
+                    if (cell.colSpan > 1) {
+                        arr = arr.concat(checkCellColSpan(table, headerArr, row++));
+                    } else {
+                        if (table.tHead.length == 1 || (cell.rowSpan > 1 || !r[row + 1])) {
+                            arr.push(cell);
+                        }
+                        // headerArr[row] = (i+row);
+                    }
+                }
+                return arr;
+            };
+
+            function checkHeaderMetadata(cell) {
+                if (($.metadata) && ($(cell).metadata().sorter === false)) {
+                    return true;
+                };
+                return false;
+            }
+
+            function checkHeaderOptions(table, i) {
+                if ((table.config.headers[i]) && (table.config.headers[i].sorter === false)) {
+                    return true;
+                };
+                return false;
+            }
+			
+			 function checkHeaderOptionsSortingLocked(table, i) {
+                if ((table.config.headers[i]) && (table.config.headers[i].lockedOrder)) return table.config.headers[i].lockedOrder;
+                return false;
+            }
+			
+            function applyWidget(table) {
+                var c = table.config.widgets;
+                var l = c.length;
+                for (var i = 0; i < l; i++) {
+
+                    getWidgetById(c[i]).format(table);
+                }
+
+            }
+
+            function getWidgetById(name) {
+                var l = widgets.length;
+                for (var i = 0; i < l; i++) {
+                    if (widgets[i].id.toLowerCase() == name.toLowerCase()) {
+                        return widgets[i];
+                    }
+                }
+            };
+
+            function formatSortingOrder(v) {
+                if (typeof(v) != "Number") {
+                    return (v.toLowerCase() == "desc") ? 1 : 0;
+                } else {
+                    return (v == 1) ? 1 : 0;
+                }
+            }
+
+            function isValueInArray(v, a) {
+                var l = a.length;
+                for (var i = 0; i < l; i++) {
+                    if (a[i][0] == v) {
+                        return true;
+                    }
+                }
+                return false;
+            }
+
+            function setHeadersCss(table, $headers, list, css) {
+                // remove all header information
+                $headers.removeClass(css[0]).removeClass(css[1]);
+
+                var h = [];
+                $headers.each(function (offset) {
+                    if (!this.sortDisabled) {
+                        h[this.column] = $(this);
+                    }
+                });
+
+                var l = list.length;
+                for (var i = 0; i < l; i++) {
+                    h[list[i][0]].addClass(css[list[i][1]]);
+                }
+            }
+
+            function fixColumnWidth(table, $headers) {
+                var c = table.config;
+                if (c.widthFixed) {
+                    var colgroup = $('<colgroup>');
+                    $("tr:first td", table.tBodies[0]).each(function () {
+                        colgroup.append($('<col>').css('width', $(this).width()));
+                    });
+                    $(table).prepend(colgroup);
+                };
+            }
+
+            function updateHeaderSortCount(table, sortList) {
+                var c = table.config,
+                    l = sortList.length;
+                for (var i = 0; i < l; i++) {
+                    var s = sortList[i],
+                        o = c.headerList[s[0]];
+                    o.count = s[1];
+                    o.count++;
+                }
+            }
+
+            /* sorting methods */
+
+            function multisort(table, sortList, cache) {
+
+                if (table.config.debug) {
+                    var sortTime = new Date();
+                }
+
+                var dynamicExp = "var sortWrapper = function(a,b) {",
+                    l = sortList.length;
+
+                // TODO: inline functions.
+                for (var i = 0; i < l; i++) {
+
+                    var c = sortList[i][0];
+                    var order = sortList[i][1];
+                    // var s = (getCachedSortType(table.config.parsers,c) == "text") ?
+                    // ((order == 0) ? "sortText" : "sortTextDesc") : ((order == 0) ?
+                    // "sortNumeric" : "sortNumericDesc");
+                    // var s = (table.config.parsers[c].type == "text") ? ((order == 0)
+                    // ? makeSortText(c) : makeSortTextDesc(c)) : ((order == 0) ?
+                    // makeSortNumeric(c) : makeSortNumericDesc(c));
+                    var s = (table.config.parsers[c].type == "text") ? ((order == 0) ? makeSortFunction("text", "asc", c) : makeSortFunction("text", "desc", c)) : ((order == 0) ? makeSortFunction("numeric", "asc", c) : makeSortFunction("numeric", "desc", c));
+                    var e = "e" + i;
+
+                    dynamicExp += "var " + e + " = " + s; // + "(a[" + c + "],b[" + c
+                    // + "]); ";
+                    dynamicExp += "if(" + e + ") { return " + e + "; } ";
+                    dynamicExp += "else { ";
+
+                }
+
+                // if value is the same keep orignal order
+                var orgOrderCol = cache.normalized[0].length - 1;
+                dynamicExp += "return a[" + orgOrderCol + "]-b[" + orgOrderCol + "];";
+
+                for (var i = 0; i < l; i++) {
+                    dynamicExp += "}; ";
+                }
+
+                dynamicExp += "return 0; ";
+                dynamicExp += "}; ";
+
+                if (table.config.debug) {
+                    benchmark("Evaling expression:" + dynamicExp, new Date());
+                }
+
+                eval(dynamicExp);
+
+                cache.normalized.sort(sortWrapper);
+
+                if (table.config.debug) {
+                    benchmark("Sorting on " + sortList.toString() + " and dir " + order + " time:", sortTime);
+                }
+
+                return cache;
+            };
+
+            function makeSortFunction(type, direction, index) {
+                var a = "a[" + index + "]",
+                    b = "b[" + index + "]";
+                if (type == 'text' && direction == 'asc') {
+                    return "(" + a + " == " + b + " ? 0 : (" + a + " === null ? Number.POSITIVE_INFINITY : (" + b + " === null ? Number.NEGATIVE_INFINITY : (" + a + " < " + b + ") ? -1 : 1 )));";
+                } else if (type == 'text' && direction == 'desc') {
+                    return "(" + a + " == " + b + " ? 0 : (" + a + " === null ? Number.POSITIVE_INFINITY : (" + b + " === null ? Number.NEGATIVE_INFINITY : (" + b + " < " + a + ") ? -1 : 1 )));";
+                } else if (type == 'numeric' && direction == 'asc') {
+                    return "(" + a + " === null && " + b + " === null) ? 0 :(" + a + " === null ? Number.POSITIVE_INFINITY : (" + b + " === null ? Number.NEGATIVE_INFINITY : " + a + " - " + b + "));";
+                } else if (type == 'numeric' && direction == 'desc') {
+                    return "(" + a + " === null && " + b + " === null) ? 0 :(" + a + " === null ? Number.POSITIVE_INFINITY : (" + b + " === null ? Number.NEGATIVE_INFINITY : " + b + " - " + a + "));";
+                }
+            };
+
+            function makeSortText(i) {
+                return "((a[" + i + "] < b[" + i + "]) ? -1 : ((a[" + i + "] > b[" + i + "]) ? 1 : 0));";
+            };
+
+            function makeSortTextDesc(i) {
+                return "((b[" + i + "] < a[" + i + "]) ? -1 : ((b[" + i + "] > a[" + i + "]) ? 1 : 0));";
+            };
+
+            function makeSortNumeric(i) {
+                return "a[" + i + "]-b[" + i + "];";
+            };
+
+            function makeSortNumericDesc(i) {
+                return "b[" + i + "]-a[" + i + "];";
+            };
+
+            function sortText(a, b) {
+                if (table.config.sortLocaleCompare) return a.localeCompare(b);
+                return ((a < b) ? -1 : ((a > b) ? 1 : 0));
+            };
+
+            function sortTextDesc(a, b) {
+                if (table.config.sortLocaleCompare) return b.localeCompare(a);
+                return ((b < a) ? -1 : ((b > a) ? 1 : 0));
+            };
+
+            function sortNumeric(a, b) {
+                return a - b;
+            };
+
+            function sortNumericDesc(a, b) {
+                return b - a;
+            };
+
+            function getCachedSortType(parsers, i) {
+                return parsers[i].type;
+            }; /* public methods */
+            this.construct = function (settings) {
+                return this.each(function () {
+                    // if no thead or tbody quit.
+                    if (!this.tHead || !this.tBodies) return;
+                    // declare
+                    var $this, $document, $headers, cache, config, shiftDown = 0,
+                        sortOrder;
+                    // new blank config object
+                    this.config = {};
+                    // merge and extend.
+                    config = $.extend(this.config, $.tablesorter.defaults, settings);
+                    // store common expression for speed
+                    $this = $(this);
+                    // save the settings where they read
+                    $.data(this, "tablesorter", config);
+                    // build headers
+                    $headers = buildHeaders(this);
+                    // try to auto detect column type, and store in tables config
+                    this.config.parsers = buildParserCache(this, $headers);
+                    // build the cache for the tbody cells
+                    cache = buildCache(this);
+                    // get the css class names, could be done else where.
+                    var sortCSS = [config.cssDesc, config.cssAsc];
+                    // fixate columns if the users supplies the fixedWidth option
+                    fixColumnWidth(this);
+                    // apply event handling to headers
+                    // this is to big, perhaps break it out?
+                    $headers.click(
+
+                    function (e) {
+                        var totalRows = ($this[0].tBodies[0] && $this[0].tBodies[0].rows.length) || 0;
+                        if (!this.sortDisabled && totalRows > 0) {
+                            // Only call sortStart if sorting is
+                            // enabled.
+                            $this.trigger("sortStart");
+                            // store exp, for speed
+                            var $cell = $(this);
+                            // get current column index
+                            var i = this.column;
+                            // get current column sort order
+                            this.order = this.count++ % 2;
+							// always sort on the locked order.
+							if(this.lockedOrder) this.order = this.lockedOrder;
+							
+							// user only whants to sort on one
+                            // column
+                            if (!e[config.sortMultiSortKey]) {
+                                // flush the sort list
+                                config.sortList = [];
+                                if (config.sortForce != null) {
+                                    var a = config.sortForce;
+                                    for (var j = 0; j < a.length; j++) {
+                                        if (a[j][0] != i) {
+                                            config.sortList.push(a[j]);
+                                        }
+                                    }
+                                }
+                                // add column to sort list
+                                config.sortList.push([i, this.order]);
+                                // multi column sorting
+                            } else {
+                                // the user has clicked on an all
+                                // ready sortet column.
+                                if (isValueInArray(i, config.sortList)) {
+                                    // revers the sorting direction
+                                    // for all tables.
+                                    for (var j = 0; j < config.sortList.length; j++) {
+                                        var s = config.sortList[j],
+                                            o = config.headerList[s[0]];
+                                        if (s[0] == i) {
+                                            o.count = s[1];
+                                            o.count++;
+                                            s[1] = o.count % 2;
+                                        }
+                                    }
+                                } else {
+                                    // add column to sort list array
+                                    config.sortList.push([i, this.order]);
+                                }
+                            };
+                            setTimeout(function () {
+                                // set css for headers
+                                setHeadersCss($this[0], $headers, config.sortList, sortCSS);
+                                appendToTable(
+	                                $this[0], multisort(
+	                                $this[0], config.sortList, cache)
+								);
+                            }, 1);
+                            // stop normal event by returning false
+                            return false;
+                        }
+                        // cancel selection
+                    }).mousedown(function () {
+                        if (config.cancelSelection) {
+                            this.onselectstart = function () {
+                                return false
+                            };
+                            return false;
+                        }
+                    });
+                    // apply easy methods that trigger binded events
+                    $this.bind("update", function () {
+                        var me = this;
+                        setTimeout(function () {
+                            // rebuild parsers.
+                            me.config.parsers = buildParserCache(
+                            me, $headers);
+                            // rebuild the cache map
+                            cache = buildCache(me);
+                        }, 1);
+                    }).bind("updateCell", function (e, cell) {
+                        var config = this.config;
+                        // get position from the dom.
+                        var pos = [(cell.parentNode.rowIndex - 1), cell.cellIndex];
+                        // update cache
+                        cache.normalized[pos[0]][pos[1]] = config.parsers[pos[1]].format(
+                        getElementText(config, cell), cell);
+                    }).bind("sorton", function (e, list) {
+                        $(this).trigger("sortStart");
+                        config.sortList = list;
+                        // update and store the sortlist
+                        var sortList = config.sortList;
+                        // update header count index
+                        updateHeaderSortCount(this, sortList);
+                        // set css for headers
+                        setHeadersCss(this, $headers, sortList, sortCSS);
+                        // sort the table and append it to the dom
+                        appendToTable(this, multisort(this, sortList, cache));
+                    }).bind("appendCache", function () {
+                        appendToTable(this, cache);
+                    }).bind("applyWidgetId", function (e, id) {
+                        getWidgetById(id).format(this);
+                    }).bind("applyWidgets", function () {
+                        // apply widgets
+                        applyWidget(this);
+                    });
+                    if ($.metadata && ($(this).metadata() && $(this).metadata().sortlist)) {
+                        config.sortList = $(this).metadata().sortlist;
+                    }
+                    // if user has supplied a sort list to constructor.
+                    if (config.sortList.length > 0) {
+                        $this.trigger("sorton", [config.sortList]);
+                    }
+                    // apply widgets
+                    applyWidget(this);
+                });
+            };
+            this.addParser = function (parser) {
+                var l = parsers.length,
+                    a = true;
+                for (var i = 0; i < l; i++) {
+                    if (parsers[i].id.toLowerCase() == parser.id.toLowerCase()) {
+                        a = false;
+                    }
+                }
+                if (a) {
+                    parsers.push(parser);
+                };
+            };
+            this.addWidget = function (widget) {
+                widgets.push(widget);
+            };
+            this.formatFloat = function (s) {
+                var i = parseFloat(s);
+                return (isNaN(i)) ? 0 : i;
+            };
+            this.formatInt = function (s) {
+                var i = parseInt(s);
+                return (isNaN(i)) ? 0 : i;
+            };
+            this.isDigit = function (s, config) {
+                // replace all an wanted chars and match.
+                return /^[-+]?\d*$/.test($.trim(s.replace(/[,.']/g, '')));
+            };
+            this.clearTableBody = function (table) {
+                if ($.browser.msie) {
+                    function empty() {
+                        while (this.firstChild)
+                        this.removeChild(this.firstChild);
+                    }
+                    empty.apply(table.tBodies[0]);
+                } else {
+                    table.tBodies[0].innerHTML = "";
+                }
+            };
+        }
+    });
+
+    // extend plugin scope
+    $.fn.extend({
+        tablesorter: $.tablesorter.construct
+    });
+
+    // make shortcut
+    var ts = $.tablesorter;
+
+    // add default parsers
+    ts.addParser({
+        id: "text",
+        is: function (s) {
+            return true;
+        }, format: function (s) {
+            return $.trim(s.toLocaleLowerCase());
+        }, type: "text"
+    });
+
+    ts.addParser({
+        id: "digit",
+        is: function (s, table) {
+            var c = table.config;
+            return $.tablesorter.isDigit(s, c);
+        }, format: function (s) {
+            return $.tablesorter.formatFloat(s);
+        }, type: "numeric"
+    });
+
+    ts.addParser({
+        id: "currency",
+        is: function (s) {
+            return /^[£$€?.]/.test(s);
+        }, format: function (s) {
+            return $.tablesorter.formatFloat(s.replace(new RegExp(/[£$€]/g), ""));
+        }, type: "numeric"
+    });
+
+    ts.addParser({
+        id: "ipAddress",
+        is: function (s) {
+            return /^\d{2,3}[\.]\d{2,3}[\.]\d{2,3}[\.]\d{2,3}$/.test(s);
+        }, format: function (s) {
+            var a = s.split("."),
+                r = "",
+                l = a.length;
+            for (var i = 0; i < l; i++) {
+                var item = a[i];
+                if (item.length == 2) {
+                    r += "0" + item;
+                } else {
+                    r += item;
+                }
+            }
+            return $.tablesorter.formatFloat(r);
+        }, type: "numeric"
+    });
+
+    ts.addParser({
+        id: "url",
+        is: function (s) {
+            return /^(https?|ftp|file):\/\/$/.test(s);
+        }, format: function (s) {
+            return jQuery.trim(s.replace(new RegExp(/(https?|ftp|file):\/\//), ''));
+        }, type: "text"
+    });
+
+    ts.addParser({
+        id: "isoDate",
+        is: function (s) {
+            return /^\d{4}[\/-]\d{1,2}[\/-]\d{1,2}$/.test(s);
+        }, format: function (s) {
+            return $.tablesorter.formatFloat((s != "") ? new Date(s.replace(
+            new RegExp(/-/g), "/")).getTime() : "0");
+        }, type: "numeric"
+    });
+
+    ts.addParser({
+        id: "percent",
+        is: function (s) {
+            return /\%$/.test($.trim(s));
+        }, format: function (s) {
+            return $.tablesorter.formatFloat(s.replace(new RegExp(/%/g), ""));
+        }, type: "numeric"
+    });
+
+    ts.addParser({
+        id: "usLongDate",
+        is: function (s) {
+            return s.match(new RegExp(/^[A-Za-z]{3,10}\.? [0-9]{1,2}, ([0-9]{4}|'?[0-9]{2}) (([0-2]?[0-9]:[0-5][0-9])|([0-1]?[0-9]:[0-5][0-9]\s(AM|PM)))$/));
+        }, format: function (s) {
+            return $.tablesorter.formatFloat(new Date(s).getTime());
+        }, type: "numeric"
+    });
+
+    ts.addParser({
+        id: "shortDate",
+        is: function (s) {
+            return /\d{1,2}[\/\-]\d{1,2}[\/\-]\d{2,4}/.test(s);
+        }, format: function (s, table) {
+            var c = table.config;
+            s = s.replace(/\-/g, "/");
+            if (c.dateFormat == "us") {
+                // reformat the string in ISO format
+                s = s.replace(/(\d{1,2})[\/\-](\d{1,2})[\/\-](\d{4})/, "$3/$1/$2");
+            } else if (c.dateFormat == "uk") {
+                // reformat the string in ISO format
+                s = s.replace(/(\d{1,2})[\/\-](\d{1,2})[\/\-](\d{4})/, "$3/$2/$1");
+            } else if (c.dateFormat == "dd/mm/yy" || c.dateFormat == "dd-mm-yy") {
+                s = s.replace(/(\d{1,2})[\/\-](\d{1,2})[\/\-](\d{2})/, "$1/$2/$3");
+            }
+            return $.tablesorter.formatFloat(new Date(s).getTime());
+        }, type: "numeric"
+    });
+    ts.addParser({
+        id: "time",
+        is: function (s) {
+            return /^(([0-2]?[0-9]:[0-5][0-9])|([0-1]?[0-9]:[0-5][0-9]\s(am|pm)))$/.test(s);
+        }, format: function (s) {
+            return $.tablesorter.formatFloat(new Date("2000/01/01 " + s).getTime());
+        }, type: "numeric"
+    });
+    ts.addParser({
+        id: "metadata",
+        is: function (s) {
+            return false;
+        }, format: function (s, table, cell) {
+            var c = table.config,
+                p = (!c.parserMetadataName) ? 'sortValue' : c.parserMetadataName;
+            return $(cell).metadata()[p];
+        }, type: "numeric"
+    });
+    // add default widgets
+    ts.addWidget({
+        id: "zebra",
+        format: function (table) {
+            if (table.config.debug) {
+                var time = new Date();
+            }
+            var $tr, row = -1,
+                odd;
+            // loop through the visible rows
+            $("tr:visible", table.tBodies[0]).each(function (i) {
+                $tr = $(this);
+                // style children rows the same way the parent
+                // row was styled
+                if (!$tr.hasClass(table.config.cssChildRow)) row++;
+                odd = (row % 2 == 0);
+                $tr.removeClass(
+                table.config.widgetZebra.css[odd ? 0 : 1]).addClass(
+                table.config.widgetZebra.css[odd ? 1 : 0])
+            });
+            if (table.config.debug) {
+                $.tablesorter.benchmark("Applying Zebra widget", time);
+            }
+        }
+    });
+})(jQuery);
\ No newline at end of file
diff --git a/www/jquery.tablesorter.pager.js b/www/jquery.tablesorter.pager.js
new file mode 100644
index 0000000..cce6ea2
--- /dev/null
+++ b/www/jquery.tablesorter.pager.js
@@ -0,0 +1,184 @@
+(function($) {
+	$.extend({
+		tablesorterPager: new function() {
+			
+			function updatePageDisplay(c) {
+				var s = $(c.cssPageDisplay,c.container).val((c.page+1) + c.seperator + c.totalPages);	
+			}
+			
+			function setPageSize(table,size) {
+				var c = table.config;
+				c.size = size;
+				c.totalPages = Math.ceil(c.totalRows / c.size);
+				c.pagerPositionSet = false;
+				moveToPage(table);
+				fixPosition(table);
+			}
+			
+			function fixPosition(table) {
+				var c = table.config;
+				if(!c.pagerPositionSet && c.positionFixed) {
+					var c = table.config, o = $(table);
+					if(o.offset) {
+						c.container.css({
+							top: o.offset().top + o.height() + 'px',
+							position: 'absolute'
+						});
+					}
+					c.pagerPositionSet = true;
+				}
+			}
+			
+			function moveToFirstPage(table) {
+				var c = table.config;
+				c.page = 0;
+				moveToPage(table);
+			}
+			
+			function moveToLastPage(table) {
+				var c = table.config;
+				c.page = (c.totalPages-1);
+				moveToPage(table);
+			}
+			
+			function moveToNextPage(table) {
+				var c = table.config;
+				c.page++;
+				if(c.page >= (c.totalPages-1)) {
+					c.page = (c.totalPages-1);
+				}
+				moveToPage(table);
+			}
+			
+			function moveToPrevPage(table) {
+				var c = table.config;
+				c.page--;
+				if(c.page <= 0) {
+					c.page = 0;
+				}
+				moveToPage(table);
+			}
+						
+			
+			function moveToPage(table) {
+				var c = table.config;
+				if(c.page < 0 || c.page > (c.totalPages-1)) {
+					c.page = 0;
+				}
+				
+				renderTable(table,c.rowsCopy);
+			}
+			
+			function renderTable(table,rows) {
+				
+				var c = table.config;
+				var l = rows.length;
+				var s = (c.page * c.size);
+				var e = (s + c.size);
+				if(e > rows.length ) {
+					e = rows.length;
+				}
+				
+				
+				var tableBody = $(table.tBodies[0]);
+				
+				// clear the table body
+				
+				$.tablesorter.clearTableBody(table);
+				
+				for(var i = s; i < e; i++) {
+					
+					//tableBody.append(rows[i]);
+					
+					var o = rows[i];
+					var l = o.length;
+					for(var j=0; j < l; j++) {
+						
+						tableBody[0].appendChild(o[j]);
+
+					}
+				}
+				
+				fixPosition(table,tableBody);
+				
+				$(table).trigger("applyWidgets");
+				
+				if( c.page >= c.totalPages ) {
+        			moveToLastPage(table);
+				}
+				
+				updatePageDisplay(c);
+			}
+			
+			this.appender = function(table,rows) {
+				
+				var c = table.config;
+				
+				c.rowsCopy = rows;
+				c.totalRows = rows.length;
+				c.totalPages = Math.ceil(c.totalRows / c.size);
+				
+				renderTable(table,rows);
+			};
+			
+			this.defaults = {
+				size: 10,
+				offset: 0,
+				page: 0,
+				totalRows: 0,
+				totalPages: 0,
+				container: null,
+				cssNext: '.next',
+				cssPrev: '.prev',
+				cssFirst: '.first',
+				cssLast: '.last',
+				cssPageDisplay: '.pagedisplay',
+				cssPageSize: '.pagesize',
+				seperator: "/",
+				positionFixed: true,
+				appender: this.appender
+			};
+			
+			this.construct = function(settings) {
+				
+				return this.each(function() {	
+					
+					config = $.extend(this.config, $.tablesorterPager.defaults, settings);
+					
+					var table = this, pager = config.container;
+				
+					$(this).trigger("appendCache");
+					
+					config.size = parseInt($(".pagesize",pager).val());
+					
+					$(config.cssFirst,pager).click(function() {
+						moveToFirstPage(table);
+						return false;
+					});
+					$(config.cssNext,pager).click(function() {
+						moveToNextPage(table);
+						return false;
+					});
+					$(config.cssPrev,pager).click(function() {
+						moveToPrevPage(table);
+						return false;
+					});
+					$(config.cssLast,pager).click(function() {
+						moveToLastPage(table);
+						return false;
+					});
+					$(config.cssPageSize,pager).change(function() {
+						setPageSize(table,parseInt($(this).val()));
+						return false;
+					});
+				});
+			};
+			
+		}
+	});
+	// extend plugin scope
+	$.fn.extend({
+        tablesorterPager: $.tablesorterPager.construct
+	});
+	
+})(jQuery);				
\ No newline at end of file
diff --git a/www/members/css/bootstrap-combobox.css b/www/members/css/bootstrap-combobox.css
new file mode 100644
index 0000000..9c991cf
--- /dev/null
+++ b/www/members/css/bootstrap-combobox.css
@@ -0,0 +1,42 @@
+.form-search .combobox-container,
+.form-inline .combobox-container {
+  display: inline-block;
+  margin-bottom: 0;
+  vertical-align: top;
+}
+.form-search .combobox-container .input-group-addon,
+.form-inline .combobox-container .input-group-addon {
+  width: auto;
+}
+.combobox-selected .caret {
+  display: none;
+}
+/* :not doesn't work in IE8 */
+.combobox-container:not(.combobox-selected) .glyphicon-remove {
+  display: none;
+}
+.typeahead-long {
+  max-height: 300px;
+  overflow-y: auto;
+}
+.control-group.error .combobox-container .add-on {
+  color: #B94A48;
+  border-color: #B94A48;
+}
+.control-group.error .combobox-container .caret {
+  border-top-color: #B94A48;
+}
+.control-group.warning .combobox-container .add-on {
+  color: #C09853;
+  border-color: #C09853;
+}
+.control-group.warning .combobox-container .caret {
+  border-top-color: #C09853;
+}
+.control-group.success .combobox-container .add-on {
+  color: #468847;
+  border-color: #468847;
+}
+.control-group.success .combobox-container .caret {
+  border-top-color: #468847;
+}
diff --git a/www/members/css/bootstrap.min.css b/www/members/css/bootstrap.min.css
new file mode 100644
index 0000000..679272d
--- /dev/null
+++ b/www/members/css/bootstrap.min.css
@@ -0,0 +1,7 @@
+/*!
+ * Bootstrap v3.1.1 (http://getbootstrap.com)
+ * Copyright 2011-2014 Twitter, Inc.
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
+ */
+
+/*! normalize.css v3.0.0 | 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,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:0 0}a:active,a:hover{outline:0}abbr[title]{border-bottom:1px dotted}b,strong{font-weight:700}dfn{font-style:italic}h1{font-size:2em;margin:.67em 0}mark{background:#ff0;color:#000}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sup{top:-.5em}sub{bottom:-.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:.35em .625em .75em}legend{border:0;padding:0}textarea{overflow:auto}optgroup{font-weight:700}table{border-collapse:collapse;border-spacing:0}td,th{padding:0}@media print{*{text-shadow:none!
 important;color:#000!important;background:transparent!important;box-shadow:none!important}a,a:visited{text-decoration:underline}a[href]:after{content:" (" attr(href) ")"}abbr[title]:after{content:" (" attr(title) ")"}a[href^="javascript:"]:after,a[href^="#"]:after{content:""}pre,blockquote{border:1px solid #999;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:#fff!important}.navbar{display:none}.table td,.table th{background-color:#fff!important}.btn>.caret,.dropup>.btn>.caret{border-top-color:#000!important}.label{border:1px solid #000}.table{border-collapse:collapse!important}.table-bordered th,.table-bordered td{border:1px solid #ddd!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:62.5%;-we
 bkit-tap-highlight-color:rgba(0,0,0,0)}body{font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:14px;line-height:1.42857143;color:#333;background-color:#fff}input,button,select,textarea{font-family:inherit;font-size:inherit;line-height:inherit}a{color:#428bca;text-decoration:none}a:hover,a:focus{color:#2a6496;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,.thumbnail>img,.thumbnail a>img,.carousel-inner>.item>img,.carousel-inner>.item>a>img{display:block;max-width:100%;height:auto}.img-rounded{border-radius:6px}.img-thumbnail{padding:4px;line-height:1.42857143;background-color:#fff;border:1px solid #ddd;border-radius:4px;-webkit-transition:all .2s ease-in-out;transition:all .2s ease-in-out;display:inline-block;max-width:100%;height:auto}.img-circle{border-radius:50%}hr{margin-top:20px;margin-bottom:20px;border:0;border-top:1px solid #eee}.sr-onl
 y{position:absolute;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden;clip:rect(0,0,0,0);border:0}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,h2 small,h3 small,h4 small,h5 small,h6 small,.h1 small,.h2 small,.h3 small,.h4 small,.h5 small,.h6 small,h1 .small,h2 .small,h3 .small,h4 .small,h5 .small,h6 .small,.h1 .small,.h2 .small,.h3 .small,.h4 .small,.h5 .small,.h6 .small{font-weight:400;line-height:1;color:#999}h1,.h1,h2,.h2,h3,.h3{margin-top:20px;margin-bottom:10px}h1 small,.h1 small,h2 small,.h2 small,h3 small,.h3 small,h1 .small,.h1 .small,h2 .small,.h2 .small,h3 .small,.h3 .small{font-size:65%}h4,.h4,h5,.h5,h6,.h6{margin-top:10px;margin-bottom:10px}h4 small,.h4 small,h5 small,.h5 small,h6 small,.h6 small,h4 .small,.h4 .small,h5 .small,.h5 .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 10px}.lead{margin-bottom:20px;font-size:16px;font-weight:200;line-height:1.4}@media (min-width:768px){.lead{font-size:21px}}small,.small{font-size:85%}cite{font-style:normal}.text-left{text-align:left}.text-right{text-align:right}.text-center{text-align:center}.text-justify{text-align:justify}.text-muted{color:#999}.text-primary{color:#428bca}a.text-primary:hover{color:#3071a9}.text-success{color:#3c763d}a.text-success:hover{color:#2b542c}.text-info{color:#31708f}a.text-info:hover{color:#245269}.text-warning{color:#8a6d3b}a.text-warning:hover{color:#66512c}.text-danger{color:#a94442}a.text-danger:hover{color:#843534}.bg-primary{color:#fff;background-color:#428bca}a.bg-primary:hover{background-color:#3071a9}.bg-success{background-color:#dff0d8}a.bg-success:hover{background-color:#c1e2b3}.bg-info{background-color:#d9edf7}a.bg-info:hover{background-color:#afd9ee}.bg-warning{background-color:#fcf8e3}a.bg-warning:hover{background-color:#f7ecb5}.bg-danger{backgroun
 d-color:#f2dede}a.bg-danger:hover{background-color:#e4b9b9}.page-header{padding-bottom:9px;margin:40px 0 20px;border-bottom:1px solid #eee}ul,ol{margin-top:0;margin-bottom:10px}ul ul,ol ul,ul ol,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:20px}dt,dd{line-height:1.42857143}dt{font-weight:700}dd{margin-left:0}@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 #999}.initialism{font-size:90%;text-transform:uppercase}blockquote{padding:10px 20px;margin:0 0 20px;font-size:17.5px;border-left:5px solid #eee}blockquote p:last-child,blockquote ul:last-child,blockquote ol:last-child{margin-bottom:0}bl
 ockquote footer,blockquote small,blockquote .small{display:block;font-size:80%;line-height:1.42857143;color:#999}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 #eee;border-left:0;text-align:right}.blockquote-reverse footer:before,blockquote.pull-right footer:before,.blockquote-reverse small:before,blockquote.pull-right small:before,.blockquote-reverse .small:before,blockquote.pull-right .small:before{content:''}.blockquote-reverse footer:after,blockquote.pull-right footer:after,.blockquote-reverse small:after,blockquote.pull-right small:after,.blockquote-reverse .small:after,blockquote.pull-right .small:after{content:'\00A0 \2014'}blockquote:before,blockquote:after{content:""}address{margin-bottom:20px;font-style:normal;line-height:1.42857143}code,kbd,pre,samp{font-family:Menlo,Monaco,Consolas,"Courier New",monospace}code{padding:2px 4px
 ;font-size:90%;color:#c7254e;background-color:#f9f2f4;white-space:nowrap;border-radius:4px}kbd{padding:2px 4px;font-size:90%;color:#fff;background-color:#333;border-radius:3px;box-shadow:inset 0 -1px 0 rgba(0,0,0,.25)}pre{display:block;padding:9.5px;margin:0 0 10px;font-size:13px;line-height:1.42857143;word-break:break-all;word-wrap:break-word;color:#333;background-color:#f5f5f5;border:1px solid #ccc;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}@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}.row{margin-left:-15px;margin-right:-15px}.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-12{width:100%}.col-xs-11{width:91.66666667%}.col-xs-10{width:83.33333333%}.col-xs-9{width:75%}.col-xs-8{width:66.66666667%}.col-xs-7{width:58.33333333%}.col-xs-6{width:50%}.col-xs-5{width:41.66666667%}.col-xs-4{width:33.33333333%}.col-xs-3{width:25%}.col-xs-2{width:16.66666667%}.col-xs-1{width:8.33333333%}.col-xs-pull-12{right:100%}.co
 l-xs-pull-11{right:91.66666667%}.col-xs-pull-10{right:83.33333333%}.col-xs-pull-9{right:75%}.col-xs-pull-8{right:66.66666667%}.col-xs-pull-7{right:58.33333333%}.col-xs-pull-6{right:50%}.col-xs-pull-5{right:41.66666667%}.col-xs-pull-4{right:33.33333333%}.col-xs-pull-3{right:25%}.col-xs-pull-2{right:16.66666667%}.col-xs-pull-1{right:8.33333333%}.col-xs-pull-0{right:0}.col-xs-push-12{left:100%}.col-xs-push-11{left:91.66666667%}.col-xs-push-10{left:83.33333333%}.col-xs-push-9{left:75%}.col-xs-push-8{left:66.66666667%}.col-xs-push-7{left:58.33333333%}.col-xs-push-6{left:50%}.col-xs-push-5{left:41.66666667%}.col-xs-push-4{left:33.33333333%}.col-xs-push-3{left:25%}.col-xs-push-2{left:16.66666667%}.col-xs-push-1{left:8.33333333%}.col-xs-push-0{left:0}.col-xs-offset-12{margin-left:100%}.col-xs-offset-11{margin-left:91.66666667%}.col-xs-offset-10{margin-left:83.33333333%}.col-xs-offset-9{margin-left:75%}.col-xs-offset-8{margin-left:66.66666667%}.col-xs-offset-7{margin-left:58.33333333%}.col-x
 s-offset-6{margin-left:50%}.col-xs-offset-5{margin-left:41.66666667%}.col-xs-offset-4{margin-left:33.33333333%}.col-xs-offset-3{margin-left:25%}.col-xs-offset-2{margin-left:16.66666667%}.col-xs-offset-1{margin-left:8.33333333%}.col-xs-offset-0{margin-left:0}@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-12{width:100%}.col-sm-11{width:91.66666667%}.col-sm-10{width:83.33333333%}.col-sm-9{width:75%}.col-sm-8{width:66.66666667%}.col-sm-7{width:58.33333333%}.col-sm-6{width:50%}.col-sm-5{width:41.66666667%}.col-sm-4{width:33.33333333%}.col-sm-3{width:25%}.col-sm-2{width:16.66666667%}.col-sm-1{width:8.33333333%}.col-sm-pull-12{right:100%}.col-sm-pull-11{right:91.66666667%}.col-sm-pull-10{right:83.33333333%}.col-sm-pull-9{right:75%}.col-sm-pull-8{right:66.66666667%}.col-sm-pull-7{right:58.33333333%}.col-sm-pull-6{right:50%}.col-sm-pull-5{right:41.66666667%}.col-sm-pull-4{r
 ight:33.33333333%}.col-sm-pull-3{right:25%}.col-sm-pull-2{right:16.66666667%}.col-sm-pull-1{right:8.33333333%}.col-sm-pull-0{right:0}.col-sm-push-12{left:100%}.col-sm-push-11{left:91.66666667%}.col-sm-push-10{left:83.33333333%}.col-sm-push-9{left:75%}.col-sm-push-8{left:66.66666667%}.col-sm-push-7{left:58.33333333%}.col-sm-push-6{left:50%}.col-sm-push-5{left:41.66666667%}.col-sm-push-4{left:33.33333333%}.col-sm-push-3{left:25%}.col-sm-push-2{left:16.66666667%}.col-sm-push-1{left:8.33333333%}.col-sm-push-0{left:0}.col-sm-offset-12{margin-left:100%}.col-sm-offset-11{margin-left:91.66666667%}.col-sm-offset-10{margin-left:83.33333333%}.col-sm-offset-9{margin-left:75%}.col-sm-offset-8{margin-left:66.66666667%}.col-sm-offset-7{margin-left:58.33333333%}.col-sm-offset-6{margin-left:50%}.col-sm-offset-5{margin-left:41.66666667%}.col-sm-offset-4{margin-left:33.33333333%}.col-sm-offset-3{margin-left:25%}.col-sm-offset-2{margin-left:16.66666667%}.col-sm-offset-1{margin-left:8.33333333%}.col-sm-
 offset-0{margin-left:0}}@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-12{width:100%}.col-md-11{width:91.66666667%}.col-md-10{width:83.33333333%}.col-md-9{width:75%}.col-md-8{width:66.66666667%}.col-md-7{width:58.33333333%}.col-md-6{width:50%}.col-md-5{width:41.66666667%}.col-md-4{width:33.33333333%}.col-md-3{width:25%}.col-md-2{width:16.66666667%}.col-md-1{width:8.33333333%}.col-md-pull-12{right:100%}.col-md-pull-11{right:91.66666667%}.col-md-pull-10{right:83.33333333%}.col-md-pull-9{right:75%}.col-md-pull-8{right:66.66666667%}.col-md-pull-7{right:58.33333333%}.col-md-pull-6{right:50%}.col-md-pull-5{right:41.66666667%}.col-md-pull-4{right:33.33333333%}.col-md-pull-3{right:25%}.col-md-pull-2{right:16.66666667%}.col-md-pull-1{right:8.33333333%}.col-md-pull-0{right:0}.col-md-push-12{left:100%}.col-md-push-11{left:91.66666667%}.col-md-push-10{left:83.33333333%}.col-md
 -push-9{left:75%}.col-md-push-8{left:66.66666667%}.col-md-push-7{left:58.33333333%}.col-md-push-6{left:50%}.col-md-push-5{left:41.66666667%}.col-md-push-4{left:33.33333333%}.col-md-push-3{left:25%}.col-md-push-2{left:16.66666667%}.col-md-push-1{left:8.33333333%}.col-md-push-0{left:0}.col-md-offset-12{margin-left:100%}.col-md-offset-11{margin-left:91.66666667%}.col-md-offset-10{margin-left:83.33333333%}.col-md-offset-9{margin-left:75%}.col-md-offset-8{margin-left:66.66666667%}.col-md-offset-7{margin-left:58.33333333%}.col-md-offset-6{margin-left:50%}.col-md-offset-5{margin-left:41.66666667%}.col-md-offset-4{margin-left:33.33333333%}.col-md-offset-3{margin-left:25%}.col-md-offset-2{margin-left:16.66666667%}.col-md-offset-1{margin-left:8.33333333%}.col-md-offset-0{margin-left:0}}@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-12{width:100%}.col-lg-11{width:91.66666667
 %}.col-lg-10{width:83.33333333%}.col-lg-9{width:75%}.col-lg-8{width:66.66666667%}.col-lg-7{width:58.33333333%}.col-lg-6{width:50%}.col-lg-5{width:41.66666667%}.col-lg-4{width:33.33333333%}.col-lg-3{width:25%}.col-lg-2{width:16.66666667%}.col-lg-1{width:8.33333333%}.col-lg-pull-12{right:100%}.col-lg-pull-11{right:91.66666667%}.col-lg-pull-10{right:83.33333333%}.col-lg-pull-9{right:75%}.col-lg-pull-8{right:66.66666667%}.col-lg-pull-7{right:58.33333333%}.col-lg-pull-6{right:50%}.col-lg-pull-5{right:41.66666667%}.col-lg-pull-4{right:33.33333333%}.col-lg-pull-3{right:25%}.col-lg-pull-2{right:16.66666667%}.col-lg-pull-1{right:8.33333333%}.col-lg-pull-0{right:0}.col-lg-push-12{left:100%}.col-lg-push-11{left:91.66666667%}.col-lg-push-10{left:83.33333333%}.col-lg-push-9{left:75%}.col-lg-push-8{left:66.66666667%}.col-lg-push-7{left:58.33333333%}.col-lg-push-6{left:50%}.col-lg-push-5{left:41.66666667%}.col-lg-push-4{left:33.33333333%}.col-lg-push-3{left:25%}.col-lg-push-2{left:16.66666667%}.co
 l-lg-push-1{left:8.33333333%}.col-lg-push-0{left:0}.col-lg-offset-12{margin-left:100%}.col-lg-offset-11{margin-left:91.66666667%}.col-lg-offset-10{margin-left:83.33333333%}.col-lg-offset-9{margin-left:75%}.col-lg-offset-8{margin-left:66.66666667%}.col-lg-offset-7{margin-left:58.33333333%}.col-lg-offset-6{margin-left:50%}.col-lg-offset-5{margin-left:41.66666667%}.col-lg-offset-4{margin-left:33.33333333%}.col-lg-offset-3{margin-left:25%}.col-lg-offset-2{margin-left:16.66666667%}.col-lg-offset-1{margin-left:8.33333333%}.col-lg-offset-0{margin-left:0}}table{max-width:100%;background-color:transparent}th{text-align:left}.table{width:100%;margin-bottom:20px}.table>thead>tr>th,.table>tbody>tr>th,.table>tfoot>tr>th,.table>thead>tr>td,.table>tbody>tr>td,.table>tfoot>tr>td{padding:8px;line-height:1.42857143;vertical-align:top;border-top:1px solid #ddd}.table>thead>tr>th{vertical-align:bottom;border-bottom:2px solid #ddd}.table>caption+thead>tr:first-child>th,.table>colgroup+thead>tr:first-chi
 ld>th,.table>thead:first-child>tr:first-child>th,.table>caption+thead>tr:first-child>td,.table>colgroup+thead>tr:first-child>td,.table>thead:first-child>tr:first-child>td{border-top:0}.table>tbody+tbody{border-top:2px solid #ddd}.table .table{background-color:#fff}.table-condensed>thead>tr>th,.table-condensed>tbody>tr>th,.table-condensed>tfoot>tr>th,.table-condensed>thead>tr>td,.table-condensed>tbody>tr>td,.table-condensed>tfoot>tr>td{padding:5px}.table-bordered{border:1px solid #ddd}.table-bordered>thead>tr>th,.table-bordered>tbody>tr>th,.table-bordered>tfoot>tr>th,.table-bordered>thead>tr>td,.table-bordered>tbody>tr>td,.table-bordered>tfoot>tr>td{border:1px solid #ddd}.table-bordered>thead>tr>th,.table-bordered>thead>tr>td{border-bottom-width:2px}.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 col[class*=col-]{position:static;flo
 at: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>tbody>tr>td.active,.table>tfoot>tr>td.active,.table>thead>tr>th.active,.table>tbody>tr>th.active,.table>tfoot>tr>th.active,.table>thead>tr.active>td,.table>tbody>tr.active>td,.table>tfoot>tr.active>td,.table>thead>tr.active>th,.table>tbody>tr.active>th,.table>tfoot>tr.active>th{background-color:#f5f5f5}.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.active:hover>th{background-color:#e8e8e8}.table>thead>tr>td.success,.table>tbody>tr>td.success,.table>tfoot>tr>td.success,.table>thead>tr>th.success,.table>tbody>tr>th.success,.table>tfoot>tr>th.success,.table>thead>tr.success>td,.table>tbody>tr.success>td,.table>tfoot>tr.success>td,.table>thead>tr.success>th,.table>tbody>tr.success>th,.table>tfoot>tr.success>th{background-color:#dff0d8}.table-hover>tb
 ody>tr>td.success:hover,.table-hover>tbody>tr>th.success:hover,.table-hover>tbody>tr.success:hover>td,.table-hover>tbody>tr.success:hover>th{background-color:#d0e9c6}.table>thead>tr>td.info,.table>tbody>tr>td.info,.table>tfoot>tr>td.info,.table>thead>tr>th.info,.table>tbody>tr>th.info,.table>tfoot>tr>th.info,.table>thead>tr.info>td,.table>tbody>tr.info>td,.table>tfoot>tr.info>td,.table>thead>tr.info>th,.table>tbody>tr.info>th,.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.info:hover>th{background-color:#c4e3f3}.table>thead>tr>td.warning,.table>tbody>tr>td.warning,.table>tfoot>tr>td.warning,.table>thead>tr>th.warning,.table>tbody>tr>th.warning,.table>tfoot>tr>th.warning,.table>thead>tr.warning>td,.table>tbody>tr.warning>td,.table>tfoot>tr.warning>td,.table>thead>tr.warning>th,.table>tbody>tr.warning>th,.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.warning:hover>th{background-color:#faf2cc}.table>thead>tr>td.danger,.table>tbody>tr>td.danger,.table>tfoot>tr>td.danger,.table>thead>tr>th.danger,.table>tbody>tr>th.danger,.table>tfoot>tr>th.danger,.table>thead>tr.danger>td,.table>tbody>tr.danger>td,.table>tfoot>tr.danger>td,.table>thead>tr.danger>th,.table>tbody>tr.danger>th,.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.danger:hover>th{background-color:#ebcccc}@media (max-width:767px){.table-responsive{width:100%;margin-bottom:15px;overflow-y:hidden;overflow-x:scroll;-ms-overflow-style:-ms-autohiding-scrollbar;border:1px solid #ddd;-webkit-overflow-scrolling:touch}.table-responsive>.table{margin-bottom:0}.table-responsive>.table>thead>tr>th,.table-responsiv
 e>.table>tbody>tr>th,.table-responsive>.table>tfoot>tr>th,.table-responsive>.table>thead>tr>td,.table-responsive>.table>tbody>tr>td,.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>tbody>tr>th:first-child,.table-responsive>.table-bordered>tfoot>tr>th:first-child,.table-responsive>.table-bordered>thead>tr>td:first-child,.table-responsive>.table-bordered>tbody>tr>td: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>tbody>tr>th:last-child,.table-responsive>.table-bordered>tfoot>tr>th:last-child,.table-responsive>.table-bordered>thead>tr>td:last-child,.table-responsive>.table-bordered>tbody>tr>td: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>tfoot>tr:last-child>th,.table-responsive>.table-bordered>tbody>tr:last-child>td,.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:20px;font-size:21px;line-height:inherit;color:#333;border:0;border-bottom:1px solid #e5e5e5}label{display:inline-block;margin-bottom:5px;font-weight:700}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.42857143;color
 :#555}.form-control{display:block;width:100%;height:34px;padding:6px 12px;font-size:14px;line-height:1.42857143;color:#555;background-color:#fff;background-image:none;border:1px solid #ccc;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075);-webkit-transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s;transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s}.form-control:focus{border-color:#66afe9;outline:0;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(102,175,233,.6);box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(102,175,233,.6)}.form-control::-moz-placeholder{color:#999;opacity:1}.form-control:-ms-input-placeholder{color:#999}.form-control::-webkit-input-placeholder{color:#999}.form-control[disabled],.form-control[readonly],fieldset[disabled] .form-control{cursor:not-allowed;background-color:#eee;opacity:1}textarea.form-control{height:auto}input[type=search]{-webki
 t-appearance:none}input[type=date]{line-height:34px}.form-group{margin-bottom:15px}.radio,.checkbox{display:block;min-height:20px;margin-top:10px;margin-bottom:10px;padding-left:20px}.radio label,.checkbox label{display:inline;font-weight:400;cursor:pointer}.radio input[type=radio],.radio-inline input[type=radio],.checkbox input[type=checkbox],.checkbox-inline input[type=checkbox]{float:left;margin-left:-20px}.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:400;cursor:pointer}.radio-inline+.radio-inline,.checkbox-inline+.checkbox-inline{margin-top:0;margin-left:10px}input[type=radio][disabled],input[type=checkbox][disabled],.radio[disabled],.radio-inline[disabled],.checkbox[disabled],.checkbox-inline[disabled],fieldset[disabled] input[type=radio],fieldset[disabled] input[type=checkbox],fieldset[disabled] .radio,fieldset[disabled] .radio-inline,fieldset[disabled] .
 checkbox,fieldset[disabled] .checkbox-inline{cursor:not-allowed}.input-sm{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}.input-lg{height:46px;padding:10px 16px;font-size:18px;line-height:1.33;border-radius:6px}select.input-lg{height:46px;line-height:46px}textarea.input-lg,select[multiple].input-lg{height:auto}.has-feedback{position:relative}.has-feedback .form-control{padding-right:42.5px}.has-feedback .form-control-feedback{position:absolute;top:25px;right:0;display:block;width:34px;height:34px;line-height:34px;text-align:center}.has-success .help-block,.has-success .control-label,.has-success .radio,.has-success .checkbox,.has-success .radio-inline,.has-success .checkbox-inline{color:#3c763d}.has-success .form-control{border-color:#3c763d;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-success .for
 m-control:focus{border-color:#2b542c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #67b168;box-shadow:inset 0 1px 1px rgba(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{color:#8a6d3b}.has-warning .form-control{border-color:#8a6d3b;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-warning .form-control:focus{border-color:#66512c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #c0a16b;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #c0a16b}.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-e
 rror .radio,.has-error .checkbox,.has-error .radio-inline,.has-error .checkbox-inline{color:#a94442}.has-error .form-control{border-color:#a94442;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-error .form-control:focus{border-color:#843534;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #ce8483;box-shadow:inset 0 1px 1px rgba(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}.form-control-static{margin-bottom: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 .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;padding-left:0;vertical-align:middle}.form-inline .radio input[type=radio],.form-inline .checkbox input[type=checkbox]{float:none;margin-left:0}.form-inline .has-feedback .form-control-feedback{top:0}}.form-horizontal .control-label,.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:27px}.form-horizontal .form-group{margin-left:-15px;margin-right:-15px}.form-horizontal .form-control-static{padding-top:7px}@media (min-width:768px){.form-horizontal .control-label{text-align:right}}.form-horizontal .has-feedback .form-control-feedback{top:0;right:15px}.btn{display:inline-block;margin-bottom:0;font-weight:400;text-align:center;vertical-align:middle;cursor:pointer;background-image:none;border:1px solid transparent;white-space:nowrap;padding:6px 1
 2px;font-size:14px;line-height:1.42857143;border-radius:4px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.btn:focus,.btn:active:focus,.btn.active:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}.btn:hover,.btn:focus{color:#333;text-decoration:none}.btn:active,.btn.active{outline:0;background-image:none;-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,.125);box-shadow:inset 0 3px 5px rgba(0,0,0,.125)}.btn.disabled,.btn[disabled],fieldset[disabled] .btn{cursor:not-allowed;pointer-events:none;opacity:.65;filter:alpha(opacity=65);-webkit-box-shadow:none;box-shadow:none}.btn-default{color:#333;background-color:#fff;border-color:#ccc}.btn-default:hover,.btn-default:focus,.btn-default:active,.btn-default.active,.open .dropdown-toggle.btn-default{color:#333;background-color:#ebebeb;border-color:#adadad}.btn-default:active,.btn-default.active,.open .dropdown-toggle.btn-default{background-image:none}.btn-default.disa
 bled,.btn-default[disabled],fieldset[disabled] .btn-default,.btn-default.disabled:hover,.btn-default[disabled]:hover,fieldset[disabled] .btn-default:hover,.btn-default.disabled:focus,.btn-default[disabled]:focus,fieldset[disabled] .btn-default:focus,.btn-default.disabled:active,.btn-default[disabled]:active,fieldset[disabled] .btn-default:active,.btn-default.disabled.active,.btn-default[disabled].active,fieldset[disabled] .btn-default.active{background-color:#fff;border-color:#ccc}.btn-default .badge{color:#fff;background-color:#333}.btn-primary{color:#fff;background-color:#428bca;border-color:#357ebd}.btn-primary:hover,.btn-primary:focus,.btn-primary:active,.btn-primary.active,.open .dropdown-toggle.btn-primary{color:#fff;background-color:#3276b1;border-color:#285e8e}.btn-primary:active,.btn-primary.active,.open .dropdown-toggle.btn-primary{background-image:none}.btn-primary.disabled,.btn-primary[disabled],fieldset[disabled] .btn-primary,.btn-primary.disabled:hover,.btn-primary[dis
 abled]:hover,fieldset[disabled] .btn-primary:hover,.btn-primary.disabled:focus,.btn-primary[disabled]:focus,fieldset[disabled] .btn-primary:focus,.btn-primary.disabled:active,.btn-primary[disabled]:active,fieldset[disabled] .btn-primary:active,.btn-primary.disabled.active,.btn-primary[disabled].active,fieldset[disabled] .btn-primary.active{background-color:#428bca;border-color:#357ebd}.btn-primary .badge{color:#428bca;background-color:#fff}.btn-success{color:#fff;background-color:#5cb85c;border-color:#4cae4c}.btn-success:hover,.btn-success:focus,.btn-success:active,.btn-success.active,.open .dropdown-toggle.btn-success{color:#fff;background-color:#47a447;border-color:#398439}.btn-success:active,.btn-success.active,.open .dropdown-toggle.btn-success{background-image:none}.btn-success.disabled,.btn-success[disabled],fieldset[disabled] .btn-success,.btn-success.disabled:hover,.btn-success[disabled]:hover,fieldset[disabled] .btn-success:hover,.btn-success.disabled:focus,.btn-success[dis
 abled]:focus,fieldset[disabled] .btn-success:focus,.btn-success.disabled:active,.btn-success[disabled]:active,fieldset[disabled] .btn-success:active,.btn-success.disabled.active,.btn-success[disabled].active,fieldset[disabled] .btn-success.active{background-color:#5cb85c;border-color:#4cae4c}.btn-success .badge{color:#5cb85c;background-color:#fff}.btn-info{color:#fff;background-color:#5bc0de;border-color:#46b8da}.btn-info:hover,.btn-info:focus,.btn-info:active,.btn-info.active,.open .dropdown-toggle.btn-info{color:#fff;background-color:#39b3d7;border-color:#269abc}.btn-info:active,.btn-info.active,.open .dropdown-toggle.btn-info{background-image:none}.btn-info.disabled,.btn-info[disabled],fieldset[disabled] .btn-info,.btn-info.disabled:hover,.btn-info[disabled]:hover,fieldset[disabled] .btn-info:hover,.btn-info.disabled:focus,.btn-info[disabled]:focus,fieldset[disabled] .btn-info:focus,.btn-info.disabled:active,.btn-info[disabled]:active,fieldset[disabled] .btn-info:active,.btn-info
 .disabled.active,.btn-info[disabled].active,fieldset[disabled] .btn-info.active{background-color:#5bc0de;border-color:#46b8da}.btn-info .badge{color:#5bc0de;background-color:#fff}.btn-warning{color:#fff;background-color:#f0ad4e;border-color:#eea236}.btn-warning:hover,.btn-warning:focus,.btn-warning:active,.btn-warning.active,.open .dropdown-toggle.btn-warning{color:#fff;background-color:#ed9c28;border-color:#d58512}.btn-warning:active,.btn-warning.active,.open .dropdown-toggle.btn-warning{background-image:none}.btn-warning.disabled,.btn-warning[disabled],fieldset[disabled] .btn-warning,.btn-warning.disabled:hover,.btn-warning[disabled]:hover,fieldset[disabled] .btn-warning:hover,.btn-warning.disabled:focus,.btn-warning[disabled]:focus,fieldset[disabled] .btn-warning:focus,.btn-warning.disabled:active,.btn-warning[disabled]:active,fieldset[disabled] .btn-warning:active,.btn-warning.disabled.active,.btn-warning[disabled].active,fieldset[disabled] .btn-warning.active{background-color:#
 f0ad4e;border-color:#eea236}.btn-warning .badge{color:#f0ad4e;background-color:#fff}.btn-danger{color:#fff;background-color:#d9534f;border-color:#d43f3a}.btn-danger:hover,.btn-danger:focus,.btn-danger:active,.btn-danger.active,.open .dropdown-toggle.btn-danger{color:#fff;background-color:#d2322d;border-color:#ac2925}.btn-danger:active,.btn-danger.active,.open .dropdown-toggle.btn-danger{background-image:none}.btn-danger.disabled,.btn-danger[disabled],fieldset[disabled] .btn-danger,.btn-danger.disabled:hover,.btn-danger[disabled]:hover,fieldset[disabled] .btn-danger:hover,.btn-danger.disabled:focus,.btn-danger[disabled]:focus,fieldset[disabled] .btn-danger:focus,.btn-danger.disabled:active,.btn-danger[disabled]:active,fieldset[disabled] .btn-danger:active,.btn-danger.disabled.active,.btn-danger[disabled].active,fieldset[disabled] .btn-danger.active{background-color:#d9534f;border-color:#d43f3a}.btn-danger .badge{color:#d9534f;background-color:#fff}.btn-link{color:#428bca;font-weight:
 400;cursor:pointer;border-radius:0}.btn-link,.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:#2a6496;text-decoration:underline;background-color:transparent}.btn-link[disabled]:hover,fieldset[disabled] .btn-link:hover,.btn-link[disabled]:focus,fieldset[disabled] .btn-link:focus{color:#999;text-decoration:none}.btn-lg,.btn-group-lg>.btn{padding:10px 16px;font-size:18px;line-height:1.33;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%;padding-left:0;padding-right:0}.btn-block+.btn-block{margin-top:5px}input[type=submit].btn-block,input[type=reset].btn-block,input[type=button].btn-block{width:10
 0%}.fade{opacity:0;-webkit-transition:opacity .15s linear;transition:opacity .15s linear}.fade.in{opacity:1}.collapse{display:none}.collapse.in{display:block}.collapsing{position:relative;height:0;overflow:hidden;-webkit-transition:height .35s ease;transition:height .35s ease}@font-face{font-family:'Glyphicons Halflings';src:url(../fonts/glyphicons-halflings-regular.eot);src:url(../fonts/glyphicons-halflings-regular.eot?#iefix) format('embedded-opentype'),url(../fonts/glyphicons-halflings-regular.woff) format('woff'),url(../fonts/glyphicons-halflings-regular.ttf) format('truetype'),url(../fonts/glyphicons-halflings-regular.svg#glyphicons_halflingsregular) format('svg')}.glyphicon{position:relative;top:1px;display:inline-block;font-family:'Glyphicons Halflings';font-style:normal;font-weight:400;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.glyphicon-asterisk:before{content:"\2a"}.glyphicon-plus:before{content:"\2b"}.glyphicon-euro: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:befor
 e{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{con
 tent:"\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"}.g
 lyphicon-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"}.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}.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;background
 -color:#fff;border:1px solid #ccc;border:1px solid rgba(0,0,0,.15);border-radius:4px;-webkit-box-shadow:0 6px 12px rgba(0,0,0,.175);box-shadow:0 6px 12px rgba(0,0,0,.175);background-clip:padding-box}.dropdown-menu.pull-right{right:0;left:auto}.dropdown-menu .divider{height:1px;margin:9px 0;overflow:hidden;background-color:#e5e5e5}.dropdown-menu>li>a{display:block;padding:3px 20px;clear:both;font-weight:400;line-height:1.42857143;color:#333;white-space:nowrap}.dropdown-menu>li>a:hover,.dropdown-menu>li>a:focus{text-decoration:none;color:#262626;background-color:#f5f5f5}.dropdown-menu>.active>a,.dropdown-menu>.active>a:hover,.dropdown-menu>.active>a:focus{color:#fff;text-decoration:none;outline:0;background-color:#428bca}.dropdown-menu>.disabled>a,.dropdown-menu>.disabled>a:hover,.dropdown-menu>.disabled>a:focus{color:#999}.dropdown-menu>.disabled>a:hover,.dropdown-menu>.disabled>a:focus{text-decoration:none;background-color:transparent;background-image:none;filter:progid:DXImageTrans
 form.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.42857143;color:#999}.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:1px}@media (min-width:768px){.navbar-right .dropdown-menu{left:auto;right:0}.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-vertical>.btn:hover,.btn-group>.btn:focus,.btn-group-vertical>
 .btn:focus,.btn-group>.btn:active,.btn-group-vertical>.btn:active,.btn-group>.btn.active,.btn-group-vertical>.btn.active{z-index:2}.btn-group>.btn:focus,.btn-group-vertical>.btn:focus{outline:0}.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 .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-radi
 us:0}.btn-group>.btn-group:first-child>.btn:last-child,.btn-group>.btn-group:first-child>.dropdown-toggle{border-bottom-right-radius:0;border-top-right-radius:0}.btn-group>.btn-group:last-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,.125);box-shadow:inset 0 3px 5px rgba(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-gro
 up>.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%}[data-toggle=buttons]>.btn>input[type=radio],[data-toggle=buttons]>.btn>input[type=checkbox]{display: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-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.33;border-radius:6px}select.input-group-lg>.form-control,select.input-group-lg>.input-group-addon,select.input-group-lg>.input-group-btn>.btn{height:46px;line-height:46px}textarea.input-group-lg>.form-control,textarea.input-group-lg>.input-group-addon,textarea.input-group-lg>.input-group-btn
 >.btn,select[multiple].input-group-lg>.form-control,select[multiple].input-group-lg>.input-group-addon,select[multiple].input-group-lg>.input-group-btn>.btn{height:auto}.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-group-sm>.form-control,select.input-group-sm>.input-group-addon,select.input-group-sm>.input-group-btn>.btn{height:30px;line-height:30px}textarea.input-group-sm>.form-control,textarea.input-group-sm>.input-group-addon,textarea.input-group-sm>.input-group-btn>.btn,select[multiple].input-group-sm>.form-control,select[multiple].input-group-sm>.input-group-addon,select[multiple].input-group-sm>.input-group-btn>.btn{height:auto}.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:400;line-height:1;color:#555;text-align:center;background-color:#eee;border:1px solid #ccc;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}.inp
 ut-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>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:#eee}.nav>li.disabled>a{color:#999}.nav>li.disabled>a:hover,.nav>li.disabled>a:focus{color:#999;text-decoration:none;background-color:transparent;cursor:not-allowed}.nav .open>a,.nav .open>a:hover,.nav .open>a:focus{background-color:#eee;border-color:#428bca}.nav .nav-divider{height:1px;margin:9px 0;overflow:hidden;background-color:#e5e5e5}.nav>li>a>img{max-width:none}.nav-tabs{border-bottom:1px solid #ddd}.nav-tabs>li{float:left;margin-bottom:-1px}.nav-tabs>li>a{margin-right:2px;line-height:1.42857143;border:1px solid transparent;border-radius:4px 4px 0 0}.nav-tabs>li>a:hover{border-color:#eee #eee #ddd}.nav-tabs>li.active>a,.nav-tabs>li.active>a:hover,.nav-tabs>li.active>a:focus{color:#555;background-color:#fff;border:1px solid #ddd;border-bottom-color:transparent;cursor:default}.nav-tabs.nav-justified{width:100%;border-bottom:0}.nav-tabs.nav-justified>li{float:none}.nav-tabs.nav-justified>li>a{text-align:center;margin-bottom:5px}.n
 av-tabs.nav-justified>.dropdown .dropdown-menu{top:auto;left:auto}@media (min-width:768px){.nav-tabs.nav-justified>li{display:table-cell;width:1%}.nav-tabs.nav-justified>li>a{margin-bottom:0}}.nav-tabs.nav-justified>li>a{margin-right:0;border-radius:4px}.nav-tabs.nav-justified>.active>a,.nav-tabs.nav-justified>.active>a:hover,.nav-tabs.nav-justified>.active>a:focus{border:1px solid #ddd}@media (min-width:768px){.nav-tabs.nav-justified>li>a{border-bottom:1px solid #ddd;border-radius:4px 4px 0 0}.nav-tabs.nav-justified>.active>a,.nav-tabs.nav-justified>.active>a:hover,.nav-tabs.nav-justified>.active>a:focus{border-bottom-color:#fff}}.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:#fff;background-color:#428bca}.nav-stacked>li{float:none}.nav-stacked>li+li{margin-top:2px;margin-left:0}.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{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 #ddd}@media (min-width:768px){.nav-tabs-justified>li>a{border-bottom:1px solid #ddd;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:#fff}}.tab-content>.tab-pane{display:none}.tab-content>.active{display:block}.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:20px;border:1px solid transparent}@media (min-width:768px){.navbar{border-radius:4px}}@media (min-width:768px){.navbar-head
 er{float:left}}.navbar-collapse{max-height:340px;overflow-x:visible;padding-right:15px;padding-left:15px;border-top:1px solid transparent;box-shadow:inset 0 1px 0 rgba(255,255,255,.1);-webkit-overflow-scrolling:touch}.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;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}}.container>.navbar-header,.container-fluid>.navbar-header,.container>.navbar-collapse,.container-fluid>.navbar-collapse{margin-right:-15px;margin-left:-15px}@media (min-width:768px){.container>.navbar-header,.container-fluid>.navbar-header,.container>.navbar-collapse,.container-fluid>.navbar-collapse{margin-right:0;margin-left:0}}.navbar-static-top{z-index:1000;bo
 rder-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:15px;font-size:18px;line-height:20px;height:50px}.navbar-brand:hover,.navbar-brand:focus{text-decoration:none}@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:7.5px -15px}.navbar-nav>li>a{padding-top:10px;padding-bottom:10px;line-height:20px}@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:20px}.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:15px;padding-bottom:15px}.navbar-nav.navbar-right:last-child{margin-right:-15px}}@media (min-width:768px){.navbar-left{float:left!important}.navbar-right{float:right!important}}.navbar-form{margin-left:-15px;margin-right:-15px;padding:10px 15px;border-top:1px solid transparent;border-bottom:1px so
 lid transparent;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.1),0 1px 0 rgba(255,255,255,.1);box-shadow:inset 0 1px 0 rgba(255,255,255,.1),0 1px 0 rgba(255,255,255,.1);margin-top:8px;margin-bottom:8px}@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 .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;padding-left:0;vertical-align:middle}.navbar-form .radio input[type=radio],.navbar-form .checkbox input[type=checkbox]{float:none;margin-left:0}.navbar-form .has-feedback .form-control-feedback{top:0}}@media (max-width:767px){.navbar-form .form-group{margin-bottom:5px}}@media (min-width:768px){.navbar-form{width:auto;border:0;margin-left:0;margin-right:0;padding-top:0;padding-bottom:0;-w
 ebkit-box-shadow:none;box-shadow:none}.navbar-form.navbar-right:last-child{margin-right:-15px}}.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{border-bottom-right-radius:0;border-bottom-left-radius:0}.navbar-btn{margin-top:8px;margin-bottom:8px}.navbar-btn.btn-sm{margin-top:10px;margin-bottom:10px}.navbar-btn.btn-xs{margin-top:14px;margin-bottom:14px}.navbar-text{margin-top:15px;margin-bottom:15px}@media (min-width:768px){.navbar-text{float:left;margin-left:15px;margin-right:15px}.navbar-text.navbar-right:last-child{margin-right:0}}.navbar-default{background-color:#f8f8f8;border-color:#e7e7e7}.navbar-default .navbar-brand{color:#777}.navbar-default .navbar-brand:hover,.navbar-default .navbar-brand:focus{color:#5e5e5e;background-color:transparent}.navbar-default .navbar-text{color:#777}.navbar-default .navbar-nav>li>a{color:#777}.navbar-default .navbar-nav>li>a:hover,.navbar-default .navb
 ar-nav>li>a:focus{color:#333;background-color:transparent}.navbar-default .navbar-nav>.active>a,.navbar-default .navbar-nav>.active>a:hover,.navbar-default .navbar-nav>.active>a:focus{color:#555;background-color:#e7e7e7}.navbar-default .navbar-nav>.disabled>a,.navbar-default .navbar-nav>.disabled>a:hover,.navbar-default .navbar-nav>.disabled>a:focus{color:#ccc;background-color:transparent}.navbar-default .navbar-toggle{border-color:#ddd}.navbar-default .navbar-toggle:hover,.navbar-default .navbar-toggle:focus{background-color:#ddd}.navbar-default .navbar-toggle .icon-bar{background-color:#888}.navbar-default .navbar-collapse,.navbar-default .navbar-form{border-color:#e7e7e7}.navbar-default .navbar-nav>.open>a,.navbar-default .navbar-nav>.open>a:hover,.navbar-default .navbar-nav>.open>a:focus{background-color:#e7e7e7;color:#555}@media (max-width:767px){.navbar-default .navbar-nav .open .dropdown-menu>li>a{color:#777}.navbar-default .navbar-nav .open .dropdown-menu>li>a:hover,.navbar-
 default .navbar-nav .open .dropdown-menu>li>a:focus{color:#333;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:#555;background-color:#e7e7e7}.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:#ccc;background-color:transparent}}.navbar-default .navbar-link{color:#777}.navbar-default .navbar-link:hover{color:#333}.navbar-inverse{background-color:#222;border-color:#080808}.navbar-inverse .navbar-brand{color:#999}.navbar-inverse .navbar-brand:hover,.navbar-inverse .navbar-brand:focus{color:#fff;background-color:transparent}.navbar-inverse .navbar-text{color:#999}.navbar-inverse .navbar-nav>li>a{color:#999}.navbar-inverse .navbar-nav>li>a:hover,.navbar-inverse .navbar
 -nav>li>a:focus{color:#fff;background-color:transparent}.navbar-inverse .navbar-nav>.active>a,.navbar-inverse .navbar-nav>.active>a:hover,.navbar-inverse .navbar-nav>.active>a:focus{color:#fff;background-color:#080808}.navbar-inverse .navbar-nav>.disabled>a,.navbar-inverse .navbar-nav>.disabled>a:hover,.navbar-inverse .navbar-nav>.disabled>a:focus{color:#444;background-color:transparent}.navbar-inverse .navbar-toggle{border-color:#333}.navbar-inverse .navbar-toggle:hover,.navbar-inverse .navbar-toggle:focus{background-color:#333}.navbar-inverse .navbar-toggle .icon-bar{background-color:#fff}.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:#080808;color:#fff}@media (max-width:767px){.navbar-inverse .navbar-nav .open .dropdown-menu>.dropdown-header{border-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu
  .divider{background-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu>li>a{color:#999}.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:hover,.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:focus{color:#fff;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:#fff;background-color:#080808}.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:#444;background-color:transparent}}.navbar-inverse .navbar-link{color:#999}.navbar-inverse .navbar-link:hover{color:#fff}.breadcrumb{padding:8px 15px;margin-bottom:20px;list-style:none;background-color:#f5f5f5;border-radius:4px}.breadcrumb>li{display:inline-block}.breadcrumb>li+li:before{content:"/\00a0";paddi
 ng:0 5px;color:#ccc}.breadcrumb>.active{color:#999}.pagination{display:inline-block;padding-left:0;margin:20px 0;border-radius:4px}.pagination>li{display:inline}.pagination>li>a,.pagination>li>span{position:relative;float:left;padding:6px 12px;line-height:1.42857143;text-decoration:none;color:#428bca;background-color:#fff;border:1px solid #ddd;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>span:hover,.pagination>li>a:focus,.pagination>li>span:focus{color:#2a6496;background-color:#eee;border-color:#ddd}.pagination>.active>a,.pagination>.active>span,.pagination>.active>a:hover,.pagination>.active>span:hover,.pagination>.active>a:focus,.pagination>.active>span:focus{z-index:2;color:#fff;background-color:#428bca;border-color:#428bca;
 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:#999;background-color:#fff;border-color:#ddd;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:20px 0;list-style:none;text-align:center}.pager li{display:
 inline}.pager li>a,.pager li>span{display:inline-block;padding:5px 14px;background-color:#fff;border:1px solid #ddd;border-radius:15px}.pager li>a:hover,.pager li>a:focus{text-decoration:none;background-color:#eee}.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:#999;background-color:#fff;cursor:not-allowed}.label{display:inline;padding:.2em .6em .3em;font-size:75%;font-weight:700;line-height:1;color:#fff;text-align:center;white-space:nowrap;vertical-align:baseline;border-radius:.25em}.label[href]:hover,.label[href]:focus{color:#fff;text-decoration:none;cursor:pointer}.label:empty{display:none}.btn .label{position:relative;top:-1px}.label-default{background-color:#999}.label-default[href]:hover,.label-default[href]:focus{background-color:gray}.label-primary{background-color:#428bca}.label-primary[href]:hover,.label-primary[href]:focus{backg
 round-color:#3071a9}.label-success{background-color:#5cb85c}.label-success[href]:hover,.label-success[href]:focus{background-color:#449d44}.label-info{background-color:#5bc0de}.label-info[href]:hover,.label-info[href]:focus{background-color:#31b0d5}.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:#c9302c}.badge{display:inline-block;min-width:10px;padding:3px 7px;font-size:12px;font-weight:700;color:#fff;line-height:1;vertical-align:baseline;white-space:nowrap;text-align:center;background-color:#999;border-radius:10px}.badge:empty{display:none}.btn .badge{position:relative;top:-1px}.btn-xs .badge{top:0;padding:1px 5px}a.badge:hover,a.badge:focus{color:#fff;text-decoration:none;cursor:pointer}a.list-group-item.active>.badge,.nav-pills>.active>a>.badge{color:#428bca;background-color:#fff}.nav-pills>li>a>.badge{
 margin-left:3px}.jumbotron{padding:30px;margin-bottom:30px;color:inherit;background-color:#eee}.jumbotron h1,.jumbotron .h1{color:inherit}.jumbotron p{margin-bottom:15px;font-size:21px;font-weight:200}.container .jumbotron{border-radius:6px}.jumbotron .container{max-width:100%}@media screen and (min-width:768px){.jumbotron{padding-top:48px;padding-bottom:48px}.container .jumbotron{padding-left:60px;padding-right:60px}.jumbotron h1,.jumbotron .h1{font-size:63px}}.thumbnail{display:block;padding:4px;margin-bottom:20px;line-height:1.42857143;background-color:#fff;border:1px solid #ddd;border-radius:4px;-webkit-transition:all .2s ease-in-out;transition:all .2s ease-in-out}.thumbnail>img,.thumbnail a>img{margin-left:auto;margin-right:auto}a.thumbnail:hover,a.thumbnail:focus,a.thumbnail.active{border-color:#428bca}.thumbnail .caption{padding:9px;color:#333}.alert{padding:15px;margin-bottom:20px;border:1px solid transparent;border-radius:4px}.alert h4{margin-top:0;color:inherit}.alert .ale
 rt-link{font-weight:700}.alert>p,.alert>ul{margin-bottom:0}.alert>p+p{margin-top:5px}.alert-dismissable{padding-right:35px}.alert-dismissable .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:#c9e2b3}.alert-success .alert-link{color:#2b542c}.alert-info{background-color:#d9edf7;border-color:#bce8f1;color:#31708f}.alert-info hr{border-top-color:#a6e1ec}.alert-info .alert-link{color:#245269}.alert-warning{background-color:#fcf8e3;border-color:#faebcc;color:#8a6d3b}.alert-warning hr{border-top-color:#f7e1b5}.alert-warning .alert-link{color:#66512c}.alert-danger{background-color:#f2dede;border-color:#ebccd1;color:#a94442}.alert-danger hr{border-top-color:#e4b9c0}.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{back
 ground-position:0 0}}.progress{overflow:hidden;height:20px;margin-bottom:20px;background-color:#f5f5f5;border-radius:4px;-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,.1);box-shadow:inset 0 1px 2px rgba(0,0,0,.1)}.progress-bar{float:left;width:0;height:100%;font-size:12px;line-height:20px;color:#fff;text-align:center;background-color:#428bca;-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,.15);box-shadow:inset 0 -1px 0 rgba(0,0,0,.15);-webkit-transition:width .6s ease;transition:width .6s ease}.progress-striped .progress-bar{background-image:-webkit-linear-gradient(45deg,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(45deg,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-size:40px 40px}.progress.active .progress-bar{-webkit-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,.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(45deg,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)}.progress-bar-info{background-color:#5bc0de}.progress-striped .progress-bar-info{background-image:-webkit-linear-gradient(45deg,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(45deg,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)}.progress-bar-warning{background-color:#f
 0ad4e}.progress-striped .progress-bar-warning{background-image:-webkit-linear-gradient(45deg,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(45deg,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)}.progress-bar-danger{background-color:#d9534f}.progress-striped .progress-bar-danger{background-image:-webkit-linear-gradient(45deg,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(45deg,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)}.media,.media-body{overflow:hidden;zoom:1}.media,.media .media{margin-top:15px}.media:first-child{margin-top:0}.media-object{display:block
 }.media-heading{margin:0 0 5px}.media>.pull-left{margin-right:10px}.media>.pull-right{margin-left:10px}.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:#fff;border:1px solid #ddd}.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}.list-group-item>.badge{float:right}.list-group-item>.badge+.badge{margin-right:5px}a.list-group-item{color:#555}a.list-group-item .list-group-item-heading{color:#333}a.list-group-item:hover,a.list-group-item:focus{text-decoration:none;background-color:#f5f5f5}a.list-group-item.active,a.list-group-item.active:hover,a.list-group-item.active:focus{z-index:2;color:#fff;background-color:#428bca;border-color:#428bca}a.list-group-item.active .list-group-item-heading,a.list-group-item.act
 ive:hover .list-group-item-heading,a.list-group-item.active:focus .list-group-item-heading{color:inherit}a.list-group-item.active .list-group-item-text,a.list-group-item.active:hover .list-group-item-text,a.list-group-item.active:focus .list-group-item-text{color:#e1edf7}.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:#fff;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:#c4e3f3}a.list-group-item-info.activ
 e,a.list-group-item-info.active:hover,a.list-group-item-info.active:focus{color:#fff;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:#fff;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:#fff;background-color:#a94442;border-color:#a
 94442}.list-group-item-heading{margin-top:0;margin-bottom:5px}.list-group-item-text{margin-bottom:0;line-height:1.3}.panel{margin-bottom:20px;background-color:#fff;border:1px solid transparent;border-radius:4px;-webkit-box-shadow:0 1px 1px rgba(0,0,0,.05);box-shadow:0 1px 1px rgba(0,0,0,.05)}.panel-body{padding:15px}.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{color:inherit}.panel-footer{padding:10px 15px;background-color:#f5f5f5;border-top:1px solid #ddd;border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.list-group{margin-bottom:0}.panel>.list-group .list-group-item{border-width:1px 0;border-radius:0}.panel>.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:la
 st-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}.panel>.table,.panel>.table-responsive>.table{margin-bottom:0}.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 td:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child td:first-child,.panel>.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 td:first-child,.panel>.table:first-child>thead:first-child>tr:first-child th:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child th:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child th: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-responsive:first-child>.table:first-child>thead:first-child>tr:first-child td:last-child,.panel>.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 td:last-child,.panel>.table:first-child>thead:first-child>tr:first-child th:last-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child th:last-child,.panel>.table:first-child>tbody:first-child>tr:first-child th: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 td:first-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child td:first-child,.panel>.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 td:first-child,.panel>.table:last-child>tbody:last-child>tr:last-child th:first-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child th:first-child,.panel>.table:last-child>tfoot:last-child>tr:last-child th: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-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child td:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child td:last-child,.panel>.table-responsive:last-child>.ta
 ble:last-child>tfoot:last-child>tr:last-child td:last-child,.panel>.table:last-child>tbody:last-child>tr:last-child th:last-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child th:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child th: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{border-top:1px solid #ddd}.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-responsive>.table-bordered>thead>tr>th:first-child,.panel>.table-bordered>tbody>tr>th:first-child,.panel>.table-responsive>.table-bordered>tbody>tr>th:first-child,.panel>.table-bordered>tfoot>tr>th:first-child,.panel>.table-responsi
 ve>.table-bordered>tfoot>tr>th:first-child,.panel>.table-bordered>thead>tr>td:first-child,.panel>.table-responsive>.table-bordered>thead>tr>td:first-child,.panel>.table-bordered>tbody>tr>td:first-child,.panel>.table-responsive>.table-bordered>tbody>tr>td:first-child,.panel>.table-bordered>tfoot>tr>td: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-responsive>.table-bordered>thead>tr>th:last-child,.panel>.table-bordered>tbody>tr>th:last-child,.panel>.table-responsive>.table-bordered>tbody>tr>th:last-child,.panel>.table-bordered>tfoot>tr>th:last-child,.panel>.table-responsive>.table-bordered>tfoot>tr>th:last-child,.panel>.table-bordered>thead>tr>td:last-child,.panel>.table-responsive>.table-bordered>thead>tr>td:last-child,.panel>.table-bordered>tbody>tr>td:last-child,.panel>.table-responsive>.table-bordered>tbody>tr>td:last-child,.panel>.table-bordered>tfoot>tr>td: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-responsive>.table-bordered>thead>tr:first-child>td,.panel>.table-bordered>tbody>tr:first-child>td,.panel>.table-responsive>.table-bordered>tbody>tr:first-child>td,.panel>.table-bordered>thead>tr:first-child>th,.panel>.table-responsive>.table-bordered>thead>tr:first-child>th,.panel>.table-bordered>tbody>tr:first-child>th,.panel>.table-responsive>.table-bordered>tbody>tr:first-child>th{border-bottom:0}.panel>.table-bordered>tbody>tr:last-child>td,.panel>.table-responsive>.table-bordered>tbody>tr:last-child>td,.panel>.table-bordered>tfoot>tr:last-child>td,.panel>.table-responsive>.table-bordered>tfoot>tr:last-child>td,.panel>.table-bordered>tbody>tr:last-child>th,.panel>.table-responsive>.table-bordered>tbody>tr:last-child>th,.panel>.table-bordered>tfoot>tr:last-child>th,.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:20px}.panel-group .panel{margin-bottom:0;border-radius:4px;overflow:hidden}.panel-group .panel+.panel{margin-top:5px}.panel-group .panel-heading{border-bottom:0}.panel-group .panel-heading+.panel-collapse .panel-body{border-top:1px solid #ddd}.panel-group .panel-footer{border-top:0}.panel-group .panel-footer+.panel-collapse .panel-body{border-bottom:1px solid #ddd}.panel-default{border-color:#ddd}.panel-default>.panel-heading{color:#333;background-color:#f5f5f5;border-color:#ddd}.panel-default>.panel-heading+.panel-collapse .panel-body{border-top-color:#ddd}.panel-default>.panel-footer+.panel-collapse .panel-body{border-bottom-color:#ddd}.panel-primary{border-color:#428bca}.panel-primary>.panel-heading{color:#fff;background-color:#428bca;border-color:#428bca}.panel-primary>.panel-heading+.panel-collapse .panel-body{border-top-color:#428bca}.panel-primary>.panel-footer+.panel-collapse .panel-body{border-bottom-col
 or:#428bca}.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-footer+.panel-collapse .panel-body{border-bottom-color:#d6e9c6}.panel-info{border-color:#bce8f1}.panel-info>.panel-heading{color:#31708f;background-color:#d9edf7;border-color:#bce8f1}.panel-info>.panel-heading+.panel-collapse .panel-body{border-top-color:#bce8f1}.panel-info>.panel-footer+.panel-collapse .panel-body{border-bottom-color:#bce8f1}.panel-warning{border-color:#faebcc}.panel-warning>.panel-heading{color:#8a6d3b;background-color:#fcf8e3;border-color:#faebcc}.panel-warning>.panel-heading+.panel-collapse .panel-body{border-top-color:#faebcc}.panel-warning>.panel-footer+.panel-collapse .panel-body{border-bottom-color:#faebcc}.panel-danger{border-color:#ebccd1}.panel-danger>.panel-heading{color:#a94442;background-color:#f2dede;border-color:
 #ebccd1}.panel-danger>.panel-heading+.panel-collapse .panel-body{border-top-color:#ebccd1}.panel-danger>.panel-footer+.panel-collapse .panel-body{border-bottom-color:#ebccd1}.well{min-height:20px;padding:19px;margin-bottom:20px;background-color:#f5f5f5;border:1px solid #e3e3e3;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.05);box-shadow:inset 0 1px 1px rgba(0,0,0,.05)}.well blockquote{border-color:#ddd;border-color:rgba(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:700;line-height:1;color:#000;text-shadow:0 1px 0 #fff;opacity:.2;filter:alpha(opacity=20)}.close:hover,.close:focus{color:#000;text-decoration:none;cursor:pointer;opacity:.5;filter:alpha(opacity=50)}button.close{padding:0;cursor:pointer;background:0 0;border:0;-webkit-appearance:none}.modal-open{overflow:hidden}.modal{display:none;overflow:auto;overflow-y:scroll;position:fixed;top:0;right:0;bottom:0;left:0;z-index:
 1050;-webkit-overflow-scrolling:touch;outline:0}.modal.fade .modal-dialog{-webkit-transform:translate(0,-25%);-ms-transform:translate(0,-25%);transform:translate(0,-25%);-webkit-transition:-webkit-transform .3s ease-out;-moz-transition:-moz-transform .3s ease-out;-o-transition:-o-transform .3s ease-out;transition:transform .3s ease-out}.modal.in .modal-dialog{-webkit-transform:translate(0,0);-ms-transform:translate(0,0);transform:translate(0,0)}.modal-dialog{position:relative;width:auto;margin:10px}.modal-content{position:relative;background-color:#fff;border:1px solid #999;border:1px solid rgba(0,0,0,.2);border-radius:6px;-webkit-box-shadow:0 3px 9px rgba(0,0,0,.5);box-shadow:0 3px 9px rgba(0,0,0,.5);background-clip:padding-box;outline:0}.modal-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1040;background-color:#000}.modal-backdrop.fade{opacity:0;filter:alpha(opacity=0)}.modal-backdrop.in{opacity:.5;filter:alpha(opacity=50)}.modal-header{padding:15px;border-bottom:1
 px solid #e5e5e5;min-height:16.42857143px}.modal-header .close{margin-top:-2px}.modal-title{margin:0;line-height:1.42857143}.modal-body{position:relative;padding:20px}.modal-footer{margin-top:15px;padding:19px 20px 20px;text-align:right;border-top:1px solid #e5e5e5}.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}@media (min-width:768px){.modal-dialog{width:600px;margin:30px auto}.modal-content{-webkit-box-shadow:0 5px 15px rgba(0,0,0,.5);box-shadow:0 5px 15px rgba(0,0,0,.5)}.modal-sm{width:300px}}@media (min-width:992px){.modal-lg{width:900px}}.tooltip{position:absolute;z-index:1030;display:block;visibility:visible;font-size:12px;line-height:1.4;opacity:0;filter:alpha(opacity=0)}.tooltip.in{opacity:.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{marg
 in-left:-3px;padding:0 5px}.tooltip-inner{max-width:200px;padding:3px 8px;color:#fff;text-align:center;text-decoration:none;background-color:#000;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:#000}.tooltip.top-left .tooltip-arrow{bottom:0;left:5px;border-width:5px 5px 0;border-top-color:#000}.tooltip.top-right .tooltip-arrow{bottom:0;right:5px;border-width:5px 5px 0;border-top-color:#000}.tooltip.right .tooltip-arrow{top:50%;left:0;margin-top:-5px;border-width:5px 5px 5px 0;border-right-color:#000}.tooltip.left .tooltip-arrow{top:50%;right:0;margin-top:-5px;border-width:5px 0 5px 5px;border-left-color:#000}.tooltip.bottom .tooltip-arrow{top:0;left:50%;margin-left:-5px;border-width:0 5px 5px;border-bottom-color:#000}.tooltip.bottom-left .tooltip-arrow{top:0;left:5px;border-width:0 5px 5px;border-bottom-color:#000}.too
 ltip.bottom-right .tooltip-arrow{top:0;right:5px;border-width:0 5px 5px;border-bottom-color:#000}.popover{position:absolute;top:0;left:0;z-index:1010;display:none;max-width:276px;padding:1px;text-align:left;background-color:#fff;background-clip:padding-box;border:1px solid #ccc;border:1px solid rgba(0,0,0,.2);border-radius:6px;-webkit-box-shadow:0 5px 10px rgba(0,0,0,.2);box-shadow:0 5px 10px rgba(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;font-weight:400;line-height:18px;background-color:#f7f7f7;border-bottom:1px solid #ebebeb;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:#999;border-top-color:rgba(0,0,0,.25);bottom:-11px}.popover.top>.arrow:after{content:" ";bottom:1px;margin-left:-10px;border-bottom-width:0;border-top-color:#fff}.popover.right>.arrow{top:50%;left:-11px;margin-top:-11px;border-left-width:0;border-right-color:#999;border-right-color:rgba(0,0,0,.25)}.popover.right>.arrow:after{content:" ";left:1px;bottom:-10px;border-left-width:0;border-right-color:#fff}.popover.bottom>.arrow{left:50%;margin-left:-11px;border-top-width:0;border-bottom-color:#999;border-bottom-color:rgba(0,0,0,.25);top:-11px}.popover.bottom>.arrow:after{content:" ";top:1px;margin-left:-10px;border-top-width:0;border-bottom-color:#fff}.popover.left>.arrow{top:50%;right:-11px;margin-top:-11px;border-right-width:0;border-left-color:#999;border-left-color:rgba(0,0,0,.25)}.popover.left>.arrow:after{content:" ";right:1px;border-right-width:0;border-left-color:#fff;bottom:-10px}.carousel{position:relative}.car
 ousel-inner{position:relative;overflow:hidden;width:100%}.carousel-inner>.item{display:none;position:relative;-webkit-transition:.6s ease-in-out left;transition:.6s ease-in-out left}.carousel-inner>.item>img,.carousel-inner>.item>a>img{line-height:1}.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:.5;filter:alpha(opacity=50);font-size:20px;color:#fff;text-align:center;text-shadow:0 1px 2px rgba(0,0,0,.6)}.carousel-control.left{background-image:-webkit-linear-gradient(left,color-stop(rgba(0,0,0,.5) 0),color-stop(rgba(0,0,0,.0001) 100%));background-image:linear-gradi
 ent(to right,rgba(0,0,0,.5) 0,rgba(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,color-stop(rgba(0,0,0,.0001) 0),color-stop(rgba(0,0,0,.5) 100%));background-image:linear-gradient(to right,rgba(0,0,0,.0001) 0,rgba(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:#fff;text-decoration:none;opacity:.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%}.carousel-c
 ontrol .icon-next,.carousel-control .glyphicon-chevron-right{right:50%}.carousel-control .icon-prev,.carousel-control .icon-next{width:20px;height:20px;margin-top:-10px;margin-left:-10px;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 #fff;border-radius:10px;cursor:pointer;background-color:#000 \9;background-color:rgba(0,0,0,0)}.carousel-indicators .active{margin:0;width:12px;height:12px;background-color:#fff}.carousel-caption{position:absolute;left:15%;right:15%;bottom:20px;z-index:10;padding-top:20px;padding-bottom:20px;color:#fff;text-align:center;text-shadow:0 1px 2px rgba(0,0,0,.6)}.carousel-caption .btn{text-shadow:none}@media screen and (min-widt
 h: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;margin-left:-15px;font-size:30px}.carousel-caption{left:20%;right:20%;padding-bottom:30px}.carousel-indicators{bottom:20px}}.clearfix:before,.clearfix:after,.container:before,.container:after,.container-fluid:before,.container-fluid:after,.row:before,.row:after,.form-horizontal .form-group:before,.form-horizontal .form-group:after,.btn-toolbar:before,.btn-toolbar:after,.btn-group-vertical>.btn-group:before,.btn-group-vertical>.btn-group:after,.nav:before,.nav:after,.navbar:before,.navbar:after,.navbar-header:before,.navbar-header:after,.navbar-collapse:before,.navbar-collapse:after,.pager:before,.pager:after,.panel-body:before,.panel-body:after,.modal-footer:before,.modal-footer:after{content:" ";display:table}.clearfix:after,.container:after,.container-fluid:after,.row:after,.form-horizontal .
 form-group:after,.btn-toolbar:after,.btn-group-vertical>.btn-group:after,.nav:after,.navbar:after,.navbar-header:after,.navbar-collapse:after,.pager:after,.panel-body:after,.modal-footer: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,.visible-sm,.visible-md,.visible-lg{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 (min-width:768px) and (max-width:991px){.visible-sm{display:block!important}table.visible-sm{disp
 lay:table}tr.visible-sm{display:table-row!important}th.visible-sm,td.visible-sm{display:table-cell!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: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 (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.visi
 ble-print{display:table-cell!important}}@media print{.hidden-print{display:none!important}}
\ No newline at end of file
diff --git a/www/members/js/bootstrap-combobox.js b/www/members/js/bootstrap-combobox.js
new file mode 100644
index 0000000..402e829
--- /dev/null
+++ b/www/members/js/bootstrap-combobox.js
@@ -0,0 +1,429 @@
+/* =============================================================
+ * bootstrap-combobox.js v1.1.6
+ * =============================================================
+ * Copyright 2012 Daniel Farrell
+ *
+ * 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";
+
+ /* COMBOBOX PUBLIC CLASS DEFINITION
+  * ================================ */
+
+  var Combobox = function ( element, options ) {
+    this.options = $.extend({}, $.fn.combobox.defaults, options);
+    this.$source = $(element);
+    this.$container = this.setup();
+    this.$element = this.$container.find('input[type=text]');
+    this.$target = this.$container.find('input[type=hidden]');
+    this.$button = this.$container.find('.dropdown-toggle');
+    this.$menu = $(this.options.menu).appendTo('body');
+    this.template = this.options.template || this.template
+    this.matcher = this.options.matcher || this.matcher;
+    this.sorter = this.options.sorter || this.sorter;
+    this.highlighter = this.options.highlighter || this.highlighter;
+    this.shown = false;
+    this.selected = false;
+    this.refresh();
+    this.transferAttributes();
+    this.listen();
+  };
+
+  Combobox.prototype = {
+
+    constructor: Combobox
+
+  , setup: function () {
+      var combobox = $(this.template());
+      this.$source.before(combobox);
+      this.$source.hide();
+      return combobox;
+    }
+
+  , disable: function() {
+      this.$element.prop('disabled', true);
+      this.$button.attr('disabled', true);
+      this.disabled = true;
+      this.$container.addClass('combobox-disabled');
+    }
+
+  , enable: function() {
+      this.$element.prop('disabled', false);
+      this.$button.attr('disabled', false);
+      this.disabled = false;
+      this.$container.removeClass('combobox-disabled');
+    }
+  , parse: function () {
+      var that = this
+        , map = {}
+        , source = []
+        , selected = false
+        , selectedValue = '';
+      this.$source.find('option').each(function() {
+        var option = $(this);
+        if (option.val() === '') {
+          that.options.placeholder = option.text();
+          return;
+        }
+        map[option.text()] = option.val();
+        source.push(option.text());
+        if (option.prop('selected')) {
+          selected = option.text();
+          selectedValue = option.val();
+        }
+      })
+      this.map = map;
+      if (selected) {
+        this.$element.val(selected);
+        this.$target.val(selectedValue);
+        this.$container.addClass('combobox-selected');
+        this.selected = true;
+      }
+      return source;
+    }
+
+  , transferAttributes: function() {
+    this.options.placeholder = this.$source.attr('data-placeholder') || this.options.placeholder
+    this.$element.attr('placeholder', this.options.placeholder)
+    this.$target.prop('name', this.$source.prop('name'))
+    this.$target.val(this.$source.val())
+    this.$source.removeAttr('name')  // Remove from source otherwise form will pass parameter twice.
+    this.$element.attr('required', this.$source.attr('required'))
+    this.$element.attr('rel', this.$source.attr('rel'))
+    this.$element.attr('title', this.$source.attr('title'))
+    this.$element.attr('class', this.$source.attr('class'))
+    this.$element.attr('tabindex', this.$source.attr('tabindex'))
+    this.$source.removeAttr('tabindex')
+    if (this.$source.attr('disabled')!==undefined)
+      this.disable();
+  }
+
+  , select: function () {
+      var val = this.$menu.find('.active').attr('data-value');
+      this.$element.val(this.updater(val)).trigger('change');
+      this.$target.val(this.map[val]).trigger('change');
+      this.$source.val(this.map[val]).trigger('change');
+      this.$container.addClass('combobox-selected');
+      this.selected = true;
+      return this.hide();
+    }
+
+  , updater: function (item) {
+      return item;
+    }
+
+  , show: function () {
+      var pos = $.extend({}, this.$element.position(), {
+        height: this.$element[0].offsetHeight
+      });
+
+      this.$menu
+        .insertAfter(this.$element)
+        .css({
+          top: pos.top + pos.height
+        , left: pos.left
+        })
+        .show();
+
+      this.shown = true;
+      return this;
+    }
+
+  , hide: function () {
+      this.$menu.hide();
+      this.shown = false;
+      return this;
+    }
+
+  , lookup: function (event) {
+      this.query = this.$element.val();
+      return this.process(this.source);
+    }
+
+  , 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();
+    }
+
+  , template: function() {
+      if (this.options.bsVersion == '2') {
+        return '<div class="combobox-container"><input type="hidden" /> <div class="input-append"> <input type="text" autocomplete="off" /> <span class="add-on dropdown-toggle" data-dropdown="dropdown"> <span class="caret"/> <i class="icon-remove"/> </span> </div> </div>'
+      } else {
+        return '<div class="combobox-container"> <input type="hidden" /> <div class="input-group"> <input type="text" autocomplete="off" /> <span class="input-group-addon dropdown-toggle" data-dropdown="dropdown"> <span class="caret" /> <span class="glyphicon glyphicon-remove" /> </span> </div> </div>'
+      }
+    }
+
+  , 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');
+    }
+
+  , toggle: function () {
+    if (!this.disabled) {
+      if (this.$container.hasClass('combobox-selected')) {
+        this.clearTarget();
+        this.triggerChange();
+        this.clearElement();
+      } else {
+        if (this.shown) {
+          this.hide();
+        } else {
+          this.clearElement();
+          this.lookup();
+        }
+      }
+    }
+  }
+
+  , clearElement: function () {
+    this.$element.val('').focus();
+  }
+
+  , clearTarget: function () {
+    this.$source.val('');
+    this.$target.val('');
+    this.$container.removeClass('combobox-selected');
+    this.selected = false;
+  }
+
+  , triggerChange: function () {
+    this.$source.trigger('change');
+  }
+
+  , refresh: function () {
+    this.source = this.parse();
+    this.options.items = this.source.length;
+  }
+
+  , listen: function () {
+      this.$element
+        .on('focus',    $.proxy(this.focus, this))
+        .on('blur',     $.proxy(this.blur, this))
+        .on('keypress', $.proxy(this.keypress, this))
+        .on('keyup',    $.proxy(this.keyup, this));
+
+      if (this.eventSupported('keydown')) {
+        this.$element.on('keydown', $.proxy(this.keydown, this));
+      }
+
+      this.$menu
+        .on('click', $.proxy(this.click, this))
+        .on('mouseenter', 'li', $.proxy(this.mouseenter, this))
+        .on('mouseleave', 'li', $.proxy(this.mouseleave, this));
+
+      this.$button
+        .on('click', $.proxy(this.toggle, this));
+    }
+
+  , eventSupported: function(eventName) {
+      var isSupported = eventName in this.$element;
+      if (!isSupported) {
+        this.$element.setAttribute(eventName, 'return;');
+        isSupported = typeof this.$element[eventName] === 'function';
+      }
+      return isSupported;
+    }
+
+  , 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 39: // right arrow
+        case 38: // up arrow
+        case 37: // left arrow
+        case 36: // home
+        case 35: // end
+        case 16: // shift
+        case 17: // ctrl
+        case 18: // alt
+          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.clearTarget();
+          this.lookup();
+      }
+
+      e.stopPropagation();
+      e.preventDefault();
+  }
+
+  , focus: function (e) {
+      this.focused = true;
+    }
+
+  , blur: function (e) {
+      var that = this;
+      this.focused = false;
+      var val = this.$element.val();
+      if (!this.selected && val !== '' ) {
+        this.$element.val('');
+        this.$source.val('').trigger('change');
+        this.$target.val('').trigger('change');
+      }
+      if (!this.mousedover && this.shown) {setTimeout(function () { that.hide(); }, 200);}
+    }
+
+  , click: function (e) {
+      e.stopPropagation();
+      e.preventDefault();
+      this.select();
+      this.$element.focus();
+    }
+
+  , mouseenter: function (e) {
+      this.mousedover = true;
+      this.$menu.find('.active').removeClass('active');
+      $(e.currentTarget).addClass('active');
+    }
+
+  , mouseleave: function (e) {
+      this.mousedover = false;
+    }
+  };
+
+  /* COMBOBOX PLUGIN DEFINITION
+   * =========================== */
+  $.fn.combobox = function ( option ) {
+    return this.each(function () {
+      var $this = $(this)
+        , data = $this.data('combobox')
+        , options = typeof option == 'object' && option;
+      if(!data) {$this.data('combobox', (data = new Combobox(this, options)));}
+      if (typeof option == 'string') {data[option]();}
+    });
+  };
+
+  $.fn.combobox.defaults = {
+    bsVersion: '3'
+  , menu: '<ul class="typeahead typeahead-long dropdown-menu"></ul>'
+  , item: '<li><a href="#"></a></li>'
+  };
+
+  $.fn.combobox.Constructor = Combobox;
+
+}( window.jQuery );
diff --git a/www/members/js/bootstrap.min.js b/www/members/js/bootstrap.min.js
new file mode 100644
index 0000000..b04a0e8
--- /dev/null
+++ b/www/members/js/bootstrap.min.js
@@ -0,0 +1,6 @@
+/*!
+ * Bootstrap v3.1.1 (http://getbootstrap.com)
+ * Copyright 2011-2014 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";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(a.support.transition.end,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()})}(jQuery),+function(a){"use strict";var b='[data-dismiss="alert"]',c=function(c){a(c).on("click",b,this.close)};c.prototype.close=function(b){function c(){f.trigger("closed.bs.alert").remove()}var d=a(this),e=d.attr("data-target");e||(e=d.attr("href"),e=e&&e.replace(/.*(?=#[^\s]*$)/,""));var f=a(e);b&&b.preventDefault(),f.length||(f=d.hasClass("alert")?d:d.parent()),f.trigger(b=a.
 Event("close.bs.alert")),b.isDefaultPrevented()||(f.removeClass("in"),a.support.transition&&f.hasClass("fade")?f.one(a.support.transition.end,c).emulateTransitionEnd(150):c())};var d=a.fn.alert;a.fn.alert=function(b){return this.each(function(){var d=a(this),e=d.data("bs.alert");e||d.data("bs.alert",e=new c(this)),"string"==typeof b&&e[b].call(d)})},a.fn.alert.Constructor=c,a.fn.alert.noConflict=function(){return a.fn.alert=d,this},a(document).on("click.bs.alert.data-api",b,c.prototype.close)}(jQuery),+function(a){"use strict";var b=function(c,d){this.$element=a(c),this.options=a.extend({},b.DEFAULTS,d),this.isLoading=!1};b.DEFAULTS={loadingText:"loading..."},b.prototype.setState=function(b){var c="disabled",d=this.$element,e=d.is("input")?"val":"html",f=d.data();b+="Text",f.resetText||d.data("resetText",d[e]()),d[e](f[b]||this.options[b]),setTimeout(a.proxy(function(){"loadingText"==b?(this.isLoading=!0,d.addClass(c).attr(c,c)):this.isLoading&&(this.isLoading=!1,d.removeClass(c).re
 moveAttr(c))},this),0)},b.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")}a&&this.$element.toggleClass("active")};var c=a.fn.button;a.fn.button=function(c){return this.each(function(){var d=a(this),e=d.data("bs.button"),f="object"==typeof c&&c;e||d.data("bs.button",e=new b(this,f)),"toggle"==c?e.toggle():c&&e.setState(c)})},a.fn.button.Constructor=b,a.fn.button.noConflict=function(){return a.fn.button=c,this},a(document).on("click.bs.button.data-api","[data-toggle^=button]",function(b){var c=a(b.target);c.hasClass("btn")||(c=c.closest(".btn")),c.button("toggle"),b.preventDefault()})}(jQuery),+function(a){"use strict";var b=function(b,c){this.$element=a(b),this.$indicators=this.$element.find(".carousel-in
 dicators"),this.options=c,this.paused=this.sliding=this.interval=this.$active=this.$items=null,"hover"==this.options.pause&&this.$element.on("mouseenter",a.proxy(this.pause,this)).on("mouseleave",a.proxy(this.cycle,this))};b.DEFAULTS={interval:5e3,pause:"hover",wrap:!0},b.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},b.prototype.getActiveIndex=function(){return this.$active=this.$element.find(".item.active"),this.$items=this.$active.parent().children(),this.$items.index(this.$active)},b.prototype.to=function(b){var c=this,d=this.getActiveIndex();return b>this.$items.length-1||0>b?void 0:this.sliding?this.$element.one("slid.bs.carousel",function(){c.to(b)}):d==b?this.pause().cycle():this.slide(b>d?"next":"prev",a(this.$items[b]))},b.prototype.pause=function(b){return b||(this.paused=!0),this.$element.find(".next, .p
 rev").length&&a.support.transition&&(this.$element.trigger(a.support.transition.end),this.cycle(!0)),this.interval=clearInterval(this.interval),this},b.prototype.next=function(){return this.sliding?void 0:this.slide("next")},b.prototype.prev=function(){return this.sliding?void 0:this.slide("prev")},b.prototype.slide=function(b,c){var d=this.$element.find(".item.active"),e=c||d[b](),f=this.interval,g="next"==b?"left":"right",h="next"==b?"first":"last",i=this;if(!e.length){if(!this.options.wrap)return;e=this.$element.find(".item")[h]()}if(e.hasClass("active"))return this.sliding=!1;var j=a.Event("slide.bs.carousel",{relatedTarget:e[0],direction:g});return this.$element.trigger(j),j.isDefaultPrevented()?void 0:(this.sliding=!0,f&&this.pause(),this.$indicators.length&&(this.$indicators.find(".active").removeClass("active"),this.$element.one("slid.bs.carousel",function(){var b=a(i.$indicators.children()[i.getActiveIndex()]);b&&b.addClass("active")})),a.support.transition&&this.$element.h
 asClass("slide")?(e.addClass(b),e[0].offsetWidth,d.addClass(g),e.addClass(g),d.one(a.support.transition.end,function(){e.removeClass([b,g].join(" ")).addClass("active"),d.removeClass(["active",g].join(" ")),i.sliding=!1,setTimeout(function(){i.$element.trigger("slid.bs.carousel")},0)}).emulateTransitionEnd(1e3*d.css("transition-duration").slice(0,-1))):(d.removeClass("active"),e.addClass("active"),this.sliding=!1,this.$element.trigger("slid.bs.carousel")),f&&this.cycle(),this)};var c=a.fn.carousel;a.fn.carousel=function(c){return this.each(function(){var d=a(this),e=d.data("bs.carousel"),f=a.extend({},b.DEFAULTS,d.data(),"object"==typeof c&&c),g="string"==typeof c?c:f.slide;e||d.data("bs.carousel",e=new b(this,f)),"number"==typeof c?e.to(c):g?e[g]():f.interval&&e.pause().cycle()})},a.fn.carousel.Constructor=b,a.fn.carousel.noConflict=function(){return a.fn.carousel=c,this},a(document).on("click.bs.carousel.data-api","[data-slide], [data-slide-to]",function(b){var c,d=a(this),e=a(d.a
 ttr("data-target")||(c=d.attr("href"))&&c.replace(/.*(?=#[^\s]+$)/,"")),f=a.extend({},e.data(),d.data()),g=d.attr("data-slide-to");g&&(f.interval=!1),e.carousel(f),(g=d.attr("data-slide-to"))&&e.data("bs.carousel").to(g),b.preventDefault()}),a(window).on("load",function(){a('[data-ride="carousel"]').each(function(){var b=a(this);b.carousel(b.data())})})}(jQuery),+function(a){"use strict";var b=function(c,d){this.$element=a(c),this.options=a.extend({},b.DEFAULTS,d),this.transitioning=null,this.options.parent&&(this.$parent=a(this.options.parent)),this.options.toggle&&this.toggle()};b.DEFAULTS={toggle:!0},b.prototype.dimension=function(){var a=this.$element.hasClass("width");return a?"width":"height"},b.prototype.show=function(){if(!this.transitioning&&!this.$element.hasClass("in")){var b=a.Event("show.bs.collapse");if(this.$element.trigger(b),!b.isDefaultPrevented()){var c=this.$parent&&this.$parent.find("> .panel > .in");if(c&&c.length){var d=c.data("bs.collapse");if(d&&d.transition
 ing)return;c.collapse("hide"),d||c.data("bs.collapse",null)}var e=this.dimension();this.$element.removeClass("collapse").addClass("collapsing")[e](0),this.transitioning=1;var f=function(){this.$element.removeClass("collapsing").addClass("collapse in")[e]("auto"),this.transitioning=0,this.$element.trigger("shown.bs.collapse")};if(!a.support.transition)return f.call(this);var g=a.camelCase(["scroll",e].join("-"));this.$element.one(a.support.transition.end,a.proxy(f,this)).emulateTransitionEnd(350)[e](this.$element[0][g])}}},b.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").removeClass("in"),this.transitioning=1;var d=function(){this.transitioning=0,this.$element.trigger("hidden.bs.collapse").removeClass("collapsing").addClass("collap
 se")};return a.support.transition?void this.$element[c](0).one(a.support.transition.end,a.proxy(d,this)).emulateTransitionEnd(350):d.call(this)}}},b.prototype.toggle=function(){this[this.$element.hasClass("in")?"hide":"show"]()};var c=a.fn.collapse;a.fn.collapse=function(c){return this.each(function(){var d=a(this),e=d.data("bs.collapse"),f=a.extend({},b.DEFAULTS,d.data(),"object"==typeof c&&c);!e&&f.toggle&&"show"==c&&(c=!c),e||d.data("bs.collapse",e=new b(this,f)),"string"==typeof c&&e[c]()})},a.fn.collapse.Constructor=b,a.fn.collapse.noConflict=function(){return a.fn.collapse=c,this},a(document).on("click.bs.collapse.data-api","[data-toggle=collapse]",function(b){var c,d=a(this),e=d.attr("data-target")||b.preventDefault()||(c=d.attr("href"))&&c.replace(/.*(?=#[^\s]+$)/,""),f=a(e),g=f.data("bs.collapse"),h=g?"toggle":d.data(),i=d.attr("data-parent"),j=i&&a(i);g&&g.transitioning||(j&&j.find('[data-toggle=collapse][data-parent="'+i+'"]').not(d).addClass("collapsed"),d[f.hasClass("in
 ")?"addClass":"removeClass"]("collapsed")),f.collapse(h)})}(jQuery),+function(a){"use strict";function b(b){a(d).remove(),a(e).each(function(){var d=c(a(this)),e={relatedTarget:this};d.hasClass("open")&&(d.trigger(b=a.Event("hide.bs.dropdown",e)),b.isDefaultPrevented()||d.removeClass("open").trigger("hidden.bs.dropdown",e))})}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()}var d=".dropdown-backdrop",e="[data-toggle=dropdown]",f=function(b){a(b).on("click.bs.dropdown",this.toggle)};f.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;f.toggleClass("op
 en").trigger("shown.bs.dropdown",h),e.focus()}return!1}},f.prototype.keydown=function(b){if(/(38|40|27)/.test(b.keyCode)){var d=a(this);if(b.preventDefault(),b.stopPropagation(),!d.is(".disabled, :disabled")){var f=c(d),g=f.hasClass("open");if(!g||g&&27==b.keyCode)return 27==b.which&&f.find(e).focus(),d.click();var h=" li:not(.divider):visible a",i=f.find("[role=menu]"+h+", [role=listbox]"+h);if(i.length){var j=i.index(i.filter(":focus"));38==b.keyCode&&j>0&&j--,40==b.keyCode&&j<i.length-1&&j++,~j||(j=0),i.eq(j).focus()}}}};var g=a.fn.dropdown;a.fn.dropdown=function(b){return this.each(function(){var c=a(this),d=c.data("bs.dropdown");d||c.data("bs.dropdown",d=new f(this)),"string"==typeof b&&d[b].call(c)})},a.fn.dropdown.Constructor=f,a.fn.dropdown.noConflict=function(){return a.fn.dropdown=g,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",e,f.prototype.toggle).on(
 "keydown.bs.dropdown.data-api",e+", [role=menu], [role=listbox]",f.prototype.keydown)}(jQuery),+function(a){"use strict";var b=function(b,c){this.options=c,this.$element=a(b),this.$backdrop=this.isShown=null,this.options.remote&&this.$element.find(".modal-content").load(this.options.remote,a.proxy(function(){this.$element.trigger("loaded.bs.modal")},this))};b.DEFAULTS={backdrop:!0,keyboard:!0,show:!0},b.prototype.toggle=function(a){return this[this.isShown?"hide":"show"](a)},b.prototype.show=function(b){var c=this,d=a.Event("show.bs.modal",{relatedTarget:b});this.$element.trigger(d),this.isShown||d.isDefaultPrevented()||(this.isShown=!0,this.escape(),this.$element.on("click.dismiss.bs.modal",'[data-dismiss="modal"]',a.proxy(this.hide,this)),this.backdrop(function(){var d=a.support.transition&&c.$element.hasClass("fade");c.$element.parent().length||c.$element.appendTo(document.body),c.$element.show().scrollTop(0),d&&c.$element[0].offsetWidth,c.$element.addClass("in").attr("aria-hidde
 n",!1),c.enforceFocus();var e=a.Event("shown.bs.modal",{relatedTarget:b});d?c.$element.find(".modal-dialog").one(a.support.transition.end,function(){c.$element.focus().trigger(e)}).emulateTransitionEnd(300):c.$element.focus().trigger(e)}))},b.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(),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(a.support.transition.end,a.proxy(this.hideModal,this)).emulateTransitionEnd(300):this.hideModal())},b.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.focus()},this))},b.prototype.escape=function(){this.isShown&&this.options.keyboard?this.$element.o
 n("keyup.dismiss.bs.modal",a.proxy(function(a){27==a.which&&this.hide()},this)):this.isShown||this.$element.off("keyup.dismiss.bs.modal")},b.prototype.hideModal=function(){var a=this;this.$element.hide(),this.backdrop(function(){a.removeBackdrop(),a.$element.trigger("hidden.bs.modal")})},b.prototype.removeBackdrop=function(){this.$backdrop&&this.$backdrop.remove(),this.$backdrop=null},b.prototype.backdrop=function(b){var c=this.$element.hasClass("fade")?"fade":"";if(this.isShown&&this.options.backdrop){var d=a.support.transition&&c;if(this.$backdrop=a('<div class="modal-backdrop '+c+'" />').appendTo(document.body),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)),d&&this.$backdrop[0].offsetWidth,this.$backdrop.addClass("in"),!b)return;d?this.$backdrop.one(a.support.transition.end,b).emulateTransitionEnd(150):b()}else!this.isShown&&this.
 $backdrop?(this.$backdrop.removeClass("in"),a.support.transition&&this.$element.hasClass("fade")?this.$backdrop.one(a.support.transition.end,b).emulateTransitionEnd(150):b()):b&&b()};var c=a.fn.modal;a.fn.modal=function(c,d){return this.each(function(){var e=a(this),f=e.data("bs.modal"),g=a.extend({},b.DEFAULTS,e.data(),"object"==typeof c&&c);f||e.data("bs.modal",f=new b(this,g)),"string"==typeof c?f[c](d):g.show&&f.show(d)})},a.fn.modal.Constructor=b,a.fn.modal.noConflict=function(){return a.fn.modal=c,this},a(document).on("click.bs.modal.data-api",'[data-toggle="modal"]',function(b){var c=a(this),d=c.attr("href"),e=a(c.attr("data-target")||d&&d.replace(/.*(?=#[^\s]+$)/,"")),f=e.data("bs.modal")?"toggle":a.extend({remote:!/#/.test(d)&&d},e.data(),c.data());c.is("a")&&b.preventDefault(),e.modal(f,this).one("hide",function(){c.is(":visible")&&c.focus()})}),a(document).on("show.bs.modal",".modal",function(){a(document.body).addClass("modal-open")}).on("hidden.bs.modal",".modal",functi
 on(){a(document.body).removeClass("modal-open")})}(jQuery),+function(a){"use strict";var b=function(a,b){this.type=this.options=this.enabled=this.timeout=this.hoverState=this.$element=null,this.init("tooltip",a,b)};b.DEFAULTS={animation:!0,placement:"top",selector:!1,template:'<div class="tooltip"><div class="tooltip-arrow"></div><div class="tooltip-inner"></div></div>',trigger:"hover focus",title:"",delay:0,html:!1,container:!1},b.prototype.init=function(b,c,d){this.enabled=!0,this.type=b,this.$element=a(c),this.options=this.getOptions(d);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()},b.prototype.getDefaults=function(){return b.DEFAULTS},b.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},b.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},b.prototype.enter=function(b){var c=b instanceof this.constructor?b:a(b.currentTarget)[this.type](this.getDelegateOptions()).data("bs."+this.type);return 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()},b.prototype.leave=function(b){var c=b instanceof this.constructor?b:a(b.currentTarget)[this.type](this.getDelegateOptions()).data("bs."+this.type);return clearTimeout(c.timeout),c.hoverState="o
 ut",c.options.delay&&c.options.delay.hide?void(c.timeout=setTimeout(function(){"out"==c.hoverState&&c.hide()},c.options.delay.hide)):c.hide()},b.prototype.show=function(){var b=a.Event("show.bs."+this.type);if(this.hasContent()&&this.enabled){if(this.$element.trigger(b),b.isDefaultPrevented())return;var c=this,d=this.tip();this.setContent(),this.options.animation&&d.addClass("fade");var e="function"==typeof this.options.placement?this.options.placement.call(this,d[0],this.$element[0]):this.options.placement,f=/\s?auto?\s?/i,g=f.test(e);g&&(e=e.replace(f,"")||"top"),d.detach().css({top:0,left:0,display:"block"}).addClass(e),this.options.container?d.appendTo(this.options.container):d.insertAfter(this.$element);var h=this.getPosition(),i=d[0].offsetWidth,j=d[0].offsetHeight;if(g){var k=this.$element.parent(),l=e,m=document.documentElement.scrollTop||document.body.scrollTop,n="body"==this.options.container?window.innerWidth:k.outerWidth(),o="body"==this.options.container?window.innerHei
 ght:k.outerHeight(),p="body"==this.options.container?0:k.offset().left;e="bottom"==e&&h.top+h.height+j-m>o?"top":"top"==e&&h.top-m-j<0?"bottom":"right"==e&&h.right+i>n?"left":"left"==e&&h.left-i<p?"right":e,d.removeClass(l).addClass(e)}var q=this.getCalculatedOffset(e,h,i,j);this.applyPlacement(q,e),this.hoverState=null;var r=function(){c.$element.trigger("shown.bs."+c.type)};a.support.transition&&this.$tip.hasClass("fade")?d.one(a.support.transition.end,r).emulateTransitionEnd(150):r()}},b.prototype.applyPlacement=function(b,c){var d,e=this.tip(),f=e[0].offsetWidth,g=e[0].offsetHeight,h=parseInt(e.css("margin-top"),10),i=parseInt(e.css("margin-left"),10);isNaN(h)&&(h=0),isNaN(i)&&(i=0),b.top=b.top+h,b.left=b.left+i,a.offset.setOffset(e[0],a.extend({using:function(a){e.css({top:Math.round(a.top),left:Math.round(a.left)})}},b),0),e.addClass("in");var j=e[0].offsetWidth,k=e[0].offsetHeight;if("top"==c&&k!=g&&(d=!0,b.top=b.top+g-k),/bottom|top/.test(c)){var l=0;b.left<0&&(l=-2*b.left,b
 .left=0,e.offset(b),j=e[0].offsetWidth,k=e[0].offsetHeight),this.replaceArrow(l-f+j,j,"left")}else this.replaceArrow(k-g,k,"top");d&&e.offset(b)},b.prototype.replaceArrow=function(a,b,c){this.arrow().css(c,a?50*(1-a/b)+"%":"")},b.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")},b.prototype.hide=function(){function b(){"in"!=c.hoverState&&d.detach(),c.$element.trigger("hidden.bs."+c.type)}var c=this,d=this.tip(),e=a.Event("hide.bs."+this.type);return this.$element.trigger(e),e.isDefaultPrevented()?void 0:(d.removeClass("in"),a.support.transition&&this.$tip.hasClass("fade")?d.one(a.support.transition.end,b).emulateTransitionEnd(150):b(),this.hoverState=null,this)},b.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","")},b.prototype.
 hasContent=function(){return this.getTitle()},b.prototype.getPosition=function(){var b=this.$element[0];return a.extend({},"function"==typeof b.getBoundingClientRect?b.getBoundingClientRect():{width:b.offsetWidth,height:b.offsetHeight},this.$element.offset())},b.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}},b.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)},b.prototype.tip=function(){return this.$tip=this.$tip||a(this.options.template)},b.prototype.arrow=function(){return this.$arrow=this.$arrow||this.tip().find(".tooltip-arrow")},b.prototype.validate=function(){this.$element[0].parentNode||(this.hide(),this.$element=null,this.options=null)},b.prototype.enabl
 e=function(){this.enabled=!0},b.prototype.disable=function(){this.enabled=!1},b.prototype.toggleEnabled=function(){this.enabled=!this.enabled},b.prototype.toggle=function(b){var c=b?a(b.currentTarget)[this.type](this.getDelegateOptions()).data("bs."+this.type):this;c.tip().hasClass("in")?c.leave(c):c.enter(c)},b.prototype.destroy=function(){clearTimeout(this.timeout),this.hide().$element.off("."+this.type).removeData("bs."+this.type)};var c=a.fn.tooltip;a.fn.tooltip=function(c){return this.each(function(){var d=a(this),e=d.data("bs.tooltip"),f="object"==typeof c&&c;(e||"destroy"!=c)&&(e||d.data("bs.tooltip",e=new b(this,f)),"string"==typeof c&&e[c]())})},a.fn.tooltip.Constructor=b,a.fn.tooltip.noConflict=function(){return a.fn.tooltip=c,this}}(jQuery),+function(a){"use strict";var b=function(a,b){this.init("popover",a,b)};if(!a.fn.tooltip)throw new Error("Popover requires tooltip.js");b.DEFAULTS=a.extend({},a.fn.tooltip.Constructor.DEFAULTS,{placement:"right",trigger:"click",content
 :"",template:'<div class="popover"><div class="arrow"></div><h3 class="popover-title"></h3><div class="popover-content"></div></div>'}),b.prototype=a.extend({},a.fn.tooltip.Constructor.prototype),b.prototype.constructor=b,b.prototype.getDefaults=function(){return b.DEFAULTS},b.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")[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()},b.prototype.hasContent=function(){return this.getTitle()||this.getContent()},b.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)},b.prototype.arrow=function(){return this.$arrow=this.$arrow||this.tip().find(".arrow")},b.prototype.tip=function(){return this.
 $tip||(this.$tip=a(this.options.template)),this.$tip};var c=a.fn.popover;a.fn.popover=function(c){return this.each(function(){var d=a(this),e=d.data("bs.popover"),f="object"==typeof c&&c;(e||"destroy"!=c)&&(e||d.data("bs.popover",e=new b(this,f)),"string"==typeof c&&e[c]())})},a.fn.popover.Constructor=b,a.fn.popover.noConflict=function(){return a.fn.popover=c,this}}(jQuery),+function(a){"use strict";function b(c,d){var e,f=a.proxy(this.process,this);this.$element=a(a(c).is("body")?window:c),this.$body=a("body"),this.$scrollElement=this.$element.on("scroll.bs.scroll-spy.data-api",f),this.options=a.extend({},b.DEFAULTS,d),this.selector=(this.options.target||(e=a(c).attr("href"))&&e.replace(/.*(?=#[^\s]+$)/,"")||"")+" .nav li > a",this.offsets=a([]),this.targets=a([]),this.activeTarget=null,this.refresh(),this.process()}b.DEFAULTS={offset:10},b.prototype.refresh=function(){var b=this.$element[0]==window?"offset":"position";this.offsets=a([]),this.targets=a([]);{var c=this;this.$body.fi
 nd(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+(!a.isWindow(c.$scrollElement.get(0))&&c.$scrollElement.scrollTop()),e]]||null}).sort(function(a,b){return a[0]-b[0]}).each(function(){c.offsets.push(this[0]),c.targets.push(this[1])})}},b.prototype.process=function(){var a,b=this.$scrollElement.scrollTop()+this.options.offset,c=this.$scrollElement[0].scrollHeight||this.$body[0].scrollHeight,d=c-this.$scrollElement.height(),e=this.offsets,f=this.targets,g=this.activeTarget;if(b>=d)return g!=(a=f.last()[0])&&this.activate(a);if(g&&b<=e[0])return g!=(a=f[0])&&this.activate(a);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,a(this.selector).parentsUntil(this.options.target,".active").removeClass("active");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")};var c=a.fn.scrollspy;a.fn.scrollspy=function(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]()})},a.fn.scrollspy.Constructor=b,a.fn.scrollspy.noConflict=function(){return a.fn.scrollspy=c,this},a(window).on("load",function(){a('[data-spy="scroll"]').each(function(){var b=a(this);b.scrollspy(b.data())})})}(jQuery),+function(a){"use strict";var b=function(b){this.element=a(b)};b.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")[0],f=a.Event("show.bs.tab",{relatedTarget:e});if(b.trigger(f),!f.isDefaultPrevented()){var g=a(d);this.activate(b.parent("li"),c),this
 .activate(g,g.parent(),function(){b.trigger({type:"shown.bs.tab",relatedTarget:e})})}}},b.prototype.activate=function(b,c,d){function e(){f.removeClass("active").find("> .dropdown-menu > .active").removeClass("active"),b.addClass("active"),g?(b[0].offsetWidth,b.addClass("in")):b.removeClass("fade"),b.parent(".dropdown-menu")&&b.closest("li.dropdown").addClass("active"),d&&d()}var f=c.find("> .active"),g=d&&a.support.transition&&f.hasClass("fade");g?f.one(a.support.transition.end,e).emulateTransitionEnd(150):e(),f.removeClass("in")};var c=a.fn.tab;a.fn.tab=function(c){return this.each(function(){var d=a(this),e=d.data("bs.tab");e||d.data("bs.tab",e=new b(this)),"string"==typeof c&&e[c]()})},a.fn.tab.Constructor=b,a.fn.tab.noConflict=function(){return a.fn.tab=c,this},a(document).on("click.bs.tab.data-api",'[data-toggle="tab"], [data-toggle="pill"]',function(b){b.preventDefault(),a(this).tab("show")})}(jQuery),+function(a){"use strict";var b=function(c,d){this.options=a.extend({},b.DE
 FAULTS,d),this.$window=a(window).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(c),this.affixed=this.unpin=this.pinnedOffset=null,this.checkPosition()};b.RESET="affix affix-top affix-bottom",b.DEFAULTS={offset:0},b.prototype.getPinnedOffset=function(){if(this.pinnedOffset)return this.pinnedOffset;this.$element.removeClass(b.RESET).addClass("affix");var a=this.$window.scrollTop(),c=this.$element.offset();return this.pinnedOffset=c.top-a},b.prototype.checkPositionWithEventLoop=function(){setTimeout(a.proxy(this.checkPosition,this),1)},b.prototype.checkPosition=function(){if(this.$element.is(":visible")){var c=a(document).height(),d=this.$window.scrollTop(),e=this.$element.offset(),f=this.options.offset,g=f.top,h=f.bottom;"top"==this.affixed&&(e.top+=d),"object"!=typeof f&&(h=g=f),"function"==typeof g&&(g=f.top(this.$element)),"function"==typeof h&&(h=f.bottom(this.$element));va
 r i=null!=this.unpin&&d+this.unpin<=e.top?!1:null!=h&&e.top+this.$element.height()>=c-h?"bottom":null!=g&&g>=d?"top":!1;if(this.affixed!==i){this.unpin&&this.$element.css("top","");var j="affix"+(i?"-"+i:""),k=a.Event(j+".bs.affix");this.$element.trigger(k),k.isDefaultPrevented()||(this.affixed=i,this.unpin="bottom"==i?this.getPinnedOffset():null,this.$element.removeClass(b.RESET).addClass(j).trigger(a.Event(j.replace("affix","affixed"))),"bottom"==i&&this.$element.offset({top:c-h-this.$element.height()}))}}};var c=a.fn.affix;a.fn.affix=function(c){return this.each(function(){var d=a(this),e=d.data("bs.affix"),f="object"==typeof c&&c;e||d.data("bs.affix",e=new b(this,f)),"string"==typeof c&&e[c]()})},a.fn.affix.Constructor=b,a.fn.affix.noConflict=function(){return a.fn.affix=c,this},a(window).on("load",function(){a('[data-spy="affix"]').each(function(){var b=a(this),c=b.data();c.offset=c.offset||{},c.offsetBottom&&(c.offset.bottom=c.offsetBottom),c.offsetTop&&(c.offset.top=c.offsetT
 op),b.affix(c)})})}(jQuery);
\ No newline at end of file
diff --git a/www/members/js/jquery-1.11.1.min.js b/www/members/js/jquery-1.11.1.min.js
new file mode 100644
index 0000000..ab28a24
--- /dev/null
+++ b/www/members/js/jquery-1.11.1.min.js
@@ -0,0 +1,4 @@
+/*! jQuery v1.11.1 | (c) 2005, 2014 jQuery Foundation, Inc. | jquery.org/license */
+!function(a,b){"object"==typeof module&&"object"==typeof module.exports?module.exports=a.document?b(a,!0):function(a){if(!a.document)throw new Error("jQuery requires a window with a document");return b(a)}:b(a)}("undefined"!=typeof window?window:this,function(a,b){var c=[],d=c.slice,e=c.concat,f=c.push,g=c.indexOf,h={},i=h.toString,j=h.hasOwnProperty,k={},l="1.11.1",m=function(a,b){return new m.fn.init(a,b)},n=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,o=/^-ms-/,p=/-([\da-z])/gi,q=function(a,b){return b.toUpperCase()};m.fn=m.prototype={jquery:l,constructor:m,selector:"",length:0,toArray:function(){return d.call(this)},get:function(a){return null!=a?0>a?this[a+this.length]:this[a]:d.call(this)},pushStack:function(a){var b=m.merge(this.constructor(),a);return b.prevObject=this,b.context=this.context,b},each:function(a,b){return m.each(this,a,b)},map:function(a){return this.pushStack(m.map(this,function(b,c){return a.call(b,c,b)}))},slice:function(){return this.pushStack(d.apply(this,argumen
 ts))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},eq:function(a){var b=this.length,c=+a+(0>a?b:0);return this.pushStack(c>=0&&b>c?[this[c]]:[])},end:function(){return this.prevObject||this.constructor(null)},push:f,sort:c.sort,splice:c.splice},m.extend=m.fn.extend=function(){var a,b,c,d,e,f,g=arguments[0]||{},h=1,i=arguments.length,j=!1;for("boolean"==typeof g&&(j=g,g=arguments[h]||{},h++),"object"==typeof g||m.isFunction(g)||(g={}),h===i&&(g=this,h--);i>h;h++)if(null!=(e=arguments[h]))for(d in e)a=g[d],c=e[d],g!==c&&(j&&c&&(m.isPlainObject(c)||(b=m.isArray(c)))?(b?(b=!1,f=a&&m.isArray(a)?a:[]):f=a&&m.isPlainObject(a)?a:{},g[d]=m.extend(j,f,c)):void 0!==c&&(g[d]=c));return g},m.extend({expando:"jQuery"+(l+Math.random()).replace(/\D/g,""),isReady:!0,error:function(a){throw new Error(a)},noop:function(){},isFunction:function(a){return"function"===m.type(a)},isArray:Array.isArray||function(a){return"array"===m.type(a)},isWindow:function(a){return null!=a&&a=
 =a.window},isNumeric:function(a){return!m.isArray(a)&&a-parseFloat(a)>=0},isEmptyObject:function(a){var b;for(b in a)return!1;return!0},isPlainObject:function(a){var b;if(!a||"object"!==m.type(a)||a.nodeType||m.isWindow(a))return!1;try{if(a.constructor&&!j.call(a,"constructor")&&!j.call(a.constructor.prototype,"isPrototypeOf"))return!1}catch(c){return!1}if(k.ownLast)for(b in a)return j.call(a,b);for(b in a);return void 0===b||j.call(a,b)},type:function(a){return null==a?a+"":"object"==typeof a||"function"==typeof a?h[i.call(a)]||"object":typeof a},globalEval:function(b){b&&m.trim(b)&&(a.execScript||function(b){a.eval.call(a,b)})(b)},camelCase:function(a){return a.replace(o,"ms-").replace(p,q)},nodeName:function(a,b){return a.nodeName&&a.nodeName.toLowerCase()===b.toLowerCase()},each:function(a,b,c){var d,e=0,f=a.length,g=r(a);if(c){if(g){for(;f>e;e++)if(d=b.apply(a[e],c),d===!1)break}else for(e in a)if(d=b.apply(a[e],c),d===!1)break}else if(g){for(;f>e;e++)if(d=b.call(a[e],e,a[e]),d
 ===!1)break}else for(e in a)if(d=b.call(a[e],e,a[e]),d===!1)break;return a},trim:function(a){return null==a?"":(a+"").replace(n,"")},makeArray:function(a,b){var c=b||[];return null!=a&&(r(Object(a))?m.merge(c,"string"==typeof a?[a]:a):f.call(c,a)),c},inArray:function(a,b,c){var d;if(b){if(g)return g.call(b,a,c);for(d=b.length,c=c?0>c?Math.max(0,d+c):c:0;d>c;c++)if(c in b&&b[c]===a)return c}return-1},merge:function(a,b){var c=+b.length,d=0,e=a.length;while(c>d)a[e++]=b[d++];if(c!==c)while(void 0!==b[d])a[e++]=b[d++];return a.length=e,a},grep:function(a,b,c){for(var d,e=[],f=0,g=a.length,h=!c;g>f;f++)d=!b(a[f],f),d!==h&&e.push(a[f]);return e},map:function(a,b,c){var d,f=0,g=a.length,h=r(a),i=[];if(h)for(;g>f;f++)d=b(a[f],f,c),null!=d&&i.push(d);else for(f in a)d=b(a[f],f,c),null!=d&&i.push(d);return e.apply([],i)},guid:1,proxy:function(a,b){var c,e,f;return"string"==typeof b&&(f=a[b],b=a,a=f),m.isFunction(a)?(c=d.call(arguments,2),e=function(){return a.apply(b||this,c.concat(d.call(ar
 guments)))},e.guid=a.guid=a.guid||m.guid++,e):void 0},now:function(){return+new Date},support:k}),m.each("Boolean Number String Function Array Date RegExp Object Error".split(" "),function(a,b){h["[object "+b+"]"]=b.toLowerCase()});function r(a){var b=a.length,c=m.type(a);return"function"===c||m.isWindow(a)?!1:1===a.nodeType&&b?!0:"array"===c||0===b||"number"==typeof b&&b>0&&b-1 in a}var s=function(a){var b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u="sizzle"+-new Date,v=a.document,w=0,x=0,y=gb(),z=gb(),A=gb(),B=function(a,b){return a===b&&(l=!0),0},C="undefined",D=1<<31,E={}.hasOwnProperty,F=[],G=F.pop,H=F.push,I=F.push,J=F.slice,K=F.indexOf||function(a){for(var b=0,c=this.length;c>b;b++)if(this[b]===a)return b;return-1},L="checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",M="[\\x20\\t\\r\\n\\f]",N="(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+",O=N.replace("w","w#"),P="\\["+M+"*("+N+")(?:"+M+"*([*^$|!~]?=)"+M+"*(?:'((?:\\\\.|[
 ^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|("+O+"))|)"+M+"*\\]",Q=":("+N+")(?:\\((('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|((?:\\\\.|[^\\\\()[\\]]|"+P+")*)|.*)\\)|)",R=new RegExp("^"+M+"+|((?:^|[^\\\\])(?:\\\\.)*)"+M+"+$","g"),S=new RegExp("^"+M+"*,"+M+"*"),T=new RegExp("^"+M+"*([>+~]|"+M+")"+M+"*"),U=new RegExp("="+M+"*([^\\]'\"]*?)"+M+"*\\]","g"),V=new RegExp(Q),W=new RegExp("^"+O+"$"),X={ID:new RegExp("^#("+N+")"),CLASS:new RegExp("^\\.("+N+")"),TAG:new RegExp("^("+N.replace("w","w*")+")"),ATTR:new RegExp("^"+P),PSEUDO:new RegExp("^"+Q),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+M+"*(even|odd|(([+-]|)(\\d*)n|)"+M+"*(?:([+-]|)"+M+"*(\\d+)|))"+M+"*\\)|)","i"),bool:new RegExp("^(?:"+L+")$","i"),needsContext:new RegExp("^"+M+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+M+"*((?:-\\d)?\\d*)"+M+"*\\)|)(?=[^-]|$)","i")},Y=/^(?:input|select|textarea|button)$/i,Z=/^h\d$/i,$=/^[^{]+\{\s*\[native \w/,_=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,ab=/[+~]/,
 bb=/'|\\/g,cb=new RegExp("\\\\([\\da-f]{1,6}"+M+"?|("+M+")|.)","ig"),db=function(a,b,c){var d="0x"+b-65536;return d!==d||c?b:0>d?String.fromCharCode(d+65536):String.fromCharCode(d>>10|55296,1023&d|56320)};try{I.apply(F=J.call(v.childNodes),v.childNodes),F[v.childNodes.length].nodeType}catch(eb){I={apply:F.length?function(a,b){H.apply(a,J.call(b))}:function(a,b){var c=a.length,d=0;while(a[c++]=b[d++]);a.length=c-1}}}function fb(a,b,d,e){var f,h,j,k,l,o,r,s,w,x;if((b?b.ownerDocument||b:v)!==n&&m(b),b=b||n,d=d||[],!a||"string"!=typeof a)return d;if(1!==(k=b.nodeType)&&9!==k)return[];if(p&&!e){if(f=_.exec(a))if(j=f[1]){if(9===k){if(h=b.getElementById(j),!h||!h.parentNode)return d;if(h.id===j)return d.push(h),d}else if(b.ownerDocument&&(h=b.ownerDocument.getElementById(j))&&t(b,h)&&h.id===j)return d.push(h),d}else{if(f[2])return I.apply(d,b.getElementsByTagName(a)),d;if((j=f[3])&&c.getElementsByClassName&&b.getElementsByClassName)return I.apply(d,b.getElementsByClassName(j)),d}if(c.qsa&&
 (!q||!q.test(a))){if(s=r=u,w=b,x=9===k&&a,1===k&&"object"!==b.nodeName.toLowerCase()){o=g(a),(r=b.getAttribute("id"))?s=r.replace(bb,"\\$&"):b.setAttribute("id",s),s="[id='"+s+"'] ",l=o.length;while(l--)o[l]=s+qb(o[l]);w=ab.test(a)&&ob(b.parentNode)||b,x=o.join(",")}if(x)try{return I.apply(d,w.querySelectorAll(x)),d}catch(y){}finally{r||b.removeAttribute("id")}}}return i(a.replace(R,"$1"),b,d,e)}function gb(){var a=[];function b(c,e){return a.push(c+" ")>d.cacheLength&&delete b[a.shift()],b[c+" "]=e}return b}function hb(a){return a[u]=!0,a}function ib(a){var b=n.createElement("div");try{return!!a(b)}catch(c){return!1}finally{b.parentNode&&b.parentNode.removeChild(b),b=null}}function jb(a,b){var c=a.split("|"),e=a.length;while(e--)d.attrHandle[c[e]]=b}function kb(a,b){var c=b&&a,d=c&&1===a.nodeType&&1===b.nodeType&&(~b.sourceIndex||D)-(~a.sourceIndex||D);if(d)return d;if(c)while(c=c.nextSibling)if(c===b)return-1;return a?1:-1}function lb(a){return function(b){var c=b.nodeName.toLower
 Case();return"input"===c&&b.type===a}}function mb(a){return function(b){var c=b.nodeName.toLowerCase();return("input"===c||"button"===c)&&b.type===a}}function nb(a){return hb(function(b){return b=+b,hb(function(c,d){var e,f=a([],c.length,b),g=f.length;while(g--)c[e=f[g]]&&(c[e]=!(d[e]=c[e]))})})}function ob(a){return a&&typeof a.getElementsByTagName!==C&&a}c=fb.support={},f=fb.isXML=function(a){var b=a&&(a.ownerDocument||a).documentElement;return b?"HTML"!==b.nodeName:!1},m=fb.setDocument=function(a){var b,e=a?a.ownerDocument||a:v,g=e.defaultView;return e!==n&&9===e.nodeType&&e.documentElement?(n=e,o=e.documentElement,p=!f(e),g&&g!==g.top&&(g.addEventListener?g.addEventListener("unload",function(){m()},!1):g.attachEvent&&g.attachEvent("onunload",function(){m()})),c.attributes=ib(function(a){return a.className="i",!a.getAttribute("className")}),c.getElementsByTagName=ib(function(a){return a.appendChild(e.createComment("")),!a.getElementsByTagName("*").length}),c.getElementsByClassNam
 e=$.test(e.getElementsByClassName)&&ib(function(a){return a.innerHTML="<div class='a'></div><div class='a i'></div>",a.firstChild.className="i",2===a.getElementsByClassName("i").length}),c.getById=ib(function(a){return o.appendChild(a).id=u,!e.getElementsByName||!e.getElementsByName(u).length}),c.getById?(d.find.ID=function(a,b){if(typeof b.getElementById!==C&&p){var c=b.getElementById(a);return c&&c.parentNode?[c]:[]}},d.filter.ID=function(a){var b=a.replace(cb,db);return function(a){return a.getAttribute("id")===b}}):(delete d.find.ID,d.filter.ID=function(a){var b=a.replace(cb,db);return function(a){var c=typeof a.getAttributeNode!==C&&a.getAttributeNode("id");return c&&c.value===b}}),d.find.TAG=c.getElementsByTagName?function(a,b){return typeof b.getElementsByTagName!==C?b.getElementsByTagName(a):void 0}:function(a,b){var c,d=[],e=0,f=b.getElementsByTagName(a);if("*"===a){while(c=f[e++])1===c.nodeType&&d.push(c);return d}return f},d.find.CLASS=c.getElementsByClassName&&function(a
 ,b){return typeof b.getElementsByClassName!==C&&p?b.getElementsByClassName(a):void 0},r=[],q=[],(c.qsa=$.test(e.querySelectorAll))&&(ib(function(a){a.innerHTML="<select msallowclip=''><option selected=''></option></select>",a.querySelectorAll("[msallowclip^='']").length&&q.push("[*^$]="+M+"*(?:''|\"\")"),a.querySelectorAll("[selected]").length||q.push("\\["+M+"*(?:value|"+L+")"),a.querySelectorAll(":checked").length||q.push(":checked")}),ib(function(a){var b=e.createElement("input");b.setAttribute("type","hidden"),a.appendChild(b).setAttribute("name","D"),a.querySelectorAll("[name=d]").length&&q.push("name"+M+"*[*^$|!~]?="),a.querySelectorAll(":enabled").length||q.push(":enabled",":disabled"),a.querySelectorAll("*,:x"),q.push(",.*:")})),(c.matchesSelector=$.test(s=o.matches||o.webkitMatchesSelector||o.mozMatchesSelector||o.oMatchesSelector||o.msMatchesSelector))&&ib(function(a){c.disconnectedMatch=s.call(a,"div"),s.call(a,"[s!='']:x"),r.push("!=",Q)}),q=q.length&&new RegExp(q.join("
 |")),r=r.length&&new RegExp(r.join("|")),b=$.test(o.compareDocumentPosition),t=b||$.test(o.contains)?function(a,b){var c=9===a.nodeType?a.documentElement:a,d=b&&b.parentNode;return a===d||!(!d||1!==d.nodeType||!(c.contains?c.contains(d):a.compareDocumentPosition&&16&a.compareDocumentPosition(d)))}:function(a,b){if(b)while(b=b.parentNode)if(b===a)return!0;return!1},B=b?function(a,b){if(a===b)return l=!0,0;var d=!a.compareDocumentPosition-!b.compareDocumentPosition;return d?d:(d=(a.ownerDocument||a)===(b.ownerDocument||b)?a.compareDocumentPosition(b):1,1&d||!c.sortDetached&&b.compareDocumentPosition(a)===d?a===e||a.ownerDocument===v&&t(v,a)?-1:b===e||b.ownerDocument===v&&t(v,b)?1:k?K.call(k,a)-K.call(k,b):0:4&d?-1:1)}:function(a,b){if(a===b)return l=!0,0;var c,d=0,f=a.parentNode,g=b.parentNode,h=[a],i=[b];if(!f||!g)return a===e?-1:b===e?1:f?-1:g?1:k?K.call(k,a)-K.call(k,b):0;if(f===g)return kb(a,b);c=a;while(c=c.parentNode)h.unshift(c);c=b;while(c=c.parentNode)i.unshift(c);while(h[d]=
 ==i[d])d++;return d?kb(h[d],i[d]):h[d]===v?-1:i[d]===v?1:0},e):n},fb.matches=function(a,b){return fb(a,null,null,b)},fb.matchesSelector=function(a,b){if((a.ownerDocument||a)!==n&&m(a),b=b.replace(U,"='$1']"),!(!c.matchesSelector||!p||r&&r.test(b)||q&&q.test(b)))try{var d=s.call(a,b);if(d||c.disconnectedMatch||a.document&&11!==a.document.nodeType)return d}catch(e){}return fb(b,n,null,[a]).length>0},fb.contains=function(a,b){return(a.ownerDocument||a)!==n&&m(a),t(a,b)},fb.attr=function(a,b){(a.ownerDocument||a)!==n&&m(a);var e=d.attrHandle[b.toLowerCase()],f=e&&E.call(d.attrHandle,b.toLowerCase())?e(a,b,!p):void 0;return void 0!==f?f:c.attributes||!p?a.getAttribute(b):(f=a.getAttributeNode(b))&&f.specified?f.value:null},fb.error=function(a){throw new Error("Syntax error, unrecognized expression: "+a)},fb.uniqueSort=function(a){var b,d=[],e=0,f=0;if(l=!c.detectDuplicates,k=!c.sortStable&&a.slice(0),a.sort(B),l){while(b=a[f++])b===a[f]&&(e=d.push(f));while(e--)a.splice(d[e],1)}return k=
 null,a},e=fb.getText=function(a){var b,c="",d=0,f=a.nodeType;if(f){if(1===f||9===f||11===f){if("string"==typeof a.textContent)return a.textContent;for(a=a.firstChild;a;a=a.nextSibling)c+=e(a)}else if(3===f||4===f)return a.nodeValue}else while(b=a[d++])c+=e(b);return c},d=fb.selectors={cacheLength:50,createPseudo:hb,match:X,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(a){return a[1]=a[1].replace(cb,db),a[3]=(a[3]||a[4]||a[5]||"").replace(cb,db),"~="===a[2]&&(a[3]=" "+a[3]+" "),a.slice(0,4)},CHILD:function(a){return a[1]=a[1].toLowerCase(),"nth"===a[1].slice(0,3)?(a[3]||fb.error(a[0]),a[4]=+(a[4]?a[5]+(a[6]||1):2*("even"===a[3]||"odd"===a[3])),a[5]=+(a[7]+a[8]||"odd"===a[3])):a[3]&&fb.error(a[0]),a},PSEUDO:function(a){var b,c=!a[6]&&a[2];return X.CHILD.test(a[0])?null:(a[3]?a[2]=a[4]||a[5]||"":c&&V.test(c)&&(b=g(c,!0))&&(b=c.indexOf(")",c.length-b)-c.len
 gth)&&(a[0]=a[0].slice(0,b),a[2]=c.slice(0,b)),a.slice(0,3))}},filter:{TAG:function(a){var b=a.replace(cb,db).toLowerCase();return"*"===a?function(){return!0}:function(a){return a.nodeName&&a.nodeName.toLowerCase()===b}},CLASS:function(a){var b=y[a+" "];return b||(b=new RegExp("(^|"+M+")"+a+"("+M+"|$)"))&&y(a,function(a){return b.test("string"==typeof a.className&&a.className||typeof a.getAttribute!==C&&a.getAttribute("class")||"")})},ATTR:function(a,b,c){return function(d){var e=fb.attr(d,a);return null==e?"!="===b:b?(e+="","="===b?e===c:"!="===b?e!==c:"^="===b?c&&0===e.indexOf(c):"*="===b?c&&e.indexOf(c)>-1:"$="===b?c&&e.slice(-c.length)===c:"~="===b?(" "+e+" ").indexOf(c)>-1:"|="===b?e===c||e.slice(0,c.length+1)===c+"-":!1):!0}},CHILD:function(a,b,c,d,e){var f="nth"!==a.slice(0,3),g="last"!==a.slice(-4),h="of-type"===b;return 1===d&&0===e?function(a){return!!a.parentNode}:function(b,c,i){var j,k,l,m,n,o,p=f!==g?"nextSibling":"previousSibling",q=b.parentNode,r=h&&b.nodeName.toLowe
 rCase(),s=!i&&!h;if(q){if(f){while(p){l=b;while(l=l[p])if(h?l.nodeName.toLowerCase()===r:1===l.nodeType)return!1;o=p="only"===a&&!o&&"nextSibling"}return!0}if(o=[g?q.firstChild:q.lastChild],g&&s){k=q[u]||(q[u]={}),j=k[a]||[],n=j[0]===w&&j[1],m=j[0]===w&&j[2],l=n&&q.childNodes[n];while(l=++n&&l&&l[p]||(m=n=0)||o.pop())if(1===l.nodeType&&++m&&l===b){k[a]=[w,n,m];break}}else if(s&&(j=(b[u]||(b[u]={}))[a])&&j[0]===w)m=j[1];else while(l=++n&&l&&l[p]||(m=n=0)||o.pop())if((h?l.nodeName.toLowerCase()===r:1===l.nodeType)&&++m&&(s&&((l[u]||(l[u]={}))[a]=[w,m]),l===b))break;return m-=e,m===d||m%d===0&&m/d>=0}}},PSEUDO:function(a,b){var c,e=d.pseudos[a]||d.setFilters[a.toLowerCase()]||fb.error("unsupported pseudo: "+a);return e[u]?e(b):e.length>1?(c=[a,a,"",b],d.setFilters.hasOwnProperty(a.toLowerCase())?hb(function(a,c){var d,f=e(a,b),g=f.length;while(g--)d=K.call(a,f[g]),a[d]=!(c[d]=f[g])}):function(a){return e(a,0,c)}):e}},pseudos:{not:hb(function(a){var b=[],c=[],d=h(a.replace(R,"$1"));retu
 rn d[u]?hb(function(a,b,c,e){var f,g=d(a,null,e,[]),h=a.length;while(h--)(f=g[h])&&(a[h]=!(b[h]=f))}):function(a,e,f){return b[0]=a,d(b,null,f,c),!c.pop()}}),has:hb(function(a){return function(b){return fb(a,b).length>0}}),contains:hb(function(a){return function(b){return(b.textContent||b.innerText||e(b)).indexOf(a)>-1}}),lang:hb(function(a){return W.test(a||"")||fb.error("unsupported lang: "+a),a=a.replace(cb,db).toLowerCase(),function(b){var c;do if(c=p?b.lang:b.getAttribute("xml:lang")||b.getAttribute("lang"))return c=c.toLowerCase(),c===a||0===c.indexOf(a+"-");while((b=b.parentNode)&&1===b.nodeType);return!1}}),target:function(b){var c=a.location&&a.location.hash;return c&&c.slice(1)===b.id},root:function(a){return a===o},focus:function(a){return a===n.activeElement&&(!n.hasFocus||n.hasFocus())&&!!(a.type||a.href||~a.tabIndex)},enabled:function(a){return a.disabled===!1},disabled:function(a){return a.disabled===!0},checked:function(a){var b=a.nodeName.toLowerCase();return"input"
 ===b&&!!a.checked||"option"===b&&!!a.selected},selected:function(a){return a.parentNode&&a.parentNode.selectedIndex,a.selected===!0},empty:function(a){for(a=a.firstChild;a;a=a.nextSibling)if(a.nodeType<6)return!1;return!0},parent:function(a){return!d.pseudos.empty(a)},header:function(a){return Z.test(a.nodeName)},input:function(a){return Y.test(a.nodeName)},button:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&"button"===a.type||"button"===b},text:function(a){var b;return"input"===a.nodeName.toLowerCase()&&"text"===a.type&&(null==(b=a.getAttribute("type"))||"text"===b.toLowerCase())},first:nb(function(){return[0]}),last:nb(function(a,b){return[b-1]}),eq:nb(function(a,b,c){return[0>c?c+b:c]}),even:nb(function(a,b){for(var c=0;b>c;c+=2)a.push(c);return a}),odd:nb(function(a,b){for(var c=1;b>c;c+=2)a.push(c);return a}),lt:nb(function(a,b,c){for(var d=0>c?c+b:c;--d>=0;)a.push(d);return a}),gt:nb(function(a,b,c){for(var d=0>c?c+b:c;++d<b;)a.push(d);return a})}},d.pseudos.n
 th=d.pseudos.eq;for(b in{radio:!0,checkbox:!0,file:!0,password:!0,image:!0})d.pseudos[b]=lb(b);for(b in{submit:!0,reset:!0})d.pseudos[b]=mb(b);function pb(){}pb.prototype=d.filters=d.pseudos,d.setFilters=new pb,g=fb.tokenize=function(a,b){var c,e,f,g,h,i,j,k=z[a+" "];if(k)return b?0:k.slice(0);h=a,i=[],j=d.preFilter;while(h){(!c||(e=S.exec(h)))&&(e&&(h=h.slice(e[0].length)||h),i.push(f=[])),c=!1,(e=T.exec(h))&&(c=e.shift(),f.push({value:c,type:e[0].replace(R," ")}),h=h.slice(c.length));for(g in d.filter)!(e=X[g].exec(h))||j[g]&&!(e=j[g](e))||(c=e.shift(),f.push({value:c,type:g,matches:e}),h=h.slice(c.length));if(!c)break}return b?h.length:h?fb.error(a):z(a,i).slice(0)};function qb(a){for(var b=0,c=a.length,d="";c>b;b++)d+=a[b].value;return d}function rb(a,b,c){var d=b.dir,e=c&&"parentNode"===d,f=x++;return b.first?function(b,c,f){while(b=b[d])if(1===b.nodeType||e)return a(b,c,f)}:function(b,c,g){var h,i,j=[w,f];if(g){while(b=b[d])if((1===b.nodeType||e)&&a(b,c,g))return!0}else while(
 b=b[d])if(1===b.nodeType||e){if(i=b[u]||(b[u]={}),(h=i[d])&&h[0]===w&&h[1]===f)return j[2]=h[2];if(i[d]=j,j[2]=a(b,c,g))return!0}}}function sb(a){return a.length>1?function(b,c,d){var e=a.length;while(e--)if(!a[e](b,c,d))return!1;return!0}:a[0]}function tb(a,b,c){for(var d=0,e=b.length;e>d;d++)fb(a,b[d],c);return c}function ub(a,b,c,d,e){for(var f,g=[],h=0,i=a.length,j=null!=b;i>h;h++)(f=a[h])&&(!c||c(f,d,e))&&(g.push(f),j&&b.push(h));return g}function vb(a,b,c,d,e,f){return d&&!d[u]&&(d=vb(d)),e&&!e[u]&&(e=vb(e,f)),hb(function(f,g,h,i){var j,k,l,m=[],n=[],o=g.length,p=f||tb(b||"*",h.nodeType?[h]:h,[]),q=!a||!f&&b?p:ub(p,m,a,h,i),r=c?e||(f?a:o||d)?[]:g:q;if(c&&c(q,r,h,i),d){j=ub(r,n),d(j,[],h,i),k=j.length;while(k--)(l=j[k])&&(r[n[k]]=!(q[n[k]]=l))}if(f){if(e||a){if(e){j=[],k=r.length;while(k--)(l=r[k])&&j.push(q[k]=l);e(null,r=[],j,i)}k=r.length;while(k--)(l=r[k])&&(j=e?K.call(f,l):m[k])>-1&&(f[j]=!(g[j]=l))}}else r=ub(r===g?r.splice(o,r.length):r),e?e(null,g,r,i):I.apply(g,r)})}fu
 nction wb(a){for(var b,c,e,f=a.length,g=d.relative[a[0].type],h=g||d.relative[" "],i=g?1:0,k=rb(function(a){return a===b},h,!0),l=rb(function(a){return K.call(b,a)>-1},h,!0),m=[function(a,c,d){return!g&&(d||c!==j)||((b=c).nodeType?k(a,c,d):l(a,c,d))}];f>i;i++)if(c=d.relative[a[i].type])m=[rb(sb(m),c)];else{if(c=d.filter[a[i].type].apply(null,a[i].matches),c[u]){for(e=++i;f>e;e++)if(d.relative[a[e].type])break;return vb(i>1&&sb(m),i>1&&qb(a.slice(0,i-1).concat({value:" "===a[i-2].type?"*":""})).replace(R,"$1"),c,e>i&&wb(a.slice(i,e)),f>e&&wb(a=a.slice(e)),f>e&&qb(a))}m.push(c)}return sb(m)}function xb(a,b){var c=b.length>0,e=a.length>0,f=function(f,g,h,i,k){var l,m,o,p=0,q="0",r=f&&[],s=[],t=j,u=f||e&&d.find.TAG("*",k),v=w+=null==t?1:Math.random()||.1,x=u.length;for(k&&(j=g!==n&&g);q!==x&&null!=(l=u[q]);q++){if(e&&l){m=0;while(o=a[m++])if(o(l,g,h)){i.push(l);break}k&&(w=v)}c&&((l=!o&&l)&&p--,f&&r.push(l))}if(p+=q,c&&q!==p){m=0;while(o=b[m++])o(r,s,g,h);if(f){if(p>0)while(q--)r[q]||s[
 q]||(s[q]=G.call(i));s=ub(s)}I.apply(i,s),k&&!f&&s.length>0&&p+b.length>1&&fb.uniqueSort(i)}return k&&(w=v,j=t),r};return c?hb(f):f}return h=fb.compile=function(a,b){var c,d=[],e=[],f=A[a+" "];if(!f){b||(b=g(a)),c=b.length;while(c--)f=wb(b[c]),f[u]?d.push(f):e.push(f);f=A(a,xb(e,d)),f.selector=a}return f},i=fb.select=function(a,b,e,f){var i,j,k,l,m,n="function"==typeof a&&a,o=!f&&g(a=n.selector||a);if(e=e||[],1===o.length){if(j=o[0]=o[0].slice(0),j.length>2&&"ID"===(k=j[0]).type&&c.getById&&9===b.nodeType&&p&&d.relative[j[1].type]){if(b=(d.find.ID(k.matches[0].replace(cb,db),b)||[])[0],!b)return e;n&&(b=b.parentNode),a=a.slice(j.shift().value.length)}i=X.needsContext.test(a)?0:j.length;while(i--){if(k=j[i],d.relative[l=k.type])break;if((m=d.find[l])&&(f=m(k.matches[0].replace(cb,db),ab.test(j[0].type)&&ob(b.parentNode)||b))){if(j.splice(i,1),a=f.length&&qb(j),!a)return I.apply(e,f),e;break}}}return(n||h(a,o))(f,b,!p,e,ab.test(a)&&ob(b.parentNode)||b),e},c.sortStable=u.split("").sort
 (B).join("")===u,c.detectDuplicates=!!l,m(),c.sortDetached=ib(function(a){return 1&a.compareDocumentPosition(n.createElement("div"))}),ib(function(a){return a.innerHTML="<a href='#'></a>","#"===a.firstChild.getAttribute("href")})||jb("type|href|height|width",function(a,b,c){return c?void 0:a.getAttribute(b,"type"===b.toLowerCase()?1:2)}),c.attributes&&ib(function(a){return a.innerHTML="<input/>",a.firstChild.setAttribute("value",""),""===a.firstChild.getAttribute("value")})||jb("value",function(a,b,c){return c||"input"!==a.nodeName.toLowerCase()?void 0:a.defaultValue}),ib(function(a){return null==a.getAttribute("disabled")})||jb(L,function(a,b,c){var d;return c?void 0:a[b]===!0?b.toLowerCase():(d=a.getAttributeNode(b))&&d.specified?d.value:null}),fb}(a);m.find=s,m.expr=s.selectors,m.expr[":"]=m.expr.pseudos,m.unique=s.uniqueSort,m.text=s.getText,m.isXMLDoc=s.isXML,m.contains=s.contains;var t=m.expr.match.needsContext,u=/^<(\w+)\s*\/?>(?:<\/\1>|)$/,v=/^.[^:#\[\.,]*$/;function w(a,b,c
 ){if(m.isFunction(b))return m.grep(a,function(a,d){return!!b.call(a,d,a)!==c});if(b.nodeType)return m.grep(a,function(a){return a===b!==c});if("string"==typeof b){if(v.test(b))return m.filter(b,a,c);b=m.filter(b,a)}return m.grep(a,function(a){return m.inArray(a,b)>=0!==c})}m.filter=function(a,b,c){var d=b[0];return c&&(a=":not("+a+")"),1===b.length&&1===d.nodeType?m.find.matchesSelector(d,a)?[d]:[]:m.find.matches(a,m.grep(b,function(a){return 1===a.nodeType}))},m.fn.extend({find:function(a){var b,c=[],d=this,e=d.length;if("string"!=typeof a)return this.pushStack(m(a).filter(function(){for(b=0;e>b;b++)if(m.contains(d[b],this))return!0}));for(b=0;e>b;b++)m.find(a,d[b],c);return c=this.pushStack(e>1?m.unique(c):c),c.selector=this.selector?this.selector+" "+a:a,c},filter:function(a){return this.pushStack(w(this,a||[],!1))},not:function(a){return this.pushStack(w(this,a||[],!0))},is:function(a){return!!w(this,"string"==typeof a&&t.test(a)?m(a):a||[],!1).length}});var x,y=a.document,z=/^(
 ?:\s*(<[\w\W]+>)[^>]*|#([\w-]*))$/,A=m.fn.init=function(a,b){var c,d;if(!a)return this;if("string"==typeof a){if(c="<"===a.charAt(0)&&">"===a.charAt(a.length-1)&&a.length>=3?[null,a,null]:z.exec(a),!c||!c[1]&&b)return!b||b.jquery?(b||x).find(a):this.constructor(b).find(a);if(c[1]){if(b=b instanceof m?b[0]:b,m.merge(this,m.parseHTML(c[1],b&&b.nodeType?b.ownerDocument||b:y,!0)),u.test(c[1])&&m.isPlainObject(b))for(c in b)m.isFunction(this[c])?this[c](b[c]):this.attr(c,b[c]);return this}if(d=y.getElementById(c[2]),d&&d.parentNode){if(d.id!==c[2])return x.find(a);this.length=1,this[0]=d}return this.context=y,this.selector=a,this}return a.nodeType?(this.context=this[0]=a,this.length=1,this):m.isFunction(a)?"undefined"!=typeof x.ready?x.ready(a):a(m):(void 0!==a.selector&&(this.selector=a.selector,this.context=a.context),m.makeArray(a,this))};A.prototype=m.fn,x=m(y);var B=/^(?:parents|prev(?:Until|All))/,C={children:!0,contents:!0,next:!0,prev:!0};m.extend({dir:function(a,b,c){var d=[],e=
 a[b];while(e&&9!==e.nodeType&&(void 0===c||1!==e.nodeType||!m(e).is(c)))1===e.nodeType&&d.push(e),e=e[b];return d},sibling:function(a,b){for(var c=[];a;a=a.nextSibling)1===a.nodeType&&a!==b&&c.push(a);return c}}),m.fn.extend({has:function(a){var b,c=m(a,this),d=c.length;return this.filter(function(){for(b=0;d>b;b++)if(m.contains(this,c[b]))return!0})},closest:function(a,b){for(var c,d=0,e=this.length,f=[],g=t.test(a)||"string"!=typeof a?m(a,b||this.context):0;e>d;d++)for(c=this[d];c&&c!==b;c=c.parentNode)if(c.nodeType<11&&(g?g.index(c)>-1:1===c.nodeType&&m.find.matchesSelector(c,a))){f.push(c);break}return this.pushStack(f.length>1?m.unique(f):f)},index:function(a){return a?"string"==typeof a?m.inArray(this[0],m(a)):m.inArray(a.jquery?a[0]:a,this):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(a,b){return this.pushStack(m.unique(m.merge(this.get(),m(a,b))))},addBack:function(a){return this.add(null==a?this.prevObject:this.prevObject.filter(a))}});function
  D(a,b){do a=a[b];while(a&&1!==a.nodeType);return a}m.each({parent:function(a){var b=a.parentNode;return b&&11!==b.nodeType?b:null},parents:function(a){return m.dir(a,"parentNode")},parentsUntil:function(a,b,c){return m.dir(a,"parentNode",c)},next:function(a){return D(a,"nextSibling")},prev:function(a){return D(a,"previousSibling")},nextAll:function(a){return m.dir(a,"nextSibling")},prevAll:function(a){return m.dir(a,"previousSibling")},nextUntil:function(a,b,c){return m.dir(a,"nextSibling",c)},prevUntil:function(a,b,c){return m.dir(a,"previousSibling",c)},siblings:function(a){return m.sibling((a.parentNode||{}).firstChild,a)},children:function(a){return m.sibling(a.firstChild)},contents:function(a){return m.nodeName(a,"iframe")?a.contentDocument||a.contentWindow.document:m.merge([],a.childNodes)}},function(a,b){m.fn[a]=function(c,d){var e=m.map(this,b,c);return"Until"!==a.slice(-5)&&(d=c),d&&"string"==typeof d&&(e=m.filter(d,e)),this.length>1&&(C[a]||(e=m.unique(e)),B.test(a)&&(e=e
 .reverse())),this.pushStack(e)}});var E=/\S+/g,F={};function G(a){var b=F[a]={};return m.each(a.match(E)||[],function(a,c){b[c]=!0}),b}m.Callbacks=function(a){a="string"==typeof a?F[a]||G(a):m.extend({},a);var b,c,d,e,f,g,h=[],i=!a.once&&[],j=function(l){for(c=a.memory&&l,d=!0,f=g||0,g=0,e=h.length,b=!0;h&&e>f;f++)if(h[f].apply(l[0],l[1])===!1&&a.stopOnFalse){c=!1;break}b=!1,h&&(i?i.length&&j(i.shift()):c?h=[]:k.disable())},k={add:function(){if(h){var d=h.length;!function f(b){m.each(b,function(b,c){var d=m.type(c);"function"===d?a.unique&&k.has(c)||h.push(c):c&&c.length&&"string"!==d&&f(c)})}(arguments),b?e=h.length:c&&(g=d,j(c))}return this},remove:function(){return h&&m.each(arguments,function(a,c){var d;while((d=m.inArray(c,h,d))>-1)h.splice(d,1),b&&(e>=d&&e--,f>=d&&f--)}),this},has:function(a){return a?m.inArray(a,h)>-1:!(!h||!h.length)},empty:function(){return h=[],e=0,this},disable:function(){return h=i=c=void 0,this},disabled:function(){return!h},lock:function(){return i=voi
 d 0,c||k.disable(),this},locked:function(){return!i},fireWith:function(a,c){return!h||d&&!i||(c=c||[],c=[a,c.slice?c.slice():c],b?i.push(c):j(c)),this},fire:function(){return k.fireWith(this,arguments),this},fired:function(){return!!d}};return k},m.extend({Deferred:function(a){var b=[["resolve","done",m.Callbacks("once memory"),"resolved"],["reject","fail",m.Callbacks("once memory"),"rejected"],["notify","progress",m.Callbacks("memory")]],c="pending",d={state:function(){return c},always:function(){return e.done(arguments).fail(arguments),this},then:function(){var a=arguments;return m.Deferred(function(c){m.each(b,function(b,f){var g=m.isFunction(a[b])&&a[b];e[f[1]](function(){var a=g&&g.apply(this,arguments);a&&m.isFunction(a.promise)?a.promise().done(c.resolve).fail(c.reject).progress(c.notify):c[f[0]+"With"](this===d?c.promise():this,g?[a]:arguments)})}),a=null}).promise()},promise:function(a){return null!=a?m.extend(a,d):d}},e={};return d.pipe=d.then,m.each(b,function(a,f){var g=
 f[2],h=f[3];d[f[1]]=g.add,h&&g.add(function(){c=h},b[1^a][2].disable,b[2][2].lock),e[f[0]]=function(){return e[f[0]+"With"](this===e?d:this,arguments),this},e[f[0]+"With"]=g.fireWith}),d.promise(e),a&&a.call(e,e),e},when:function(a){var b=0,c=d.call(arguments),e=c.length,f=1!==e||a&&m.isFunction(a.promise)?e:0,g=1===f?a:m.Deferred(),h=function(a,b,c){return function(e){b[a]=this,c[a]=arguments.length>1?d.call(arguments):e,c===i?g.notifyWith(b,c):--f||g.resolveWith(b,c)}},i,j,k;if(e>1)for(i=new Array(e),j=new Array(e),k=new Array(e);e>b;b++)c[b]&&m.isFunction(c[b].promise)?c[b].promise().done(h(b,k,c)).fail(g.reject).progress(h(b,j,i)):--f;return f||g.resolveWith(k,c),g.promise()}});var H;m.fn.ready=function(a){return m.ready.promise().done(a),this},m.extend({isReady:!1,readyWait:1,holdReady:function(a){a?m.readyWait++:m.ready(!0)},ready:function(a){if(a===!0?!--m.readyWait:!m.isReady){if(!y.body)return setTimeout(m.ready);m.isReady=!0,a!==!0&&--m.readyWait>0||(H.resolveWith(y,[m]),m
 .fn.triggerHandler&&(m(y).triggerHandler("ready"),m(y).off("ready")))}}});function I(){y.addEventListener?(y.removeEventListener("DOMContentLoaded",J,!1),a.removeEventListener("load",J,!1)):(y.detachEvent("onreadystatechange",J),a.detachEvent("onload",J))}function J(){(y.addEventListener||"load"===event.type||"complete"===y.readyState)&&(I(),m.ready())}m.ready.promise=function(b){if(!H)if(H=m.Deferred(),"complete"===y.readyState)setTimeout(m.ready);else if(y.addEventListener)y.addEventListener("DOMContentLoaded",J,!1),a.addEventListener("load",J,!1);else{y.attachEvent("onreadystatechange",J),a.attachEvent("onload",J);var c=!1;try{c=null==a.frameElement&&y.documentElement}catch(d){}c&&c.doScroll&&!function e(){if(!m.isReady){try{c.doScroll("left")}catch(a){return setTimeout(e,50)}I(),m.ready()}}()}return H.promise(b)};var K="undefined",L;for(L in m(k))break;k.ownLast="0"!==L,k.inlineBlockNeedsLayout=!1,m(function(){var a,b,c,d;c=y.getElementsByTagName("body")[0],c&&c.style&&(b=y.crea
 teElement("div"),d=y.createElement("div"),d.style.cssText="position:absolute;border:0;width:0;height:0;top:0;left:-9999px",c.appendChild(d).appendChild(b),typeof b.style.zoom!==K&&(b.style.cssText="display:inline;margin:0;border:0;padding:1px;width:1px;zoom:1",k.inlineBlockNeedsLayout=a=3===b.offsetWidth,a&&(c.style.zoom=1)),c.removeChild(d))}),function(){var a=y.createElement("div");if(null==k.deleteExpando){k.deleteExpando=!0;try{delete a.test}catch(b){k.deleteExpando=!1}}a=null}(),m.acceptData=function(a){var b=m.noData[(a.nodeName+" ").toLowerCase()],c=+a.nodeType||1;return 1!==c&&9!==c?!1:!b||b!==!0&&a.getAttribute("classid")===b};var M=/^(?:\{[\w\W]*\}|\[[\w\W]*\])$/,N=/([A-Z])/g;function O(a,b,c){if(void 0===c&&1===a.nodeType){var d="data-"+b.replace(N,"-$1").toLowerCase();if(c=a.getAttribute(d),"string"==typeof c){try{c="true"===c?!0:"false"===c?!1:"null"===c?null:+c+""===c?+c:M.test(c)?m.parseJSON(c):c}catch(e){}m.data(a,b,c)}else c=void 0}return c}function P(a){var b;for(b
  in a)if(("data"!==b||!m.isEmptyObject(a[b]))&&"toJSON"!==b)return!1;return!0}function Q(a,b,d,e){if(m.acceptData(a)){var f,g,h=m.expando,i=a.nodeType,j=i?m.cache:a,k=i?a[h]:a[h]&&h;
+if(k&&j[k]&&(e||j[k].data)||void 0!==d||"string"!=typeof b)return k||(k=i?a[h]=c.pop()||m.guid++:h),j[k]||(j[k]=i?{}:{toJSON:m.noop}),("object"==typeof b||"function"==typeof b)&&(e?j[k]=m.extend(j[k],b):j[k].data=m.extend(j[k].data,b)),g=j[k],e||(g.data||(g.data={}),g=g.data),void 0!==d&&(g[m.camelCase(b)]=d),"string"==typeof b?(f=g[b],null==f&&(f=g[m.camelCase(b)])):f=g,f}}function R(a,b,c){if(m.acceptData(a)){var d,e,f=a.nodeType,g=f?m.cache:a,h=f?a[m.expando]:m.expando;if(g[h]){if(b&&(d=c?g[h]:g[h].data)){m.isArray(b)?b=b.concat(m.map(b,m.camelCase)):b in d?b=[b]:(b=m.camelCase(b),b=b in d?[b]:b.split(" ")),e=b.length;while(e--)delete d[b[e]];if(c?!P(d):!m.isEmptyObject(d))return}(c||(delete g[h].data,P(g[h])))&&(f?m.cleanData([a],!0):k.deleteExpando||g!=g.window?delete g[h]:g[h]=null)}}}m.extend({cache:{},noData:{"applet ":!0,"embed ":!0,"object ":"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"},hasData:function(a){return a=a.nodeType?m.cache[a[m.expando]]:a[m.expando],!!a&&!P(a)},
 data:function(a,b,c){return Q(a,b,c)},removeData:function(a,b){return R(a,b)},_data:function(a,b,c){return Q(a,b,c,!0)},_removeData:function(a,b){return R(a,b,!0)}}),m.fn.extend({data:function(a,b){var c,d,e,f=this[0],g=f&&f.attributes;if(void 0===a){if(this.length&&(e=m.data(f),1===f.nodeType&&!m._data(f,"parsedAttrs"))){c=g.length;while(c--)g[c]&&(d=g[c].name,0===d.indexOf("data-")&&(d=m.camelCase(d.slice(5)),O(f,d,e[d])));m._data(f,"parsedAttrs",!0)}return e}return"object"==typeof a?this.each(function(){m.data(this,a)}):arguments.length>1?this.each(function(){m.data(this,a,b)}):f?O(f,a,m.data(f,a)):void 0},removeData:function(a){return this.each(function(){m.removeData(this,a)})}}),m.extend({queue:function(a,b,c){var d;return a?(b=(b||"fx")+"queue",d=m._data(a,b),c&&(!d||m.isArray(c)?d=m._data(a,b,m.makeArray(c)):d.push(c)),d||[]):void 0},dequeue:function(a,b){b=b||"fx";var c=m.queue(a,b),d=c.length,e=c.shift(),f=m._queueHooks(a,b),g=function(){m.dequeue(a,b)};"inprogress"===e&&(
 e=c.shift(),d--),e&&("fx"===b&&c.unshift("inprogress"),delete f.stop,e.call(a,g,f)),!d&&f&&f.empty.fire()},_queueHooks:function(a,b){var c=b+"queueHooks";return m._data(a,c)||m._data(a,c,{empty:m.Callbacks("once memory").add(function(){m._removeData(a,b+"queue"),m._removeData(a,c)})})}}),m.fn.extend({queue:function(a,b){var c=2;return"string"!=typeof a&&(b=a,a="fx",c--),arguments.length<c?m.queue(this[0],a):void 0===b?this:this.each(function(){var c=m.queue(this,a,b);m._queueHooks(this,a),"fx"===a&&"inprogress"!==c[0]&&m.dequeue(this,a)})},dequeue:function(a){return this.each(function(){m.dequeue(this,a)})},clearQueue:function(a){return this.queue(a||"fx",[])},promise:function(a,b){var c,d=1,e=m.Deferred(),f=this,g=this.length,h=function(){--d||e.resolveWith(f,[f])};"string"!=typeof a&&(b=a,a=void 0),a=a||"fx";while(g--)c=m._data(f[g],a+"queueHooks"),c&&c.empty&&(d++,c.empty.add(h));return h(),e.promise(b)}});var S=/[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/.source,T=["Top","Right","Botto
 m","Left"],U=function(a,b){return a=b||a,"none"===m.css(a,"display")||!m.contains(a.ownerDocument,a)},V=m.access=function(a,b,c,d,e,f,g){var h=0,i=a.length,j=null==c;if("object"===m.type(c)){e=!0;for(h in c)m.access(a,b,h,c[h],!0,f,g)}else if(void 0!==d&&(e=!0,m.isFunction(d)||(g=!0),j&&(g?(b.call(a,d),b=null):(j=b,b=function(a,b,c){return j.call(m(a),c)})),b))for(;i>h;h++)b(a[h],c,g?d:d.call(a[h],h,b(a[h],c)));return e?a:j?b.call(a):i?b(a[0],c):f},W=/^(?:checkbox|radio)$/i;!function(){var a=y.createElement("input"),b=y.createElement("div"),c=y.createDocumentFragment();if(b.innerHTML="  <link/><table></table><a href='/a'>a</a><input type='checkbox'/>",k.leadingWhitespace=3===b.firstChild.nodeType,k.tbody=!b.getElementsByTagName("tbody").length,k.htmlSerialize=!!b.getElementsByTagName("link").length,k.html5Clone="<:nav></:nav>"!==y.createElement("nav").cloneNode(!0).outerHTML,a.type="checkbox",a.checked=!0,c.appendChild(a),k.appendChecked=a.checked,b.innerHTML="<textarea>x</textarea>
 ",k.noCloneChecked=!!b.cloneNode(!0).lastChild.defaultValue,c.appendChild(b),b.innerHTML="<input type='radio' checked='checked' name='t'/>",k.checkClone=b.cloneNode(!0).cloneNode(!0).lastChild.checked,k.noCloneEvent=!0,b.attachEvent&&(b.attachEvent("onclick",function(){k.noCloneEvent=!1}),b.cloneNode(!0).click()),null==k.deleteExpando){k.deleteExpando=!0;try{delete b.test}catch(d){k.deleteExpando=!1}}}(),function(){var b,c,d=y.createElement("div");for(b in{submit:!0,change:!0,focusin:!0})c="on"+b,(k[b+"Bubbles"]=c in a)||(d.setAttribute(c,"t"),k[b+"Bubbles"]=d.attributes[c].expando===!1);d=null}();var X=/^(?:input|select|textarea)$/i,Y=/^key/,Z=/^(?:mouse|pointer|contextmenu)|click/,$=/^(?:focusinfocus|focusoutblur)$/,_=/^([^.]*)(?:\.(.+)|)$/;function ab(){return!0}function bb(){return!1}function cb(){try{return y.activeElement}catch(a){}}m.event={global:{},add:function(a,b,c,d,e){var f,g,h,i,j,k,l,n,o,p,q,r=m._data(a);if(r){c.handler&&(i=c,c=i.handler,e=i.selector),c.guid||(c.guid=
 m.guid++),(g=r.events)||(g=r.events={}),(k=r.handle)||(k=r.handle=function(a){return typeof m===K||a&&m.event.triggered===a.type?void 0:m.event.dispatch.apply(k.elem,arguments)},k.elem=a),b=(b||"").match(E)||[""],h=b.length;while(h--)f=_.exec(b[h])||[],o=q=f[1],p=(f[2]||"").split(".").sort(),o&&(j=m.event.special[o]||{},o=(e?j.delegateType:j.bindType)||o,j=m.event.special[o]||{},l=m.extend({type:o,origType:q,data:d,handler:c,guid:c.guid,selector:e,needsContext:e&&m.expr.match.needsContext.test(e),namespace:p.join(".")},i),(n=g[o])||(n=g[o]=[],n.delegateCount=0,j.setup&&j.setup.call(a,d,p,k)!==!1||(a.addEventListener?a.addEventListener(o,k,!1):a.attachEvent&&a.attachEvent("on"+o,k))),j.add&&(j.add.call(a,l),l.handler.guid||(l.handler.guid=c.guid)),e?n.splice(n.delegateCount++,0,l):n.push(l),m.event.global[o]=!0);a=null}},remove:function(a,b,c,d,e){var f,g,h,i,j,k,l,n,o,p,q,r=m.hasData(a)&&m._data(a);if(r&&(k=r.events)){b=(b||"").match(E)||[""],j=b.length;while(j--)if(h=_.exec(b[j])||
 [],o=q=h[1],p=(h[2]||"").split(".").sort(),o){l=m.event.special[o]||{},o=(d?l.delegateType:l.bindType)||o,n=k[o]||[],h=h[2]&&new RegExp("(^|\\.)"+p.join("\\.(?:.*\\.|)")+"(\\.|$)"),i=f=n.length;while(f--)g=n[f],!e&&q!==g.origType||c&&c.guid!==g.guid||h&&!h.test(g.namespace)||d&&d!==g.selector&&("**"!==d||!g.selector)||(n.splice(f,1),g.selector&&n.delegateCount--,l.remove&&l.remove.call(a,g));i&&!n.length&&(l.teardown&&l.teardown.call(a,p,r.handle)!==!1||m.removeEvent(a,o,r.handle),delete k[o])}else for(o in k)m.event.remove(a,o+b[j],c,d,!0);m.isEmptyObject(k)&&(delete r.handle,m._removeData(a,"events"))}},trigger:function(b,c,d,e){var f,g,h,i,k,l,n,o=[d||y],p=j.call(b,"type")?b.type:b,q=j.call(b,"namespace")?b.namespace.split("."):[];if(h=l=d=d||y,3!==d.nodeType&&8!==d.nodeType&&!$.test(p+m.event.triggered)&&(p.indexOf(".")>=0&&(q=p.split("."),p=q.shift(),q.sort()),g=p.indexOf(":")<0&&"on"+p,b=b[m.expando]?b:new m.Event(p,"object"==typeof b&&b),b.isTrigger=e?2:3,b.namespace=q.join("
 ."),b.namespace_re=b.namespace?new RegExp("(^|\\.)"+q.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,b.result=void 0,b.target||(b.target=d),c=null==c?[b]:m.makeArray(c,[b]),k=m.event.special[p]||{},e||!k.trigger||k.trigger.apply(d,c)!==!1)){if(!e&&!k.noBubble&&!m.isWindow(d)){for(i=k.delegateType||p,$.test(i+p)||(h=h.parentNode);h;h=h.parentNode)o.push(h),l=h;l===(d.ownerDocument||y)&&o.push(l.defaultView||l.parentWindow||a)}n=0;while((h=o[n++])&&!b.isPropagationStopped())b.type=n>1?i:k.bindType||p,f=(m._data(h,"events")||{})[b.type]&&m._data(h,"handle"),f&&f.apply(h,c),f=g&&h[g],f&&f.apply&&m.acceptData(h)&&(b.result=f.apply(h,c),b.result===!1&&b.preventDefault());if(b.type=p,!e&&!b.isDefaultPrevented()&&(!k._default||k._default.apply(o.pop(),c)===!1)&&m.acceptData(d)&&g&&d[p]&&!m.isWindow(d)){l=d[g],l&&(d[g]=null),m.event.triggered=p;try{d[p]()}catch(r){}m.event.triggered=void 0,l&&(d[g]=l)}return b.result}},dispatch:function(a){a=m.event.fix(a);var b,c,e,f,g,h=[],i=d.call(arguments),j=(m.
 _data(this,"events")||{})[a.type]||[],k=m.event.special[a.type]||{};if(i[0]=a,a.delegateTarget=this,!k.preDispatch||k.preDispatch.call(this,a)!==!1){h=m.event.handlers.call(this,a,j),b=0;while((f=h[b++])&&!a.isPropagationStopped()){a.currentTarget=f.elem,g=0;while((e=f.handlers[g++])&&!a.isImmediatePropagationStopped())(!a.namespace_re||a.namespace_re.test(e.namespace))&&(a.handleObj=e,a.data=e.data,c=((m.event.special[e.origType]||{}).handle||e.handler).apply(f.elem,i),void 0!==c&&(a.result=c)===!1&&(a.preventDefault(),a.stopPropagation()))}return k.postDispatch&&k.postDispatch.call(this,a),a.result}},handlers:function(a,b){var c,d,e,f,g=[],h=b.delegateCount,i=a.target;if(h&&i.nodeType&&(!a.button||"click"!==a.type))for(;i!=this;i=i.parentNode||this)if(1===i.nodeType&&(i.disabled!==!0||"click"!==a.type)){for(e=[],f=0;h>f;f++)d=b[f],c=d.selector+" ",void 0===e[c]&&(e[c]=d.needsContext?m(c,this).index(i)>=0:m.find(c,this,null,[i]).length),e[c]&&e.push(d);e.length&&g.push({elem:i,hand
 lers:e})}return h<b.length&&g.push({elem:this,handlers:b.slice(h)}),g},fix:function(a){if(a[m.expando])return a;var b,c,d,e=a.type,f=a,g=this.fixHooks[e];g||(this.fixHooks[e]=g=Z.test(e)?this.mouseHooks:Y.test(e)?this.keyHooks:{}),d=g.props?this.props.concat(g.props):this.props,a=new m.Event(f),b=d.length;while(b--)c=d[b],a[c]=f[c];return a.target||(a.target=f.srcElement||y),3===a.target.nodeType&&(a.target=a.target.parentNode),a.metaKey=!!a.metaKey,g.filter?g.filter(a,f):a},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(a,b){return null==a.which&&(a.which=null!=b.charCode?b.charCode:b.keyCode),a}},mouseHooks:{props:"button buttons clientX clientY fromElement offsetX offsetY pageX pageY screenX screenY toElement".split(" "),filter:function(a,b){var c,d,e,f=b.button,g=b.fromElement;return null==a.pageX&&null!=b.cl
 ientX&&(d=a.target.ownerDocument||y,e=d.documentElement,c=d.body,a.pageX=b.clientX+(e&&e.scrollLeft||c&&c.scrollLeft||0)-(e&&e.clientLeft||c&&c.clientLeft||0),a.pageY=b.clientY+(e&&e.scrollTop||c&&c.scrollTop||0)-(e&&e.clientTop||c&&c.clientTop||0)),!a.relatedTarget&&g&&(a.relatedTarget=g===a.target?b.toElement:g),a.which||void 0===f||(a.which=1&f?1:2&f?3:4&f?2:0),a}},special:{load:{noBubble:!0},focus:{trigger:function(){if(this!==cb()&&this.focus)try{return this.focus(),!1}catch(a){}},delegateType:"focusin"},blur:{trigger:function(){return this===cb()&&this.blur?(this.blur(),!1):void 0},delegateType:"focusout"},click:{trigger:function(){return m.nodeName(this,"input")&&"checkbox"===this.type&&this.click?(this.click(),!1):void 0},_default:function(a){return m.nodeName(a.target,"a")}},beforeunload:{postDispatch:function(a){void 0!==a.result&&a.originalEvent&&(a.originalEvent.returnValue=a.result)}}},simulate:function(a,b,c,d){var e=m.extend(new m.Event,c,{type:a,isSimulated:!0,origin
 alEvent:{}});d?m.event.trigger(e,null,b):m.event.dispatch.call(b,e),e.isDefaultPrevented()&&c.preventDefault()}},m.removeEvent=y.removeEventListener?function(a,b,c){a.removeEventListener&&a.removeEventListener(b,c,!1)}:function(a,b,c){var d="on"+b;a.detachEvent&&(typeof a[d]===K&&(a[d]=null),a.detachEvent(d,c))},m.Event=function(a,b){return this instanceof m.Event?(a&&a.type?(this.originalEvent=a,this.type=a.type,this.isDefaultPrevented=a.defaultPrevented||void 0===a.defaultPrevented&&a.returnValue===!1?ab:bb):this.type=a,b&&m.extend(this,b),this.timeStamp=a&&a.timeStamp||m.now(),void(this[m.expando]=!0)):new m.Event(a,b)},m.Event.prototype={isDefaultPrevented:bb,isPropagationStopped:bb,isImmediatePropagationStopped:bb,preventDefault:function(){var a=this.originalEvent;this.isDefaultPrevented=ab,a&&(a.preventDefault?a.preventDefault():a.returnValue=!1)},stopPropagation:function(){var a=this.originalEvent;this.isPropagationStopped=ab,a&&(a.stopPropagation&&a.stopPropagation(),a.cance
 lBubble=!0)},stopImmediatePropagation:function(){var a=this.originalEvent;this.isImmediatePropagationStopped=ab,a&&a.stopImmediatePropagation&&a.stopImmediatePropagation(),this.stopPropagation()}},m.each({mouseenter:"mouseover",mouseleave:"mouseout",pointerenter:"pointerover",pointerleave:"pointerout"},function(a,b){m.event.special[a]={delegateType:b,bindType:b,handle:function(a){var c,d=this,e=a.relatedTarget,f=a.handleObj;return(!e||e!==d&&!m.contains(d,e))&&(a.type=f.origType,c=f.handler.apply(this,arguments),a.type=b),c}}}),k.submitBubbles||(m.event.special.submit={setup:function(){return m.nodeName(this,"form")?!1:void m.event.add(this,"click._submit keypress._submit",function(a){var b=a.target,c=m.nodeName(b,"input")||m.nodeName(b,"button")?b.form:void 0;c&&!m._data(c,"submitBubbles")&&(m.event.add(c,"submit._submit",function(a){a._submit_bubble=!0}),m._data(c,"submitBubbles",!0))})},postDispatch:function(a){a._submit_bubble&&(delete a._submit_bubble,this.parentNode&&!a.isTrig
 ger&&m.event.simulate("submit",this.parentNode,a,!0))},teardown:function(){return m.nodeName(this,"form")?!1:void m.event.remove(this,"._submit")}}),k.changeBubbles||(m.event.special.change={setup:function(){return X.test(this.nodeName)?(("checkbox"===this.type||"radio"===this.type)&&(m.event.add(this,"propertychange._change",function(a){"checked"===a.originalEvent.propertyName&&(this._just_changed=!0)}),m.event.add(this,"click._change",function(a){this._just_changed&&!a.isTrigger&&(this._just_changed=!1),m.event.simulate("change",this,a,!0)})),!1):void m.event.add(this,"beforeactivate._change",function(a){var b=a.target;X.test(b.nodeName)&&!m._data(b,"changeBubbles")&&(m.event.add(b,"change._change",function(a){!this.parentNode||a.isSimulated||a.isTrigger||m.event.simulate("change",this.parentNode,a,!0)}),m._data(b,"changeBubbles",!0))})},handle:function(a){var b=a.target;return this!==b||a.isSimulated||a.isTrigger||"radio"!==b.type&&"checkbox"!==b.type?a.handleObj.handler.apply(th
 is,arguments):void 0},teardown:function(){return m.event.remove(this,"._change"),!X.test(this.nodeName)}}),k.focusinBubbles||m.each({focus:"focusin",blur:"focusout"},function(a,b){var c=function(a){m.event.simulate(b,a.target,m.event.fix(a),!0)};m.event.special[b]={setup:function(){var d=this.ownerDocument||this,e=m._data(d,b);e||d.addEventListener(a,c,!0),m._data(d,b,(e||0)+1)},teardown:function(){var d=this.ownerDocument||this,e=m._data(d,b)-1;e?m._data(d,b,e):(d.removeEventListener(a,c,!0),m._removeData(d,b))}}}),m.fn.extend({on:function(a,b,c,d,e){var f,g;if("object"==typeof a){"string"!=typeof b&&(c=c||b,b=void 0);for(f in a)this.on(f,b,c,a[f],e);return this}if(null==c&&null==d?(d=b,c=b=void 0):null==d&&("string"==typeof b?(d=c,c=void 0):(d=c,c=b,b=void 0)),d===!1)d=bb;else if(!d)return this;return 1===e&&(g=d,d=function(a){return m().off(a),g.apply(this,arguments)},d.guid=g.guid||(g.guid=m.guid++)),this.each(function(){m.event.add(this,a,d,c,b)})},one:function(a,b,c,d){return 
 this.on(a,b,c,d,1)},off:function(a,b,c){var d,e;if(a&&a.preventDefault&&a.handleObj)return d=a.handleObj,m(a.delegateTarget).off(d.namespace?d.origType+"."+d.namespace:d.origType,d.selector,d.handler),this;if("object"==typeof a){for(e in a)this.off(e,b,a[e]);return this}return(b===!1||"function"==typeof b)&&(c=b,b=void 0),c===!1&&(c=bb),this.each(function(){m.event.remove(this,a,c,b)})},trigger:function(a,b){return this.each(function(){m.event.trigger(a,b,this)})},triggerHandler:function(a,b){var c=this[0];return c?m.event.trigger(a,b,c,!0):void 0}});function db(a){var b=eb.split("|"),c=a.createDocumentFragment();if(c.createElement)while(b.length)c.createElement(b.pop());return c}var eb="abbr|article|aside|audio|bdi|canvas|data|datalist|details|figcaption|figure|footer|header|hgroup|mark|meter|nav|output|progress|section|summary|time|video",fb=/ jQuery\d+="(?:null|\d+)"/g,gb=new RegExp("<(?:"+eb+")[\\s/>]","i"),hb=/^\s+/,ib=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]
 +)[^>]*)\/>/gi,jb=/<([\w:]+)/,kb=/<tbody/i,lb=/<|&#?\w+;/,mb=/<(?:script|style|link)/i,nb=/checked\s*(?:[^=]|=\s*.checked.)/i,ob=/^$|\/(?:java|ecma)script/i,pb=/^true\/(.*)/,qb=/^\s*<!(?:\[CDATA\[|--)|(?:\]\]|--)>\s*$/g,rb={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:k.htmlSerialize?[0,"",""]:[1,"X<div>","</div>"]},sb=db(y),tb=sb.appendChild(y.createElement("div"));rb.optgroup=rb.option,rb.tbody=rb.tfoot=rb.colgroup=rb.caption=rb.thead,rb.th=rb.td;function ub(a,b){var c,d,e=0,f=typeof a.getElementsByTagName!==K?a.getElementsByTagName(b||"*"):typeof a.querySelectorAll!==K?a.querySelectorAll(b||"*"):void 0;if(!f)for(f=[],c=a.childNodes||a;null!=(d=c[e]);e++)!b||m.nodeName(d,b)?f.push
 (d):m.merge(f,ub(d,b));return void 0===b||b&&m.nodeName(a,b)?m.merge([a],f):f}function vb(a){W.test(a.type)&&(a.defaultChecked=a.checked)}function wb(a,b){return m.nodeName(a,"table")&&m.nodeName(11!==b.nodeType?b:b.firstChild,"tr")?a.getElementsByTagName("tbody")[0]||a.appendChild(a.ownerDocument.createElement("tbody")):a}function xb(a){return a.type=(null!==m.find.attr(a,"type"))+"/"+a.type,a}function yb(a){var b=pb.exec(a.type);return b?a.type=b[1]:a.removeAttribute("type"),a}function zb(a,b){for(var c,d=0;null!=(c=a[d]);d++)m._data(c,"globalEval",!b||m._data(b[d],"globalEval"))}function Ab(a,b){if(1===b.nodeType&&m.hasData(a)){var c,d,e,f=m._data(a),g=m._data(b,f),h=f.events;if(h){delete g.handle,g.events={};for(c in h)for(d=0,e=h[c].length;e>d;d++)m.event.add(b,c,h[c][d])}g.data&&(g.data=m.extend({},g.data))}}function Bb(a,b){var c,d,e;if(1===b.nodeType){if(c=b.nodeName.toLowerCase(),!k.noCloneEvent&&b[m.expando]){e=m._data(b);for(d in e.events)m.removeEvent(b,d,e.handle);b.rem
 oveAttribute(m.expando)}"script"===c&&b.text!==a.text?(xb(b).text=a.text,yb(b)):"object"===c?(b.parentNode&&(b.outerHTML=a.outerHTML),k.html5Clone&&a.innerHTML&&!m.trim(b.innerHTML)&&(b.innerHTML=a.innerHTML)):"input"===c&&W.test(a.type)?(b.defaultChecked=b.checked=a.checked,b.value!==a.value&&(b.value=a.value)):"option"===c?b.defaultSelected=b.selected=a.defaultSelected:("input"===c||"textarea"===c)&&(b.defaultValue=a.defaultValue)}}m.extend({clone:function(a,b,c){var d,e,f,g,h,i=m.contains(a.ownerDocument,a);if(k.html5Clone||m.isXMLDoc(a)||!gb.test("<"+a.nodeName+">")?f=a.cloneNode(!0):(tb.innerHTML=a.outerHTML,tb.removeChild(f=tb.firstChild)),!(k.noCloneEvent&&k.noCloneChecked||1!==a.nodeType&&11!==a.nodeType||m.isXMLDoc(a)))for(d=ub(f),h=ub(a),g=0;null!=(e=h[g]);++g)d[g]&&Bb(e,d[g]);if(b)if(c)for(h=h||ub(a),d=d||ub(f),g=0;null!=(e=h[g]);g++)Ab(e,d[g]);else Ab(a,f);return d=ub(f,"script"),d.length>0&&zb(d,!i&&ub(a,"script")),d=h=e=null,f},buildFragment:function(a,b,c,d){for(var e
 ,f,g,h,i,j,l,n=a.length,o=db(b),p=[],q=0;n>q;q++)if(f=a[q],f||0===f)if("object"===m.type(f))m.merge(p,f.nodeType?[f]:f);else if(lb.test(f)){h=h||o.appendChild(b.createElement("div")),i=(jb.exec(f)||["",""])[1].toLowerCase(),l=rb[i]||rb._default,h.innerHTML=l[1]+f.replace(ib,"<$1></$2>")+l[2],e=l[0];while(e--)h=h.lastChild;if(!k.leadingWhitespace&&hb.test(f)&&p.push(b.createTextNode(hb.exec(f)[0])),!k.tbody){f="table"!==i||kb.test(f)?"<table>"!==l[1]||kb.test(f)?0:h:h.firstChild,e=f&&f.childNodes.length;while(e--)m.nodeName(j=f.childNodes[e],"tbody")&&!j.childNodes.length&&f.removeChild(j)}m.merge(p,h.childNodes),h.textContent="";while(h.firstChild)h.removeChild(h.firstChild);h=o.lastChild}else p.push(b.createTextNode(f));h&&o.removeChild(h),k.appendChecked||m.grep(ub(p,"input"),vb),q=0;while(f=p[q++])if((!d||-1===m.inArray(f,d))&&(g=m.contains(f.ownerDocument,f),h=ub(o.appendChild(f),"script"),g&&zb(h),c)){e=0;while(f=h[e++])ob.test(f.type||"")&&c.push(f)}return h=null,o},cleanData:
 function(a,b){for(var d,e,f,g,h=0,i=m.expando,j=m.cache,l=k.deleteExpando,n=m.event.special;null!=(d=a[h]);h++)if((b||m.acceptData(d))&&(f=d[i],g=f&&j[f])){if(g.events)for(e in g.events)n[e]?m.event.remove(d,e):m.removeEvent(d,e,g.handle);j[f]&&(delete j[f],l?delete d[i]:typeof d.removeAttribute!==K?d.removeAttribute(i):d[i]=null,c.push(f))}}}),m.fn.extend({text:function(a){return V(this,function(a){return void 0===a?m.text(this):this.empty().append((this[0]&&this[0].ownerDocument||y).createTextNode(a))},null,a,arguments.length)},append:function(){return this.domManip(arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=wb(this,a);b.appendChild(a)}})},prepend:function(){return this.domManip(arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=wb(this,a);b.insertBefore(a,b.firstChild)}})},before:function(){return this.domManip(arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this)})},after:fu
 nction(){return this.domManip(arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this.nextSibling)})},remove:function(a,b){for(var c,d=a?m.filter(a,this):this,e=0;null!=(c=d[e]);e++)b||1!==c.nodeType||m.cleanData(ub(c)),c.parentNode&&(b&&m.contains(c.ownerDocument,c)&&zb(ub(c,"script")),c.parentNode.removeChild(c));return this},empty:function(){for(var a,b=0;null!=(a=this[b]);b++){1===a.nodeType&&m.cleanData(ub(a,!1));while(a.firstChild)a.removeChild(a.firstChild);a.options&&m.nodeName(a,"select")&&(a.options.length=0)}return this},clone:function(a,b){return a=null==a?!1:a,b=null==b?a:b,this.map(function(){return m.clone(this,a,b)})},html:function(a){return V(this,function(a){var b=this[0]||{},c=0,d=this.length;if(void 0===a)return 1===b.nodeType?b.innerHTML.replace(fb,""):void 0;if(!("string"!=typeof a||mb.test(a)||!k.htmlSerialize&&gb.test(a)||!k.leadingWhitespace&&hb.test(a)||rb[(jb.exec(a)||["",""])[1].toLowerCase()])){a=a.replace(ib,"<$1></$2>");try{for(;d>c;
 c++)b=this[c]||{},1===b.nodeType&&(m.cleanData(ub(b,!1)),b.innerHTML=a);b=0}catch(e){}}b&&this.empty().append(a)},null,a,arguments.length)},replaceWith:function(){var a=arguments[0];return this.domManip(arguments,function(b){a=this.parentNode,m.cleanData(ub(this)),a&&a.replaceChild(b,this)}),a&&(a.length||a.nodeType)?this:this.remove()},detach:function(a){return this.remove(a,!0)},domManip:function(a,b){a=e.apply([],a);var c,d,f,g,h,i,j=0,l=this.length,n=this,o=l-1,p=a[0],q=m.isFunction(p);if(q||l>1&&"string"==typeof p&&!k.checkClone&&nb.test(p))return this.each(function(c){var d=n.eq(c);q&&(a[0]=p.call(this,c,d.html())),d.domManip(a,b)});if(l&&(i=m.buildFragment(a,this[0].ownerDocument,!1,this),c=i.firstChild,1===i.childNodes.length&&(i=c),c)){for(g=m.map(ub(i,"script"),xb),f=g.length;l>j;j++)d=i,j!==o&&(d=m.clone(d,!0,!0),f&&m.merge(g,ub(d,"script"))),b.call(this[j],d,j);if(f)for(h=g[g.length-1].ownerDocument,m.map(g,yb),j=0;f>j;j++)d=g[j],ob.test(d.type||"")&&!m._data(d,"globalEv
 al")&&m.contains(h,d)&&(d.src?m._evalUrl&&m._evalUrl(d.src):m.globalEval((d.text||d.textContent||d.innerHTML||"").replace(qb,"")));i=c=null}return this}}),m.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(a,b){m.fn[a]=function(a){for(var c,d=0,e=[],g=m(a),h=g.length-1;h>=d;d++)c=d===h?this:this.clone(!0),m(g[d])[b](c),f.apply(e,c.get());return this.pushStack(e)}});var Cb,Db={};function Eb(b,c){var d,e=m(c.createElement(b)).appendTo(c.body),f=a.getDefaultComputedStyle&&(d=a.getDefaultComputedStyle(e[0]))?d.display:m.css(e[0],"display");return e.detach(),f}function Fb(a){var b=y,c=Db[a];return c||(c=Eb(a,b),"none"!==c&&c||(Cb=(Cb||m("<iframe frameborder='0' width='0' height='0'/>")).appendTo(b.documentElement),b=(Cb[0].contentWindow||Cb[0].contentDocument).document,b.write(),b.close(),c=Eb(a,b),Cb.detach()),Db[a]=c),c}!function(){var a;k.shrinkWrapBlocks=function(){if(null!=a)return a;a=!1;var b,c,d;return c=y.ge
 tElementsByTagName("body")[0],c&&c.style?(b=y.createElement("div"),d=y.createElement("div"),d.style.cssText="position:absolute;border:0;width:0;height:0;top:0;left:-9999px",c.appendChild(d).appendChild(b),typeof b.style.zoom!==K&&(b.style.cssText="-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;display:block;margin:0;border:0;padding:1px;width:1px;zoom:1",b.appendChild(y.createElement("div")).style.width="5px",a=3!==b.offsetWidth),c.removeChild(d),a):void 0}}();var Gb=/^margin/,Hb=new RegExp("^("+S+")(?!px)[a-z%]+$","i"),Ib,Jb,Kb=/^(top|right|bottom|left)$/;a.getComputedStyle?(Ib=function(a){return a.ownerDocument.defaultView.getComputedStyle(a,null)},Jb=function(a,b,c){var d,e,f,g,h=a.style;return c=c||Ib(a),g=c?c.getPropertyValue(b)||c[b]:void 0,c&&(""!==g||m.contains(a.ownerDocument,a)||(g=m.style(a,b)),Hb.test(g)&&Gb.test(b)&&(d=h.width,e=h.minWidth,f=h.maxWidth,h.minWidth=h.maxWidth=h.width=g,g=c.width,h.width=d,h.minWidth=e,h.maxWidth=f)),void
  0===g?g:g+""}):y.documentElement.currentStyle&&(Ib=function(a){return a.currentStyle},Jb=function(a,b,c){var d,e,f,g,h=a.style;return c=c||Ib(a),g=c?c[b]:void 0,null==g&&h&&h[b]&&(g=h[b]),Hb.test(g)&&!Kb.test(b)&&(d=h.left,e=a.runtimeStyle,f=e&&e.left,f&&(e.left=a.currentStyle.left),h.left="fontSize"===b?"1em":g,g=h.pixelLeft+"px",h.left=d,f&&(e.left=f)),void 0===g?g:g+""||"auto"});function Lb(a,b){return{get:function(){var c=a();if(null!=c)return c?void delete this.get:(this.get=b).apply(this,arguments)}}}!function(){var b,c,d,e,f,g,h;if(b=y.createElement("div"),b.innerHTML="  <link/><table></table><a href='/a'>a</a><input type='checkbox'/>",d=b.getElementsByTagName("a")[0],c=d&&d.style){c.cssText="float:left;opacity:.5",k.opacity="0.5"===c.opacity,k.cssFloat=!!c.cssFloat,b.style.backgroundClip="content-box",b.cloneNode(!0).style.backgroundClip="",k.clearCloneStyle="content-box"===b.style.backgroundClip,k.boxSizing=""===c.boxSizing||""===c.MozBoxSizing||""===c.WebkitBoxSizing,m.ex
 tend(k,{reliableHiddenOffsets:function(){return null==g&&i(),g},boxSizingReliable:function(){return null==f&&i(),f},pixelPosition:function(){return null==e&&i(),e},reliableMarginRight:function(){return null==h&&i(),h}});function i(){var b,c,d,i;c=y.getElementsByTagName("body")[0],c&&c.style&&(b=y.createElement("div"),d=y.createElement("div"),d.style.cssText="position:absolute;border:0;width:0;height:0;top:0;left:-9999px",c.appendChild(d).appendChild(b),b.style.cssText="-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;display:block;margin-top:1%;top:1%;border:1px;padding:1px;width:4px;position:absolute",e=f=!1,h=!0,a.getComputedStyle&&(e="1%"!==(a.getComputedStyle(b,null)||{}).top,f="4px"===(a.getComputedStyle(b,null)||{width:"4px"}).width,i=b.appendChild(y.createElement("div")),i.style.cssText=b.style.cssText="-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;display:block;margin:0;border:0;padding:0",i.style.marginRight=
 i.style.width="0",b.style.width="1px",h=!parseFloat((a.getComputedStyle(i,null)||{}).marginRight)),b.innerHTML="<table><tr><td></td><td>t</td></tr></table>",i=b.getElementsByTagName("td"),i[0].style.cssText="margin:0;border:0;padding:0;display:none",g=0===i[0].offsetHeight,g&&(i[0].style.display="",i[1].style.display="none",g=0===i[0].offsetHeight),c.removeChild(d))}}}(),m.swap=function(a,b,c,d){var e,f,g={};for(f in b)g[f]=a.style[f],a.style[f]=b[f];e=c.apply(a,d||[]);for(f in b)a.style[f]=g[f];return e};var Mb=/alpha\([^)]*\)/i,Nb=/opacity\s*=\s*([^)]*)/,Ob=/^(none|table(?!-c[ea]).+)/,Pb=new RegExp("^("+S+")(.*)$","i"),Qb=new RegExp("^([+-])=("+S+")","i"),Rb={position:"absolute",visibility:"hidden",display:"block"},Sb={letterSpacing:"0",fontWeight:"400"},Tb=["Webkit","O","Moz","ms"];function Ub(a,b){if(b in a)return b;var c=b.charAt(0).toUpperCase()+b.slice(1),d=b,e=Tb.length;while(e--)if(b=Tb[e]+c,b in a)return b;return d}function Vb(a,b){for(var c,d,e,f=[],g=0,h=a.length;h>g;g++
 )d=a[g],d.style&&(f[g]=m._data(d,"olddisplay"),c=d.style.display,b?(f[g]||"none"!==c||(d.style.display=""),""===d.style.display&&U(d)&&(f[g]=m._data(d,"olddisplay",Fb(d.nodeName)))):(e=U(d),(c&&"none"!==c||!e)&&m._data(d,"olddisplay",e?c:m.css(d,"display"))));for(g=0;h>g;g++)d=a[g],d.style&&(b&&"none"!==d.style.display&&""!==d.style.display||(d.style.display=b?f[g]||"":"none"));return a}function Wb(a,b,c){var d=Pb.exec(b);return d?Math.max(0,d[1]-(c||0))+(d[2]||"px"):b}function Xb(a,b,c,d,e){for(var f=c===(d?"border":"content")?4:"width"===b?1:0,g=0;4>f;f+=2)"margin"===c&&(g+=m.css(a,c+T[f],!0,e)),d?("content"===c&&(g-=m.css(a,"padding"+T[f],!0,e)),"margin"!==c&&(g-=m.css(a,"border"+T[f]+"Width",!0,e))):(g+=m.css(a,"padding"+T[f],!0,e),"padding"!==c&&(g+=m.css(a,"border"+T[f]+"Width",!0,e)));return g}function Yb(a,b,c){var d=!0,e="width"===b?a.offsetWidth:a.offsetHeight,f=Ib(a),g=k.boxSizing&&"border-box"===m.css(a,"boxSizing",!1,f);if(0>=e||null==e){if(e=Jb(a,b,f),(0>e||null==e)&&(
 e=a.style[b]),Hb.test(e))return e;d=g&&(k.boxSizingReliable()||e===a.style[b]),e=parseFloat(e)||0}return e+Xb(a,b,c||(g?"border":"content"),d,f)+"px"}m.extend({cssHooks:{opacity:{get:function(a,b){if(b){var c=Jb(a,"opacity");return""===c?"1":c}}}},cssNumber:{columnCount:!0,fillOpacity:!0,flexGrow:!0,flexShrink:!0,fontWeight:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{"float":k.cssFloat?"cssFloat":"styleFloat"},style:function(a,b,c,d){if(a&&3!==a.nodeType&&8!==a.nodeType&&a.style){var e,f,g,h=m.camelCase(b),i=a.style;if(b=m.cssProps[h]||(m.cssProps[h]=Ub(i,h)),g=m.cssHooks[b]||m.cssHooks[h],void 0===c)return g&&"get"in g&&void 0!==(e=g.get(a,!1,d))?e:i[b];if(f=typeof c,"string"===f&&(e=Qb.exec(c))&&(c=(e[1]+1)*e[2]+parseFloat(m.css(a,b)),f="number"),null!=c&&c===c&&("number"!==f||m.cssNumber[h]||(c+="px"),k.clearCloneStyle||""!==c||0!==b.indexOf("background")||(i[b]="inherit"),!(g&&"set"in g&&void 0===(c=g.set(a,c,d)))))try{i[b]=c}catch(j){}
 }},css:function(a,b,c,d){var e,f,g,h=m.camelCase(b);return b=m.cssProps[h]||(m.cssProps[h]=Ub(a.style,h)),g=m.cssHooks[b]||m.cssHooks[h],g&&"get"in g&&(f=g.get(a,!0,c)),void 0===f&&(f=Jb(a,b,d)),"normal"===f&&b in Sb&&(f=Sb[b]),""===c||c?(e=parseFloat(f),c===!0||m.isNumeric(e)?e||0:f):f}}),m.each(["height","width"],function(a,b){m.cssHooks[b]={get:function(a,c,d){return c?Ob.test(m.css(a,"display"))&&0===a.offsetWidth?m.swap(a,Rb,function(){return Yb(a,b,d)}):Yb(a,b,d):void 0},set:function(a,c,d){var e=d&&Ib(a);return Wb(a,c,d?Xb(a,b,d,k.boxSizing&&"border-box"===m.css(a,"boxSizing",!1,e),e):0)}}}),k.opacity||(m.cssHooks.opacity={get:function(a,b){return Nb.test((b&&a.currentStyle?a.currentStyle.filter:a.style.filter)||"")?.01*parseFloat(RegExp.$1)+"":b?"1":""},set:function(a,b){var c=a.style,d=a.currentStyle,e=m.isNumeric(b)?"alpha(opacity="+100*b+")":"",f=d&&d.filter||c.filter||"";c.zoom=1,(b>=1||""===b)&&""===m.trim(f.replace(Mb,""))&&c.removeAttribute&&(c.removeAttribute("filter
 "),""===b||d&&!d.filter)||(c.filter=Mb.test(f)?f.replace(Mb,e):f+" "+e)}}),m.cssHooks.marginRight=Lb(k.reliableMarginRight,function(a,b){return b?m.swap(a,{display:"inline-block"},Jb,[a,"marginRight"]):void 0}),m.each({margin:"",padding:"",border:"Width"},function(a,b){m.cssHooks[a+b]={expand:function(c){for(var d=0,e={},f="string"==typeof c?c.split(" "):[c];4>d;d++)e[a+T[d]+b]=f[d]||f[d-2]||f[0];return e}},Gb.test(a)||(m.cssHooks[a+b].set=Wb)}),m.fn.extend({css:function(a,b){return V(this,function(a,b,c){var d,e,f={},g=0;if(m.isArray(b)){for(d=Ib(a),e=b.length;e>g;g++)f[b[g]]=m.css(a,b[g],!1,d);return f}return void 0!==c?m.style(a,b,c):m.css(a,b)},a,b,arguments.length>1)},show:function(){return Vb(this,!0)},hide:function(){return Vb(this)},toggle:function(a){return"boolean"==typeof a?a?this.show():this.hide():this.each(function(){U(this)?m(this).show():m(this).hide()})}});function Zb(a,b,c,d,e){return new Zb.prototype.init(a,b,c,d,e)}m.Tween=Zb,Zb.prototype={constructor:Zb,init:fun
 ction(a,b,c,d,e,f){this.elem=a,this.prop=c,this.easing=e||"swing",this.options=b,this.start=this.now=this.cur(),this.end=d,this.unit=f||(m.cssNumber[c]?"":"px")
+},cur:function(){var a=Zb.propHooks[this.prop];return a&&a.get?a.get(this):Zb.propHooks._default.get(this)},run:function(a){var b,c=Zb.propHooks[this.prop];return this.pos=b=this.options.duration?m.easing[this.easing](a,this.options.duration*a,0,1,this.options.duration):a,this.now=(this.end-this.start)*b+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),c&&c.set?c.set(this):Zb.propHooks._default.set(this),this}},Zb.prototype.init.prototype=Zb.prototype,Zb.propHooks={_default:{get:function(a){var b;return null==a.elem[a.prop]||a.elem.style&&null!=a.elem.style[a.prop]?(b=m.css(a.elem,a.prop,""),b&&"auto"!==b?b:0):a.elem[a.prop]},set:function(a){m.fx.step[a.prop]?m.fx.step[a.prop](a):a.elem.style&&(null!=a.elem.style[m.cssProps[a.prop]]||m.cssHooks[a.prop])?m.style(a.elem,a.prop,a.now+a.unit):a.elem[a.prop]=a.now}}},Zb.propHooks.scrollTop=Zb.propHooks.scrollLeft={set:function(a){a.elem.nodeType&&a.elem.parentNode&&(a.elem[a.prop]=a.now)}},m.easing={linear:fu
 nction(a){return a},swing:function(a){return.5-Math.cos(a*Math.PI)/2}},m.fx=Zb.prototype.init,m.fx.step={};var $b,_b,ac=/^(?:toggle|show|hide)$/,bc=new RegExp("^(?:([+-])=|)("+S+")([a-z%]*)$","i"),cc=/queueHooks$/,dc=[ic],ec={"*":[function(a,b){var c=this.createTween(a,b),d=c.cur(),e=bc.exec(b),f=e&&e[3]||(m.cssNumber[a]?"":"px"),g=(m.cssNumber[a]||"px"!==f&&+d)&&bc.exec(m.css(c.elem,a)),h=1,i=20;if(g&&g[3]!==f){f=f||g[3],e=e||[],g=+d||1;do h=h||".5",g/=h,m.style(c.elem,a,g+f);while(h!==(h=c.cur()/d)&&1!==h&&--i)}return e&&(g=c.start=+g||+d||0,c.unit=f,c.end=e[1]?g+(e[1]+1)*e[2]:+e[2]),c}]};function fc(){return setTimeout(function(){$b=void 0}),$b=m.now()}function gc(a,b){var c,d={height:a},e=0;for(b=b?1:0;4>e;e+=2-b)c=T[e],d["margin"+c]=d["padding"+c]=a;return b&&(d.opacity=d.width=a),d}function hc(a,b,c){for(var d,e=(ec[b]||[]).concat(ec["*"]),f=0,g=e.length;g>f;f++)if(d=e[f].call(c,b,a))return d}function ic(a,b,c){var d,e,f,g,h,i,j,l,n=this,o={},p=a.style,q=a.nodeType&&U(a),r=m._
 data(a,"fxshow");c.queue||(h=m._queueHooks(a,"fx"),null==h.unqueued&&(h.unqueued=0,i=h.empty.fire,h.empty.fire=function(){h.unqueued||i()}),h.unqueued++,n.always(function(){n.always(function(){h.unqueued--,m.queue(a,"fx").length||h.empty.fire()})})),1===a.nodeType&&("height"in b||"width"in b)&&(c.overflow=[p.overflow,p.overflowX,p.overflowY],j=m.css(a,"display"),l="none"===j?m._data(a,"olddisplay")||Fb(a.nodeName):j,"inline"===l&&"none"===m.css(a,"float")&&(k.inlineBlockNeedsLayout&&"inline"!==Fb(a.nodeName)?p.zoom=1:p.display="inline-block")),c.overflow&&(p.overflow="hidden",k.shrinkWrapBlocks()||n.always(function(){p.overflow=c.overflow[0],p.overflowX=c.overflow[1],p.overflowY=c.overflow[2]}));for(d in b)if(e=b[d],ac.exec(e)){if(delete b[d],f=f||"toggle"===e,e===(q?"hide":"show")){if("show"!==e||!r||void 0===r[d])continue;q=!0}o[d]=r&&r[d]||m.style(a,d)}else j=void 0;if(m.isEmptyObject(o))"inline"===("none"===j?Fb(a.nodeName):j)&&(p.display=j);else{r?"hidden"in r&&(q=r.hidden):r=m
 ._data(a,"fxshow",{}),f&&(r.hidden=!q),q?m(a).show():n.done(function(){m(a).hide()}),n.done(function(){var b;m._removeData(a,"fxshow");for(b in o)m.style(a,b,o[b])});for(d in o)g=hc(q?r[d]:0,d,n),d in r||(r[d]=g.start,q&&(g.end=g.start,g.start="width"===d||"height"===d?1:0))}}function jc(a,b){var c,d,e,f,g;for(c in a)if(d=m.camelCase(c),e=b[d],f=a[c],m.isArray(f)&&(e=f[1],f=a[c]=f[0]),c!==d&&(a[d]=f,delete a[c]),g=m.cssHooks[d],g&&"expand"in g){f=g.expand(f),delete a[d];for(c in f)c in a||(a[c]=f[c],b[c]=e)}else b[d]=e}function kc(a,b,c){var d,e,f=0,g=dc.length,h=m.Deferred().always(function(){delete i.elem}),i=function(){if(e)return!1;for(var b=$b||fc(),c=Math.max(0,j.startTime+j.duration-b),d=c/j.duration||0,f=1-d,g=0,i=j.tweens.length;i>g;g++)j.tweens[g].run(f);return h.notifyWith(a,[j,f,c]),1>f&&i?c:(h.resolveWith(a,[j]),!1)},j=h.promise({elem:a,props:m.extend({},b),opts:m.extend(!0,{specialEasing:{}},c),originalProperties:b,originalOptions:c,startTime:$b||fc(),duration:c.durati
 on,tweens:[],createTween:function(b,c){var d=m.Tween(a,j.opts,b,c,j.opts.specialEasing[b]||j.opts.easing);return j.tweens.push(d),d},stop:function(b){var c=0,d=b?j.tweens.length:0;if(e)return this;for(e=!0;d>c;c++)j.tweens[c].run(1);return b?h.resolveWith(a,[j,b]):h.rejectWith(a,[j,b]),this}}),k=j.props;for(jc(k,j.opts.specialEasing);g>f;f++)if(d=dc[f].call(j,a,k,j.opts))return d;return m.map(k,hc,j),m.isFunction(j.opts.start)&&j.opts.start.call(a,j),m.fx.timer(m.extend(i,{elem:a,anim:j,queue:j.opts.queue})),j.progress(j.opts.progress).done(j.opts.done,j.opts.complete).fail(j.opts.fail).always(j.opts.always)}m.Animation=m.extend(kc,{tweener:function(a,b){m.isFunction(a)?(b=a,a=["*"]):a=a.split(" ");for(var c,d=0,e=a.length;e>d;d++)c=a[d],ec[c]=ec[c]||[],ec[c].unshift(b)},prefilter:function(a,b){b?dc.unshift(a):dc.push(a)}}),m.speed=function(a,b,c){var d=a&&"object"==typeof a?m.extend({},a):{complete:c||!c&&b||m.isFunction(a)&&a,duration:a,easing:c&&b||b&&!m.isFunction(b)&&b};return 
 d.duration=m.fx.off?0:"number"==typeof d.duration?d.duration:d.duration in m.fx.speeds?m.fx.speeds[d.duration]:m.fx.speeds._default,(null==d.queue||d.queue===!0)&&(d.queue="fx"),d.old=d.complete,d.complete=function(){m.isFunction(d.old)&&d.old.call(this),d.queue&&m.dequeue(this,d.queue)},d},m.fn.extend({fadeTo:function(a,b,c,d){return this.filter(U).css("opacity",0).show().end().animate({opacity:b},a,c,d)},animate:function(a,b,c,d){var e=m.isEmptyObject(a),f=m.speed(b,c,d),g=function(){var b=kc(this,m.extend({},a),f);(e||m._data(this,"finish"))&&b.stop(!0)};return g.finish=g,e||f.queue===!1?this.each(g):this.queue(f.queue,g)},stop:function(a,b,c){var d=function(a){var b=a.stop;delete a.stop,b(c)};return"string"!=typeof a&&(c=b,b=a,a=void 0),b&&a!==!1&&this.queue(a||"fx",[]),this.each(function(){var b=!0,e=null!=a&&a+"queueHooks",f=m.timers,g=m._data(this);if(e)g[e]&&g[e].stop&&d(g[e]);else for(e in g)g[e]&&g[e].stop&&cc.test(e)&&d(g[e]);for(e=f.length;e--;)f[e].elem!==this||null!=a&
 &f[e].queue!==a||(f[e].anim.stop(c),b=!1,f.splice(e,1));(b||!c)&&m.dequeue(this,a)})},finish:function(a){return a!==!1&&(a=a||"fx"),this.each(function(){var b,c=m._data(this),d=c[a+"queue"],e=c[a+"queueHooks"],f=m.timers,g=d?d.length:0;for(c.finish=!0,m.queue(this,a,[]),e&&e.stop&&e.stop.call(this,!0),b=f.length;b--;)f[b].elem===this&&f[b].queue===a&&(f[b].anim.stop(!0),f.splice(b,1));for(b=0;g>b;b++)d[b]&&d[b].finish&&d[b].finish.call(this);delete c.finish})}}),m.each(["toggle","show","hide"],function(a,b){var c=m.fn[b];m.fn[b]=function(a,d,e){return null==a||"boolean"==typeof a?c.apply(this,arguments):this.animate(gc(b,!0),a,d,e)}}),m.each({slideDown:gc("show"),slideUp:gc("hide"),slideToggle:gc("toggle"),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"},fadeToggle:{opacity:"toggle"}},function(a,b){m.fn[a]=function(a,c,d){return this.animate(b,a,c,d)}}),m.timers=[],m.fx.tick=function(){var a,b=m.timers,c=0;for($b=m.now();c<b.length;c++)a=b[c],a()||b[c]!==a||b.splice(c--,1);b.length|
 |m.fx.stop(),$b=void 0},m.fx.timer=function(a){m.timers.push(a),a()?m.fx.start():m.timers.pop()},m.fx.interval=13,m.fx.start=function(){_b||(_b=setInterval(m.fx.tick,m.fx.interval))},m.fx.stop=function(){clearInterval(_b),_b=null},m.fx.speeds={slow:600,fast:200,_default:400},m.fn.delay=function(a,b){return a=m.fx?m.fx.speeds[a]||a:a,b=b||"fx",this.queue(b,function(b,c){var d=setTimeout(b,a);c.stop=function(){clearTimeout(d)}})},function(){var a,b,c,d,e;b=y.createElement("div"),b.setAttribute("className","t"),b.innerHTML="  <link/><table></table><a href='/a'>a</a><input type='checkbox'/>",d=b.getElementsByTagName("a")[0],c=y.createElement("select"),e=c.appendChild(y.createElement("option")),a=b.getElementsByTagName("input")[0],d.style.cssText="top:1px",k.getSetAttribute="t"!==b.className,k.style=/top/.test(d.getAttribute("style")),k.hrefNormalized="/a"===d.getAttribute("href"),k.checkOn=!!a.value,k.optSelected=e.selected,k.enctype=!!y.createElement("form").enctype,c.disabled=!0,k.opt
 Disabled=!e.disabled,a=y.createElement("input"),a.setAttribute("value",""),k.input=""===a.getAttribute("value"),a.value="t",a.setAttribute("type","radio"),k.radioValue="t"===a.value}();var lc=/\r/g;m.fn.extend({val:function(a){var b,c,d,e=this[0];{if(arguments.length)return d=m.isFunction(a),this.each(function(c){var e;1===this.nodeType&&(e=d?a.call(this,c,m(this).val()):a,null==e?e="":"number"==typeof e?e+="":m.isArray(e)&&(e=m.map(e,function(a){return null==a?"":a+""})),b=m.valHooks[this.type]||m.valHooks[this.nodeName.toLowerCase()],b&&"set"in b&&void 0!==b.set(this,e,"value")||(this.value=e))});if(e)return b=m.valHooks[e.type]||m.valHooks[e.nodeName.toLowerCase()],b&&"get"in b&&void 0!==(c=b.get(e,"value"))?c:(c=e.value,"string"==typeof c?c.replace(lc,""):null==c?"":c)}}}),m.extend({valHooks:{option:{get:function(a){var b=m.find.attr(a,"value");return null!=b?b:m.trim(m.text(a))}},select:{get:function(a){for(var b,c,d=a.options,e=a.selectedIndex,f="select-one"===a.type||0>e,g=f?
 null:[],h=f?e+1:d.length,i=0>e?h:f?e:0;h>i;i++)if(c=d[i],!(!c.selected&&i!==e||(k.optDisabled?c.disabled:null!==c.getAttribute("disabled"))||c.parentNode.disabled&&m.nodeName(c.parentNode,"optgroup"))){if(b=m(c).val(),f)return b;g.push(b)}return g},set:function(a,b){var c,d,e=a.options,f=m.makeArray(b),g=e.length;while(g--)if(d=e[g],m.inArray(m.valHooks.option.get(d),f)>=0)try{d.selected=c=!0}catch(h){d.scrollHeight}else d.selected=!1;return c||(a.selectedIndex=-1),e}}}}),m.each(["radio","checkbox"],function(){m.valHooks[this]={set:function(a,b){return m.isArray(b)?a.checked=m.inArray(m(a).val(),b)>=0:void 0}},k.checkOn||(m.valHooks[this].get=function(a){return null===a.getAttribute("value")?"on":a.value})});var mc,nc,oc=m.expr.attrHandle,pc=/^(?:checked|selected)$/i,qc=k.getSetAttribute,rc=k.input;m.fn.extend({attr:function(a,b){return V(this,m.attr,a,b,arguments.length>1)},removeAttr:function(a){return this.each(function(){m.removeAttr(this,a)})}}),m.extend({attr:function(a,b,c){v
 ar d,e,f=a.nodeType;if(a&&3!==f&&8!==f&&2!==f)return typeof a.getAttribute===K?m.prop(a,b,c):(1===f&&m.isXMLDoc(a)||(b=b.toLowerCase(),d=m.attrHooks[b]||(m.expr.match.bool.test(b)?nc:mc)),void 0===c?d&&"get"in d&&null!==(e=d.get(a,b))?e:(e=m.find.attr(a,b),null==e?void 0:e):null!==c?d&&"set"in d&&void 0!==(e=d.set(a,c,b))?e:(a.setAttribute(b,c+""),c):void m.removeAttr(a,b))},removeAttr:function(a,b){var c,d,e=0,f=b&&b.match(E);if(f&&1===a.nodeType)while(c=f[e++])d=m.propFix[c]||c,m.expr.match.bool.test(c)?rc&&qc||!pc.test(c)?a[d]=!1:a[m.camelCase("default-"+c)]=a[d]=!1:m.attr(a,c,""),a.removeAttribute(qc?c:d)},attrHooks:{type:{set:function(a,b){if(!k.radioValue&&"radio"===b&&m.nodeName(a,"input")){var c=a.value;return a.setAttribute("type",b),c&&(a.value=c),b}}}}}),nc={set:function(a,b,c){return b===!1?m.removeAttr(a,c):rc&&qc||!pc.test(c)?a.setAttribute(!qc&&m.propFix[c]||c,c):a[m.camelCase("default-"+c)]=a[c]=!0,c}},m.each(m.expr.match.bool.source.match(/\w+/g),function(a,b){var c
 =oc[b]||m.find.attr;oc[b]=rc&&qc||!pc.test(b)?function(a,b,d){var e,f;return d||(f=oc[b],oc[b]=e,e=null!=c(a,b,d)?b.toLowerCase():null,oc[b]=f),e}:function(a,b,c){return c?void 0:a[m.camelCase("default-"+b)]?b.toLowerCase():null}}),rc&&qc||(m.attrHooks.value={set:function(a,b,c){return m.nodeName(a,"input")?void(a.defaultValue=b):mc&&mc.set(a,b,c)}}),qc||(mc={set:function(a,b,c){var d=a.getAttributeNode(c);return d||a.setAttributeNode(d=a.ownerDocument.createAttribute(c)),d.value=b+="","value"===c||b===a.getAttribute(c)?b:void 0}},oc.id=oc.name=oc.coords=function(a,b,c){var d;return c?void 0:(d=a.getAttributeNode(b))&&""!==d.value?d.value:null},m.valHooks.button={get:function(a,b){var c=a.getAttributeNode(b);return c&&c.specified?c.value:void 0},set:mc.set},m.attrHooks.contenteditable={set:function(a,b,c){mc.set(a,""===b?!1:b,c)}},m.each(["width","height"],function(a,b){m.attrHooks[b]={set:function(a,c){return""===c?(a.setAttribute(b,"auto"),c):void 0}}})),k.style||(m.attrHooks.styl
 e={get:function(a){return a.style.cssText||void 0},set:function(a,b){return a.style.cssText=b+""}});var sc=/^(?:input|select|textarea|button|object)$/i,tc=/^(?:a|area)$/i;m.fn.extend({prop:function(a,b){return V(this,m.prop,a,b,arguments.length>1)},removeProp:function(a){return a=m.propFix[a]||a,this.each(function(){try{this[a]=void 0,delete this[a]}catch(b){}})}}),m.extend({propFix:{"for":"htmlFor","class":"className"},prop:function(a,b,c){var d,e,f,g=a.nodeType;if(a&&3!==g&&8!==g&&2!==g)return f=1!==g||!m.isXMLDoc(a),f&&(b=m.propFix[b]||b,e=m.propHooks[b]),void 0!==c?e&&"set"in e&&void 0!==(d=e.set(a,c,b))?d:a[b]=c:e&&"get"in e&&null!==(d=e.get(a,b))?d:a[b]},propHooks:{tabIndex:{get:function(a){var b=m.find.attr(a,"tabindex");return b?parseInt(b,10):sc.test(a.nodeName)||tc.test(a.nodeName)&&a.href?0:-1}}}}),k.hrefNormalized||m.each(["href","src"],function(a,b){m.propHooks[b]={get:function(a){return a.getAttribute(b,4)}}}),k.optSelected||(m.propHooks.selected={get:function(a){var b
 =a.parentNode;return b&&(b.selectedIndex,b.parentNode&&b.parentNode.selectedIndex),null}}),m.each(["tabIndex","readOnly","maxLength","cellSpacing","cellPadding","rowSpan","colSpan","useMap","frameBorder","contentEditable"],function(){m.propFix[this.toLowerCase()]=this}),k.enctype||(m.propFix.enctype="encoding");var uc=/[\t\r\n\f]/g;m.fn.extend({addClass:function(a){var b,c,d,e,f,g,h=0,i=this.length,j="string"==typeof a&&a;if(m.isFunction(a))return this.each(function(b){m(this).addClass(a.call(this,b,this.className))});if(j)for(b=(a||"").match(E)||[];i>h;h++)if(c=this[h],d=1===c.nodeType&&(c.className?(" "+c.className+" ").replace(uc," "):" ")){f=0;while(e=b[f++])d.indexOf(" "+e+" ")<0&&(d+=e+" ");g=m.trim(d),c.className!==g&&(c.className=g)}return this},removeClass:function(a){var b,c,d,e,f,g,h=0,i=this.length,j=0===arguments.length||"string"==typeof a&&a;if(m.isFunction(a))return this.each(function(b){m(this).removeClass(a.call(this,b,this.className))});if(j)for(b=(a||"").match(E)|
 |[];i>h;h++)if(c=this[h],d=1===c.nodeType&&(c.className?(" "+c.className+" ").replace(uc," "):"")){f=0;while(e=b[f++])while(d.indexOf(" "+e+" ")>=0)d=d.replace(" "+e+" "," ");g=a?m.trim(d):"",c.className!==g&&(c.className=g)}return this},toggleClass:function(a,b){var c=typeof a;return"boolean"==typeof b&&"string"===c?b?this.addClass(a):this.removeClass(a):this.each(m.isFunction(a)?function(c){m(this).toggleClass(a.call(this,c,this.className,b),b)}:function(){if("string"===c){var b,d=0,e=m(this),f=a.match(E)||[];while(b=f[d++])e.hasClass(b)?e.removeClass(b):e.addClass(b)}else(c===K||"boolean"===c)&&(this.className&&m._data(this,"__className__",this.className),this.className=this.className||a===!1?"":m._data(this,"__className__")||"")})},hasClass:function(a){for(var b=" "+a+" ",c=0,d=this.length;d>c;c++)if(1===this[c].nodeType&&(" "+this[c].className+" ").replace(uc," ").indexOf(b)>=0)return!0;return!1}}),m.each("blur focus focusin focusout load resize scroll unload click dblclick mou
 sedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup error contextmenu".split(" "),function(a,b){m.fn[b]=function(a,c){return arguments.length>0?this.on(b,null,a,c):this.trigger(b)}}),m.fn.extend({hover:function(a,b){return this.mouseenter(a).mouseleave(b||a)},bind:function(a,b,c){return this.on(a,null,b,c)},unbind:function(a,b){return this.off(a,null,b)},delegate:function(a,b,c,d){return this.on(b,a,c,d)},undelegate:function(a,b,c){return 1===arguments.length?this.off(a,"**"):this.off(b,a||"**",c)}});var vc=m.now(),wc=/\?/,xc=/(,)|(\[|{)|(}|])|"(?:[^"\\\r\n]|\\["\\\/bfnrt]|\\u[\da-fA-F]{4})*"\s*:?|true|false|null|-?(?!0\d)\d+(?:\.\d+|)(?:[eE][+-]?\d+|)/g;m.parseJSON=function(b){if(a.JSON&&a.JSON.parse)return a.JSON.parse(b+"");var c,d=null,e=m.trim(b+"");return e&&!m.trim(e.replace(xc,function(a,b,e,f){return c&&b&&(d=0),0===d?a:(c=e||b,d+=!f-!e,"")}))?Function("return "+e)():m.error("Invalid JSON: "+b)},m.parseXML=function(b
 ){var c,d;if(!b||"string"!=typeof b)return null;try{a.DOMParser?(d=new DOMParser,c=d.parseFromString(b,"text/xml")):(c=new ActiveXObject("Microsoft.XMLDOM"),c.async="false",c.loadXML(b))}catch(e){c=void 0}return c&&c.documentElement&&!c.getElementsByTagName("parsererror").length||m.error("Invalid XML: "+b),c};var yc,zc,Ac=/#.*$/,Bc=/([?&])_=[^&]*/,Cc=/^(.*?):[ \t]*([^\r\n]*)\r?$/gm,Dc=/^(?:about|app|app-storage|.+-extension|file|res|widget):$/,Ec=/^(?:GET|HEAD)$/,Fc=/^\/\//,Gc=/^([\w.+-]+:)(?:\/\/(?:[^\/?#]*@|)([^\/?#:]*)(?::(\d+)|)|)/,Hc={},Ic={},Jc="*/".concat("*");try{zc=location.href}catch(Kc){zc=y.createElement("a"),zc.href="",zc=zc.href}yc=Gc.exec(zc.toLowerCase())||[];function Lc(a){return function(b,c){"string"!=typeof b&&(c=b,b="*");var d,e=0,f=b.toLowerCase().match(E)||[];if(m.isFunction(c))while(d=f[e++])"+"===d.charAt(0)?(d=d.slice(1)||"*",(a[d]=a[d]||[]).unshift(c)):(a[d]=a[d]||[]).push(c)}}function Mc(a,b,c,d){var e={},f=a===Ic;function g(h){var i;return e[h]=!0,m.each
 (a[h]||[],function(a,h){var j=h(b,c,d);return"string"!=typeof j||f||e[j]?f?!(i=j):void 0:(b.dataTypes.unshift(j),g(j),!1)}),i}return g(b.dataTypes[0])||!e["*"]&&g("*")}function Nc(a,b){var c,d,e=m.ajaxSettings.flatOptions||{};for(d in b)void 0!==b[d]&&((e[d]?a:c||(c={}))[d]=b[d]);return c&&m.extend(!0,a,c),a}function Oc(a,b,c){var d,e,f,g,h=a.contents,i=a.dataTypes;while("*"===i[0])i.shift(),void 0===e&&(e=a.mimeType||b.getResponseHeader("Content-Type"));if(e)for(g in h)if(h[g]&&h[g].test(e)){i.unshift(g);break}if(i[0]in c)f=i[0];else{for(g in c){if(!i[0]||a.converters[g+" "+i[0]]){f=g;break}d||(d=g)}f=f||d}return f?(f!==i[0]&&i.unshift(f),c[f]):void 0}function Pc(a,b,c,d){var e,f,g,h,i,j={},k=a.dataTypes.slice();if(k[1])for(g in a.converters)j[g.toLowerCase()]=a.converters[g];f=k.shift();while(f)if(a.responseFields[f]&&(c[a.responseFields[f]]=b),!i&&d&&a.dataFilter&&(b=a.dataFilter(b,a.dataType)),i=f,f=k.shift())if("*"===f)f=i;else if("*"!==i&&i!==f){if(g=j[i+" "+f]||j["* "+f],!g)f
 or(e in j)if(h=e.split(" "),h[1]===f&&(g=j[i+" "+h[0]]||j["* "+h[0]])){g===!0?g=j[e]:j[e]!==!0&&(f=h[0],k.unshift(h[1]));break}if(g!==!0)if(g&&a["throws"])b=g(b);else try{b=g(b)}catch(l){return{state:"parsererror",error:g?l:"No conversion from "+i+" to "+f}}}return{state:"success",data:b}}m.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:zc,type:"GET",isLocal:Dc.test(yc[1]),global:!0,processData:!0,async:!0,contentType:"application/x-www-form-urlencoded; charset=UTF-8",accepts:{"*":Jc,text:"text/plain",html:"text/html",xml:"application/xml, text/xml",json:"application/json, text/javascript"},contents:{xml:/xml/,html:/html/,json:/json/},responseFields:{xml:"responseXML",text:"responseText",json:"responseJSON"},converters:{"* text":String,"text html":!0,"text json":m.parseJSON,"text xml":m.parseXML},flatOptions:{url:!0,context:!0}},ajaxSetup:function(a,b){return b?Nc(Nc(a,m.ajaxSettings),b):Nc(m.ajaxSettings,a)},ajaxPrefilter:Lc(Hc),ajaxTransport:Lc(Ic),ajax:function(a,b){"
 object"==typeof a&&(b=a,a=void 0),b=b||{};var c,d,e,f,g,h,i,j,k=m.ajaxSetup({},b),l=k.context||k,n=k.context&&(l.nodeType||l.jquery)?m(l):m.event,o=m.Deferred(),p=m.Callbacks("once memory"),q=k.statusCode||{},r={},s={},t=0,u="canceled",v={readyState:0,getResponseHeader:function(a){var b;if(2===t){if(!j){j={};while(b=Cc.exec(f))j[b[1].toLowerCase()]=b[2]}b=j[a.toLowerCase()]}return null==b?null:b},getAllResponseHeaders:function(){return 2===t?f:null},setRequestHeader:function(a,b){var c=a.toLowerCase();return t||(a=s[c]=s[c]||a,r[a]=b),this},overrideMimeType:function(a){return t||(k.mimeType=a),this},statusCode:function(a){var b;if(a)if(2>t)for(b in a)q[b]=[q[b],a[b]];else v.always(a[v.status]);return this},abort:function(a){var b=a||u;return i&&i.abort(b),x(0,b),this}};if(o.promise(v).complete=p.add,v.success=v.done,v.error=v.fail,k.url=((a||k.url||zc)+"").replace(Ac,"").replace(Fc,yc[1]+"//"),k.type=b.method||b.type||k.method||k.type,k.dataTypes=m.trim(k.dataType||"*").toLowerCase(
 ).match(E)||[""],null==k.crossDomain&&(c=Gc.exec(k.url.toLowerCase()),k.crossDomain=!(!c||c[1]===yc[1]&&c[2]===yc[2]&&(c[3]||("http:"===c[1]?"80":"443"))===(yc[3]||("http:"===yc[1]?"80":"443")))),k.data&&k.processData&&"string"!=typeof k.data&&(k.data=m.param(k.data,k.traditional)),Mc(Hc,k,b,v),2===t)return v;h=k.global,h&&0===m.active++&&m.event.trigger("ajaxStart"),k.type=k.type.toUpperCase(),k.hasContent=!Ec.test(k.type),e=k.url,k.hasContent||(k.data&&(e=k.url+=(wc.test(e)?"&":"?")+k.data,delete k.data),k.cache===!1&&(k.url=Bc.test(e)?e.replace(Bc,"$1_="+vc++):e+(wc.test(e)?"&":"?")+"_="+vc++)),k.ifModified&&(m.lastModified[e]&&v.setRequestHeader("If-Modified-Since",m.lastModified[e]),m.etag[e]&&v.setRequestHeader("If-None-Match",m.etag[e])),(k.data&&k.hasContent&&k.contentType!==!1||b.contentType)&&v.setRequestHeader("Content-Type",k.contentType),v.setRequestHeader("Accept",k.dataTypes[0]&&k.accepts[k.dataTypes[0]]?k.accepts[k.dataTypes[0]]+("*"!==k.dataTypes[0]?", "+Jc+"; q=0.0
 1":""):k.accepts["*"]);for(d in k.headers)v.setRequestHeader(d,k.headers[d]);if(k.beforeSend&&(k.beforeSend.call(l,v,k)===!1||2===t))return v.abort();u="abort";for(d in{success:1,error:1,complete:1})v[d](k[d]);if(i=Mc(Ic,k,b,v)){v.readyState=1,h&&n.trigger("ajaxSend",[v,k]),k.async&&k.timeout>0&&(g=setTimeout(function(){v.abort("timeout")},k.timeout));try{t=1,i.send(r,x)}catch(w){if(!(2>t))throw w;x(-1,w)}}else x(-1,"No Transport");function x(a,b,c,d){var j,r,s,u,w,x=b;2!==t&&(t=2,g&&clearTimeout(g),i=void 0,f=d||"",v.readyState=a>0?4:0,j=a>=200&&300>a||304===a,c&&(u=Oc(k,v,c)),u=Pc(k,u,v,j),j?(k.ifModified&&(w=v.getResponseHeader("Last-Modified"),w&&(m.lastModified[e]=w),w=v.getResponseHeader("etag"),w&&(m.etag[e]=w)),204===a||"HEAD"===k.type?x="nocontent":304===a?x="notmodified":(x=u.state,r=u.data,s=u.error,j=!s)):(s=x,(a||!x)&&(x="error",0>a&&(a=0))),v.status=a,v.statusText=(b||x)+"",j?o.resolveWith(l,[r,x,v]):o.rejectWith(l,[v,x,s]),v.statusCode(q),q=void 0,h&&n.trigger(j?"ajax
 Success":"ajaxError",[v,k,j?r:s]),p.fireWith(l,[v,x]),h&&(n.trigger("ajaxComplete",[v,k]),--m.active||m.event.trigger("ajaxStop")))}return v},getJSON:function(a,b,c){return m.get(a,b,c,"json")},getScript:function(a,b){return m.get(a,void 0,b,"script")}}),m.each(["get","post"],function(a,b){m[b]=function(a,c,d,e){return m.isFunction(c)&&(e=e||d,d=c,c=void 0),m.ajax({url:a,type:b,dataType:e,data:c,success:d})}}),m.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(a,b){m.fn[b]=function(a){return this.on(b,a)}}),m._evalUrl=function(a){return m.ajax({url:a,type:"GET",dataType:"script",async:!1,global:!1,"throws":!0})},m.fn.extend({wrapAll:function(a){if(m.isFunction(a))return this.each(function(b){m(this).wrapAll(a.call(this,b))});if(this[0]){var b=m(a,this[0].ownerDocument).eq(0).clone(!0);this[0].parentNode&&b.insertBefore(this[0]),b.map(function(){var a=this;while(a.firstChild&&1===a.firstChild.nodeType)a=a.firstChild;return a}).append(this)}re
 turn this},wrapInner:function(a){return this.each(m.isFunction(a)?function(b){m(this).wrapInner(a.call(this,b))}:function(){var b=m(this),c=b.contents();c.length?c.wrapAll(a):b.append(a)})},wrap:function(a){var b=m.isFunction(a);return this.each(function(c){m(this).wrapAll(b?a.call(this,c):a)})},unwrap:function(){return this.parent().each(function(){m.nodeName(this,"body")||m(this).replaceWith(this.childNodes)}).end()}}),m.expr.filters.hidden=function(a){return a.offsetWidth<=0&&a.offsetHeight<=0||!k.reliableHiddenOffsets()&&"none"===(a.style&&a.style.display||m.css(a,"display"))},m.expr.filters.visible=function(a){return!m.expr.filters.hidden(a)};var Qc=/%20/g,Rc=/\[\]$/,Sc=/\r?\n/g,Tc=/^(?:submit|button|image|reset|file)$/i,Uc=/^(?:input|select|textarea|keygen)/i;function Vc(a,b,c,d){var e;if(m.isArray(b))m.each(b,function(b,e){c||Rc.test(a)?d(a,e):Vc(a+"["+("object"==typeof e?b:"")+"]",e,c,d)});else if(c||"object"!==m.type(b))d(a,b);else for(e in b)Vc(a+"["+e+"]",b[e],c,d)}m.para
 m=function(a,b){var c,d=[],e=function(a,b){b=m.isFunction(b)?b():null==b?"":b,d[d.length]=encodeURIComponent(a)+"="+encodeURIComponent(b)};if(void 0===b&&(b=m.ajaxSettings&&m.ajaxSettings.traditional),m.isArray(a)||a.jquery&&!m.isPlainObject(a))m.each(a,function(){e(this.name,this.value)});else for(c in a)Vc(c,a[c],b,e);return d.join("&").replace(Qc,"+")},m.fn.extend({serialize:function(){return m.param(this.serializeArray())},serializeArray:function(){return this.map(function(){var a=m.prop(this,"elements");return a?m.makeArray(a):this}).filter(function(){var a=this.type;return this.name&&!m(this).is(":disabled")&&Uc.test(this.nodeName)&&!Tc.test(a)&&(this.checked||!W.test(a))}).map(function(a,b){var c=m(this).val();return null==c?null:m.isArray(c)?m.map(c,function(a){return{name:b.name,value:a.replace(Sc,"\r\n")}}):{name:b.name,value:c.replace(Sc,"\r\n")}}).get()}}),m.ajaxSettings.xhr=void 0!==a.ActiveXObject?function(){return!this.isLocal&&/^(get|post|head|put|delete|options)$/i.
 test(this.type)&&Zc()||$c()}:Zc;var Wc=0,Xc={},Yc=m.ajaxSettings.xhr();a.ActiveXObject&&m(a).on("unload",function(){for(var a in Xc)Xc[a](void 0,!0)}),k.cors=!!Yc&&"withCredentials"in Yc,Yc=k.ajax=!!Yc,Yc&&m.ajaxTransport(function(a){if(!a.crossDomain||k.cors){var b;return{send:function(c,d){var e,f=a.xhr(),g=++Wc;if(f.open(a.type,a.url,a.async,a.username,a.password),a.xhrFields)for(e in a.xhrFields)f[e]=a.xhrFields[e];a.mimeType&&f.overrideMimeType&&f.overrideMimeType(a.mimeType),a.crossDomain||c["X-Requested-With"]||(c["X-Requested-With"]="XMLHttpRequest");for(e in c)void 0!==c[e]&&f.setRequestHeader(e,c[e]+"");f.send(a.hasContent&&a.data||null),b=function(c,e){var h,i,j;if(b&&(e||4===f.readyState))if(delete Xc[g],b=void 0,f.onreadystatechange=m.noop,e)4!==f.readyState&&f.abort();else{j={},h=f.status,"string"==typeof f.responseText&&(j.text=f.responseText);try{i=f.statusText}catch(k){i=""}h||!a.isLocal||a.crossDomain?1223===h&&(h=204):h=j.text?200:404}j&&d(h,i,j,f.getAllResponseHe
 aders())},a.async?4===f.readyState?setTimeout(b):f.onreadystatechange=Xc[g]=b:b()},abort:function(){b&&b(void 0,!0)}}}});function Zc(){try{return new a.XMLHttpRequest}catch(b){}}function $c(){try{return new a.ActiveXObject("Microsoft.XMLHTTP")}catch(b){}}m.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/(?:java|ecma)script/},converters:{"text script":function(a){return m.globalEval(a),a}}}),m.ajaxPrefilter("script",function(a){void 0===a.cache&&(a.cache=!1),a.crossDomain&&(a.type="GET",a.global=!1)}),m.ajaxTransport("script",function(a){if(a.crossDomain){var b,c=y.head||m("head")[0]||y.documentElement;return{send:function(d,e){b=y.createElement("script"),b.async=!0,a.scriptCharset&&(b.charset=a.scriptCharset),b.src=a.url,b.onload=b.onreadystatechange=function(a,c){(c||!b.readyState||/loaded|complete/.test(b.readyState))&&(b.onload=b.onreadystatechange=null,b.parentNode&&b.parentNode.removeChild
 (b),b=null,c||e(200,"success"))},c.insertBefore(b,c.firstChild)},abort:function(){b&&b.onload(void 0,!0)}}}});var _c=[],ad=/(=)\?(?=&|$)|\?\?/;m.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var a=_c.pop()||m.expando+"_"+vc++;return this[a]=!0,a}}),m.ajaxPrefilter("json jsonp",function(b,c,d){var e,f,g,h=b.jsonp!==!1&&(ad.test(b.url)?"url":"string"==typeof b.data&&!(b.contentType||"").indexOf("application/x-www-form-urlencoded")&&ad.test(b.data)&&"data");return h||"jsonp"===b.dataTypes[0]?(e=b.jsonpCallback=m.isFunction(b.jsonpCallback)?b.jsonpCallback():b.jsonpCallback,h?b[h]=b[h].replace(ad,"$1"+e):b.jsonp!==!1&&(b.url+=(wc.test(b.url)?"&":"?")+b.jsonp+"="+e),b.converters["script json"]=function(){return g||m.error(e+" was not called"),g[0]},b.dataTypes[0]="json",f=a[e],a[e]=function(){g=arguments},d.always(function(){a[e]=f,b[e]&&(b.jsonpCallback=c.jsonpCallback,_c.push(e)),g&&m.isFunction(f)&&f(g[0]),g=f=void 0}),"script"):void 0}),m.parseHTML=function(a,b,c){if(!a||"stri
 ng"!=typeof a)return null;"boolean"==typeof b&&(c=b,b=!1),b=b||y;var d=u.exec(a),e=!c&&[];return d?[b.createElement(d[1])]:(d=m.buildFragment([a],b,e),e&&e.length&&m(e).remove(),m.merge([],d.childNodes))};var bd=m.fn.load;m.fn.load=function(a,b,c){if("string"!=typeof a&&bd)return bd.apply(this,arguments);var d,e,f,g=this,h=a.indexOf(" ");return h>=0&&(d=m.trim(a.slice(h,a.length)),a=a.slice(0,h)),m.isFunction(b)?(c=b,b=void 0):b&&"object"==typeof b&&(f="POST"),g.length>0&&m.ajax({url:a,type:f,dataType:"html",data:b}).done(function(a){e=arguments,g.html(d?m("<div>").append(m.parseHTML(a)).find(d):a)}).complete(c&&function(a,b){g.each(c,e||[a.responseText,b,a])}),this},m.expr.filters.animated=function(a){return m.grep(m.timers,function(b){return a===b.elem}).length};var cd=a.document.documentElement;function dd(a){return m.isWindow(a)?a:9===a.nodeType?a.defaultView||a.parentWindow:!1}m.offset={setOffset:function(a,b,c){var d,e,f,g,h,i,j,k=m.css(a,"position"),l=m(a),n={};"static"===k&&
 (a.style.position="relative"),h=l.offset(),f=m.css(a,"top"),i=m.css(a,"left"),j=("absolute"===k||"fixed"===k)&&m.inArray("auto",[f,i])>-1,j?(d=l.position(),g=d.top,e=d.left):(g=parseFloat(f)||0,e=parseFloat(i)||0),m.isFunction(b)&&(b=b.call(a,c,h)),null!=b.top&&(n.top=b.top-h.top+g),null!=b.left&&(n.left=b.left-h.left+e),"using"in b?b.using.call(a,n):l.css(n)}},m.fn.extend({offset:function(a){if(arguments.length)return void 0===a?this:this.each(function(b){m.offset.setOffset(this,a,b)});var b,c,d={top:0,left:0},e=this[0],f=e&&e.ownerDocument;if(f)return b=f.documentElement,m.contains(b,e)?(typeof e.getBoundingClientRect!==K&&(d=e.getBoundingClientRect()),c=dd(f),{top:d.top+(c.pageYOffset||b.scrollTop)-(b.clientTop||0),left:d.left+(c.pageXOffset||b.scrollLeft)-(b.clientLeft||0)}):d},position:function(){if(this[0]){var a,b,c={top:0,left:0},d=this[0];return"fixed"===m.css(d,"position")?b=d.getBoundingClientRect():(a=this.offsetParent(),b=this.offset(),m.nodeName(a[0],"html")||(c=a.offs
 et()),c.top+=m.css(a[0],"borderTopWidth",!0),c.left+=m.css(a[0],"borderLeftWidth",!0)),{top:b.top-c.top-m.css(d,"marginTop",!0),left:b.left-c.left-m.css(d,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var a=this.offsetParent||cd;while(a&&!m.nodeName(a,"html")&&"static"===m.css(a,"position"))a=a.offsetParent;return a||cd})}}),m.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(a,b){var c=/Y/.test(b);m.fn[a]=function(d){return V(this,function(a,d,e){var f=dd(a);return void 0===e?f?b in f?f[b]:f.document.documentElement[d]:a[d]:void(f?f.scrollTo(c?m(f).scrollLeft():e,c?e:m(f).scrollTop()):a[d]=e)},a,d,arguments.length,null)}}),m.each(["top","left"],function(a,b){m.cssHooks[b]=Lb(k.pixelPosition,function(a,c){return c?(c=Jb(a,b),Hb.test(c)?m(a).position()[b]+"px":c):void 0})}),m.each({Height:"height",Width:"width"},function(a,b){m.each({padding:"inner"+a,content:b,"":"outer"+a},function(c,d){m.fn[d]=function(d,e){var f=arguments.length&&(c||"boole
 an"!=typeof d),g=c||(d===!0||e===!0?"margin":"border");return V(this,function(b,c,d){var e;return m.isWindow(b)?b.document.documentElement["client"+a]:9===b.nodeType?(e=b.documentElement,Math.max(b.body["scroll"+a],e["scroll"+a],b.body["offset"+a],e["offset"+a],e["client"+a])):void 0===d?m.css(b,c,g):m.style(b,c,d,g)},b,f?d:void 0,f,null)}})}),m.fn.size=function(){return this.length},m.fn.andSelf=m.fn.addBack,"function"==typeof define&&define.amd&&define("jquery",[],function(){return m});var ed=a.jQuery,fd=a.$;return m.noConflict=function(b){return a.$===m&&(a.$=fd),b&&a.jQuery===m&&(a.jQuery=ed),m},typeof b===K&&(a.jQuery=a.$=m),m});
diff --git a/www/members/nominations.cgi b/www/members/nominations.cgi
new file mode 100755
index 0000000..3bc0d47
--- /dev/null
+++ b/www/members/nominations.cgi
@@ -0,0 +1,78 @@
+#!/usr/bin/ruby1.9.1
+
+require 'mail'
+require 'wunderbar'
+require 'whimsy/asf'
+
+# link to members private-arch
+MBOX = "https://mail-search.apache.org/members/private-arch/members/201503.mbox/"
+
+# get a list of current members messages
+archive = Dir['/home/apmail/members/archive/*/*']
+
+# select messages that have a subject line starting with [MEMBER NOMINATION]
+emails = []
+archive.each do |email|
+  next if email.end_with? '/index'
+  message = IO.read(email, mode: 'rb')
+  subject = message[/^Subject: .*/]
+  next unless subject.include? "[MEMBER NOMINATION]"
+  mail = Mail.new(message)
+  emails << mail if mail.subject.start_with? "[MEMBER NOMINATION]"
+end
+
+# 
+MEETINGS = ASF::SVN['private/foundation/Meetings']
+meeting = Dir["#{MEETINGS}/2*"].sort.last
+nominations = IO.read("#{meeting}/nominated-members.txt").
+  scan(/^-+--\s+(.*?)\n/).flatten.
+  map {|name| name.gsub(/<.*|\(\w+@.*/, '').strip}
+nominations.shift
+
+
+url = `cd #{meeting}; svn info`[/URL: (.*)/, 1]
+
+# produce HTML output of reports, highlighting ones that have not (yet)
+# been posted
+_html do
+  _style %{
+    .missing {background-color: yellow}
+  }
+
+  _h1 "Nominations in SVN"
+  _a File.basename(meeting), href: File.join(url, 'nominated-members.txt')
+  _ul nominations.sort do |name|
+    _li name
+  end
+
+  nominations.map!(&:downcase)
+
+  _h1.posted! "Posted nominations reports"
+
+  # attempt to sort reports by PMC name
+  emails.sort_by! do |mail| 
+    mail.subject.downcase.gsub('- ', '')
+  end
+
+  # output an unordered list of subjects linked to the message archive
+  _ul emails do |mail|
+    _li do
+      href = MBOX + URI.escape('<' + mail.message_id + '>')
+
+      if nominations.any? {|name| mail.subject.downcase =~ /\b#{name}\b/}
+        _a.present mail.subject, href: href
+      else
+        _a.missing mail.subject, href: href
+      end
+    end
+  end
+end
+
+# produce JSON output of reports
+_json do
+  _ reports do |mail|
+    _subject mail.subject
+    _link MBOX + URI.escape('<' + mail.message_id + '>')
+    _missing missing.any? {|title| mail.subject.downcase =~ /\b#{title}\b/}
+  end
+end
diff --git a/www/members/non-participants.cgi b/www/members/non-participants.cgi
new file mode 100755
index 0000000..1c66594
--- /dev/null
+++ b/www/members/non-participants.cgi
@@ -0,0 +1,88 @@
+#!/usr/bin/ruby1.9.1
+require 'whimsy/asf'
+require 'wunderbar'
+require 'date'
+
+ROSTER = "https://whimsy.apache.org/roster/committer/"
+
+# locate and read the attendance file
+MEETINGS = ASF::SVN['private/foundation/Meetings']
+attendance = IO.read("#{MEETINGS}/attendance.txt")
+
+# scan the headings, extract column information
+headings = attendance[/^(\s+\d+)+/]
+col = 0
+cols = headings.scan(/(\s+)(\d+)/).map {|spaces, date|
+  col += spaces.length
+  Range.new(col, col+=date.length)
+}
+
+# column information for the member name
+nameField =  0...cols.first.begin
+
+# extract and format dates
+dates = cols.map {|range| headings[range]}.
+  map {|date| Date.parse(date).strftime('%Y-%b-%d')}
+
+# compute mappings of names to ids
+active = ASF::Member.list.select {|id, data| not data['status']}
+nameMap = Hash[active.map {|id, data| [id, data[:text].split("\n").first]}]
+idMap = Hash[nameMap.map {|id, name| [name.gsub(/[^\x20-\x7F]/, ''), id]}]
+
+# handle cases where names in attendance don't match members.txt
+idMap["Antonio Gallardo Rivera"] = "antonio"
+# idMap["Astrid Keler"] = ?
+# idMap["Astrid Stolper"] = ?
+idMap["Craig Russell"] = 'clr'
+idMap["Donald A. Ball Jr."] = 'balld'
+idMap["Maisonobe Luc"] = 'luc'
+idMap["Noirin Shirley"] = 'noirinp'
+idMap["Reto Bachmann-Gmr"] = 'reto'
+idMap["Robertus W.A.M. Huijben (\"Bert\")"] = 'rhuijben'
+idMap["Thomas Fischer"] = 'tfischer'
+idMap["Wilfredo Sanchez"] = 'wsanchez'
+# idMap["William Stoddard"] = 'stoddard'
+
+# produce HTML
+_html do
+  _h1 'Non-participating active members'
+
+  @meetingsMissed = (@meetingsMissed || 7).to_i
+
+  # selection
+  _form_ do
+    _span "List of members that have not participated, starting with the "
+    _select name: 'meetingsMissed', onChange: 'this.form.submit()' do
+      dates.reverse.each_with_index do |name, i|
+        _option name, value: i+1, selected: (i+1 == @meetingsMissed)
+      end
+    end
+    _span "meeting."
+  end
+
+  count = 0
+  _table do
+    _tr do
+      _th 'Name'
+      _th 'Last participated'
+    end
+
+    attendance.scan(/^[(A-Za-z].*\]\s*$/).each do |line|
+      name = line[nameField].strip
+      id = idMap[name]
+      next unless id
+      data = cols.map {|field| line[field].strip}.reverse
+      missed = data.index {|datum| datum != '-'} + 1
+    
+      if missed > @meetingsMissed
+        _tr_ do
+          _td! {_a nameMap[id], href: "#{ROSTER}/#{id}"}
+          _td dates[-missed]
+        end
+        count += 1
+      end
+    end
+  end
+
+  _p "Count: #{count}"
+end
diff --git a/www/members/proxy.cgi b/www/members/proxy.cgi
new file mode 100755
index 0000000..6cfd586
--- /dev/null
+++ b/www/members/proxy.cgi
@@ -0,0 +1,175 @@
+#!/usr/bin/ruby1.9.1
+require 'wunderbar'
+require 'whimsy/asf'
+require 'date'
+
+# Update ~/.whimsy to have a :svn: entry for the following:
+MEETINGS = ASF::SVN['private/foundation/Meetings']
+
+_html do
+  _link href: "css/bootstrap.min.css", rel: 'stylesheet'
+  _link href: "css/bootstrap-combobox.css", rel: 'stylesheet'
+  _style :system
+
+  meeting = File.basename(Dir["#{MEETINGS}/2*"].sort.last).untaint
+
+  # get a list of members who have submitted proxies
+  exclude = Dir["#{MEETINGS}/#{meeting}/proxies-received/*"].
+    map {|name| name[/(\w+)\.\w+$/, 1]}
+
+  if _.get?
+
+    _div_.container do
+      _div.row do
+        _div.well.text_center do
+          _h1 'ASF Proxy Selection Form'
+          _h3 Date.parse(meeting).strftime("%B %-d, %Y")
+        end
+      end
+
+      _div.row do
+        _div do
+          _p %{
+            This form allows you to assign a proxy for the upcoming members
+            meeting. By default it will assume you intend to assign the proxy
+            for the meeting only, and you will still be sent voting ballots by
+            email. If you do not have internet access during the meeting
+            window and would like to assign the member to vote for you, please
+            select a proxy below.
+          }
+        end
+      end
+
+      _div.row do
+        _div do
+          _pre IO.read("#{MEETINGS}/#{meeting}/member_proxy.txt")
+        end
+      end
+
+      _form method: 'POST' do
+        _div_.row do
+          _div.form_group do
+            _label 'Select proxy'
+
+            # Fetch LDAP
+            ldap_members = ASF.members
+            ASF::Person.preload('cn', ldap_members)
+
+            # Fetch members.txt
+            members_txt = ASF::Member.list
+
+            _select.combobox.input_large.form_control name: 'proxy' do
+              _option 'Select an ASF Member', :selected, value: ''
+              ldap_members.sort_by(&:public_name).each do |member|
+                next if member.id == $USER               # No self proxies
+                next if exclude.include? member.id       # Not attending
+                next unless members_txt[member.id]       # Non-members
+                next if members_txt[member.id]['status'] # Emeritus/Deceased
+                _option member.public_name
+              end
+            end
+          end
+        end
+
+        _div_.row do
+          _div.button_group.text_center do
+            _button.btn.btn_primary 'Submit'
+          end
+        end
+      end
+    end
+
+    _script src: "js/jquery-1.11.1.min.js"
+    _script src: "js/bootstrap.min.js"
+    _script src: "js/bootstrap-combobox.js"
+
+    _script_ %{
+      // convert select into combobox
+      $('.combobox').combobox();
+
+      // initially disable submit
+      $('.btn').prop('disabled', true);
+
+      // enable submit when proxy is chosen
+      $('*[name="proxy"]').change(function() {
+        $('.btn').prop('disabled', false);
+      });
+    }
+
+  else
+    _body? do
+      # collect data
+      proxy = File.read("#{MEETINGS}/#{meeting}/member_proxy.txt")
+      user = ASF::Person.find($USER)
+      date = Date.today.strftime("%B %-d, %Y")
+
+      # update proxy form
+      proxy[/authorize _(#{'_' *@proxy.length})/, 1] = @proxy.gsub(' ', '_')
+
+      proxy[/signature: _(_#{'_' *user.public_name.length}_)/, 1] = 
+        "/#{user.public_name.gsub(' ', '_')}/"
+
+      proxy[/name: _(#{'_' *user.public_name.length})/, 1] = 
+        user.public_name.gsub(' ', '_')
+
+      proxy[/Date: _(#{'_' *date.length})/, 1] = date.gsub(' ', '_')
+
+      proxyform = proxy.untaint
+
+      # report on commit
+      require 'tmpdir'
+      Dir.mktmpdir do |tmpdir|
+        svn = `svn info #{MEETINGS}/#{meeting}`[/URL: (.*)/, 1]
+        `svn checkout #{svn.untaint} #{tmpdir.untaint}`
+
+        Dir.chdir(tmpdir) do
+          _h3 'Commit Log'
+          # write proxy form
+          filename = "proxies-received/#$USER.txt".untaint
+          File.write(filename, proxyform)
+          _.system ['svn', 'add', filename]
+
+          # get a list of proxies
+          list = Dir['proxies-received/*.txt'].map do |file|
+            form = File.read(file.untaint)
+      
+            id = file[/([-A-Za-z0-9]+)\.\w+$/, 1]
+            proxy = form[/hereby authorize ([\S].*) to act/, 1].gsub('_', ' ').strip
+            name = form[/signature: ([\S].*)/, 1].gsub(/[\/_]/, ' ').strip
+
+            "   #{proxy.ljust(24)} #{name} (#{id})"
+          end
+  
+          # gather a list of all non-text proxies
+          nontext = Dir['proxies-received/*'].
+            reject {|file| file.end_with? '.txt'}.
+            map {|file| file[/([A-Za-z0-9]+)\.\w+$/, 1]}
+
+          # update proxies file
+          proxies = IO.read('proxies')
+          list += proxies.scan(/   \S.*\(\S+\)$/).
+            select {|line| nontext.include? line[/\((\S+)\)$/, 1]}
+          proxies[/.*-\n(.*)/m, 1] = list.flatten.sort.join("\n") + "\n"
+          IO.write('proxies', proxies)
+
+          # commit
+          _.system [
+            'svn', 'commit', filename, 'proxies',
+            '-m', "assign #{@proxy} as my proxy",
+            ['--no-auth-cache', '--non-interactive'],
+            (['--username', $USER, '--password', $PASSWORD] if $PASSWORD)
+          ]
+        end
+      end
+
+      # report on contents
+      _h3! do
+        _span "Contents of "
+        _code "foundation/meetings/#{meeting}/#{$USER}.txt"
+        _span ":"
+      end
+
+      _pre proxyform
+    end
+  end
+end
diff --git a/www/members/subscriptions.cgi b/www/members/subscriptions.cgi
new file mode 100755
index 0000000..53e65c1
--- /dev/null
+++ b/www/members/subscriptions.cgi
@@ -0,0 +1,151 @@
+#!/usr/bin/ruby1.9.1
+require 'wunderbar'
+require 'whimsy/asf'
+require 'whimsy/asf/podlings'
+require 'whimsy/asf/site'
+
+SUBSCRIPTIONS = '/home/apmail/subscriptions/members'
+
+_html do
+  _head_ do
+    _title 'Apache Members cross-check'
+    _style %{
+      table {border-collapse: collapse}
+      th, td { border: 1pt solid black}
+      .issue {color: red}
+    }
+  end
+
+  _body? do
+
+    _h1_ 'Apache Members cross-check'
+
+    _p! do
+      _ 'This process starts with the list of subscribers to '
+      _a 'members@apache.org', href: 'https://mail-search.apache.org/members/private-arch/members/'
+      _ '.  It then uses '
+      _a 'members.txt', href: 'https://svn.apache.org/repos/private/foundation/members.txt'
+      _ ', '
+      _a 'iclas.txt', href: 'https://svn.apache.org/repos/private/foundation/officers/iclas.txt'
+      _ ', and '
+      _code 'ldapsearch mail'
+      _ ' to attempt to match the email address to an Apache ID.  '
+      _ 'Those that are not found are listed as '
+      _code.issue '*missing*'
+      _ '.  Emeritus members are '
+      _em 'listed in italics'
+      _ '.  Non ASF members are '
+      _span.issue 'listed in red'
+      _ '.'
+    end
+
+    _p! do
+      _ 'The resulting list is then cross-checked against '
+      _code 'ldapsearch cn=member'
+      _ '.  Membership that is only listed in one of these two sources is also '
+      _span.issue 'listed in red'
+      _ '.'
+    end
+
+    _p! do
+      _ 'ASF members for which a matching email address can not be found are '
+      _a 'listed in a separate table', href: "#unsub"
+      _ '.'
+    end
+
+    ldap = ASF::Group['member'].members
+
+    members = ASF::Member.new.map {|id, text| ASF::Person[id]}
+    ASF::Person.preload('cn', members)
+
+    subscriptions = []
+    File.readlines(SUBSCRIPTIONS).each do |line|
+      person = ASF::Mail.list[line.downcase.strip]
+      person ||= ASF::Mail.list[line.downcase.strip.sub(/\+\w+@/,'@')]
+      if person
+        id = person.id
+        id = '*notinavail*' if id == 'notinavail'
+      else
+        person = ASF::Person.find('notinavail')
+        id = '*missing*'
+      end
+      subscriptions << [id, person, line.strip]
+    end
+
+    _table_ border: '1', cellpadding: '2', cellspacing: '0' do
+      _tr do
+        _th 'id'
+        _th 'email'
+        _th 'name'
+      end
+      subscriptions.sort.each do |id, person, email|
+        next if email == 'members-archive@apache.org'
+        _tr_ do
+          if id.include? '*'
+            _td.issue id
+          elsif not person.asf_member?
+            _td.issue id, title: 'Non Member'
+          elsif person.asf_member? != true
+            _td {_em id, title: 'Emeritus'}
+          elsif not ldap.include? person
+            _td {_strong.issue id, title: 'Not in LDAP'}
+          else
+            _td id
+          end
+          _td email
+
+          if id.include? '*'
+            _td ''
+          else
+            _td person.public_name
+          end
+        end
+      end
+    end
+
+    missing = members - (subscriptions.map {|id,person,email| person})
+    missing.delete_if {|person| person.asf_member? != true} # remove emeritus
+
+    unless missing.empty?
+      _h3_.unsub! 'Not subscribed to the list'
+      _table border: 1, cellpadding: 2, cellspacing: 0 do
+	_tr_ do
+	  _th 'id'
+	  _th 'name'
+	end
+	missing.sort_by(&:name).each do |person|
+	  _tr do
+	    if not ldap.include? person
+	      _td {_strong.issue person.id, title: 'Not in LDAP'}
+	    else
+	      _td person.id
+	    end
+            if person.public_name
+	      _td person.public_name
+            else
+              _td.issue '*notinavail*'
+            end
+	  end
+	end
+      end
+    end
+
+    extras = ldap - members
+
+    unless extras.empty?
+      _h3_.ldap! 'In LDAP but not in members.txt'
+      _table border: 1, cellpadding: 2, cellspacing: 0 do
+	_tr_ do
+	  _th 'id'
+	  _th 'name'
+	end
+	extras.sort.each do |person|
+	  _tr do
+	    _td person.id
+	    _td person.public_name
+	  end
+	end
+      end
+    end
+  end
+end
diff --git a/www/members/watch.cgi b/www/members/watch.cgi
new file mode 100755
index 0000000..8e32fcb
--- /dev/null
+++ b/www/members/watch.cgi
@@ -0,0 +1,263 @@
+#!/usr/bin/ruby1.9.1
+require 'wunderbar'
+require 'whimsy/asf'
+require 'whimsy/asf/podlings'
+require 'whimsy/asf/site'
+require 'nokogiri'
+require 'date'
+
+SVN_BOARD = "https://svn.apache.org/repos/private/foundation/board"
+meetings = ASF::SVN['private/foundation/Meetings']
+
+_html do
+  _head_ do
+    _title 'Potential Member Watch'
+    _style %{
+      th {border-bottom: solid black}
+      table {border-spacing: 1em 0.2em }
+      tr td:first-child {text-align: center}
+      .issue {color: red; font-weight: bold}
+      .header span {float: right}
+      .header span:after {padding-left: 0.5em}
+      .headerSortUp span:after {content: " \u2198"}
+      .headerSortDown span:after {content: " \u2197"}
+    }
+    _script src: '/jquery.min.js'
+    _script src: '/jquery.tablesorter.js'
+  end
+
+  _body? do
+    # common banner
+    _a href: 'https://whimsy.apache.org/' do
+      _img title: "ASF Logo", alt: "ASF Logo",
+        src: "https://id.apache.org/img/asf_logo_wide.png"
+    end
+
+    # start with the Watch List itself
+    watch_list = ASF::Person.member_watch_list.keys
+    meeting =
+      File.dirname(Dir["#{meetings}/*/nominated-members.txt"].sort.last).untaint
+
+    txt = File.read("#{meeting}/nominated-members.txt")
+    nominations = txt.scan(/^---+\n\s*\w+.*<(\...@apache.org>/).flatten
+    nominations += txt.scan(/^---+\n\s*\w+.*\(([a-z]+)\)/).flatten
+    nominations += txt.scan(/^---+\n\s*\w+.*\(([a-z]+)@apache\.org\)/).flatten
+
+    # determine which list to report on, based on the URI
+    request = ENV['REQUEST_URI']
+    if request =~ /multiple/
+      _h2_ 'Active In Multiple Committees'
+      list = ASF::Committee.list.map {|committee| committee.members}.
+        reduce(&:+).group_by {|person| person}.
+        delete_if {|person,list| list.length<3}.keys
+      list -= ASF.members
+    elsif request =~ /chairs/
+      _h2_ 'PMC Chairs'
+      list = ASF.pmc_chairs
+      list -= ASF.members
+    elsif request =~ /nominees/
+      _h2_ 'Nominees'
+      list = nominations.uniq.map {|id| ASF::Person.find(id)}
+    elsif request =~ /appstatus/
+      _h2_ 'Application Status'
+      status = File.read("#{meeting}/memapp-received.txt").
+        scan(/^(yes|no)\s+(yes|no)\s+(yes|no)\s+(yes|no)\s+(\w+)\s/)
+      status = Hash[status.map {|tokens| [tokens.pop, tokens]}]
+      list = status.keys.map {|id| ASF::Person.find(id)}
+    else
+      _h2_ 'Watch List'
+      list = watch_list
+    end
+
+    # for efficiency, preload public_names
+    ASF::Person.preload('cn', list)
+
+    _table do
+
+      _thead_ do
+        _tr do
+          if request =~ /appstatus/
+            _th 'Invited?'
+            _th 'Applied?'
+            _th 'members@?'
+            _th 'Karma'
+          elsif request =~ /nominees/
+            _th 'Seconded?'
+          else
+            _th 'Nominated?'
+	  end
+          
+          _th 'AvailID'
+          _th 'Name'
+
+          if request !~ /appstatus/
+          _th 'Committees'
+          _th 'Chair Since'
+          end
+        end
+      end
+
+      _tbody do
+        list.sort_by {|id| id.public_name.to_s}.each do |person|
+
+          _tr_ do
+
+            if request =~ /appstatus/
+              cols = status[person.id]
+
+	      if cols[0] == 'yes'
+                _td cols[0]
+              else
+                _td.issue cols[0]
+	      end
+
+              _td cols[1]
+
+	      if cols[1] == 'no' or cols[2] == 'yes'
+                _td cols[2]
+              else
+                _td.issue cols[2]
+              end
+
+	      if cols[3] == 'yes'
+                _td cols[3], class: ('issue' unless person.asf_member?)
+	      elsif cols[1] == 'no'
+                _td cols[3], class: ('issue' if person.asf_member?)
+              else
+                _td.issue cols[3]
+              end
+            elsif request =~ /nominees/
+              if person.member_nomination =~ /Seconded by: \w/
+                _td 'yes'
+              else
+                _td.issue 'no'
+              end
+	    else
+              if nominations.include? person.id
+                _td 'yes'
+              else
+                _td
+              end
+	    end
+
+            # ASF id
+            if person.id =~ /^notinavail_\d+$/
+              _td
+            elsif person.asf_member?
+              _td! do
+                _strong {_a person.id, href: "/roster/committer/#{person.id}"}
+              end
+            else
+              _td! {_a person.id, href: "/roster/committer/#{person.id}"}
+            end
+
+            # public name
+            _td person.public_name
+  
+
+            if request !~ /appstatus/
+	      # committees
+	      _td do
+		person.committees.sort_by(&:name).each do |committee|
+		  if committee.chair == person
+		    _strong do
+		      _a committee.name, href: "/roster/committee/#{committee.name}"
+		    end
+		  else
+		    _a committee.name, href: "/roster/committee/#{committee.name}"
+		  end
+		end
+	      end
+    
+	      # chair since
+	      chair = person.committees.find {|committee| committee.chair == person}
+	      if chair
+		minutes = Dir['/var/www/whimsy/board/minutes/*'].find do |name|
+		  File.basename(name).split('.').first.downcase.gsub(/[_\W]/,'') ==
+		    "#{chair.name.gsub(/\W/,'')}"
+		end
+    
+		search_string = "RESOLVED, that #{person.public_name}"
+		search_string.force_encoding('utf-8')
+
+		# search published minutes
+                if minutes
+		  resolution = nil
+		  minutes.untaint
+		  Nokogiri::HTML(File.read(minutes)).search('pre').each do |pre|
+		    if pre.text.include? search_string
+		      resolution = pre
+		      while resolution and resolution.name != 'h2'
+		        resolution = resolution.previous
+		      end
+		      break if resolution
+		    end
+		  end
+		end
+    
+		date = 'unknown'
+                if minutes
+		  minutes = '/board/minutes/' + File.basename(minutes)
+                end
+		if resolution
+		  minutes += '#' + resolution.at('a')['id']
+		  date = Date.parse(resolution.text)
+		else
+		  # search unpublished agendas
+		  board = ASF::SVN['private/foundation/board']
+		  Dir["#{board}/board_agenda_*"].sort.each do |agenda|
+		    agenda.untaint
+		    if File.read(agenda).include? search_string
+		      minutes = "#{SVN_BOARD}/#{File.basename(agenda)}"
+		      date = agenda.gsub('_','-')[/(\d+-\d+-\d+)/,1]
+		      break
+		    end
+		  end
+		end
+
+		_td do
+		  _a date, href: minutes
+		end
+              end
+            end
+          end
+        end
+      end
+    end
+
+    _h2_ 'Related Links'
+    _ul do
+      unless request =~ /appstatus/
+        _li do
+          _a 'Application Status', href: '/members/watch/appstatus'
+        end
+      end
+      unless list == watch_list
+        _li do
+          _a 'Potential Member Watch List', href: '/members/watch'
+        end
+      end
+      unless request =~ /nominees/
+        _li do
+          _a 'Nominees', href: '/members/watch/nominees'
+        end
+      end
+      unless request =~ /multiple/
+        _li do
+          _a 'Active in Multiple (>=3) PMCs', href: '/members/watch/multiple'
+        end
+      end
+      unless request =~ /chairs/
+        _li do
+          _a 'Non-member PMC chairs', href: '/members/watch/chairs'
+        end
+      end
+    end
+
+    _script %{
+      var numheaders = $('thead th').length;
+      $('table').tablesorter({sortList: [[numheaders-1,0]]});
+      $('.header').append('<span></span>');
+    }
+  end
+end
diff --git a/www/new-account-request-queue.cgi b/www/new-account-request-queue.cgi
new file mode 100755
index 0000000..dca2f7a
--- /dev/null
+++ b/www/new-account-request-queue.cgi
@@ -0,0 +1,4 @@
+#!/usr/bin/ruby1.9.1
+ACREQ = '/var/tools/acreq'
+Dir.chdir '/var/tools'
+require "./new-account-request-queue"
diff --git a/www/robots.txt b/www/robots.txt
new file mode 100644
index 0000000..4bd36c2
--- /dev/null
+++ b/www/robots.txt
@@ -0,0 +1,12 @@
+User-agent: *
+Disallow /board/agenda/
+Disallow /board/draft-minutes/
+Disallow /board/subscriptions/
+Disallow /fundraising/
+Disallow /incubator/moderators/
+Disallow /incubator/private-lists/
+Disallow /mattmann/
+Disallow /members/
+Disallow /roster/
+Disallow /treasurer/
+Disallow /voter/
diff --git a/www/roster/config.ru b/www/roster/config.ru
new file mode 100644
index 0000000..365fb86
--- /dev/null
+++ b/www/roster/config.ru
@@ -0,0 +1,10 @@
+require File.expand_path('../main.rb', __FILE__)
+
+require 'whimsy/asf/rack'
+
+# https://svn.apache.org/repos/infra/infrastructure/trunk/projects/whimsy/asf/rack.rb
+# use ASF::Auth::MembersAndOfficers
+use ASF::HTTPS_workarounds
+use Rack::Deflater
+
+run Sinatra::Application
diff --git a/www/roster/js/app._js b/www/roster/js/app._js
new file mode 100644
index 0000000..1d0431e
--- /dev/null
+++ b/www/roster/js/app._js
@@ -0,0 +1,227 @@
+#!/usr/bin/ruby
+
+module Angular::AsfRoster
+  use :AsfRosterServices
+
+  $locationProvider.html5Mode(true).hashPrefix('!')
+
+  case $routeProvider
+  when '/'
+    templateUrl 'partials/index.html'
+    controller :Index
+
+  when '/committer/'
+    templateUrl 'partials/committers.html'
+    controller :Committers
+
+  when '/committer/:name'
+    templateUrl 'partials/committer.html'
+    controller :Committer
+
+  when '/committee/'
+    templateUrl 'partials/committees.html'
+    controller :PMCs
+
+  when '/committee/:name'
+    templateUrl 'partials/committee.html'
+    controller :PMC
+
+  when '/group/'
+    templateUrl 'partials/groups.html'
+    controller :Groups
+
+  when '/group/:name'
+    templateUrl 'partials/group.html'
+    controller :Group
+
+  else
+    redirectTo '/'
+  end
+
+  controller :Index do
+    def size(hash)
+      return hash.keys().length || 'loading...'
+    end
+  end
+
+  controller :Layout do
+    LDAP.get()
+    AUTH.get()
+    @groups = Roster::GROUPS
+    @committers = Roster::COMMITTERS
+    @pmcs = Roster::PMCS
+    @members = Roster::MEMBERS
+    @info = INFO.get()
+    @search = {committer: ''}
+
+    $rootScope.title = 'ASF Roster'
+
+    watch Roster.user do |value|
+      @user = value 
+    end
+  end
+
+  controller :Committers do
+    @search.committer = $location.search().q
+    $rootScope.title = 'ASF Committers'
+  end
+
+  controller :PMCs do
+    $rootScope.title = 'ASF PMCs'
+    watch @groups['pmc-chairs'] do |value|
+      @pmc_chairs = value ? value.memberUid : []
+    end
+
+    def loading
+      @pmcs.keys().empty?
+    end
+  end
+
+  controller :PMCLine do
+    watch INFO.ready && LDAP.ready do
+      @class = 'issue'
+      @status = ''
+      if not Roster::INFO[@pmc.cn] and INFO.ready
+        @status = 'Not in committee-info.txt'
+      elsif @pmc.memberUid.length == 0 and LDAP.ready
+        @status = 'Not in LDAP'
+      elsif @pmc.chair and not @pmc_chairs.include? @pmc.chair.uid
+        @status = 'Not in pmc-chairs LDAP service'
+      else
+        @class = ''
+      end
+    end
+  end
+
+  controller :Groups do
+    $rootScope.title = 'ASF Groups'
+    @podlings = Podlings.get()
+
+    def loading
+      @groups.keys().empty?
+    end
+  end
+
+  controller :PMC do
+    @ldap = LDAP
+    Site.list
+
+    @name = $rootScope.title = $routeParams.name
+
+    watch INFO.get(@name) do |value|
+      @info = value || {memberUid: []}
+    end
+
+    watch @pmcs[@name] do |value|
+      @pmc = value || {memberUid: []}
+      @changes = Changes.find(@pmc.display_name)
+    end
+  end
+
+  controller :PMCMember do
+    @class = 'issue'
+
+    if not @person
+      @status = 'not found'
+    elsif not (@pmc.memberUid.include? @person.uid or @pmc.memberUid.empty?)
+      @status = 'not in LDAP'
+      @hint = "modify_committee.pl #{@name} --add #{@person.uid}"
+    elsif not (@info.memberUid.include? @person.uid or @info.memberUid.empty?)
+      @status = 'not in committee_info.txt'
+      @hint = "modify_committee.pl #{@name} --rm #{@person.uid}"
+    elsif @pmc.group and not @pmc.group.memberUid.include? @person.uid
+      @status = 'not in committer list'
+      @hint = "modify_unix_group.pl #{@name} --add #{@person.uid}"
+    elsif (@person.cn && @info.names[@person.uid]) != @person.cn
+      @status = "name in committee_info.txt doesn't match public name"
+      @hint = "listed as #{@info.names[@person.uid]}"
+    elsif @person.uid == @info.chair
+      @status = 'chair'
+      @class = 'chair'
+    else
+      @class = ''
+      @status = ''
+    end
+  end
+
+  controller :Group do
+    @name = $rootScope.title = $routeParams.name
+    watch @groups[@name] do |value|
+      @group = value || {memberUid: []}
+    end
+  end
+
+  controller :Committer do
+    @uid = $rootScope.title = $routeParams.name
+    @my_committer = []
+    @my_groups = []
+    watch Committer.find(@uid) do |value|
+      @committer = value
+    end
+  end
+
+  filter :committer_match do |committers, text|
+    results = []
+    text = text.downcase()
+
+    if text.include? ' '
+      words = text.split(/\s+/)
+      for id in committers
+        committer = committers[id]
+
+        info = id + ' ' + committer.cn
+
+        if committer.public_name != committer.cn
+          info = id + ' ' + committer.public_name 
+        end
+
+        if committer.legal_name != committer.public_name
+          info = id + ' ' + committer.legal_name 
+        end
+
+        info += ' ' + committer.mail.join(' ') if committer.mail
+        if committer["asf-altEmail"]
+          info += ' ' + committer["asf-altEmail"].join(' ') 
+        end
+        info = info.downcase()
+
+        results << committer if words.all? {|word| info.include? word}
+      end
+    else
+      for id in committers
+        committer = committers[id]
+        if committer.cn.downcase().include? text
+          results << committer
+        elsif "#{id}@apache.org".include? text
+          results << committer
+        elsif committer.mail and 
+          committer.mail.any? {|email| email.downcase().include? text}
+          results << committer
+        elsif committer["asf-altEmail"] and
+          committer["asf-altEmail"].any? {|email| email.downcase().include? text}
+          results << committer
+        end
+      end
+    end
+
+    results.sort! {|a,b| return a.uid < b.uid ? -1 : +1}
+
+    return results
+  end
+
+  directive :main do
+    restrict :E
+    def link(scope, element, attributes)
+      window.scrollTo(0,0)
+      element.find('*[autofocus]').focus()
+    end
+  end
+
+  directive :asfId do
+    def link(scope, element, attributes)
+      observe attributes.asfId do |value|
+        element.addClass 'member' if @members.include? value
+      end
+    end
+  end
+end
diff --git a/www/roster/js/services._js b/www/roster/js/services._js
new file mode 100644
index 0000000..36831be
--- /dev/null
+++ b/www/roster/js/services._js
@@ -0,0 +1,477 @@
+#!/usr/bin/ruby
+
+module Angular::AsfRosterServices
+
+  # Since Angular.JS doesn't allow circular dependencies, keep the canonical
+  # rosters of each class in a separate place so that they can be referenced
+  # anywhere.
+  class Roster
+    COMMITTERS = {}
+    PMCS = {}
+    GROUPS = {}
+    MEMBERS = []
+    PODLINGS = []
+    INFO = {}
+    SITE = {}
+    CHANGES = {}
+
+    def self.user
+      main = document.querySelector('main')
+      if main
+        user = main.attributes['data-availid'].value
+        if $location.search().user and Roster::MEMBERS.include? user
+          $location.search().user
+        else
+          user
+        end
+      end
+    end
+  end
+
+  ####################################################################
+  #                          Model Objects                           #
+  ####################################################################
+
+  # Instances of this class represent a Committer from LDAP.
+  class Committer
+    @@list = Roster::COMMITTERS
+
+    def self.load(ldap)
+      angular.copy({}, @@list)
+      for uid in ldap.committers
+        @@list[uid] = Committer.new(ldap.committers[uid])
+      end
+    end
+
+    def self.find(id)
+      return @@list[id]
+    end
+
+    def initialize(ldap)
+      angular.copy ldap, self
+    end
+
+    def link
+      "committer/#{self.cn}"
+    end
+
+    def emails
+      angular.copy(self['asf-altEmail'] || []).concat(self.mail || []).uniq()
+    end
+
+    def pmcs
+      result = []
+      for name in Roster::PMCS
+        pmc = Roster::PMCS[name]
+        result << pmc if pmc.memberUid.include? self.uid 
+      end
+      result
+    end
+
+    def committer_on
+      result = []
+      for name in Roster::PMCS
+        pmc = Roster::PMCS[name]
+        next if not pmc.group or pmc.memberUid.include? self.uid 
+        result << pmc if pmc.group.memberUid.include? self.uid 
+      end
+      result
+    end
+
+    def groups
+      result = []
+      for name in Roster::GROUPS
+        group = Roster::GROUPS[name]
+        result << group if group.memberUid.include? self.uid 
+      end
+      result
+    end
+
+    def chairs
+      result = []
+      for name in Roster::PMCS
+        pmc = Roster::PMCS[name]
+        result << pmc if pmc.chair == self 
+      end
+      result
+    end
+
+    def members_text
+      Member.find(self.uid)
+    end
+  end
+
+  # Instances of this class represent a PMC from LDAP, augmented with
+  # information from committee-info.txt.
+  class PMC
+    @@list = Roster::PMCS
+
+    def self.load(sources)
+      if sources.ldap
+        ldap = sources.ldap
+        for pmc in ldap.pmcs
+          @@list[pmc] = PMC.new(ldap.pmcs[pmc])
+          @@list[pmc].group = ldap.groups[pmc]
+        end
+      end
+
+      if sources.info
+        info = sources.info
+        for pmc in info
+          if info[pmc].pmc and not @@list[pmc]
+            @@list[pmc] = PMC.new(cn: pmc, memberUid: [])
+          end
+        end
+      end
+    end
+
+    def initialize(ldap)
+      angular.copy ldap, self
+      @members = []
+      @committers = []
+      @@list[self.cn] = self
+      @maillists = []
+    end
+
+    def display_name
+      info = Roster::INFO[self.cn]
+      info ? info.display_name : self.cn
+    end
+
+    def site_description
+      site = Roster::SITE[self.cn]
+      site.text if site
+    end
+
+    def site_link
+      site = Roster::SITE[self.cn]
+      if site
+        site.link
+      else
+        "http://#{self.cn}.apache.org/"
+      end
+    end
+
+    def report
+      info = Roster::INFO[self.cn]
+      info.report if info
+    end
+
+    def prior_reports
+      info = Roster::INFO[self.cn]
+      if info
+        name = info.display_name.gsub(/\s+/, '_')
+        "https://whimsy.apache.org/board/minutes/#{name}"
+      end
+    end
+
+    def link
+      "committee/#{self.cn}"
+    end
+
+    def chair
+      info = Roster::INFO[self.cn]
+      Committer.find(info.chair) if info
+    end
+
+    def members
+      @members.clear()
+      info = Roster::INFO[self.cn]
+
+      # add PMC members from committee-info.txt
+      if info
+        info.memberUid.each do |uid|
+          @members << (Committer.find(uid) || {uid: uid})
+        end
+      end
+
+      # add unique PMC members from LDAP
+      self.memberUid.each do |uid|
+        person = Committer.find(uid) || {uid: uid}
+        @members << person unless @members.include? person
+      end
+
+      @members
+    end
+
+    def committers
+      self.members if @members.empty?
+      @committers.clear()
+
+      # add members from LDAP group of the same name
+      if self.group
+        self.group.memberUid.each do |uid|
+          person = Committer.find(uid) || {uid: uid}
+          @committers << person unless @members.include? person
+        end
+      end
+
+      @committers
+    end
+
+    def mail_prefix
+      return 'community' if self.cn == 'comdev'
+      return 'hc' if self.cn == 'httpcomponents'
+      self.cn
+    end
+
+    def maillists(user)
+      if @maillists.empty?
+        prefix = "#{self.mail_prefix}-"
+        for list in Mail.lists
+          if list.start_with? prefix
+            if Mail.lists[list] == 'public'
+              @maillists << {name: list, link:
+                "http://mail-archives.apache.org/mod_mbox/#{list}/"}
+            elsif self.memberUid.include? user
+              @maillists << {name: list, link:
+                "https://mail-search.apache.org/pmc/private-arch/#{list}/"}
+            elsif Roster::MEMBERS.include? user
+              @maillists << {name: list, link:
+                "https://mail-search.apache.org/members/private-arch/#{list}/"}
+            end
+          end
+        end
+      end
+      return @maillists
+    end
+  end
+
+  # Instances of this class represent non-PMC groups from various sources:
+  # groups in LDAP with no corresponding PMC; groups in committee-info.txt
+  # also with no corresponding LDAP PMC.
+  class Group
+    @@list = Roster::GROUPS
+
+    def self.load(sources)
+      if sources.ldap
+        ldap = sources.ldap
+
+        # start with any LDAP groups which aren't associated with a PMC
+        for group in ldap.groups
+          next if %w(committers).include? group or ldap.pmcs[group]
+          @@list[group] = Group.new(ldap.groups[group], 'LDAP group')
+        end
+
+        # add in the LDAP services
+        for group in ldap.services
+          next if %w(apldap infrastructure-root).include? group
+          if group == 'infrastructure' and @@list[group]
+            @@list[group].group =
+              Group.new(ldap.services[group], 'LDAP service')
+          else
+            @@list[group] = Group.new(ldap.services[group], 'LDAP service')
+          end
+        end
+
+        # remove any groups previously loaded that are associated with PMCS
+        for group in ldap.pmcs
+          @@list.delete group
+        end
+      end
+
+      if sources.info
+        pmcs = Roster::PMCS
+        info = sources.info
+        for group in info
+          next if pmcs[group] or info[group].memberUid.empty?
+          @@list[group] = Group.new(info[group], 'committee-info.txt')
+        end
+      end
+
+      if sources.auth
+        %w(asf pit).each do |auth_type|
+          info = sources.auth[auth_type]
+          for group in info
+            value = {cn: group, memberUid: info[group]}
+            @@list[group] ||= Group.new(value, "#{auth_type}-auth")
+          end
+        end
+      end
+    end
+
+    def initialize(ldap, source)
+      angular.copy ldap, self
+      self.source = source if source
+      self.display_name ||= self.cn
+      @members = []
+    end
+
+    def members
+      @members.clear()
+
+      self.memberUid.each do |uid|
+        @members << (Committer.find(uid) || {uid: uid})
+      end
+
+      @members
+    end
+
+    def link
+      "group/#{self.cn}"
+    end
+  end
+
+  ####################################################################
+  #                           Data Sources                           #
+  ####################################################################
+
+  class LDAP
+    @@ready == false
+
+    def self.fetch_twice(url, &update)
+      if_cached = {"Cache-Control" => "only-if-cached"}
+      $http.get(url, cache: false, headers: if_cached).success { |result|
+        update(result)
+      }.finally {
+        $http.get(url, cache: false).success do |result, status|
+          update(result) unless status == 304
+        end
+      }
+    end
+
+    def self.get()
+      unless @@fetched and (Date.new().getTime()-@@fetched) < 300_000
+        @@fetched = Date.new().getTime()
+        self.fetch_twice 'json/ldap' do |result|
+          Committer.load(result)
+          PMC.load(ldap: result)
+          Group.load(ldap: result)
+
+          # extract members
+          angular.copy result.groups.member.memberUid, Roster::MEMBERS
+          @@ready = true
+        end
+      end
+
+      return @@index
+    end
+
+    def self.ready
+      @@ready
+    end
+  end
+
+  class INFO
+    @@info = Roster::INFO
+    @@ready == false
+
+    def self.get(name)
+      unless @@fetched and (Date.new().getTime()-@@fetched) < 300_000
+        @@fetched = Date.new().getTime()
+        $http.get('json/info').success do |result|
+          for pmc in result
+            result[pmc].cn = pmc
+          end
+
+          angular.copy result, @@info
+          PMC.load(info: @@info)
+          Group.load(info: @@info)
+          @@ready = true
+        end
+      end
+
+      if name
+        return @@info[name]
+      else
+        return @@info
+      end
+    end
+
+    def self.ready
+      @@ready
+    end
+  end
+
+  class AUTH
+    def self.get()
+      unless @@fetched and (Date.new().getTime()-@@fetched) < 300_000
+        @@fetched = Date.new().getTime()
+        $http.get('json/auth').success do |result|
+          Group.load auth: result
+        end
+      end
+    end
+  end
+
+  class Podlings
+    def self.get()
+      unless @@fetched and (Date.new().getTime()-@@fetched) < 300_000
+        @@fetched = Date.new().getTime()
+        $http.get('json/podlings').success do |result|
+          angular.copy result, Roster::PODLINGS
+        end
+      end
+      return Roster::PODLINGS
+    end
+  end
+
+  class Mail
+    @@list = {}
+
+    def self.lists
+      unless @@fetched and (Date.new().getTime()-@@fetched) < 300_000
+        @@fetched = Date.new().getTime()
+        $http.get('json/mail').success do |result|
+          angular.copy result, @@list
+        end
+      end
+
+      @@list
+    end
+  end
+
+  class Member
+    @@list = {}
+
+    def self.lists
+      unless @@fetched and (Date.new().getTime()-@@fetched) < 300_000
+        @@fetched = Date.new().getTime()
+        $http.get('json/members').success do |result|
+          angular.copy result, @@list
+        end
+      end
+
+      @@list
+    end
+
+    def self.find(uid)
+      return self.lists[uid]
+    end
+  end
+
+  class Site
+    @@list = Roster::SITE
+
+    def self.list
+      unless @@fetched and (Date.new().getTime()-@@fetched) < 300_000
+        @@fetched = Date.new().getTime()
+        $http.get('json/site').success do |result|
+          angular.copy result, @@list
+        end
+      end
+
+      @@list
+    end
+  end
+
+  class Changes
+    @@list = Roster::CHANGES
+
+    def self.find(name)
+      @@list[name] ||= {} if name
+
+      unless @@fetched and (Date.new().getTime()-@@fetched) < 300_000
+        @@fetched = Date.new().getTime()
+        $http.get('json/changes').success do |result|
+          for pmc in result
+            @@list[pmc] ||= {}
+            angular.copy result[pmc], @@list[pmc]
+          end
+        end
+      end
+
+      return @@list[name]
+    end
+  end
+end
diff --git a/www/roster/main.rb b/www/roster/main.rb
new file mode 100755
index 0000000..8165a27
--- /dev/null
+++ b/www/roster/main.rb
@@ -0,0 +1,174 @@
+#!/usr/bin/ruby
+
+#
+# Server side router/controllers
+#
+
+require 'whimsy/asf'
+require 'whimsy/asf/podlings'
+require 'whimsy/asf/site'
+
+require 'wunderbar/sinatra'
+require 'wunderbar/bootstrap/theme'
+require 'wunderbar/angularjs/route'
+require 'wunderbar/jquery/filter'
+require 'wunderbar/underscore'
+require 'ruby2js/filter/functions'
+
+require_relative 'model/ldap'
+
+set :views, File.dirname(__FILE__)
+
+get '/' do
+  @base = env['REQUEST_URI']
+  _html :'views/main'
+end
+
+get %r{/(committer/(.*))} do |path, name|
+  if request.xhr? or env['HTTP_ACCEPT'].include? 'application/json'
+    _json do
+      person = ASF::Person.find(name)
+      if person and person.public_name
+        _availid person.id
+        _name person.public_name 
+        _emails person.all_mail
+        _urls person.urls
+        _committees person.committees.map(&:name)
+        _member person.asf_member?
+        _banned person.banned? if person.banned?
+        _pgpkeys (person.pgp_key_fingerprints || [])
+        _groups person.groups.map(&:name)
+        _auth person.auth
+      else
+        throw :halt, 404
+      end
+    end
+  else
+    @base = URI.parse(env['REQUEST_URI']).path.chomp(path)
+    _html :'views/main'
+  end
+end
+
+get %r{/(committee/.*)} do |path|
+  @base = URI.parse(env['REQUEST_URI']).path.chomp(path)
+  _html :'views/main'
+end
+
+get %r{/(group/.*)} do |path|
+  @base = env['REQUEST_URI'].chomp(path)
+  _html :'views/main'
+end
+
+get '/js/:file.js' do
+  _js :"js/#{params[:file]}"
+end
+
+get '/partials/:file.html' do
+  _html :"partials/#{params[:file]}"
+end
+
+configure do
+  @ldap_cache = nil
+  @ldap_etag = nil
+end
+
+get '/json/auth' do
+  _json do
+    _asf Hash[ASF::Authorization.new('asf').map {|group, list| [group, list]}]
+    _pit Hash[ASF::Authorization.new('pit').map {|group, list| [group, list]}]
+  end
+end
+
+get '/json/podlings' do
+  _json do
+    _! Hash[ASF::Podlings.new.map {|podling, definition| [podling, definition]}]
+  end
+end
+
+get '/json/site' do
+  _json do
+    _! ASF::Site.list
+  end
+end
+
+get '/json/info' do
+  _json do
+    committees = ASF::Committee.load_committee_info
+    _! Hash[committees.map { |committee| 
+      [committee.name.gsub(/[^-\w]/,''), {
+        display_name: committee.display_name,
+        report: committee.report,
+        chair: committee.chair ? committee.chair.id : nil,
+        memberUid: committee.info,
+        names: committee.names,
+        emeritus: committee.emeritus,
+        pmc: !ASF::Committee.nonpmcs.include?(committee)
+      }]
+    }]
+  end
+end
+
+LDAP_ETAGS=[]
+get '/json/ldap' do
+  cache_control :private, :no_cache, :must_revalidate, max_age: 0
+
+  cache_control = env['HTTP_CACHE_CONTROL'].to_s.downcase.split(/,\s+/)
+  if cache_control.include? 'only-if-cached'
+    etag = request.env['HTTP_IF_NONE_MATCH']
+    if LDAP_ETAGS.include? etag
+      throw :halt, 304
+    else
+      throw :halt, 504 unless @ldap_cache
+    end
+  else
+    @ldap_cache = JSON.dump(ASF::RosterLDAP.get)
+    @ldap_etag = Digest::MD5.hexdigest(@ldap_cache)
+
+    unless LDAP_ETAGS.include? @ldap_etag
+      LDAP_ETAGS << @ldap_etag 
+      LDAP_ETAGS.slice! 0, LDAP_ETAGS.length-20
+    end
+  end
+
+  etag @ldap_etag if @ldap_etag
+  @ldap_cache
+end
+
+get '/json/mail' do
+  _json do
+    _! ASF::Mail.lists(true)
+  end
+end
+
+get '/json/members' do
+  user = env['REMOTE_USER'] ||= ENV['USER'] || Etc.getpwuid.name
+  if ASF::Person.find(user).asf_member?
+    _json do
+      _! ASF::Member.list
+    end
+  else
+    halt 403, "Not authorized\n"
+  end
+end
+
+get '/json/changes' do
+  scripts = ASF::SVN['private/foundation/board/scripts']
+  record = File.read("#{scripts}/pmc-changes-record.txt")
+
+  changes = {}
+
+  ASF::Committee.load_committee_info.each do |pmc| 
+    status = record[/^#{pmc.display_name} ((matches|differs).*?\n)(\w|\Z)/m, 1]
+    changes[pmc.display_name] = {
+      established: record[/^#{pmc.display_name} (established \d+-\d+-\d+)/, 1],
+      status: status && status[/^\w.*/],
+      detail: status && status.scan(/^\t.*/).map(&:strip)
+    }
+  end
+
+  _json { _! changes }
+end
+
+post '/json/:file' do
+  _json :"json/#{params[:file]}"
+end
diff --git a/www/roster/model/ldap.rb b/www/roster/model/ldap.rb
new file mode 100644
index 0000000..b33490b
--- /dev/null
+++ b/www/roster/model/ldap.rb
@@ -0,0 +1,103 @@
+ASF::ICLA.preload
+
+class ASF::RosterLDAP
+  def self.get
+    dump = File.expand_path('../ldap.dump', __FILE__.untaint).untaint
+    if File.exist? dump
+      ldap = eval File.read(dump).untaint
+    else
+      ldap_connection = ASF.init_ldap
+      ldap = ldap_connection.search2 'dc=apache,dc=org', 
+        LDAP::LDAP_SCOPE_SUBTREE, 'objectclass=*'
+    end
+
+    services = {}
+    pmcs = {}
+    groups = {}
+    committers = {}
+
+    ldap.each do |entry|
+      next if entry['objectClass'].include? 'organizationalUnit'
+      cn = entry['cn'].first
+      dn = entry['dn'].first
+
+      if entry['objectClass'].include? 'groupOfNames'
+        entry['memberUid'] = entry.delete('member').
+          map {|dn| dn[/uid=(.*?),/,1]}
+        if dn == "cn=#{cn},ou=pmc,ou=committees,ou=groups,dc=apache,dc=org"
+          pmcs[cn] = flatten(entry)
+        elsif dn == "cn=#{cn},ou=groups,ou=ianh,ou=sandbox,dc=apache,dc=org"
+          # ignore sandbox
+        elsif dn == "cn=#{cn},ou=groups,ou=sandbox,dc=apache,dc=org"
+          # ignore sandbox
+        else
+          services[cn] = flatten(entry)
+        end
+      elsif entry['objectClass'].include? 'posixGroup'
+        if dn == "cn=#{cn},ou=people,ou=groups,dc=apache,dc=org"
+          # ignore posixGroup entries for users
+        elsif dn == "cn=#{cn},ou=sudoers,ou=groups,ou=services,dc=apache,dc=org"
+          # ignore sudoers
+        else
+          groups[cn] = flatten(entry)
+        end
+      else
+        if entry['objectClass'].include? 'asf-committer'
+          committers[entry['uid'].first] = flatten(entry)
+        elsif dn == "cn=#{cn},ou=users,ou=services,dc=apache,dc=org"
+          # ignore role accounts
+        elsif dn == "cn=#{cn},ou=sandbox,dc=apache,dc=org"
+          # ignore sandbox accounts
+        elsif dn == "cn=#{cn},dc=apache,dc=org" and cn.include? '-ppolicy'
+          # ignore sandbox accounts
+        else
+          puts
+          p entry
+        end
+      end
+    end
+
+    services.values.each {|ldap| ldap['objectClass'] -= ['groupOfNames', 'top']}
+    pmcs.values.each {|ldap| ldap['objectClass'] -= ['groupOfNames', 'top']}
+    committers.values.each {|ldap| ldap['objectClass'] -= ["person", "top",
+      "posixAccount", "organizationalPerson", "inetOrgPerson", "asf-committer"]}
+
+    services.delete('apldap')
+
+    groups.values.each do |ldap| 
+      ldap['objectClass'] -= ['posixGroup', 'top']
+      ldap['memberUid'] ||= []
+    end
+
+    {services: services, pmcs: pmcs, committers: committers, groups: groups}
+  end
+
+  private
+    def self.flatten(entry)
+      entry.each do |key, value|
+        entry[key] = value.first if value.length == 1 and 
+          not %w(objectClass memberUid mail asf-altEmail asf-pgpKeyFingerprint).
+            include? key
+      end
+
+      entry.delete('userPassword') if entry['userPassword'] == '{crypt}*'
+      entry.delete('dn')
+
+      entry['cn'].force_encoding('utf-8') if entry['cn']
+      entry['sn'].force_encoding('utf-8') if entry['sn']
+
+      person = ASF::Person.new(entry['uid'])
+      if person.icla
+        entry['public_name'] = person.public_name
+        entry['legal_name'] = person.icla.legal_name
+      end
+
+      if Array === entry['sshPublicKey']
+        entry['sshPublicKey'].each { |key| key.force_encoding('utf-8') }
+      elsif String === entry['sshPublicKey']
+        entry['sshPublicKey'].force_encoding('utf-8')
+      end
+
+      entry
+    end
+end
diff --git a/www/roster/partials/committee._html b/www/roster/partials/committee._html
new file mode 100644
index 0000000..35eb66e
--- /dev/null
+++ b/www/roster/partials/committee._html
@@ -0,0 +1,77 @@
+_h1 do
+  _a '{{pmc.display_name}}', href: '{{pmc.site_link}}'
+  _span.note.not_found '(Not in LDAP)', 
+     ng_if: 'ldap.ready && pmc.cn && pmc.memberUid.length == 0'
+  _small '{{changes.established}}'
+end
+
+_p '{{pmc.site_description}}'
+
+_h2 'PMC'
+
+_table do
+  _tr ng_if: '!pmc.cn' do
+    _th 'loading...', ng_if: 'members.length == 0'
+    _th.not_found 'Not Found', ng_if: 'members.length > 0'
+  end
+
+  _tr ng_repeat: 'person in filtered = (pmc.members | orderBy:"uid")',
+    ng_controller: 'PMCMember' do
+    _td do
+      _a href: 'committer/{{ person.uid }}' do
+        _span ng_bind: 'person.uid'
+      end
+    end
+    _td ng_bind: 'person.cn', asf_id: '{{ person.uid }}'
+    _td ng_if: 'status' do
+      _span ng_bind: 'status', class: '{{ class }}'
+      _span.hint '{{hint}}', ng_if: 'hint'
+    end
+  end
+
+end
+
+_h2 ng_if: 'pmc.committers.length > 0' do
+  _ 'Committers'
+  _span.note '(not on the PMC)'
+end
+
+_table do
+  _tr ng_repeat: 'person in pmc.committers | orderBy:"uid"' do
+    _td do
+      _a href: 'committer/{{ person.uid }}' do
+        _span ng_bind: 'person.uid'
+      end
+    end
+    _td ng_bind: 'person.cn', asf_id: '{{ person.uid }}'
+  end
+end
+
+_p 'All Committers are members of the PMC.', style: 'margin-top: 1em',
+  ng_if: 'pmc.memberUid.length > 0 && pmc.committers.length == 0'
+
+_h2 'Mailing lists', ng_if: 'pmc.maillists(user).length'
+
+_ul.list_none do
+  _li ng_repeat: 'list in pmc.maillists(user) | orderBy:"name"' do
+    _a '{{list.name}}', href: '{{list.link}}'
+  end
+end
+
+_section ng_if: 'pmc.report' do
+  _h2 'Reporting Schedule'
+  _ul.list_none do
+    _li '{{ pmc.report }}'
+    _li ng_if: 'pmc.prior_reports' do
+      _a 'Prior reports', href: '{{ pmc.prior_reports }}'
+    end
+  end
+end
+
+_section ng_if: 'changes.status' do
+  _h2 'Change Audit'
+  _h4 '{{ changes.status }}'
+  _ul ng_if: 'changes.detail.length > 0' do
+    _li '{{line}}', ng_repeat: 'line in changes.detail'
+  end
+end
diff --git a/www/roster/partials/committees._html b/www/roster/partials/committees._html
new file mode 100644
index 0000000..842a65e
--- /dev/null
+++ b/www/roster/partials/committees._html
@@ -0,0 +1,16 @@
+_h1 'PMCs'
+_table do
+  _tr ng_if: 'loading' do
+    _th 'loading...'
+  end
+
+  _tr ng_repeat: 'pmc in pmcs | orderBy:"display_name"', 
+    ng_controller: 'PMCLine' do
+    _td do
+      _a '{{pmc.display_name}}', href: '{{pmc.link}}'
+    end
+    _td ng_bind: 'pmc.chair.cn', asf_id: '{{ pmc.chair.uid }}'
+    _td '{{ status }}', class: '{{ class }}'
+  end
+end
+
diff --git a/www/roster/partials/committer._html b/www/roster/partials/committer._html
new file mode 100644
index 0000000..8843b46
--- /dev/null
+++ b/www/roster/partials/committer._html
@@ -0,0 +1,118 @@
+_h2 '{{ uid }}@apache.org'
+
+_h3 ng_if: '!committer' do
+  _span 'loading...', ng_if: 'members.length == 0'
+  _span.not_found 'Not Found', ng_if: 'members.length > 0'
+end
+
+_table.wide ng_if: 'committer' do
+  _tr do
+    _td 'Name'
+    _td ng_bind: 'committer.cn', asf_id: '{{ committer.uid }}',
+      ng_if: 'committer.cn == committer.public_name && committer.cn == committer.legal_name'
+    _td ng_if: 'committer.cn != committer.public_name || committer.cn != committer.legal_name' do
+      _ul do
+        _li ng_if: 'committer.public_name' do
+          _span ng_bind: 'committer.public_name', asf_id: '{{ committer.uid }}'
+          _span ' (public)'
+        end
+        _li ng_if: 'members.indexOf(user) != -1 && committer.legal_name && committer.legal_name != committer.public_name' do
+          _span ng_bind: 'committer.legal_name', asf_id: '{{ committer.uid }}'
+          _span ' (legal)'
+        end
+        _li ng_if: 'committer.cn && committer.cn != committer.public_name' do
+          _span ng_bind: 'committer.cn', asf_id: '{{ committer.uid }}'
+          _span ' (LDAP)'
+        end
+      end
+    end
+  end
+
+  _tr ng_if: 'committer["asf-personalURL"]' do
+    _td 'Personal URL'
+    _td do
+      _a '{{ committer["asf-personalURL"] }}', 
+        href: '{{ committer["asf-personalURL"] }}'
+    end
+  end
+
+  _tr ng_if: 'committer.pmcs.length > 0' do
+    _td 'Committees'
+    _td do
+      _ul do
+        _li ng_repeat: 'pmc in committer.pmcs | orderBy:"cn"' do
+          _a '{{pmc.cn}}', href: '{{pmc.link}}'
+          _span.chair 'chair', ng_if: 'committer.chairs.indexOf(pmc) >= 0'
+          _span.issue 'not in committer list', 
+            ng_if: 'pmc.group.memberUid.indexOf(committer.uid) == -1'
+        end
+      end
+    end
+  end
+
+  _tr ng_if: 'committer.committer_on.length > 0' do
+    _td 'Committer'
+    _td do
+      _ul do
+        _li ng_repeat: 'pmc in committer.committer_on | orderBy:"cn"' do
+          _a '{{pmc.cn}}', href: '{{pmc.link}}'
+        end
+      end
+    end
+  end
+
+  _tr ng_if: 'committer.groups.length > 0' do
+    _td 'Groups'
+    _td do
+      _ul do
+        _li ng_repeat: 'group in committer.groups | orderBy:"cn"' do
+          _a '{{group.cn}}', href: '{{group.link}}', title: '{{group.source}}'
+        end
+      end
+    end
+  end
+
+  _tr ng_if: 'my_groups.length > 0' do
+    _td 'Groups'
+    _td do
+      _ul do
+        _li ng_repeat: 'group in my_groups | orderBy:"cn"' do
+          _a '{{group.cn}}', href: '{{group.link}}'
+        end
+      end
+    end
+  end
+
+  _tr ng_if: 'committer["asf-pgpKeyFingerprint"].length > 0' do
+    _td 'PGP Key'
+    _td do
+      _ul do
+        _li '{{ pgp }}', ng_repeat: 'pgp in committer["asf-pgpKeyFingerprint"]'
+      end
+    end
+  end
+
+  _tr do
+    _td 'Email addresses'
+    _td do
+      _ul do
+        _li '{{ mail }}', 
+          ng_repeat: 'mail in committer.emails | orderBy:"toString()"'
+      end
+    end
+  end
+
+  _tr ng_if: 'members.indexOf(user) != -1 && committer.members_text' do
+    _td 'Members.txt'
+    _td do
+      _h4 '{{ committer.members_text.status }}',
+        ng_if: 'committer.members_text.status'
+      _pre '{{ committer.members_text.text }}'
+    end
+  end
+end
+
+_p ng_if: 'user == committer.uid' do
+  _ 'You can update your keys and e-mail information by visiting'
+  _a 'https://id.apache.org/', href: 'https://id.apache.org/'
+end
diff --git a/www/roster/partials/committers._html b/www/roster/partials/committers._html
new file mode 100644
index 0000000..f68e258
--- /dev/null
+++ b/www/roster/partials/committers._html
@@ -0,0 +1,30 @@
+_h1 'Committer - Search'
+
+_label 'Search:', for: 'search_text'
+_input.search_text! :autofocus, ng_model: 'search.committer'
+
+_table ng_if: 'search.committer.length > 2' do
+  _tr do
+    _th 'id'
+    _th 'name'
+    _th 'email'
+  end
+
+  _tr ng_repeat: 'committer in filtered = (committers | committer_match:search.committer)' do
+    _td do
+      _a href: 'committer/{{ committer.uid }}' do
+        _span ng_bind: 'committer.uid'
+      end
+    end
+    _td ng_bind: 'committer.public_name || committer.cn', 
+      asf_id: '{{ committer.uid }}'
+    _td ng_bind: 'committer.mail[0]'
+  end
+
+  _tr ng_if: 'filtered.length == 0' do
+    _th 'loading...', colspan: 3, style: 'text-align: center',
+      ng_if: 'members.length == 0'
+    _th.not_found 'Not Found', ng_if: 'members.length > 0', colspan: 3
+  end
+
+end
diff --git a/www/roster/partials/group._html b/www/roster/partials/group._html
new file mode 100644
index 0000000..c6f5637
--- /dev/null
+++ b/www/roster/partials/group._html
@@ -0,0 +1,43 @@
+_h1 do
+  _ '{{group.display_name}}'
+  _span.note '({{group.source}})', ng_if: 'group.source'
+end
+
+_table do
+  _tr ng_if: '!group.display_name' do
+    _th 'loading...', ng_if: 'members.length == 0'
+    _th.not_found 'Not Found', ng_if: 'members.length > 0'
+  end
+
+  _tr ng_repeat: 'person in group.members | orderBy:"uid"' do
+    _td do
+      _a href: 'committer/{{ person.uid }}' do
+        _span ng_bind: 'person.uid'
+      end
+    end
+
+    _td ng_bind: 'person.cn', asf_id: '{{ person.uid }}'
+
+    _td ng_if: 'group.cn == "pmc-chairs"' do
+      _span.issue 'not listed as a chair in committee-info.txt', 
+        ng_if: 'person.chairs.length == 0'
+      _span ng_repeat: 'pmc in person.chairs | orderBy:"cn"' do
+        _a '{{pmc.display_name}}', href: '{{pmc.link}}'
+      end
+    end
+  end
+end
+
+_h1 'LDAP service', ng_if: 'group.cn == "infrastructure"'
+
+_table ng_if: 'group.cn == "infrastructure"' do
+  _tr ng_repeat: 'person in group.group.members | orderBy:"uid"' do
+    _td do
+      _a href: 'committer/{{ person.uid }}' do
+        _span ng_bind: 'person.uid'
+      end
+    end
+
+    _td ng_bind: 'person.cn', asf_id: '{{ person.uid }}'
+  end
+end
diff --git a/www/roster/partials/groups._html b/www/roster/partials/groups._html
new file mode 100644
index 0000000..449d714
--- /dev/null
+++ b/www/roster/partials/groups._html
@@ -0,0 +1,15 @@
+_h1 'Groups'
+_table do
+  _tr ng_if: 'loading' do
+    _th 'loading...'
+  end
+
+  _tr ng_repeat: 'group in groups | orderBy:"cn"' do
+    _td do
+      _a '{{group.cn}}', href: '{{group.link}}', title: '{{group.source}}'
+    end
+    _td '{{podlings[group.cn].status}} podling', ng_if: 'podlings[group.cn]', 
+      ng_class: '{issue: podlings[group.cn].status == "retired"}'
+  end
+end
+
diff --git a/www/roster/partials/index._html b/www/roster/partials/index._html
new file mode 100644
index 0000000..a2ee642
--- /dev/null
+++ b/www/roster/partials/index._html
@@ -0,0 +1,22 @@
+_h1 'Roster'
+
+_table do
+
+_tr do
+_td(align: 'right') {_a '{{size(committers)}}', href: 'committer/'}
+_td {_a 'Committers', href: 'committer/'}
+_td "Search for committers by name, user id, or email address"
+end
+
+_tr do
+_td(align: 'right') { _a '{{size(pmcs)}}', href: 'committee/' }
+_td { _a 'PMCs', href: 'committee/' }
+_td "Active projects at the ASF"
+end
+
+_tr do
+_td(align: 'right') { _a '{{size(groups)}}', href: 'group/' }
+_td { _a 'Groups', href: 'group/' }
+_td "Assorted other groups from various sources"
+end
+end
diff --git a/www/roster/public/stylesheets/app.css b/www/roster/public/stylesheets/app.css
new file mode 100644
index 0000000..63622da
--- /dev/null
+++ b/www/roster/public/stylesheets/app.css
@@ -0,0 +1,23 @@
+h1 .note, h2 .note {font-size: small}
+h2 {margin-bottom: 0}
+h4 {margin-left: 1em}
+table ul {margin: 0; padding: 0; list-style: none}
+table {border-spacing: 0 1em}
+.wide td:first-child {text-align: right; padding: 0}
+.wide td:first-child:after {content: ' —'}
+.wide td:last-child {border-left: solid 1px #000; padding: 0 0.5em}
+table {margin-left: 1em; margin-top: 0.5em}
+td, th {padding-left: 0.5em; padding-right: 0.5em}
+table.wide {color: #000; border-collapse: separate; font-size: 100%}
+.issue:before, .chair:before {content: '\21d0  '}
+.issue, .not-found {color: red; font-weight:bold} 
+.chair {color: green; font-weight:bold} 
+.member {font-weight: bold}
+
+td .hint {display: none}
+td:hover .hint {
+  position: absolute; display: block; background-color: #FFF;
+  padding: 1em; border: 2px solid #0F0; border-radius: 1em;
+  color: black; font-weight: normal}
+
+.list-none {list-style-type: none; padding-left: 1.5em; margin-top: 0.5em}
diff --git a/www/roster/public_committee_info.rb b/www/roster/public_committee_info.rb
new file mode 100644
index 0000000..22738ed
--- /dev/null
+++ b/www/roster/public_committee_info.rb
@@ -0,0 +1,47 @@
+require 'json'
+require 'whimsy/asf'
+
+GEMVERSION = Gem.loaded_specs['whimsy-asf'].version.to_s rescue nil
+  # rescue is to allow for running with local library rather than a Gem
+
+# parse arguments for output file name
+if ARGV.length == 0 or ARGV.first == '-'
+  output = STDOUT
+else
+  # exit quickly if there has been no change
+  if File.exist? ARGV.first
+    source = "#{ASF::SVN['private/committers/board']}/committee-info.txt"
+    mtime = [File.mtime(source), File.mtime(__FILE__)].max
+    if File.mtime(ARGV.first) >= mtime
+      previous_results = JSON.parse(File.read ARGV.first) rescue {}
+      exit 0 if previous_results['gem_version'] == GEMVERSION
+    end
+  end
+
+  output = File.open(ARGV.first, 'w')
+end
+
+# gather committee info
+committees = ASF::Committee.load_committee_info
+info = {last_updated: ASF::Committee.svn_change, gem_version: GEMVERSION}
+info[:committees] = Hash[committees.map {|committee|
+  schedule = committee.schedule.to_s.split(/,\s*/)
+  schedule.unshift committee.report if committee.report != committee.schedule
+
+  [committee.name.gsub(/[^-\w]/,''), {
+    display_name: committee.display_name,
+    site: committee.site,
+    description: committee.description,
+    mail_list: committee.mail_list,
+    established: committee.established,
+    report: schedule,
+    chair: Hash[committee.chairs.map {|chair|
+      [chair.delete(:id), chair]}],
+    roster: committee.roster,
+    pmc: !ASF::Committee.nonpmcs.include?(committee)
+  }]
+}]
+
+# output results
+output.puts JSON.pretty_generate(info)
+output.close
diff --git a/www/roster/public_icla_info.rb b/www/roster/public_icla_info.rb
new file mode 100644
index 0000000..73fe4b3
--- /dev/null
+++ b/www/roster/public_icla_info.rb
@@ -0,0 +1,44 @@
+require 'whimsy/asf'
+
+GEMVERSION = Gem.loaded_specs['whimsy-asf'].version.to_s rescue nil
+  # rescue is to allow for running with local library rather than a Gem
+
+# parse arguments for output file name
+if ARGV.length == 0 or ARGV.first == '-'
+  output = STDOUT
+else
+  # exit quickly if there has been no change
+  if File.exist? ARGV.first
+    source = "#{ASF::SVN['private/foundation/officers']}/iclas.txt"
+    mtime = [File.mtime(source), File.mtime(__FILE__)].max
+    if File.mtime(ARGV.first) >= mtime
+      previous_results = JSON.parse(File.read ARGV.first) rescue {}
+      exit 0 if previous_results['gem_version'] == GEMVERSION
+    end
+  end
+
+  output = File.open(ARGV.first, 'w')
+end
+
+# gather icla info
+ids = {}
+noid = []
+
+ASF::ICLA.each do |entry|
+  if entry.id == 'notinavail'
+    noid << entry.name
+  else
+    ids[entry.id] = entry.name
+  end
+end
+
+info = {
+  last_updated: ASF::ICLA.svn_change,
+  gem_version: GEMVERSION,
+  committers: ids,
+  non_committers: noid
+}
+
+# output results
+output.puts JSON.pretty_generate(info)
+output.close
diff --git a/www/roster/public_member_info.rb b/www/roster/public_member_info.rb
new file mode 100644
index 0000000..49d262b
--- /dev/null
+++ b/www/roster/public_member_info.rb
@@ -0,0 +1,43 @@
+require 'json'
+require 'whimsy/asf'
+
+GEMVERSION = Gem.loaded_specs['whimsy-asf'].version.to_s rescue nil
+  # rescue is to allow for running with local library rather than a Gem
+CODEVERSION = ASF.library_mtime rescue nil
+
+# parse arguments for output file name
+if ARGV.length == 0 or ARGV.first == '-'
+  output = STDOUT
+else
+  # exit quickly if there has been no change
+  if File.exist? ARGV.first
+    source = "#{ASF::SVN['private/foundation']}/members.txt"
+    mtime = [File.mtime(source), File.mtime(__FILE__)].max
+    if File.mtime(ARGV.first) >= mtime
+      previous_results = JSON.parse(File.read(ARGV.first)) rescue {}
+      exit 0 if previous_results['gem_version'] == GEMVERSION
+    end
+  end
+
+  output = File.open(ARGV.first, 'w')
+end
+
+# gather member info
+
+info = {last_updated: (ASF::Member.svn_change rescue nil) , gem_version: GEMVERSION, code_version: CODEVERSION}
+info[:members] = Array.new
+info[:ex_members] = Hash.new
+ASF::Member.list.each do |e,v|
+  s = v['status']
+  if s == nil
+    info[:members] << e
+  else
+    info[:ex_members][e] = s
+  end
+end
+
+# output results (the JSON module does not support sorting, so we pre-sort and rely on insertion order preservation)
+info[:members].sort!
+info[:ex_members] = Hash[info[:ex_members].sort]
+output.puts JSON.pretty_generate(info)
+output.close
diff --git a/www/roster/tmp/restart.txt b/www/roster/tmp/restart.txt
new file mode 100644
index 0000000..e69de29
diff --git a/www/roster/views/main._html b/www/roster/views/main._html
new file mode 100644
index 0000000..493188b
--- /dev/null
+++ b/www/roster/views/main._html
@@ -0,0 +1,15 @@
+_html ng_app: 'AsfRoster', ng_controller: 'Layout' do
+  _base href: @base
+  _title 'ASF Roster', ng_bind: 'title'
+  _script src: 'js/app.js'
+  _script src: 'js/services.js'
+
+  _link rel: 'stylesheet', href: 'stylesheets/app.css'
+
+  _a href: 'https://whimsy.apache.org/' do
+    _img title: 'ASF Logo', alt: 'ASF Logo', 
+      src: 'https://id.apache.org/img/asf_logo_wide.png'
+  end
+
+  _main :ng_view, data_availid: env['REMOTE_USER'] || ENV['USER']
+end
diff --git a/www/secretary/icla-lint.cgi b/www/secretary/icla-lint.cgi
new file mode 100755
index 0000000..cde28d0
--- /dev/null
+++ b/www/secretary/icla-lint.cgi
@@ -0,0 +1,194 @@
+#!/usr/bin/ruby1.9.1
+require 'wunderbar/script'
+require 'ruby2js/filter/functions'
+require 'whimsy/asf'
+
+ldaplist = ASF::Person.list
+ldap = ldaplist.map(&:id)
+errors = 0
+
+_html do
+  _style %{
+    table {border-collapse: collapse}
+    table, th, td {border: 1px solid black}
+    td {padding: 3px 6px}
+    tr:hover td {background-color: #FF8}
+    th {background-color: #a0ddf0}
+  }
+
+  _h1 'iclas.txt lint check'
+
+  _h2_ 'LDAP Status'
+  _div do 
+    _label "#{ldaplist.length} entries found."
+   end
+
+  _h2_ 'Error Status'
+  _div do
+    _label "#{errors} errors found."
+   end
+
+  _h2_ 'Show'
+  _div do
+    _input id: 'missing', type: 'checkbox', checked: true
+    _label 'missing stub/dir name', for: 'missing'
+  end
+
+  _div do
+    _input id: 'extra', type: 'checkbox', checked: true
+    _label 'extra text', for: 'extra'
+  end
+
+  _div do
+    _input id: 'comment', type: 'checkbox', checked: true
+    _label 'parenthetical comment', for: 'comment'
+  end
+
+  _div do
+    _input id: 'error', type: 'checkbox', checked: true
+    _label 'icla not found', for: 'error'
+  end
+
+  _div do
+    _input id: 'mismatch', type: 'checkbox', checked: true
+    _label "doesn't match pattern", for: 'mismatch'
+  end
+
+  _div do
+    _input id: 'notinldap', type: 'checkbox', checked: true
+    _label "id not in LDAP", for: 'notinldap'
+  end
+
+  _div do
+    _input id: 'notinavail', type: 'checkbox', checked: true
+    _label "notinavail entries", for: 'notinavail'
+  end
+
+  _h2_ 'Issues'
+
+  input = ASF::SVN['private/foundation/officers'] + '/iclas.txt'
+  iclas = Dir[ASF::SVN['private/documents/iclas'] + '/*'].map do |file|
+    file.split('/').last.sub(/\.\w+$/, '')
+  end
+
+  _table_ do
+    _tr do
+      _th 'availid'
+      _th 'public name'
+      _th 'issue'
+      _th 'email'
+      _th 'ICLA stub'
+    end
+
+    document = File.read(input).untaint
+    document.scan(/^(\w.*?):.*?:(.*?):(.*?):(.*)/) do |(id, name, email, comment)|
+      issue, note = nil, nil
+      comment2 = comment.dup
+
+      if comment.sub!(/\s*(\(.*?\))\s*/, '')
+        issue, note = 'comment', "parenthetical comment: #{$1.inspect}"
+      end
+
+      if comment.sub!(/Signed CLA(.+?);/, 'Signed CLA;')
+        issue, note = 'extra', "extra text: #{$1.inspect}"
+      end
+
+      if id != 'notinavail'
+        apachemail = "," + id + "@apache.org"
+      end
+
+      if id != 'notinavail' and ldap.length > 0 and not ldap.include? id
+        issue, note = 'notinldap', 'not in LDAP'
+      elsif comment =~ /Signed CLA;(.*)/
+        missing = $1.split(',').select {|path| not iclas.include? path}
+
+        if not missing.empty?
+          missing = missing.select do |path|
+            not iclas.any? {|icla| icla.start_with? path}
+          end
+        end
+
+        if not missing.empty?
+          issue, note = 'error', "missing icla: #{missing.first.inspect}"
+        end
+      elsif comment =~ /^Treasurer;/ or comment =~ /^President;/
+
+      elsif comment == 'Signed CLA'
+        issue, note = 'missing', 'missing stub/dir name'
+      else
+        issue, note = 'mismatch', "doesn't match pattern"
+      end
+
+      if issue
+        issue = "#{issue} notinavail" if id =='notinavail'
+
+        _tr_ class: issue do
+          _td! do
+            if id == 'notinavail' or issue == 'notinldap'
+              _ id
+            else
+              _a id, href: 'https://whimsy.apache.org/roster/committer/' + id
+            end
+          end
+
+          if id != 'notinavail' and ASF::Person.new(id).asf_member?
+            _td! {_b name}
+          else
+            _td name
+          end
+
+          _td do
+            _button 'email', data_email: "#{name} <#{email}>#{apachemail}",
+              data_issue: note, data_name: name
+            _span note
+          end
+
+          _td email
+          _td comment2
+        end
+      end
+    end
+  end
+
+  _script do
+    inputs = document.querySelectorAll('input')
+    for i in 0...inputs.length
+      inputs[i].checked = true
+      inputs[i].addEventListener('click') do |event|
+        rows = document.getElementsByClassName(event.target.id)
+        errors = rows.length
+        for j in 0...rows.length
+          if event.target.checked
+            rows[j].style.display = ''
+          else
+            rows[j].style.display = 'none'
+          end
+        end
+      end
+    end
+    buttons = document.querySelectorAll('button')
+    for i in 0...buttons.length
+      buttons[i].addEventListener('click') do |event|
+        email = event.target.getAttribute('data-email')
+        issue = event.target.getAttribute('data-issue')
+        name  = event.target.getAttribute('data-name')
+
+        destination = "mailto:#{email}?cc=secretary@apache.org"
+        subject = 'Your Apache ICLA has gone missing'
+        body = "Dear " + name + ",\n\n" +
+            "We are reviewing our records to be sure that all submitted ICLAs are on file.\n" +
+            "Unfortunately, we are unable to locate the ICLA that you submitted earlier.\n\n" +
+            "Can you please resubmit to secretary@apache.org? http://apache.org/licenses/#submitting\n" +
+            "Please do *not* use an apache email as your E-Mail address.\n" +
+            "You can send the original ICLA (if the email address is still valid) or a new one.\n\n" +
+            "Best regards,\n"
+
+        window.location = destination +
+          "&subject=#{encodeURIComponent(subject)}" +
+          "&body=#{encodeURIComponent(body)}"
+
+      end
+    end
+
+  end
+end
diff --git a/www/secretary/iclasort.rb b/www/secretary/iclasort.rb
new file mode 100644
index 0000000..dae1486
--- /dev/null
+++ b/www/secretary/iclasort.rb
@@ -0,0 +1,22 @@
+require 'whimsy/asf'
+
+OFFICERS = ASF::SVN['private/foundation/officers']
+
+unless OFFICERS
+  STDERR.puts 'Unable to locate a checked out version of '
+  STDERR.puts 'https://svn.apache.org/repos/private/foundation/officers.'
+  STDERR.ptus
+  STDERR.puts "Please check your #{Dir.home}/.whimsy file"
+  exit 1
+end
+
+Dir.chdir OFFICERS
+source = File.read('iclas.txt')
+sorted = ASF::ICLA.sort(source)
+
+if source == sorted
+  puts 'no change'
+else
+  File.write('iclas.txt', sorted)
+  system 'svn diff iclas.txt'
+end
diff --git a/www/secretary/public-names.cgi b/www/secretary/public-names.cgi
new file mode 100755
index 0000000..0c0abd2
--- /dev/null
+++ b/www/secretary/public-names.cgi
@@ -0,0 +1,364 @@
+#!/usr/bin/ruby1.9.1
+
+require 'whimsy/asf'
+require 'wunderbar/script'
+require 'ruby2js/filter/functions'
+
+# only available to ASF members and PMC chairs
+user = ASF::Person.new($USER)
+unless user.asf_member? or ASF.pmc_chairs.include? user
+  print "Status: 401 Unauthorized\r\n"
+  print "WWW-Authenticate: Basic realm=\"ASF Members and Officers\"\r\n\r\n"
+  exit
+end
+
+_html do
+  _style :system if @updates
+
+  _style_ %{
+    table {border-collapse: collapse}
+    table, th, td {border: 1px solid black}
+    td {padding: 3px 6px}
+    th {background-color: #a0ddf0}
+    tr:hover .diff {background-color: #AAF}
+
+    td[draggable=true] {cursor: move}
+    td.modified {background-color: #FF0}
+    td.over {background-color: #FFA}
+
+    input[type=text] {width: 100%; box-sizing: border-box}
+    input[type=submit] {margin-top: 1em}
+  }
+
+  _h1 "public names: LDAP vs ICLA.txt"
+
+  # prefetch LDAP data
+  ASF::Person.preload('cn')
+
+  if @updates
+
+    ################################################################## 
+    #                         Apply Updates                          #
+    ################################################################## 
+
+    _h2_ 'Applying updates'
+    updates = JSON.parse(@updates)
+
+    # scope out the work to be done
+    svn_updates = []
+    ldap_updates = []
+    updates.each do |id, names|
+      svn_updates << id if names['legal_name'] or names['public_name']
+      ldap_updates << id if names['ldap']
+    end
+
+    # update SVN
+    unless svn_updates.empty?
+      officers = '/var/tools/secretary/foundation/officers'
+      _.system ['svn', 'cleanup', officers]
+      _.system ['svn', 'up', officers]
+      iclas = File.read(officers + '/iclas.txt')
+
+      updates.each do |id, names|
+        pattern = Regexp.new("^#{Regexp.escape(id)}:(.*?):(.*?):")
+
+        if names['legal_name']
+          iclas[pattern,1] = names['legal_name'].gsub("\u00A0", ' ')  
+        end
+
+        if names['public_name']
+          iclas[pattern,2] = names['public_name'].gsub("\u00A0", ' ') 
+        end
+      end
+
+      File.write(officers + '/iclas.txt', ASF::ICLA.sort(iclas))
+      _.system ['svn', 'diff', officers + '/iclas.txt']
+
+      if svn_updates.length > 8
+        message = "Update #{svn_updates.length} names"
+      else
+        message = "Update names for #{svn_updates.sort.join(', ')}"
+
+        if svn_updates.length == 1
+          update = updates[svn_updates.first]
+          if not update['legal_name']
+            message = "Update public name for #{svn_updates.first}"
+          elsif not update['public_name']
+            message = "Update legal name for #{svn_updates.first}"
+          end
+        else
+          if svn_updates.all? {|update| not update['legal_name']}
+            message = "Update public names for #{svn_updates.sort.join(', ')}"
+          elsif svn_updates.all? {|update| not update['public_name']}
+            message = "Update legal names for #{svn_updates.sort.join(', ')}"
+          end
+        end
+      end
+
+      _.system ['svn', 'commit', '-m', message, 
+        ['--no-auth-cache', '--non-interactive'],
+        (['--username', $USER, '--password', $PASSWORD] if $PASSWORD),
+        officers + '/iclas.txt']
+    end
+
+    # update LDAP
+    unless ldap_updates.empty?
+      ASF::LDAP.bind($USER, $PASSWORD) do
+        _pre 'ldapmodify', class: '_stdin'
+        updates.each do |id, names|
+          next unless names['ldap']
+          person = ASF::Person.new(id)
+          _pre person.dn, class: '_stdout'
+          person.cn = names['ldap'].gsub("\u00A0", ' ')
+        end
+      end
+    end
+
+  else
+
+    ################################################################## 
+    #                          Instructions                          #
+    ################################################################## 
+
+    _h2_ 'Instructions:'
+
+    _ul do
+      _li 'Double click to edit.'
+      _li 'Drag/drop to copy.'
+      _li 'When done, click "Commit Changes" (at the bottom of the page).'
+    end
+
+  end
+
+  #################################################################### 
+  #     Show LDAP differences where entry is present in icla.txt     #
+  #################################################################### 
+
+  # prefetch ICLA data
+  ASF::ICLA.preload
+
+  _h2_!.present! do
+    _ 'Present in '
+    _a 'icla.txt', 
+      href: 'https://svn.apache.org/repos/private/foundation/officers/iclas.txt'
+   _ ':'
+  end
+
+  _table do
+    _tr do
+      _th "availid"
+      _th "icla.txt real name"
+      _th "icla.txt public name"
+      _th "LDAP cn"
+    end
+
+    ASF::ICLA.each do |icla|
+      next if icla.id == 'notinavail'
+      person = ASF::Person.find(icla.id)
+      next unless person.dn
+
+      if person.cn != icla.name
+        # locate point at which names differ
+        first, last = 0, -1
+        length = [icla.name.length, person.cn.length].min
+
+        while icla.name[first] == person.cn[first]
+          first += 1 
+        end
+
+        while icla.name[last] == person.cn[last] and length >= first-last
+          last -= 1 
+        end
+
+        if icla.name[last] == ' ' and icla.name[last] == person.cn[last]
+          last -= 1 if (icla.name.length - person.cn.length).abs > 1
+        end
+
+        _tr_ do
+          _td! do
+            _a icla.id, 
+              href: "https://whimsy.apache.org/roster/committer/#{icla.id}"
+          end
+          _td icla.legal_name.gsub(' ', "\u00A0"), draggable: 'true'
+
+          if 
+            icla.name[first..last].length > length/2 and 
+            person.cn[first..last].length > length/2
+          then
+            _td icla.name, draggable: 'true'
+            _td person.cn, draggable: 'true'
+          else
+            _td! draggable: 'true' do
+              _ icla.name[0...first] unless first == 0
+              _span.diff icla.name[first..last].gsub(' ', "\u00A0")
+              _ icla.name[last+1..-1] unless last == -1
+            end
+            _td! draggable: 'true' do
+              _ person.cn[0...first] unless first == 0
+              _span.diff person.cn[first..last].gsub(' ', "\u00A0")
+              _ person.cn[last+1..-1] unless last == -1
+            end
+          end
+        end
+      end
+    end
+  end
+
+  #################################################################### 
+  #   Show LDAP differences where entry is NOT present in icla.txt   #
+  #################################################################### 
+
+  icla = ASF::ICLA.availids
+  ldap = ASF::Person.list.sort_by(&:name)
+  ldap.delete ASF::Person.new('apldaptest')
+
+  unless ldap.all? {|person| icla.include? person.id}
+    _h2_.missing! 'Only in LDAP'
+
+    _table do
+      _tr do
+        _th 'id'
+        _th 'cn'
+        _th 'mail'
+      end
+
+      ldap.each do |person|
+        next if icla.include? person.id
+
+        _tr_ do
+          _td! do
+            _a person.id, href:
+              "https://whimsy.apache.org/roster/committer/#{person.id}"
+          end
+          _td person.cn
+          _td person.mail.first
+        end
+      end
+    end
+  end
+
+  #################################################################### 
+  #                   Form used to submit changes                    #
+  #################################################################### 
+
+  _form_ method: 'post' do
+    _input type: 'hidden', name: 'updates'
+    _input type: 'submit', value: 'Commit Changes', disabled: true
+  end
+
+  #################################################################### 
+  #                        Client side logic                         #
+  #################################################################### 
+
+  _script do
+    # track current drag operation
+    row = nil
+    dragText = nil
+
+    # enable submit button only when there is modifications
+    def enable_submit()
+      button = document.querySelector('input[type=submit]')
+      modified = document.querySelectorAll('td.modified')
+
+      button.disabled = (modified.length == 0)
+    end
+
+    # add drag/drop, mouse click event handlers to cells marked as draggable
+    Array(document.getElementsByTagName('td')).each do |td|
+      next unless td.getAttribute('draggable') == 'true'
+
+      # dragstart: capture row and textContent
+      td.addEventListener(:dragstart) do |event|
+        row = event.target.parentNode
+        dragText = this.textContent
+        event.dataTransfer.setData('text/plain', dragText)
+      end
+
+      # dragover: add CSS class 'over' if same row and text is different
+      td.addEventListener(:dragover) do |event|
+        return unless row == event.target.parentNode
+        if event.target.textContent != dragText
+          event.target.classList.add 'over'
+          event.preventDefault() 
+        end
+      end
+
+      # dragleave: remove CSS class 'over'
+      td.addEventListener(:dragleave) do |event|
+        event.currentTarget.classList.remove 'over'
+      end
+
+      # drop: update text after capturing original text
+      td.addEventListener(:drop) do |event|
+        data = event.dataTransfer.getData('text/plain')
+        event.target.classList.remove 'over'
+
+        if not event.target.getAttribute('data-original')
+          event.target.setAttribute('data-original', event.target.textContent)
+          event.target.classList.add 'modified'
+        elsif data == event.target.getAttribute('data-original')
+          event.target.removeAttribute('data-original')
+          event.target.classList.remove 'modified'
+        else
+          event.target.classList.add 'modified'
+        end
+
+        event.target.textContent = data
+        event.preventDefault()
+        enable_submit()
+        row = nil
+      end
+
+      # mouseup: replace cell with an input field
+      td.addEventListener(:dblclick) do |event|
+        input = document.createElement('input')
+        input.setAttribute('type', 'text')
+        input.value = event.target.textContent
+
+        if not event.target.getAttribute('data-original')
+          event.target.setAttribute('data-original', input.value)
+        end
+
+        event.target.firstChild.remove() while event.target.firstChild
+        event.target.appendChild(input)
+        event.target.setAttribute('draggable', 'false')
+        input.focus()
+
+        # when focus leaves input, replace cell with modified text
+        input.addEventListener(:blur) do |event|
+          parent = input.parentNode
+          value = input.value
+          input.remove()
+          parent.textContent = value
+          parent.setAttribute('draggable', 'true')
+
+          if value == parent.getAttribute('data-original')
+            parent.removeAttribute('data-original')
+            parent.classList.remove 'modified'
+          else
+            parent.classList.add 'modified'
+          end
+
+          enable_submit()
+        end
+      end
+    end
+
+    # capture modifications when button is pressed
+    document.querySelector('input[type=submit]').addEventListener(:click) do
+      updates = {}
+      columnNames = %w(id legal_name public_name ldap)
+
+      Array(document.querySelectorAll('td.modified')).each do |td|
+        id = td.parentNode.firstElementChild.textContent.strip()
+        updates[id] ||= {}
+        updates[id][columnNames[td.cellIndex]] = td.textContent
+      end
+
+      document.querySelector('form input').value = JSON.stringify(updates)
+    end
+
+    # force submit state on initial load (i.e., disable submit button)
+    enable_submit()
+  end
+end
diff --git a/www/secretary/response-time.cgi b/www/secretary/response-time.cgi
new file mode 100755
index 0000000..03447bc
--- /dev/null
+++ b/www/secretary/response-time.cgi
@@ -0,0 +1,50 @@
+#!/usr/bin/ruby1.9.1
+
+require 'whimsy/asf'
+require 'wunderbar/jquery'
+
+# only available to ASF members and PMC chairs
+user = ASF::Person.new($USER)
+unless user.asf_member? or ASF.pmc_chairs.include? user
+  print "Status: 401 Unauthorized\r\n"
+  print "WWW-Authenticate: Basic realm=\"ASF Members and Officers\"\r\n\r\n"
+  exit
+end
+
+CMD = 'svn log -l 1 officers/iclas.txt'
+
+_html do
+  _style :system
+  _h1_ 'Response time test'
+
+  _section_.times do
+    _h2 'Times'
+    _pre 'running test...'
+  end
+
+  _section_.output do
+    _h2 'Output'
+    _pre class: '_stdin'
+    _pre 'loading...', class: '_stdout'
+  end
+
+  _script %{
+    var startTime = new Date();
+
+    $.get('', '', function(data) {
+      data.roundTrip = (new Date() - startTime)/1000;
+      $('.output pre._stdin').text(#{CMD.inspect});
+      $('.output pre._stdout').text(data.result);
+      delete data.result;
+      $('.times pre').text(JSON.stringify(data, '', 2));
+    }, 'json');
+  }
+end
+
+_json do
+  officers = ASF::SVN['private/foundation/officers']
+  startTime = Time.now
+  _result `#{CMD.sub(/\bofficers\b/, officers)}`
+  _server Time.now - startTime
+end
+
diff --git a/www/secretary/workbench/HOWTO.html b/www/secretary/workbench/HOWTO.html
new file mode 100644
index 0000000..8c1304e
--- /dev/null
+++ b/www/secretary/workbench/HOWTO.html
@@ -0,0 +1,179 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
+<HTML>
+<HEAD>
+	<META HTTP-EQUIV="CONTENT-TYPE" CONTENT="text/html; charset=utf-8">
+	<TITLE></TITLE>
+	<META NAME="GENERATOR" CONTENT="OpenOffice.org 3.4.1  (Unix)">
+	<META NAME="AUTHOR" CONTENT="Craig Russell">
+	<META NAME="CREATED" CONTENT="20110814;13503500">
+	<META NAME="CHANGEDBY" CONTENT="Craig Russell">
+	<META NAME="CHANGED" CONTENT="20130406;14553000">
+	<META NAME="CHANGEDBY" CONTENT="Craig Russell">
+	<META NAME="CHANGEDBY" CONTENT="Craig Russell">
+	<STYLE TYPE="text/css">
+	<!--
+		@page { margin: 0.79in }
+		P { margin-bottom: 0.08in }
+		A:link { so-language: zxx }
+	-->
+	</STYLE>
+</HEAD>
+<BODY LANG="en-US" DIR="LTR">
+<P STYLE="margin-bottom: 0in"><FONT FACE="Times New Roman, serif"><FONT SIZE=3>This
+tool helps file documents received via fax or email.</FONT></FONT></P>
+<P STYLE="margin-bottom: 0in"><BR>
+</P>
+<OL>
+	<LI><P STYLE="margin-bottom: 0in"><FONT FACE="Times New Roman, serif"><FONT SIZE=3>Documents
+	to be filed appear in the Work List area. </FONT></FONT>
+	</P>
+	<OL TYPE=A>
+		<LI><P STYLE="margin-bottom: 0in"><FONT COLOR="#000000"><FONT FACE="Times New Roman, serif"><FONT SIZE=3>Documents
+		that are received via fax appear as .pdf files with an eFax prefix.
+		These documents can be processed directly. There is no metadata
+		associated with these documents, so all information must be entered
+		manually.</FONT></FONT></FONT></P>
+		<LI><P STYLE="margin-bottom: 0in"><FONT COLOR="#000000"><FONT FACE="Times New Roman, serif"><FONT SIZE=3>Documents
+		that are received via email are in one of two forms. Metadata
+		associated with the documents includes the sender's email address
+		and name. This metadata will populate certain forms for specific
+		document types.</FONT></FONT></FONT></P>
+		<OL TYPE=i>
+			<LI><P STYLE="margin-bottom: 0in"><FONT COLOR="#000000"><FONT FACE="Times New Roman, serif"><FONT SIZE=3>If
+			an email is received with a single document to be processed that
+			document will appear by itself. </FONT></FONT></FONT>
+			</P>
+			<LI><P STYLE="margin-bottom: 0in"><FONT COLOR="#000000"><FONT FACE="Times New Roman, serif"><FONT SIZE=3>If
+			an email is received with multiple documents, all of the documents
+			will be put into a single directory and the directory appears in
+			the work list.</FONT></FONT></FONT></P>
+		</OL>
+	</OL>
+	<LI><P STYLE="margin-bottom: 0in"><FONT COLOR="#000000"><FONT FACE="Times New Roman, serif"><FONT SIZE=3>To
+	convert documents to a form that can be processed, select the
+	directory from the Work List. The contents of the directory will be
+	displayed on the view port. </FONT></FONT></FONT>
+	</P>
+	<OL TYPE=A>
+		<LI><P STYLE="margin-bottom: 0in"><FONT COLOR="#000000"><FONT FACE="Times New Roman, serif"><FONT SIZE=3>If
+		the documents are a file and a signature (e.g. icla.txt and
+		icla.txt.asc) the tool will attempt to verify the document via the
+		command &quot;gpg --verify icla.txt.asc&quot;. The results of the
+		verification are displayed in the view port along with the list of
+		documents. If the document verifies correctly, it can be processed
+		as if it were a document. </FONT></FONT></FONT>
+		</P>
+		<OL TYPE=i>
+			<LI><P STYLE="margin-bottom: 0in"><FONT COLOR="#000000"><FONT FACE="Times New Roman, serif"><FONT SIZE=3>If
+			the document does not verify because the public key is not
+			available, try to download the key from a public key server via
+			the command &quot;gpg --recv-keys &lt;pub-key&gt;&quot;. After the
+			key is downloaded, you can try again.</FONT></FONT></FONT></P>
+			<LI><P STYLE="margin-bottom: 0in"><FONT COLOR="#000000"><FONT FACE="Times New Roman, serif"><FONT SIZE=3>If
+			the document does not verify because the signature is BAD, contact
+			the sender and attempt to get the document in a different mode.</FONT></FONT></FONT></P>
+		</OL>
+		<LI><P STYLE="margin-bottom: 0in"><FONT COLOR="#000000"><FONT FACE="Times New Roman, serif"><FONT SIZE=3>If
+		the documents are a collection of documents, they can be turned
+		into individual documents via the Staple command in the view port. </FONT></FONT></FONT>
+		</P>
+		<OL TYPE=i>
+			<LI><P STYLE="margin-bottom: 0in"><FONT COLOR="#000000"><FONT FACE="Times New Roman, serif"><FONT SIZE=3>If
+			the documents comprise a single document, e.g. icla1.pdf,
+			icla2.pdf, select both documents and press the Staple key. Both
+			documents will be combined into a single .pdf document and
+			displayed in the Work List. This technique currently works for
+			.pdf and .jpg files.</FONT></FONT></FONT></P>
+			<LI><P STYLE="margin-bottom: 0in"><FONT COLOR="#000000"><FONT FACE="Times New Roman, serif"><FONT SIZE=3>If
+			the documents comprise multiple independent documents, select a
+			single document and press Staple. The single document will be
+			copied into a new document with the same metadata and placed into
+			the Work List. This technique currently works for .pdf and .jpg
+			files.</FONT></FONT></FONT></P>
+			<LI><P STYLE="margin-bottom: 0in"><FONT COLOR="#000000"><FONT FACE="Times New Roman, serif"><FONT SIZE=3>For
+			each document in the collection, after stapling the document is
+			ready for processing.</FONT></FONT></FONT></P>
+			<LI><P STYLE="margin-bottom: 0in"><FONT COLOR="#000000"><FONT FACE="Times New Roman, serif"><FONT SIZE=3>After
+			all documents have been processed, check to make sure the
+			directory has been deleted by using the &quot;svn status&quot;
+			command. [The directory will not appear in the Work List if it is
+			empty.] If not, remove it manually using the &quot;svn rm&quot;
+			command.</FONT></FONT></FONT></P>
+		</OL>
+	</OL>
+	<LI><P STYLE="margin-bottom: 0in"><FONT COLOR="#000000"><FONT FACE="Times New Roman, serif"><FONT SIZE=3>To
+	process a document, select it from the Work List. If it is
+	displayable, the document will appear in the view port. All
+	documents must be complete and legible. Multipage documents must
+	have all pages included (specifically, not just the first and last
+	page) in the same transmission. </FONT></FONT></FONT>
+	</P>
+	<OL TYPE=A>
+		<LI><P STYLE="margin-bottom: 0in"><FONT COLOR="#000000"><FONT FACE="Times New Roman, serif"><FONT SIZE=3>ICLAs:
+		Required fields are full name, email address, signature, and date.
+		If there is already an existing ICLA for the same name, you must
+		establish whether the existing document is for the same person. </FONT></FONT></FONT>
+		</P>
+		<OL TYPE=i>
+			<LI><P STYLE="margin-bottom: 0in"><FONT COLOR="#000000"><FONT FACE="Times New Roman, serif"><FONT SIZE=3>If
+			the existing document is for the same person, process the new ICLA
+			with a different file name (e.g. existing-name2.pdf) and before
+			completing the process, create a directory (e.g. existing-name/)
+			and move both existing-name.pdf and existing-name2.pdf into the
+			new directory.</FONT></FONT></FONT></P>
+			<LI><P STYLE="margin-bottom: 0in"><FONT COLOR="#000000"><FONT FACE="Times New Roman, serif"><FONT SIZE=3>If
+			the existing document is for a different person, contact the
+			submitter and see if there is an additional (middle) name that can
+			be used in the &quot;Full Name&quot; section. If not, see if there
+			is a title that can be used to distinguish the entries.</FONT></FONT></FONT></P>
+			<LI><P STYLE="margin-bottom: 0in"><FONT COLOR="#000000"><FONT FACE="Times New Roman, serif"><FONT SIZE=3>Try
+			to determine if the ICLA is from a person who should be given
+			commit access. Read the original email containing the document,
+			look at the &quot;notify PMC&quot; field on the form, and search
+			the email records to determine if the ICLA is in response to an
+			invitation from a PMC or PPMC. If there is a valid invitation from
+			a PMC, select the url of the invitation so it can be pasted into
+			the ICLA form below the &quot;file&quot; button.</FONT></FONT></FONT></P>
+		</OL>
+		<LI><P STYLE="margin-bottom: 0in"><FONT COLOR="#000000"><FONT FACE="Times New Roman, serif"><FONT SIZE=3>If
+		the acknowledgement email to the ICLA submitter bounces, try to
+		resolve the issue. Common reasons for bounced emails are typos due
+		to illegible ICLAs or ambiguous special symbols, such as &quot;-&quot;
+		for &quot;_&quot;, &quot;0&quot; for &quot;o&quot;. Note that email
+		addresses are case-insensitive. If the proper email address cannot
+		be obtained, manually edit the foundation/officers/iclas.txt file
+		and change the incorrect email address. The address can be changed,
+		for example, from &quot;<A HREF="mailto:wrong.email@company.com">wrong.email@company.com</A>&quot;
+		to &quot;Bounced Email&lt; <A HREF="mailto:wrong.email@company.com">wrong.email@company.com</A>&gt;&quot;.</FONT></FONT></FONT></P>
+		<LI><P STYLE="margin-bottom: 0in"><FONT COLOR="#000000"><FONT FACE="Times New Roman, serif"><FONT SIZE=3>CCLAs
+		must be signed by an officer of the corporation authorized to enter
+		into binding contracts. Required fields are corporation name,
+		contact, and email address. </FONT></FONT></FONT>
+		</P>
+		<LI><P STYLE="margin-bottom: 0in"><FONT COLOR="#000000"><FONT FACE="Times New Roman, serif"><FONT SIZE=3>NDAs
+		require the apache id.</FONT></FONT></FONT></P>
+	</OL>
+	<LI><P STYLE="margin-bottom: 0in"><FONT COLOR="#000000"><FONT FACE="Times New Roman, serif"><FONT SIZE=3>If
+	there are duplicate documents to be processed, after processing the
+	best document, remove the duplicates before committing. Choose
+	&quot;other&quot; &quot;junk&quot; from the menu. After removing all
+	duplicates, commit the batch.</FONT></FONT></FONT></P>
+	<LI><P STYLE="margin-bottom: 0in"><FONT COLOR="#000000"><FONT FACE="Times New Roman, serif"><FONT SIZE=3>After
+	processing an ICLA, if the sender should have an account created,
+	select &quot;New Account&quot; from the menu. The last ICLA should
+	appear in the &quot;ASF New Account Request&quot; form. In
+	&quot;Comments&quot; indicate &quot;original committer&quot; if the
+	ICLA is from a new podling. Otherwise, leave it blank.</FONT></FONT></FONT></P>
+	<LI><P STYLE="margin-bottom: 0in"><FONT COLOR="#000000"><FONT FACE="Times New Roman, serif"><FONT SIZE=3>Forms
+	received by other than the above process should be added to the
+	documents/received directory and added via &quot;svn add&quot;. The
+	document will then appear in the work list to be processed as above.
+	Documents that are not in the proper format should be converted to
+	.pdf before adding them.</FONT></FONT></FONT></P>
+</OL>
+<P STYLE="margin-bottom: 0in"><BR>
+</P>
+<P STYLE="margin-bottom: 0in"><BR>
+</P>
+</BODY>
+</HTML>
\ No newline at end of file
diff --git a/www/secretary/workbench/README b/www/secretary/workbench/README
new file mode 100644
index 0000000..89db1ff
--- /dev/null
+++ b/www/secretary/workbench/README
@@ -0,0 +1,27 @@
+This tool help file documents received via fax or email.
+
+See HOWTO.html for usage.
+
+General design of the tool:
+
+*) configuration is done using local_paths.yml.  Format is a series of
+   names followed by locations.  Most are directories where svn checkouts
+   reside.  'mail' is a path to a ruby script that sets Mail.defaults as
+   well as @from and @sig.
+
+*) index.html splits the window into two panes using old-school frames.
+
+*) worklist.cgi, worklist.css, and worklist.js are primarily responsible
+   for the left pane.  This is mostly an HTML forms processing, with a lot
+   of JavaScript to assist.
+
+*) file.cgi is responsible for the right pane.  This is where most of the
+   server logic resides, and mostly involves invoking underlying system
+   commands (e.g., svn, pdftk, convert, gpg) and returning the results as
+   HTML.
+
+*) ccla.erb, grant.erb, icla.erb, mem.erb, and nda.erb are mail templates
+   of confirmation replies sent back when the document is processed.
+
+*) The tool assumes that the url /members/received is a symlink to a checkout
+   of https://svn.apache.org/repos/private/documents/received
diff --git a/www/secretary/workbench/ccla.erb b/www/secretary/workbench/ccla.erb
new file mode 100644
index 0000000..fc031dd
--- /dev/null
+++ b/www/secretary/workbench/ccla.erb
@@ -0,0 +1,13 @@
+to:   <%= contact.inspect %> <<%= cemail %>>
+from: <%= from %>
+cc:   secretary@apache.org
+bcc:  <%= bcc %>
+subject: Your CCLA sent to Apache Secretary
+
+Dear <%= contact %>,
+
+This message acknowledges receipt of the following document, which has been filed in the Apache Software Foundation records:
+
+  <%= commit_message %>
+
+<%= sig %>
diff --git a/www/secretary/workbench/file.cgi b/www/secretary/workbench/file.cgi
new file mode 100755
index 0000000..2c084e5
--- /dev/null
+++ b/www/secretary/workbench/file.cgi
@@ -0,0 +1,1091 @@
+#!/usr/bin/ruby1.9.1
+require 'wunderbar'
+require 'open3'
+require './local_paths'
+require 'fileutils'
+require 'ostruct'
+require 'escape'
+require 'time'
+require 'whimsy/asf'
+
+ENV['LANG'] = 'en_US.UTF-8'
+
+def html_fragment(&block)
+  x = Wunderbar::HtmlMarkup.new({})
+  x.instance_eval(&block)
+  x._.target!
+end
+
+OLDPODLINGS = [
+  'allura',
+  'ambari',
+  'blur',
+  'celix',
+  'chukwa',
+  'deltaspike',
+  'devicemap',
+  'drill',
+  'droids',
+  'hcatalog',
+  'jspwiki',
+  'kafka',
+  'kalumet',
+  'mesos',
+  'npanday',
+  'odf',
+  'onami',
+  's4',
+  'tashi',
+  'vxquery',
+  'wave'
+]
+
+def update_pending fields, dest
+  # start with the fields provided
+  fields = Hash[fields]
+
+  # reject blank fields, normalize the rest
+  fields.reject! {|k,v| v == [""]}
+  fields.each_key {|k| fields[k]=fields[k].join(' ')}
+
+  # add properties from svn
+  at = svn_at(dest)
+  at += '/*' if File.directory?(dest) and `svn proplist #{dest}#{at}`.empty?
+  `svn proplist #{dest}#{at}`.scan(/  \w+:[-\w]+/).each do |prop|
+    prop.untaint if prop.strip =~ /^\w+(:\w+)/
+    value = `svn propget #{prop} #{dest}#{at}`.chomp
+    value.gsub!(/\\x[0-9a-fA-F][0-9a-fA-F]/) {|c| [c[2..3].to_i(16)].pack('C')}
+    value.gsub!(/\\[0-7][0-7][0-7]/) {|c| [c[1..3].to_i(8)].pack('C')}
+    fields[prop.strip] = value
+  end
+
+  # copy email field
+  fields['email'] ||= fields['gemail'] || fields['cemail'] ||
+                      fields['nemail'] || fields['memail']
+  fields.delete('email') unless fields['email']
+  
+  # Concatenate the fields to the pending list and write to disk
+  pending = YAML.load(open(PENDING_YML)) rescue []
+  pending << fields
+  open(PENDING_YML, 'w') {|file| file.write pending.to_yaml}
+end
+
+class Wunderbar::XmlMarkup
+  def move source, dest
+    if not Dir.chdir(RECEIVED) {Dir['*']}.include? source.chomp('/')
+      tag! :pre, "svn mv #{source.inspect} #{dest}", class: '_stdin'
+      tag! :pre, "File #{source} doesn't exist.", class: '_stderr'
+      return
+    end
+
+    source = File.expand_path(source, RECEIVED).untaint
+    source += svn_at(source)
+
+    if File.exist?(dest) and !File.directory?(dest)
+      # Since svn error messages aren't as helpful as they could be here,
+      # let's improve on it... by pretending to run the command and then
+      # producing a better error message.
+      tag! :pre, "svn mv #{source.inspect} #{dest}", class: '_stdin'
+      tag! :pre, "File #{dest} already exists.", class: '_stderr'
+    else
+      if (`svn --version --quiet`.chomp.split('.') <=> %w(1 5)) >= 1
+        if source.start_with? Dir.pwd + '/'
+          source = source[Dir.pwd.length+1..-1]
+        end
+        self.system "svn mv #{source.inspect} #{dest}"
+      else
+        if `svn st #{source.inspect}` =~ /^A/
+          self.system "cp #{source.inspect} #{dest}"
+          self.system "svn add #{dest}"
+          `svn proplist #{source.inspect}`.scan(/  \w+:[-\w]+/).each do |prop|
+            prop.untaint if prop.strip =~ /^\w+(:\w+)/
+            value = `svn propget #{prop.strip} #{source.inspect}`.chomp
+            self.system "svn propset #{prop.strip} #{value.inspect} #{dest}"
+          end
+          self.system "svn revert #{source.inspect}"
+        elsif `svn st #{source.inspect}` !~ /^D/
+          self.system "svn mv --force #{source.inspect} #{dest}"
+        end
+      end
+      self.system "svn rm #{dest}/Thumbs.db" if File.exist?("#{dest}/Thumbs.db")
+    end
+  end
+end
+
+def check
+  email = {}
+  prev_name = nil
+  output = []
+
+  open("#{OFFICERS}/iclas.txt").each do |line|
+    next unless line =~ /^\w.*?:(.*?):(.*?):(.*?)(:(.*))?\n/
+    name = $1
+ 
+    if ! $3.index('@')
+      output << [ 'email', "#{$1}: #{$3}" ]
+    elsif ! $4 or ! $4.index('CLA')
+      if not %w(:President :Treasurer).include? $4.split(';').first
+        output << [ 'nocla', "#$2: #$4" ]
+      end
+    elsif email[$3.downcase]
+      output << [ 'dupemail', "#{$3}: #{name} and #{email[$3.downcase]}" ]
+    end
+ 
+    email[$3.downcase] = name
+
+    name.split.each do |word|
+      next if word.length == 1 and word !~ /\w/
+      next if word =~ /^\W/
+      next if %w(van von da de del der den dos i).include? word
+      output << ['case', name] if word !~ /[A-Z][a-z]*/
+    end
+
+    sort_name = ASF::ICLA.lname(line)
+    if prev_name and prev_name > sort_name
+      output << [ 'order', "#{prev_name} > #{sort_name}" ]
+    end
+    prev_name = sort_name
+  end
+
+  html_fragment do
+    if output.empty?
+      _p 'No icla.txt issues.'
+    else
+      _h3 'icla.txt issues'
+      _table border: 1, cellpadding: 10, cellspacing: 0 do
+        _thead do
+          _th 'issue'
+          _th 'name'
+        end
+        output.each do |type, message|
+          _tr do
+            _td type
+            _td message
+          end
+        end
+      end
+    end
+  end
+end
+
+def svn_info(source)
+  source.untaint if Dir.chdir(RECEIVED) {Dir['*']}.include? source.chomp('/')
+  source = File.join(RECEIVED, source)
+  source += svn_at(source)
+  info = {
+    'from' =>  `svn propget email:name #{source}`.chomp,
+    'email' => `svn propget email:addr #{source}`.chomp
+  }
+
+  if info['from'].empty? and info['email'].empty?
+    log=`svn log -l 9 #{source}`
+    from=log.scan(/\nFrom: (.*)/).flatten.first
+
+    if from and from !~ /"eFax"/
+      email = from.gsub(/.*<(.*)>$/, '\1')
+      info['email'] = email if email.include?('@')
+    
+      from.gsub! /\s<.*>$/, ''
+      from.gsub! /^"(.*)"$/, '\1'
+      info['from'] = from unless from.include?('@')
+    end
+  end
+
+  info.each do |name, value| 
+    value.gsub!(/\\x[0-9a-fA-F][0-9a-fA-F]/) {|c| [c[2..3].to_i(16)].pack('C')}
+    value.force_encoding('utf-8')
+    value.force_encoding('iso-8859-1') unless value.valid_encoding?
+  end
+
+  info
+end
+
+def email(target, message)
+  pending = YAML.load(open(PENDING_YML))
+
+  require MAIL if defined?(MAIL)
+  require 'erb'
+
+  mails = []
+  pending.each do |pending_hash|
+    next unless pending_hash['email'] == target
+
+    vars = OpenStruct.new(pending_hash.map {|k,v| 
+      [k.gsub(/\W/,'_'), v.dup.untaint]
+    })
+    vars.commit_message = message
+
+    # collapse pmc and podling variable names
+    vars.pmc ||= vars.cpmc || vars.gpmc
+    vars.podling ||= vars.cpodling || vars.gpodling
+
+    # send email, if template exists
+    template = vars.doctype + '.erb'
+    template.taint unless template =~ /^\w[.\w]+$/
+    if defined?(MAIL) and File.exist?(template)
+
+      # extract fields from the Mail defaults
+      Mail.defaults do
+        vars.sig  = instance_eval {@sig.gsub(/^ +/,'').strip}
+        vars.from = instance_eval {@from}
+        vars.bcc  = instance_eval {@bcc}
+      end
+
+      # expand template
+      def vars.get_binding
+        binding
+      end
+      message = ERB.new(open(template).read.untaint).result(vars.get_binding)
+      headers = message.slice!(/\A(\w+: .*\r?\n)*(\r?\n)*/)
+
+      mail = Mail.new do
+        # apply headers
+        headers.scan(/(\w+):[ \t]*(.*)/).each do |name, value|
+          send name, value.untaint unless value.empty?
+        end
+
+        body message
+
+        # is this a reply?
+        if vars.email_id
+          in_reply_to vars.email_id
+          references  vars.email_id
+
+          # override subject?
+          if vars.email_subject and !vars.email_subject.empty?
+            if vars.email_subject =~ /^re:\s/i
+              subject vars.email_subject
+            else
+              subject 'Re: ' + vars.email_subject
+            end
+          end
+        end
+      end
+
+      # get the list of cc's as an array
+      cc = mail.cc.to_a
+
+      # eliminate the legal-archive from the cc list
+      cc.reject! {|addr| addr =~ /\blegal-archive@apache\.org\b/}
+
+      # add additional cc if email:addr != email
+      if vars.email_addr and !vars.email_addr.include?(mail.to.to_s)
+        if vars.email_name
+          cc << "#{vars.email_name.inspect} <#{vars.email_addr}>"
+        else
+          cc << vars.email_addr
+        end
+      end
+
+      # add original cc list
+      cc << vars.email_cc if vars.email_cc
+
+      # calculate podling list name
+      if vars.podling 
+        if OLDPODLINGS.include?(vars.podling) 
+          vars.podlinglist = "#{vars.podling}-private@incubator.apache.org"
+        else
+          vars.podlinglist = "private@#{vars.podling}.incubator.apache.org"
+        end
+      end
+
+      # add pmc and podling lists, if supplied
+      cc << "private@#{vars.pmc}.apache.org" if vars.pmc
+      cc << "#{vars.podlinglist}" if vars.podling
+      cc << "private@incubator.apache.org" if vars.podling and not vars.pmc
+
+      # replace the list of cc's
+      mail.cc = cc.uniq.join(', ')
+
+      # update bcc
+      if vars.email_bcc and not vars.email_bcc.empty?
+        bcc = mail.bcc.to_s.split(/,\s*/) + vars.email_bcc.to_s.split(/,\s*/)
+        mail.bcc = bcc.uniq.join(', ').untaint
+      end
+
+      # for debugging purposes
+      mails << [vars.email, mail.to_s]
+
+      # ship it!
+      mail.deliver!
+
+      completed = YAML.load(open(COMPLETED_YML)) rescue []
+      completed << pending_hash
+      open(COMPLETED_YML, 'w') {|file| file.write completed.pop(10).to_yaml}
+
+      # clean up pending list
+      pending.delete pending_hash
+
+      if pending.empty?
+        FileUtils.rm_f PENDING_YML
+      else
+        open(PENDING_YML, 'w') {|file| file.write pending.to_yaml}
+      end
+    end
+  end
+
+  html_fragment do
+    mails.each do |dest, mail|
+      _h2 "email #{dest}"
+      _pre.email mail
+    end
+  end
+end
+
+def committable
+  files = %W( #{FOUNDATION}/Correspondence/JCP/tck-nda-list.txt )
+  if defined?(MEETING)
+    files += %W(#{MEETING}/memapp-received.txt #{FOUNDATION}/members.txt)
+    files << MEETING
+    files << SUBREQ
+  end
+  files += [DOCUMENTS, OFFICERS]
+end
+
+_json do
+  if @cmd == 'svninfo'
+    _! svn_info(@source)
+  elsif @cmd == 'icla.txt issues'
+    _html check
+  elsif @cmd =~ /email (.*)/
+    _html email $1, @message
+  elsif @cmd =~ /svn (update|revert -R|cleanup)/ and committable.include? @file
+    op, file = $1.split(' '), @file
+    _html html_fragment {
+      _.system [ 'svn', *op, file ]
+    }
+  elsif @cmd =~ /svn commit/ and committable.include? @file
+    message, file = @message, @file
+    _html html_fragment {
+      _.system [
+        'svn', 'commit', '-m', message, '--no-auth-cache',
+        (['--username', $USER, '--password', $PASSWORD] if $PASSWORD),
+        file
+      ]
+    }
+  elsif @cmd =~ /ezmlm-sub/
+    message, list, email, availid = @message, @list, @email, @availid
+    _html html_fragment {
+      user = ASF::Person.find(availid)
+      vars = {
+        version: 3, # This must match http://s.apache.org/008
+        availid: availid,
+        addr: email,
+        listkey: list,
+        member_p: true,
+        chair_p: ASF.pmc_chairs.include?(user),
+      }
+
+      fn = "#{availid}-members-#{Time.now.strftime '%Y%m%d-%H%M%S-%L'}.json"
+      fn.untaint if availid =~ /^\w[-.\w]+$/
+
+      Dir.chdir SUBREQ do
+        File.open(fn, 'w') {|file| file.write JSON.pretty_generate(vars) + "\n"}
+        _.system [ 'svn', 'add', fn ]
+        _.system [
+          'svn', 'commit', '-m', message, '--no-auth-cache',
+          (['--username', $USER, '--password', $PASSWORD] if $PASSWORD),
+          fn
+        ]
+      end
+    }
+  elsif @cmd =~ /modify_unix_group/
+    cmd, group, availid = @cmd, @group, @availid
+    _html html_fragment {
+      _pre cmd, class: '_stdin'
+      ldap = ASF.init_ldap
+      ldap.bind("uid=#{$USER},ou=people,dc=apache,dc=org", $PASSWORD)
+
+      ldap.modify "cn=#{group},ou=groups,dc=apache,dc=org",
+        [LDAP.mod(LDAP::LDAP_MOD_ADD, 'memberUid', [availid])]
+
+      _pre "add member: #{ldap.err2string(ldap.err)} (#{ldap.err})",
+        class: (ldap.err == 0 ? '_stdout' : '_stderr')
+
+      ldap.unbind
+
+    }
+  else
+    cmd = @cmd
+    _html html_fragment { 
+      _pre cmd, class: '_stdin'
+      _pre 'Unauthorized command', class: '_stderr'
+    }
+  end
+end
+
+DESTINATION = {
+  "operations" => "to_operations",
+  "dup" => "deadletter/dup",
+  "incomplete" => "deadletter/incomplete",
+  "unsigned" => "deadletter/incomplete"
+}
+
+line = nil
+
+_html do
+  _head_ do
+    _title 'File Document'
+
+    if ! %w{check update commit view}.include?(@action.to_s.downcase)
+      _script 'parent.frames[0].location.reload()'
+    end
+
+    _style %{
+      html {background-color: #F8F8FF}
+      pre {font-weight: bold; margin: 0}
+      pre._stdin, pre.todo {color: #C000C0; margin-top: 1em}
+      .todo {opacity: 0.2}
+      pre._stdout {color: #000}
+      pre._hilite {color: #000; background-color: #FF0}
+      pre._stderr {color: #F00}
+      pre.email {background-color: #BDF; padding: 1em 3em}
+      pre.email {border-radius: 1em}
+      .traceback {background-color:#ff0; margin: 1em 0; padding: 1em;
+        border: 2px solid}
+      #notice {color: green}
+      .collision {background-color: #ee82ee}
+    }
+  end
+
+  _body? do
+
+    activity_log = nil
+    File.open "#{RECEIVED}/activity.yml", File::RDWR|File::CREAT, 0644 do |file|
+      file.flock File::LOCK_EX
+      activity_log = YAML.load(file.read) || []
+      activity_log.unshift({'USER' => $USER, 'time' => Time.now.utc}.
+        merge(Hash[params.map {|key,value| [key,value.first]}]))
+      activity_log.delete_at(1) if activity_log.length > 1 and
+        activity_log[1]['USER'] == $USER and 
+        activity_log[1]['action'] == 'update'
+      file.rewind
+      file.write YAML.dump(activity_log[0...5])
+      file.flush
+      file.truncate file.pos
+    end
+
+    filename = [@filename, @cfilename, @gfilename, @mfilename, @nfilename].
+      find {|name| name and not name.empty?}
+    filename.untaint if filename and filename =~ /^[-.\w]+/
+    doctype = (@doctype == 'mem' ? 'member_apps' : @doctype.to_s+'s')
+    doctype.untaint if doctype =~ /^\w+$/
+    dest = File.join(DOCUMENTS, doctype, filename.to_s)
+    stem = ";#{filename.sub(/\.\w+$/,'').split('/').first}" if filename
+    alax = false
+    if @source and Dir.chdir(RECEIVED) {Dir['*']}.include? @source.chomp('/')
+      @source.untaint
+    end
+
+    unless %w(clr rubys jcarman sanders mnour).include? $USER
+      @action = 'welcome' unless @action == 'view'
+    end
+
+    case (@action || @doctype).to_s.downcase
+    when 'welcome'
+      _h1 "Welcome!"
+      _p "This tools is for the Secretarial's team use only."
+      _p %{
+        Feel free to look around, but none of your actions will cause any
+        files to be moved, updated, or any emails to be sent.
+      }
+
+    when 'icla'
+      if @replaces != ''
+        remove_id, remove_email = @replaces.strip.split(':',2)
+      else
+        remove_id, remove_email = 'notinavail', nil
+      end
+
+      insert = [
+        remove_id, 
+        @realname.strip, 
+        @pubname.strip, 
+        @email.strip, 
+        "Signed CLA#{stem}\n"
+      ].join(':')
+
+      Dir.chdir(OFFICERS) do
+        input = open('iclas.txt') {|file| file.to_a}
+        open('iclas.txt','w') do |file|
+          input.each do |line|
+            if insert and ASF::ICLA.lname(line) >= ASF::ICLA.lname(insert)
+              if insert.split(':',2).last != line.split(':',2).last
+                file.print insert
+              end
+              insert = nil
+            end
+            fields = line.split(':')
+            next if fields[0] == remove_id and fields[3] == remove_email
+            file.print line
+          end
+          file.print insert if insert
+        end
+
+        _h1 @pubname
+        if @source=~/[^\x00-\x7F]/ and RUBY_PLATFORM=~/darwin/i
+          require 'unicode'
+          @source = Unicode.normalize_KC(@source)
+        end
+        _.move @source, dest
+        _.system "svn diff iclas.txt", hilite: @pubname
+      end
+
+      update_pending params, dest
+
+    when 'grant'
+      insert = "#{@from.strip}" +
+        "\n  file: #{dest.split('/').last}" +
+        "\n  for: #{@description.strip.gsub(/\r?\n\s*/,"\n       ")}"
+
+      Dir.chdir(OFFICERS) do
+        input = open('grants.txt') {|file| file.read}
+        marker = "\n# registering.  documents on way to Secretary.\n"
+        input = input.split(marker).insert(1,"\n#{insert}\n",marker)
+        open('grants.txt','w') do |file|
+          file.write(input.join)
+        end
+
+        _h1 "Grant"
+        _.move @source, dest
+        _.system "svn diff grants.txt", hilite: insert.split("\n")
+      end
+
+      update_pending params, dest
+
+    when 'ccla'
+      insert = "notinavail:" + @company.strip
+       
+      unless @contact.empty?
+        insert += " - #{@contact.strip}"
+      end
+
+      insert += ":#{@cemail.strip}:Signed Corp CLA"
+
+      unless @employees.empty?
+        insert += " for #{@employees.strip.gsub(/\s*\n\s*/, ', ')}"
+      end
+
+      unless @product.empty?
+        insert += " for #{@product.strip}"
+      end
+
+      Dir.chdir(OFFICERS) do
+        open('cclas.txt','a') {|file| file.write(insert+"\n")}
+
+        _h1 @pubname
+        _.move @source, dest
+        _.system "svn diff cclas.txt", hilite: insert
+      end
+
+      update_pending params, dest
+
+    when 'nda'
+      @realname ||= @nname
+
+      _h1 "NDA for #{@realname}"
+      _.move @source, dest
+
+      Dir.chdir(FOUNDATION) do
+        ndalist = "Correspondence/JCP/tck-nda-list.txt"
+        _.system "svn update #{ndalist}"
+        text = open(ndalist).read
+        open(ndalist, 'w') do |fh|
+          fh.write(text)
+          line = "#{@nname.ljust(20)} #{@nid.ljust(13)} "
+          line += Date.today.strftime("%Y/%m/%d    ")
+          line += `id -un`.chomp.ljust(10) + ' No TCK access yet'
+          fh.write("#{line}\n")
+        end
+        _.system "svn diff #{ndalist}", hilite: @nid
+      end
+
+      update_pending params, dest
+
+    when 'mem'
+      @realname ||= @mfname
+      dest.untaint if dest =~ /^[-.\w]+$/
+
+      _h1 "Membership Application for #{@realname}"
+      _.move @source, dest
+
+      if defined?(MEETING)
+        _.system "svn update #{MEETING}"
+        received = open("#{MEETING}/memapp-received.txt").read
+        begin
+          received[/(no )\s+\w+\s+\w+\s+#{@mavailid}/,1] = 'yes'
+          received[/(no )\s+\w+\s+#{@mavailid}/,1] = 'yes'
+          received[/(no )\s+#{@mavailid}/,1] = 'yes'
+        rescue
+          _pre.stderr $!
+        end
+        open("#{MEETING}/memapp-received.txt", 'w') do |fh| 
+          fh.write(received)
+        end
+        _.system "svn diff #{MEETING}/memapp-received.txt", hilite: @mavailid
+      end
+
+      _.system "svn update #{FOUNDATION}/members.txt"
+      pattern = /^Active.*?^=+\n+(.*?)^Emeritus/m
+      members_txt = open("#{FOUNDATION}/members.txt").read
+      data = members_txt.scan(pattern).flatten.first
+      members = data.split(/^\s+\*\)\s+/)
+      members.shift
+
+      members.push [
+        "#{@mfname}",
+        "#{@maddr.gsub(/^/,'    ').gsub(/\r/,'')}",
+        ("    #{@mcountry}"     unless @mcountry.empty?),
+        "    Email: #{@memail}",
+        ("      Tel: #{@mtele}" unless @mtele.empty?),
+        ("      Fax: #{@mfax}"  unless @mfax.empty?),
+        " Forms on File: ASF Membership Application",
+        " Avail ID: #{@mavailid}"
+      ].compact.join("\n") + "\n"
+
+      sorted = members.sort_by {|member| lname(member.split("\n").first)}
+      members_txt[pattern,1] = " *) " + sorted.join("\n *) ")
+      members_txt[/We now number (\d+) active members\./,1] = 
+        members.length.to_s
+      open("#{FOUNDATION}/members.txt",'w') {|fh| fh.write(members_txt)}
+
+      _.system "svn diff #{FOUNDATION}/members.txt"
+
+      update_pending params, dest
+
+    when 'staple'
+      _h1 'Staple'
+      Dir.chdir(RECEIVED) do
+        @source.sub! /\/$/, ''
+        @source.untaint if Dir['*'].include? @source
+        selected = params.keys.grep(/include\d+/)
+        selected.map! {|key| "#{@source}/#{params[key].first}"}
+        selected=Dir["#{@source}/*"] if selected.empty?
+        cleanup = []
+
+        # convert to pdf, if necessary
+        sources = []
+        selected.sort.each do |file|
+          file.untaint if Dir["#{@source}/*"].include? file
+          ext = file.split('.').last
+          if ext.downcase == 'pdf'
+            sources << file
+          else
+            cleanup << file.sub(Regexp.new(ext+'$'),'pdf').sub(' ', '_')
+            sources << cleanup.last
+            _.system(['convert', file, cleanup.last])
+          end
+        end
+
+        dest,i = @source,0
+        dest = @source + (i+=1).to_s while File.exist?("#{dest}.pdf")
+        at = svn_at(@source)
+
+        # concatenate sources
+        if sources.length > 1
+          _.system "pdftk #{sources.sort.join(' ')} cat output #{dest}.pdf"
+          _.system "svn add #{dest}.pdf#{at}"
+        elsif selected.first =~ /\.pdf$/i
+          _.system "svn mv #{sources.first}#{at} #{dest}.pdf"
+        else
+          _.system "mv #{cleanup.shift} #{dest}.pdf"
+          _.system "svn add #{dest}.pdf#{at}"
+        end
+
+        # copy properties
+        sfx = at
+        `svn proplist #{@source}#{sfx}`.scan(/  \w+:[-\w]+/).each do |prop|
+          prop.untaint if prop.strip =~ /^\w+(:\w+)/
+          value = `svn propget #{prop} #{@source}#{sfx}`.chomp
+          _.system(['svn', 'propset', prop.strip, value, "#{dest}.pdf#{at}"])
+        end
+        _.system "svn propset svn:mime-type application/pdf #{dest}.pdf#{at}"
+
+        # remove temporary file and source directory
+        _.system "rm #{cleanup.join(' ')}" unless cleanup.empty?
+        if not (Dir["#{@source}/*"]-selected).empty?
+          selected.each do |file| 
+            if `svn st #{file}` !~ /^D/ and File.exist? file
+              _.system "svn rm --force #{file}" 
+            end
+          end
+          if Dir["#{@source}/*"].empty?
+            _.system "svn remove --force #{@source}#{at}"
+          end
+        elsif `svn st #{@source}#{at}` !~ /^D/ and File.exist? @source
+          _.system "svn remove --force #{@source}#{at}"
+        end
+      end
+
+    when 'cleanup'
+      _h1 'Revert all and cleanup'
+
+      committable.each do |file|
+        status = `svn status #{file}`
+        unless status.empty?
+          status.scan(/^[?A]\s*\+?\s*(.*)/).flatten.each do |uncommitted|
+            _.system ['rm', '-rf', uncommitted]
+          end
+          if status =~ /^\w/
+            _pre.todo "svn revert -R #{file}", 'data-file' => file
+          end
+        end
+
+        if File.directory? file
+           _pre.todo "svn cleanup #{file}", 'data-file' => file
+        end
+      end
+
+      if File.exist?(PENDING_YML)
+        _.system "rm #{PENDING_YML}"
+      end
+
+      ajax=true
+
+    when 'commit'
+      _h1 'Commit'
+      log = Escape.shell_single_word(@message)
+      committable.each do |file|
+        unless `svn status #{file}`.empty?
+          _pre.todo "svn commit -m #{log} #{file}",
+            'data-message' => @message, 'data-file' => file
+        end
+      end
+
+      if File.exist?(PENDING_YML)
+        pending = YAML.load(open(PENDING_YML))
+
+        pending.each do |vars|
+          if vars['memail'] and vars['mfilename']
+            _pre.todo "ezmlm-sub lists/apache.org/members/ #{vars['memail']}",
+              'data-list' => 'members', 'data-email' => vars['memail'],
+              'data-availid' => vars['mavailid'], 'data-message' => @message
+          end
+
+          if vars['mavailid'] and vars['mfilename']
+            _pre.todo "modify_unix_group.pl member --add=#{vars['mavailid']}",
+              'data-group' => 'member', 'data-availid' => vars['mavailid']
+          end
+
+          _h2.todo "email #{vars['email']}", 'data-message' => @message
+        end
+      end
+
+      ajax = true
+
+    when 'other'
+      at = svn_at(@source)
+      Dir.chdir(RECEIVED) do
+        if @dest == 'burst'
+          _h1 'Burst'
+          dest = @source.sub(/\.\w+$/,'')
+
+          _.system "mkdir #{dest}"
+          _.system "pdftk #{@source} burst output #{dest}/%02d.pdf"
+          _.system "svn add #{dest}#{at}"
+          # copy properties
+          `svn proplist #{@source}#{at}`.scan(/ \w+:[-\w]+/).each do |prop|
+             prop.untaint if prop.strip =~ /^\w+(:\w+)/
+             next if prop.strip == 'svn:mime-type'
+             value = `svn propget #{prop} #{@source}#{at}`.chomp
+             _.system ['svn', 'propset', prop.strip, value, dest+at]
+          end
+          _.system "rm doc_data.txt" if File.exist? 'doc_data.txt'
+          _.system "svn rm #{@source}#{at}"
+        elsif @dest == 'flip'
+          _h1 'Flip'
+          _.system "pdftk #{@source} cat 1-endS output #{@source}.tmp"
+          _.system "mv #{@source}.tmp #{@source}"
+        elsif @dest == 'restore'
+          _h1 'Restore'
+          _.system "pdftk #{@source} cat 1-endN output #{@source}.tmp"
+          _.system "mv #{@source}.tmp #{@source}"
+        elsif @dest == 'rotate right'
+          _h1 'Rotate Right'
+          _.system "pdftk #{@source} cat 1-endE output #{@source}.tmp"
+          _.system "mv #{@source}.tmp #{@source}"
+        elsif @dest == 'rotate left'
+          _h1 'Rotate Left'
+          _.system "pdftk #{@source} cat 1-endW output #{@source}.tmp"
+          _.system "mv #{@source}.tmp #{@source}"
+        elsif @dest == 'junk'
+          _.system(['svn', 'rm', '--force', "#{@source}#{at}"])
+        elsif DESTINATION.include? @dest
+          _.move @source, DESTINATION[@dest]
+        else
+          _pre.stderr "Unknown destination: #{@dest}"
+        end
+      end
+
+    when 'update'
+      _h1 'Update'
+      _pre.todo "svn update #{OFFICERS}",  'data-file' => OFFICERS
+      _pre.todo "svn update #{DOCUMENTS}", 'data-file' => DOCUMENTS
+      if defined? MEETING
+        _pre.todo "svn update #{MEETING}", 'data-file' => MEETING
+        _pre.todo "svn update #{SUBREQ}", 'data-file' => SUBREQ
+      end
+      _h3.todo 'icla.txt issues'
+      ajax = true
+      cleanup = Dir["#{DOCUMENTS}/members/received/*"].map(&:untaint).
+        select {|name| File.directory?(name) and Dir["#{name}/*"].empty?}.
+        reject {|name| name =~ /\/to_\w+$/}
+      unless cleanup.empty?
+        _h2 'Empty directories'
+        _ul do
+          cleanup.each { |name| _li name }
+        end
+      end
+
+      _h2 'Recent Activity'
+      _table border: 1, cellpadding: 5, cellspacing: 0 do
+        _thead_ do
+          _tr do
+            _th 'Time'
+            _th 'User'
+            _th 'Action'
+          end
+        end
+
+        cleanup = {
+          icla: %w( realname email ),
+          ccla: %w( cemail contact ),
+          nda: %w( nname nemail nid ),
+          mem: %w( memail ),
+          grant: %w( gname gemail ),
+        } 
+
+        _tbody do
+          activity_log[1..-1].each do |entry|
+            collision = (entry['USER'] != $USER)
+            collision &&= (Time.now-entry['time'] < 600)
+
+            keep = cleanup[entry['doctype']] || []
+            (cleanup.values.flatten - keep).each { |var| entry.delete(var) }
+
+            _tr_ class: ('collision' if collision) do
+              _td! do
+                 time = entry.delete('time')
+                 _time time, datetime: time.utc.iso8601
+              end
+              _td entry.delete('USER')
+
+              entry.delete_if {|name, value| value.empty?}
+              title = entry.map {|n, v| "#{n}: #{v.inspect}"}.join(', ')
+
+              name = entry['action'] || entry['doctype']
+              name = entry['dest'] if name == 'other'
+              _td name.to_s.downcase, title: title
+            end
+          end
+        end
+      end
+
+    when 'view'
+      files = nil
+      Dir.chdir(RECEIVED) do
+	if Dir['*'].include? @dir.chomp('/')
+	  files = Dir["#{@dir.untaint.chomp('/')}/*"].map(&:untaint).sort
+        else
+	  files = []
+        end
+
+	if files.length == 2
+	  verify = nil
+
+	  if files.first.end_with? '.sig' or files.first.end_with? '.asc'
+	    unless files.last.end_with? '.sig' or files.last.end_with? '.asc'
+	      verify = files
+            end
+	  elsif files.last.end_with? '.sig' or files.last.end_with? '.asc'
+	    verify = files.reverse
+	  end
+
+	  if verify
+	    stderr2out = { class: {stderr: '_stdout'} }
+	    _.system ['gpg', '--verify', *verify], stderr2out
+            if _.target!.include? "gpg: Can't check signature: public key not found"
+              keyid = _.target![/[RD]SA key ID (\w+)/,1]
+              if keyid
+	        _.system ['gpg', '--keyserver', 'pgpkeys.mit.edu',
+		  '--recv-keys', keyid], stderr2out
+	        _.system ['gpg', '--verify', *verify], stderr2out
+              end
+            end
+	  end
+	end
+      end
+
+      _form.buttons target: 'viewport', action: 'file.cgi', method: 'post' do
+        _ul style: 'list-style: none; padding: 0' do
+          files.each_with_index do |line,i|
+            file = line.split('/').last
+            _li do
+              _input type: :checkbox, name: "include#{i}", value: file
+              if %w(jpg).include?(file.split('.').last)
+                _img src: "/members/received/#{@dir}/#{file}"
+              else
+                _a file, href: "/members/received/#{@dir}/#{file}"
+              end
+            end
+          end
+        end
+
+        _input name: 'source', id: 'source', type: 'hidden', value: @dir
+
+        if files.length > 0
+          _input type: 'submit', name: 'action', value: 'Staple'
+        else
+          file = "#{RECEIVED}/#{@dir}"
+	  stderr2out = { class: {stderr: '_stdout'} }
+	  _.system ['gpg', '--verify', file], stderr2out
+          if _.target!.include? "gpg: Can't check signature: public key not found"
+            keyid = _.target![/[RD]SA key ID (\w+)/,1]
+            if keyid
+	      _.system ['gpg', '--keyserver', 'pgpkeys.mit.edu',
+		'--recv-keys', keyid], stderr2out
+	      _.system ['gpg', '--verify', file], stderr2out
+            end
+          end
+          open(file) {|fh| _pre fh.read} 
+        end
+
+        _script src: "jquery-1.7.2.min.js"
+        _script %{
+          // first, check all of the checkboxes
+          $('input[type=checkbox]').attr('checked', 'checked');
+
+          // on click, unclick all if all are checked.
+          $('input[type=checkbox]').mousedown(function() {
+            if (!$('input[type=checkbox]:not(:checked)').length) {
+              $('input[type=checkbox]').removeAttr('checked');
+            }
+          });
+        }
+      end
+
+    when 'cancel', 'check'
+      _h1 @action
+      check
+  
+    when 'edit cc'
+      _h1 @action
+
+      if File.exist?(PENDING_YML)
+        pending = YAML.load(open(PENDING_YML))
+
+        if @email
+          pending.each do |vars|
+            if vars['email'] == @email
+              vars['email:cc'] = @cc.strip.gsub(/\r?\n/, ", ") 
+              vars['email:bcc'] = @bcc.strip.gsub(/\r?\n/, ", ") 
+              vars.delete('email:bcc') if vars['email:bcc'].empty?
+
+              open(PENDING_YML, 'w') {|file| file.write pending.to_yaml}
+              _p.notice! "cc list for #{@email} updated"
+            end
+          end
+        end
+
+        pending.each do |vars|
+          vars = OpenStruct.new(vars.map {|k,v| [k.gsub(/\W/,'_'),v]})
+          _h2 "email #{vars.email}"
+          _form do
+            _input name: 'email', value: vars.email, type: 'hidden'
+            _table do
+              _tr do
+                _td 'cc:'
+                _td do
+                  _textarea vars.email_cc.to_s.gsub(/,\s+/,"\n"),
+                    name: 'cc', cols: 60
+                end
+              end
+              _tr do
+                _td 'bcc:'
+                _td do
+                  _textarea vars.email_bcc.to_s.gsub(/,\s+/,"\n"),
+                    name: 'bcc', cols: 60
+                end
+              end
+            end
+            _input type: 'hidden', name: 'action', value: @action
+            _input type: 'submit', value: 'Update'
+          end
+        end
+      end
+  
+    else
+      _h2 'Unsupported action'
+      _table border: 1, cellpadding: 10, cellspacing: 0 do
+        params.sort.each do |key, value|
+          _tr do
+            _td key
+            _td value
+          end
+        end
+      end
+    end
+
+    if ajax
+      _script src: 'jquery-1.7.2.min.js'
+
+      if @action == 'update'
+        _script src: 'jquery.timeago.js'
+        _script "$('time').timeago()"
+      end
+
+      _script %{
+        function execute_todos() {
+          var todo = $('.todo:first');
+          if (todo.length == 1) {
+            // add a spinner
+            var spinner = $('<img src="spinner.gif"/>');
+            todo.after(spinner);
+
+            // params = cmd plus all of the data-* attributes
+            var params = {cmd: todo.text()};
+            for (var i=0; i<todo[0].attributes.length; i++) {
+              var attr = todo[0].attributes[i];
+              if (attr.name.match("^data-")) {
+                params[attr.name.substr(5)] = attr.value;
+              }
+            }
+
+            // issue request
+            $.post(#{ENV['SCRIPT_NAME'].inspect}, params, function(response) {
+              var replacement = $(response.html);
+              if (replacement.length > 0) todo.replaceWith(replacement);
+              if (replacement.filter('._stderr,._traceback').length > 0) {
+                if (!confirm("Error detected.  Continue?")) return;
+              }
+              execute_todos();
+            }, 'json').done(function(data, textStatus, jqXHR) {
+              if (data.toString() == '') {
+                var replacement = $(
+                  '<pre class="_stdin">' + params.cmd + '</pre>' +
+                  '<pre class="_stderr"><em>no response</em></pre>'
+                );
+                todo.replaceWith(replacement);
+                alert("Error detected.  Processing terminated.");
+              }
+            }).fail(function(jqXHR, textStatus, errorThrown) {
+              if (errorThrown == '') errorThrown = 'no response';
+              var replacement = $(
+                '<pre class="_stdin">' + params.cmd + '</pre>' +
+                '<pre class="_stderr">' + textStatus+': '+errorThrown + '</pre>'
+              );
+              todo.replaceWith(replacement);
+              if (!confirm("Error detected.  Continue?")) return;
+              execute_todos();
+            }).always(function() {
+              spinner.remove();
+            });
+          } else {
+            parent.frames[0].location.reload();
+          }
+        }
+        execute_todos();
+      }
+    end
+  end
+end
diff --git a/www/secretary/workbench/grant.erb b/www/secretary/workbench/grant.erb
new file mode 100644
index 0000000..4f91d0f
--- /dev/null
+++ b/www/secretary/workbench/grant.erb
@@ -0,0 +1,13 @@
+to:   <%= gname.inspect %> <<%= gemail %>>
+from: <%= from %>
+cc:   secretary@apache.org
+bcc:  <%= bcc %>
+subject: Your Grant sent to Apache Secretary
+
+Dear <%= gname %>,
+
+This message acknowledges receipt of the following document, which has been filed in the Apache Software Foundation records:
+
+  <%= commit_message %>
+
+<%= sig %>
diff --git a/www/secretary/workbench/icla.erb b/www/secretary/workbench/icla.erb
new file mode 100644
index 0000000..d317ec5
--- /dev/null
+++ b/www/secretary/workbench/icla.erb
@@ -0,0 +1,16 @@
+to:   <%= pubname.inspect %> <<%= email %>>
+from: <%= from %>
+cc:   secretary@apache.org
+bcc:  <%= bcc %>
+subject: Your ICLA sent to Apache Secretary
+
+Dear <%= pubname %>,
+
+This message acknowledges receipt of your ICLA, which has been filed in the Apache Software Foundation records.
+
+If you have been invited as a committer, please advise the project PMC that your ICLA has been filed.
+
+Warm Regards,
+
+<%= sig %>
+
diff --git a/www/secretary/workbench/index.html b/www/secretary/workbench/index.html
new file mode 100644
index 0000000..f82a156
--- /dev/null
+++ b/www/secretary/workbench/index.html
@@ -0,0 +1,10 @@
+<!DOCTYPE html>
+<html xmlns="http://www.w3.org/1999/xhtml">
+  <head>
+    <title>ASF Secretary-Assistant Workbench</title>
+  </head>
+  <frameset cols="20%, 60%">
+    <frame src="worklist.cgi"/>
+    <frame name="viewport"/>
+  </frameset>
+</html>
diff --git a/www/secretary/workbench/jquery-1.7.2.min.js b/www/secretary/workbench/jquery-1.7.2.min.js
new file mode 100644
index 0000000..16ad06c
--- /dev/null
+++ b/www/secretary/workbench/jquery-1.7.2.min.js
@@ -0,0 +1,4 @@
+/*! jQuery v1.7.2 jquery.com | jquery.org/license */
+(function(a,b){function cy(a){return f.isWindow(a)?a:a.nodeType===9?a.defaultView||a.parentWindow:!1}function cu(a){if(!cj[a]){var b=c.body,d=f("<"+a+">").appendTo(b),e=d.css("display");d.remove();if(e==="none"||e===""){ck||(ck=c.createElement("iframe"),ck.frameBorder=ck.width=ck.height=0),b.appendChild(ck);if(!cl||!ck.createElement)cl=(ck.contentWindow||ck.contentDocument).document,cl.write((f.support.boxModel?"<!doctype html>":"")+"<html><body>"),cl.close();d=cl.createElement(a),cl.body.appendChild(d),e=f.css(d,"display"),b.removeChild(ck)}cj[a]=e}return cj[a]}function ct(a,b){var c={};f.each(cp.concat.apply([],cp.slice(0,b)),function(){c[this]=a});return c}function cs(){cq=b}function cr(){setTimeout(cs,0);return cq=f.now()}function ci(){try{return new a.ActiveXObject("Microsoft.XMLHTTP")}catch(b){}}function ch(){try{return new a.XMLHttpRequest}catch(b){}}function cb(a,c){a.dataFilter&&(c=a.dataFilter(c,a.dataType));var d=a.dataTypes,e={},g,h,i=d.length,j,k=d[0],l,m,n,o,p;for(g=1;
 g<i;g++){if(g===1)for(h in a.converters)typeof h=="string"&&(e[h.toLowerCase()]=a.converters[h]);l=k,k=d[g];if(k==="*")k=l;else if(l!=="*"&&l!==k){m=l+" "+k,n=e[m]||e["* "+k];if(!n){p=b;for(o in e){j=o.split(" ");if(j[0]===l||j[0]==="*"){p=e[j[1]+" "+k];if(p){o=e[o],o===!0?n=p:p===!0&&(n=o);break}}}}!n&&!p&&f.error("No conversion from "+m.replace(" "," to ")),n!==!0&&(c=n?n(c):p(o(c)))}}return c}function ca(a,c,d){var e=a.contents,f=a.dataTypes,g=a.responseFields,h,i,j,k;for(i in g)i in d&&(c[g[i]]=d[i]);while(f[0]==="*")f.shift(),h===b&&(h=a.mimeType||c.getResponseHeader("content-type"));if(h)for(i in e)if(e[i]&&e[i].test(h)){f.unshift(i);break}if(f[0]in d)j=f[0];else{for(i in d){if(!f[0]||a.converters[i+" "+f[0]]){j=i;break}k||(k=i)}j=j||k}if(j){j!==f[0]&&f.unshift(j);return d[j]}}function b_(a,b,c,d){if(f.isArray(b))f.each(b,function(b,e){c||bD.test(a)?d(a,e):b_(a+"["+(typeof e=="object"?b:"")+"]",e,c,d)});else if(!c&&f.type(b)==="object")for(var e in b)b_(a+"["+e+"]",b[e],c,d);e
 lse d(a,b)}function b$(a,c){var d,e,g=f.ajaxSettings.flatOptions||{};for(d in c)c[d]!==b&&((g[d]?a:e||(e={}))[d]=c[d]);e&&f.extend(!0,a,e)}function bZ(a,c,d,e,f,g){f=f||c.dataTypes[0],g=g||{},g[f]=!0;var h=a[f],i=0,j=h?h.length:0,k=a===bS,l;for(;i<j&&(k||!l);i++)l=h[i](c,d,e),typeof l=="string"&&(!k||g[l]?l=b:(c.dataTypes.unshift(l),l=bZ(a,c,d,e,l,g)));(k||!l)&&!g["*"]&&(l=bZ(a,c,d,e,"*",g));return l}function bY(a){return function(b,c){typeof b!="string"&&(c=b,b="*");if(f.isFunction(c)){var d=b.toLowerCase().split(bO),e=0,g=d.length,h,i,j;for(;e<g;e++)h=d[e],j=/^\+/.test(h),j&&(h=h.substr(1)||"*"),i=a[h]=a[h]||[],i[j?"unshift":"push"](c)}}}function bB(a,b,c){var d=b==="width"?a.offsetWidth:a.offsetHeight,e=b==="width"?1:0,g=4;if(d>0){if(c!=="border")for(;e<g;e+=2)c||(d-=parseFloat(f.css(a,"padding"+bx[e]))||0),c==="margin"?d+=parseFloat(f.css(a,c+bx[e]))||0:d-=parseFloat(f.css(a,"border"+bx[e]+"Width"))||0;return d+"px"}d=by(a,b);if(d<0||d==null)d=a.style[b];if(bt.test(d))return d;d
 =parseFloat(d)||0;if(c)for(;e<g;e+=2)d+=parseFloat(f.css(a,"padding"+bx[e]))||0,c!=="padding"&&(d+=parseFloat(f.css(a,"border"+bx[e]+"Width"))||0),c==="margin"&&(d+=parseFloat(f.css(a,c+bx[e]))||0);return d+"px"}function bo(a){var b=c.createElement("div");bh.appendChild(b),b.innerHTML=a.outerHTML;return b.firstChild}function bn(a){var b=(a.nodeName||"").toLowerCase();b==="input"?bm(a):b!=="script"&&typeof a.getElementsByTagName!="undefined"&&f.grep(a.getElementsByTagName("input"),bm)}function bm(a){if(a.type==="checkbox"||a.type==="radio")a.defaultChecked=a.checked}function bl(a){return typeof a.getElementsByTagName!="undefined"?a.getElementsByTagName("*"):typeof a.querySelectorAll!="undefined"?a.querySelectorAll("*"):[]}function bk(a,b){var c;b.nodeType===1&&(b.clearAttributes&&b.clearAttributes(),b.mergeAttributes&&b.mergeAttributes(a),c=b.nodeName.toLowerCase(),c==="object"?b.outerHTML=a.outerHTML:c!=="input"||a.type!=="checkbox"&&a.type!=="radio"?c==="option"?b.selected=a.defaul
 tSelected:c==="input"||c==="textarea"?b.defaultValue=a.defaultValue:c==="script"&&b.text!==a.text&&(b.text=a.text):(a.checked&&(b.defaultChecked=b.checked=a.checked),b.value!==a.value&&(b.value=a.value)),b.removeAttribute(f.expando),b.removeAttribute("_submit_attached"),b.removeAttribute("_change_attached"))}function bj(a,b){if(b.nodeType===1&&!!f.hasData(a)){var c,d,e,g=f._data(a),h=f._data(b,g),i=g.events;if(i){delete h.handle,h.events={};for(c in i)for(d=0,e=i[c].length;d<e;d++)f.event.add(b,c,i[c][d])}h.data&&(h.data=f.extend({},h.data))}}function bi(a,b){return f.nodeName(a,"table")?a.getElementsByTagName("tbody")[0]||a.appendChild(a.ownerDocument.createElement("tbody")):a}function U(a){var b=V.split("|"),c=a.createDocumentFragment();if(c.createElement)while(b.length)c.createElement(b.pop());return c}function T(a,b,c){b=b||0;if(f.isFunction(b))return f.grep(a,function(a,d){var e=!!b.call(a,d,a);return e===c});if(b.nodeType)return f.grep(a,function(a,d){return a===b===c});if(typ
 eof b=="string"){var d=f.grep(a,function(a){return a.nodeType===1});if(O.test(b))return f.filter(b,d,!c);b=f.filter(b,d)}return f.grep(a,function(a,d){return f.inArray(a,b)>=0===c})}function S(a){return!a||!a.parentNode||a.parentNode.nodeType===11}function K(){return!0}function J(){return!1}function n(a,b,c){var d=b+"defer",e=b+"queue",g=b+"mark",h=f._data(a,d);h&&(c==="queue"||!f._data(a,e))&&(c==="mark"||!f._data(a,g))&&setTimeout(function(){!f._data(a,e)&&!f._data(a,g)&&(f.removeData(a,d,!0),h.fire())},0)}function m(a){for(var b in a){if(b==="data"&&f.isEmptyObject(a[b]))continue;if(b!=="toJSON")return!1}return!0}function l(a,c,d){if(d===b&&a.nodeType===1){var e="data-"+c.replace(k,"-$1").toLowerCase();d=a.getAttribute(e);if(typeof d=="string"){try{d=d==="true"?!0:d==="false"?!1:d==="null"?null:f.isNumeric(d)?+d:j.test(d)?f.parseJSON(d):d}catch(g){}f.data(a,c,d)}else d=b}return d}function h(a){var b=g[a]={},c,d;a=a.split(/\s+/);for(c=0,d=a.length;c<d;c++)b[a[c]]=!0;return b}var c
 =a.document,d=a.navigator,e=a.location,f=function(){function J(){if(!e.isReady){try{c.documentElement.doScroll("left")}catch(a){setTimeout(J,1);return}e.ready()}}var e=function(a,b){return new e.fn.init(a,b,h)},f=a.jQuery,g=a.$,h,i=/^(?:[^#<]*(<[\w\W]+>)[^>]*$|#([\w\-]*)$)/,j=/\S/,k=/^\s+/,l=/\s+$/,m=/^<(\w+)\s*\/?>(?:<\/\1>)?$/,n=/^[\],:{}\s]*$/,o=/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g,p=/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,q=/(?:^|:|,)(?:\s*\[)+/g,r=/(webkit)[ \/]([\w.]+)/,s=/(opera)(?:.*version)?[ \/]([\w.]+)/,t=/(msie) ([\w.]+)/,u=/(mozilla)(?:.*? rv:([\w.]+))?/,v=/-([a-z]|[0-9])/ig,w=/^-ms-/,x=function(a,b){return(b+"").toUpperCase()},y=d.userAgent,z,A,B,C=Object.prototype.toString,D=Object.prototype.hasOwnProperty,E=Array.prototype.push,F=Array.prototype.slice,G=String.prototype.trim,H=Array.prototype.indexOf,I={};e.fn=e.prototype={constructor:e,init:function(a,d,f){var g,h,j,k;if(!a)return this;if(a.nodeType){this.context=this[0]=a,this.length=1;r
 eturn this}if(a==="body"&&!d&&c.body){this.context=c,this[0]=c.body,this.selector=a,this.length=1;return this}if(typeof a=="string"){a.charAt(0)!=="<"||a.charAt(a.length-1)!==">"||a.length<3?g=i.exec(a):g=[null,a,null];if(g&&(g[1]||!d)){if(g[1]){d=d instanceof e?d[0]:d,k=d?d.ownerDocument||d:c,j=m.exec(a),j?e.isPlainObject(d)?(a=[c.createElement(j[1])],e.fn.attr.call(a,d,!0)):a=[k.createElement(j[1])]:(j=e.buildFragment([g[1]],[k]),a=(j.cacheable?e.clone(j.fragment):j.fragment).childNodes);return e.merge(this,a)}h=c.getElementById(g[2]);if(h&&h.parentNode){if(h.id!==g[2])return f.find(a);this.length=1,this[0]=h}this.context=c,this.selector=a;return this}return!d||d.jquery?(d||f).find(a):this.constructor(d).find(a)}if(e.isFunction(a))return f.ready(a);a.selector!==b&&(this.selector=a.selector,this.context=a.context);return e.makeArray(a,this)},selector:"",jquery:"1.7.2",length:0,size:function(){return this.length},toArray:function(){return F.call(this,0)},get:function(a){return a==nu
 ll?this.toArray():a<0?this[this.length+a]:this[a]},pushStack:function(a,b,c){var d=this.constructor();e.isArray(a)?E.apply(d,a):e.merge(d,a),d.prevObject=this,d.context=this.context,b==="find"?d.selector=this.selector+(this.selector?" ":"")+c:b&&(d.selector=this.selector+"."+b+"("+c+")");return d},each:function(a,b){return e.each(this,a,b)},ready:function(a){e.bindReady(),A.add(a);return this},eq:function(a){a=+a;return a===-1?this.slice(a):this.slice(a,a+1)},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},slice:function(){return this.pushStack(F.apply(this,arguments),"slice",F.call(arguments).join(","))},map:function(a){return this.pushStack(e.map(this,function(b,c){return a.call(b,c,b)}))},end:function(){return this.prevObject||this.constructor(null)},push:E,sort:[].sort,splice:[].splice},e.fn.init.prototype=e.fn,e.extend=e.fn.extend=function(){var a,c,d,f,g,h,i=arguments[0]||{},j=1,k=arguments.length,l=!1;typeof i=="boolean"&&(l=i,i=arguments[1]||{},j=2),t
 ypeof i!="object"&&!e.isFunction(i)&&(i={}),k===j&&(i=this,--j);for(;j<k;j++)if((a=arguments[j])!=null)for(c in a){d=i[c],f=a[c];if(i===f)continue;l&&f&&(e.isPlainObject(f)||(g=e.isArray(f)))?(g?(g=!1,h=d&&e.isArray(d)?d:[]):h=d&&e.isPlainObject(d)?d:{},i[c]=e.extend(l,h,f)):f!==b&&(i[c]=f)}return i},e.extend({noConflict:function(b){a.$===e&&(a.$=g),b&&a.jQuery===e&&(a.jQuery=f);return e},isReady:!1,readyWait:1,holdReady:function(a){a?e.readyWait++:e.ready(!0)},ready:function(a){if(a===!0&&!--e.readyWait||a!==!0&&!e.isReady){if(!c.body)return setTimeout(e.ready,1);e.isReady=!0;if(a!==!0&&--e.readyWait>0)return;A.fireWith(c,[e]),e.fn.trigger&&e(c).trigger("ready").off("ready")}},bindReady:function(){if(!A){A=e.Callbacks("once memory");if(c.readyState==="complete")return setTimeout(e.ready,1);if(c.addEventListener)c.addEventListener("DOMContentLoaded",B,!1),a.addEventListener("load",e.ready,!1);else if(c.attachEvent){c.attachEvent("onreadystatechange",B),a.attachEvent("onload",e.ready
 );var b=!1;try{b=a.frameElement==null}catch(d){}c.documentElement.doScroll&&b&&J()}}},isFunction:function(a){return e.type(a)==="function"},isArray:Array.isArray||function(a){return e.type(a)==="array"},isWindow:function(a){return a!=null&&a==a.window},isNumeric:function(a){return!isNaN(parseFloat(a))&&isFinite(a)},type:function(a){return a==null?String(a):I[C.call(a)]||"object"},isPlainObject:function(a){if(!a||e.type(a)!=="object"||a.nodeType||e.isWindow(a))return!1;try{if(a.constructor&&!D.call(a,"constructor")&&!D.call(a.constructor.prototype,"isPrototypeOf"))return!1}catch(c){return!1}var d;for(d in a);return d===b||D.call(a,d)},isEmptyObject:function(a){for(var b in a)return!1;return!0},error:function(a){throw new Error(a)},parseJSON:function(b){if(typeof b!="string"||!b)return null;b=e.trim(b);if(a.JSON&&a.JSON.parse)return a.JSON.parse(b);if(n.test(b.replace(o,"@").replace(p,"]").replace(q,"")))return(new Function("return "+b))();e.error("Invalid JSON: "+b)},parseXML:functio
 n(c){if(typeof c!="string"||!c)return null;var d,f;try{a.DOMParser?(f=new DOMParser,d=f.parseFromString(c,"text/xml")):(d=new ActiveXObject("Microsoft.XMLDOM"),d.async="false",d.loadXML(c))}catch(g){d=b}(!d||!d.documentElement||d.getElementsByTagName("parsererror").length)&&e.error("Invalid XML: "+c);return d},noop:function(){},globalEval:function(b){b&&j.test(b)&&(a.execScript||function(b){a.eval.call(a,b)})(b)},camelCase:function(a){return a.replace(w,"ms-").replace(v,x)},nodeName:function(a,b){return a.nodeName&&a.nodeName.toUpperCase()===b.toUpperCase()},each:function(a,c,d){var f,g=0,h=a.length,i=h===b||e.isFunction(a);if(d){if(i){for(f in a)if(c.apply(a[f],d)===!1)break}else for(;g<h;)if(c.apply(a[g++],d)===!1)break}else if(i){for(f in a)if(c.call(a[f],f,a[f])===!1)break}else for(;g<h;)if(c.call(a[g],g,a[g++])===!1)break;return a},trim:G?function(a){return a==null?"":G.call(a)}:function(a){return a==null?"":(a+"").replace(k,"").replace(l,"")},makeArray:function(a,b){var c=b||[
 ];if(a!=null){var d=e.type(a);a.length==null||d==="string"||d==="function"||d==="regexp"||e.isWindow(a)?E.call(c,a):e.merge(c,a)}return c},inArray:function(a,b,c){var d;if(b){if(H)return H.call(b,a,c);d=b.length,c=c?c<0?Math.max(0,d+c):c:0;for(;c<d;c++)if(c in b&&b[c]===a)return c}return-1},merge:function(a,c){var d=a.length,e=0;if(typeof c.length=="number")for(var f=c.length;e<f;e++)a[d++]=c[e];else while(c[e]!==b)a[d++]=c[e++];a.length=d;return a},grep:function(a,b,c){var d=[],e;c=!!c;for(var f=0,g=a.length;f<g;f++)e=!!b(a[f],f),c!==e&&d.push(a[f]);return d},map:function(a,c,d){var f,g,h=[],i=0,j=a.length,k=a instanceof e||j!==b&&typeof j=="number"&&(j>0&&a[0]&&a[j-1]||j===0||e.isArray(a));if(k)for(;i<j;i++)f=c(a[i],i,d),f!=null&&(h[h.length]=f);else for(g in a)f=c(a[g],g,d),f!=null&&(h[h.length]=f);return h.concat.apply([],h)},guid:1,proxy:function(a,c){if(typeof c=="string"){var d=a[c];c=a,a=d}if(!e.isFunction(a))return b;var f=F.call(arguments,2),g=function(){return a.apply(c,f
 .concat(F.call(arguments)))};g.guid=a.guid=a.guid||g.guid||e.guid++;return g},access:function(a,c,d,f,g,h,i){var j,k=d==null,l=0,m=a.length;if(d&&typeof d=="object"){for(l in d)e.access(a,c,l,d[l],1,h,f);g=1}else if(f!==b){j=i===b&&e.isFunction(f),k&&(j?(j=c,c=function(a,b,c){return j.call(e(a),c)}):(c.call(a,f),c=null));if(c)for(;l<m;l++)c(a[l],d,j?f.call(a[l],l,c(a[l],d)):f,i);g=1}return g?a:k?c.call(a):m?c(a[0],d):h},now:function(){return(new Date).getTime()},uaMatch:function(a){a=a.toLowerCase();var b=r.exec(a)||s.exec(a)||t.exec(a)||a.indexOf("compatible")<0&&u.exec(a)||[];return{browser:b[1]||"",version:b[2]||"0"}},sub:function(){function a(b,c){return new a.fn.init(b,c)}e.extend(!0,a,this),a.superclass=this,a.fn=a.prototype=this(),a.fn.constructor=a,a.sub=this.sub,a.fn.init=function(d,f){f&&f instanceof e&&!(f instanceof a)&&(f=a(f));return e.fn.init.call(this,d,f,b)},a.fn.init.prototype=a.fn;var b=a(c);return a},browser:{}}),e.each("Boolean Number String Function Array Date 
 RegExp Object".split(" "),function(a,b){I["[object "+b+"]"]=b.toLowerCase()}),z=e.uaMatch(y),z.browser&&(e.browser[z.browser]=!0,e.browser.version=z.version),e.browser.webkit&&(e.browser.safari=!0),j.test(" ")&&(k=/^[\s\xA0]+/,l=/[\s\xA0]+$/),h=e(c),c.addEventListener?B=function(){c.removeEventListener("DOMContentLoaded",B,!1),e.ready()}:c.attachEvent&&(B=function(){c.readyState==="complete"&&(c.detachEvent("onreadystatechange",B),e.ready())});return e}(),g={};f.Callbacks=function(a){a=a?g[a]||h(a):{};var c=[],d=[],e,i,j,k,l,m,n=function(b){var d,e,g,h,i;for(d=0,e=b.length;d<e;d++)g=b[d],h=f.type(g),h==="array"?n(g):h==="function"&&(!a.unique||!p.has(g))&&c.push(g)},o=function(b,f){f=f||[],e=!a.memory||[b,f],i=!0,j=!0,m=k||0,k=0,l=c.length;for(;c&&m<l;m++)if(c[m].apply(b,f)===!1&&a.stopOnFalse){e=!0;break}j=!1,c&&(a.once?e===!0?p.disable():c=[]:d&&d.length&&(e=d.shift(),p.fireWith(e[0],e[1])))},p={add:function(){if(c){var a=c.length;n(arguments),j?l=c.length:e&&e!==!0&&(k=a,o(e[0],
 e[1]))}return this},remove:function(){if(c){var b=arguments,d=0,e=b.length;for(;d<e;d++)for(var f=0;f<c.length;f++)if(b[d]===c[f]){j&&f<=l&&(l--,f<=m&&m--),c.splice(f--,1);if(a.unique)break}}return this},has:function(a){if(c){var b=0,d=c.length;for(;b<d;b++)if(a===c[b])return!0}return!1},empty:function(){c=[];return this},disable:function(){c=d=e=b;return this},disabled:function(){return!c},lock:function(){d=b,(!e||e===!0)&&p.disable();return this},locked:function(){return!d},fireWith:function(b,c){d&&(j?a.once||d.push([b,c]):(!a.once||!e)&&o(b,c));return this},fire:function(){p.fireWith(this,arguments);return this},fired:function(){return!!i}};return p};var i=[].slice;f.extend({Deferred:function(a){var b=f.Callbacks("once memory"),c=f.Callbacks("once memory"),d=f.Callbacks("memory"),e="pending",g={resolve:b,reject:c,notify:d},h={done:b.add,fail:c.add,progress:d.add,state:function(){return e},isResolved:b.fired,isRejected:c.fired,then:function(a,b,c){i.done(a).fail(b).progress(c);re
 turn this},always:function(){i.done.apply(i,arguments).fail.apply(i,arguments);return this},pipe:function(a,b,c){return f.Deferred(function(d){f.each({done:[a,"resolve"],fail:[b,"reject"],progress:[c,"notify"]},function(a,b){var c=b[0],e=b[1],g;f.isFunction(c)?i[a](function(){g=c.apply(this,arguments),g&&f.isFunction(g.promise)?g.promise().then(d.resolve,d.reject,d.notify):d[e+"With"](this===i?d:this,[g])}):i[a](d[e])})}).promise()},promise:function(a){if(a==null)a=h;else for(var b in h)a[b]=h[b];return a}},i=h.promise({}),j;for(j in g)i[j]=g[j].fire,i[j+"With"]=g[j].fireWith;i.done(function(){e="resolved"},c.disable,d.lock).fail(function(){e="rejected"},b.disable,d.lock),a&&a.call(i,i);return i},when:function(a){function m(a){return function(b){e[a]=arguments.length>1?i.call(arguments,0):b,j.notifyWith(k,e)}}function l(a){return function(c){b[a]=arguments.length>1?i.call(arguments,0):c,--g||j.resolveWith(j,b)}}var b=i.call(arguments,0),c=0,d=b.length,e=Array(d),g=d,h=d,j=d<=1&&a&&f
 .isFunction(a.promise)?a:f.Deferred(),k=j.promise();if(d>1){for(;c<d;c++)b[c]&&b[c].promise&&f.isFunction(b[c].promise)?b[c].promise().then(l(c),j.reject,m(c)):--g;g||j.resolveWith(j,b)}else j!==a&&j.resolveWith(j,d?[a]:[]);return k}}),f.support=function(){var b,d,e,g,h,i,j,k,l,m,n,o,p=c.createElement("div"),q=c.documentElement;p.setAttribute("className","t"),p.innerHTML="   <link/><table></table><a href='/a' style='top:1px;float:left;opacity:.55;'>a</a><input type='checkbox'/>",d=p.getElementsByTagName("*"),e=p.getElementsByTagName("a")[0];if(!d||!d.length||!e)return{};g=c.createElement("select"),h=g.appendChild(c.createElement("option")),i=p.getElementsByTagName("input")[0],b={leadingWhitespace:p.firstChild.nodeType===3,tbody:!p.getElementsByTagName("tbody").length,htmlSerialize:!!p.getElementsByTagName("link").length,style:/top/.test(e.getAttribute("style")),hrefNormalized:e.getAttribute("href")==="/a",opacity:/^0.55/.test(e.style.opacity),cssFloat:!!e.style.cssFloat,checkOn:i.va
 lue==="on",optSelected:h.selected,getSetAttribute:p.className!=="t",enctype:!!c.createElement("form").enctype,html5Clone:c.createElement("nav").cloneNode(!0).outerHTML!=="<:nav></:nav>",submitBubbles:!0,changeBubbles:!0,focusinBubbles:!1,deleteExpando:!0,noCloneEvent:!0,inlineBlockNeedsLayout:!1,shrinkWrapBlocks:!1,reliableMarginRight:!0,pixelMargin:!0},f.boxModel=b.boxModel=c.compatMode==="CSS1Compat",i.checked=!0,b.noCloneChecked=i.cloneNode(!0).checked,g.disabled=!0,b.optDisabled=!h.disabled;try{delete p.test}catch(r){b.deleteExpando=!1}!p.addEventListener&&p.attachEvent&&p.fireEvent&&(p.attachEvent("onclick",function(){b.noCloneEvent=!1}),p.cloneNode(!0).fireEvent("onclick")),i=c.createElement("input"),i.value="t",i.setAttribute("type","radio"),b.radioValue=i.value==="t",i.setAttribute("checked","checked"),i.setAttribute("name","t"),p.appendChild(i),j=c.createDocumentFragment(),j.appendChild(p.lastChild),b.checkClone=j.cloneNode(!0).cloneNode(!0).lastChild.checked,b.appendChecke
 d=i.checked,j.removeChild(i),j.appendChild(p);if(p.attachEvent)for(n in{submit:1,change:1,focusin:1})m="on"+n,o=m in p,o||(p.setAttribute(m,"return;"),o=typeof p[m]=="function"),b[n+"Bubbles"]=o;j.removeChild(p),j=g=h=p=i=null,f(function(){var d,e,g,h,i,j,l,m,n,q,r,s,t,u=c.getElementsByTagName("body")[0];!u||(m=1,t="padding:0;margin:0;border:",r="position:absolute;top:0;left:0;width:1px;height:1px;",s=t+"0;visibility:hidden;",n="style='"+r+t+"5px solid #000;",q="<div "+n+"display:block;'><div style='"+t+"0;display:block;overflow:hidden;'></div></div>"+"<table "+n+"' cellpadding='0' cellspacing='0'>"+"<tr><td></td></tr></table>",d=c.createElement("div"),d.style.cssText=s+"width:0;height:0;position:static;top:0;margin-top:"+m+"px",u.insertBefore(d,u.firstChild),p=c.createElement("div"),d.appendChild(p),p.innerHTML="<table><tr><td style='"+t+"0;display:none'></td><td>t</td></tr></table>",k=p.getElementsByTagName("td"),o=k[0].offsetHeight===0,k[0].style.display="",k[1].style.display="no
 ne",b.reliableHiddenOffsets=o&&k[0].offsetHeight===0,a.getComputedStyle&&(p.innerHTML="",l=c.createElement("div"),l.style.width="0",l.style.marginRight="0",p.style.width="2px",p.appendChild(l),b.reliableMarginRight=(parseInt((a.getComputedStyle(l,null)||{marginRight:0}).marginRight,10)||0)===0),typeof p.style.zoom!="undefined"&&(p.innerHTML="",p.style.width=p.style.padding="1px",p.style.border=0,p.style.overflow="hidden",p.style.display="inline",p.style.zoom=1,b.inlineBlockNeedsLayout=p.offsetWidth===3,p.style.display="block",p.style.overflow="visible",p.innerHTML="<div style='width:5px;'></div>",b.shrinkWrapBlocks=p.offsetWidth!==3),p.style.cssText=r+s,p.innerHTML=q,e=p.firstChild,g=e.firstChild,i=e.nextSibling.firstChild.firstChild,j={doesNotAddBorder:g.offsetTop!==5,doesAddBorderForTableAndCells:i.offsetTop===5},g.style.position="fixed",g.style.top="20px",j.fixedPosition=g.offsetTop===20||g.offsetTop===15,g.style.position=g.style.top="",e.style.overflow="hidden",e.style.position=
 "relative",j.subtractsBorderForOverflowNotVisible=g.offsetTop===-5,j.doesNotIncludeMarginInBodyOffset=u.offsetTop!==m,a.getComputedStyle&&(p.style.marginTop="1%",b.pixelMargin=(a.getComputedStyle(p,null)||{marginTop:0}).marginTop!=="1%"),typeof d.style.zoom!="undefined"&&(d.style.zoom=1),u.removeChild(d),l=p=d=null,f.extend(b,j))});return b}();var j=/^(?:\{.*\}|\[.*\])$/,k=/([A-Z])/g;f.extend({cache:{},uuid:0,expando:"jQuery"+(f.fn.jquery+Math.random()).replace(/\D/g,""),noData:{embed:!0,object:"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000",applet:!0},hasData:function(a){a=a.nodeType?f.cache[a[f.expando]]:a[f.expando];return!!a&&!m(a)},data:function(a,c,d,e){if(!!f.acceptData(a)){var g,h,i,j=f.expando,k=typeof c=="string",l=a.nodeType,m=l?f.cache:a,n=l?a[j]:a[j]&&j,o=c==="events";if((!n||!m[n]||!o&&!e&&!m[n].data)&&k&&d===b)return;n||(l?a[j]=n=++f.uuid:n=j),m[n]||(m[n]={},l||(m[n].toJSON=f.noop));if(typeof c=="object"||typeof c=="function")e?m[n]=f.extend(m[n],c):m[n].data=f.extend(m[
 n].data,c);g=h=m[n],e||(h.data||(h.data={}),h=h.data),d!==b&&(h[f.camelCase(c)]=d);if(o&&!h[c])return g.events;k?(i=h[c],i==null&&(i=h[f.camelCase(c)])):i=h;return i}},removeData:function(a,b,c){if(!!f.acceptData(a)){var d,e,g,h=f.expando,i=a.nodeType,j=i?f.cache:a,k=i?a[h]:h;if(!j[k])return;if(b){d=c?j[k]:j[k].data;if(d){f.isArray(b)||(b in d?b=[b]:(b=f.camelCase(b),b in d?b=[b]:b=b.split(" ")));for(e=0,g=b.length;e<g;e++)delete d[b[e]];if(!(c?m:f.isEmptyObject)(d))return}}if(!c){delete j[k].data;if(!m(j[k]))return}f.support.deleteExpando||!j.setInterval?delete j[k]:j[k]=null,i&&(f.support.deleteExpando?delete a[h]:a.removeAttribute?a.removeAttribute(h):a[h]=null)}},_data:function(a,b,c){return f.data(a,b,c,!0)},acceptData:function(a){if(a.nodeName){var b=f.noData[a.nodeName.toLowerCase()];if(b)return b!==!0&&a.getAttribute("classid")===b}return!0}}),f.fn.extend({data:function(a,c){var d,e,g,h,i,j=this[0],k=0,m=null;if(a===b){if(this.length){m=f.data(j);if(j.nodeType===1&&!f._data(
 j,"parsedAttrs")){g=j.attributes;for(i=g.length;k<i;k++)h=g[k].name,h.indexOf("data-")===0&&(h=f.camelCase(h.substring(5)),l(j,h,m[h]));f._data(j,"parsedAttrs",!0)}}return m}if(typeof a=="object")return this.each(function(){f.data(this,a)});d=a.split(".",2),d[1]=d[1]?"."+d[1]:"",e=d[1]+"!";return f.access(this,function(c){if(c===b){m=this.triggerHandler("getData"+e,[d[0]]),m===b&&j&&(m=f.data(j,a),m=l(j,a,m));return m===b&&d[1]?this.data(d[0]):m}d[1]=c,this.each(function(){var b=f(this);b.triggerHandler("setData"+e,d),f.data(this,a,c),b.triggerHandler("changeData"+e,d)})},null,c,arguments.length>1,null,!1)},removeData:function(a){return this.each(function(){f.removeData(this,a)})}}),f.extend({_mark:function(a,b){a&&(b=(b||"fx")+"mark",f._data(a,b,(f._data(a,b)||0)+1))},_unmark:function(a,b,c){a!==!0&&(c=b,b=a,a=!1);if(b){c=c||"fx";var d=c+"mark",e=a?0:(f._data(b,d)||1)-1;e?f._data(b,d,e):(f.removeData(b,d,!0),n(b,c,"mark"))}},queue:function(a,b,c){var d;if(a){b=(b||"fx")+"queue",d=f
 ._data(a,b),c&&(!d||f.isArray(c)?d=f._data(a,b,f.makeArray(c)):d.push(c));return d||[]}},dequeue:function(a,b){b=b||"fx";var c=f.queue(a,b),d=c.shift(),e={};d==="inprogress"&&(d=c.shift()),d&&(b==="fx"&&c.unshift("inprogress"),f._data(a,b+".run",e),d.call(a,function(){f.dequeue(a,b)},e)),c.length||(f.removeData(a,b+"queue "+b+".run",!0),n(a,b,"queue"))}}),f.fn.extend({queue:function(a,c){var d=2;typeof a!="string"&&(c=a,a="fx",d--);if(arguments.length<d)return f.queue(this[0],a);return c===b?this:this.each(function(){var b=f.queue(this,a,c);a==="fx"&&b[0]!=="inprogress"&&f.dequeue(this,a)})},dequeue:function(a){return this.each(function(){f.dequeue(this,a)})},delay:function(a,b){a=f.fx?f.fx.speeds[a]||a:a,b=b||"fx";return this.queue(b,function(b,c){var d=setTimeout(b,a);c.stop=function(){clearTimeout(d)}})},clearQueue:function(a){return this.queue(a||"fx",[])},promise:function(a,c){function m(){--h||d.resolveWith(e,[e])}typeof a!="string"&&(c=a,a=b),a=a||"fx";var d=f.Deferred(),e=th
 is,g=e.length,h=1,i=a+"defer",j=a+"queue",k=a+"mark",l;while(g--)if(l=f.data(e[g],i,b,!0)||(f.data(e[g],j,b,!0)||f.data(e[g],k,b,!0))&&f.data(e[g],i,f.Callbacks("once memory"),!0))h++,l.add(m);m();return d.promise(c)}});var o=/[\n\t\r]/g,p=/\s+/,q=/\r/g,r=/^(?:button|input)$/i,s=/^(?:button|input|object|select|textarea)$/i,t=/^a(?:rea)?$/i,u=/^(?:autofocus|autoplay|async|checked|controls|defer|disabled|hidden|loop|multiple|open|readonly|required|scoped|selected)$/i,v=f.support.getSetAttribute,w,x,y;f.fn.extend({attr:function(a,b){return f.access(this,f.attr,a,b,arguments.length>1)},removeAttr:function(a){return this.each(function(){f.removeAttr(this,a)})},prop:function(a,b){return f.access(this,f.prop,a,b,arguments.length>1)},removeProp:function(a){a=f.propFix[a]||a;return this.each(function(){try{this[a]=b,delete this[a]}catch(c){}})},addClass:function(a){var b,c,d,e,g,h,i;if(f.isFunction(a))return this.each(function(b){f(this).addClass(a.call(this,b,this.className))});if(a&&typeof
  a=="string"){b=a.split(p);for(c=0,d=this.length;c<d;c++){e=this[c];if(e.nodeType===1)if(!e.className&&b.length===1)e.className=a;else{g=" "+e.className+" ";for(h=0,i=b.length;h<i;h++)~g.indexOf(" "+b[h]+" ")||(g+=b[h]+" ");e.className=f.trim(g)}}}return this},removeClass:function(a){var c,d,e,g,h,i,j;if(f.isFunction(a))return this.each(function(b){f(this).removeClass(a.call(this,b,this.className))});if(a&&typeof a=="string"||a===b){c=(a||"").split(p);for(d=0,e=this.length;d<e;d++){g=this[d];if(g.nodeType===1&&g.className)if(a){h=(" "+g.className+" ").replace(o," ");for(i=0,j=c.length;i<j;i++)h=h.replace(" "+c[i]+" "," ");g.className=f.trim(h)}else g.className=""}}return this},toggleClass:function(a,b){var c=typeof a,d=typeof b=="boolean";if(f.isFunction(a))return this.each(function(c){f(this).toggleClass(a.call(this,c,this.className,b),b)});return this.each(function(){if(c==="string"){var e,g=0,h=f(this),i=b,j=a.split(p);while(e=j[g++])i=d?i:!h.hasClass(e),h[i?"addClass":"removeCla
 ss"](e)}else if(c==="undefined"||c==="boolean")this.className&&f._data(this,"__className__",this.className),this.className=this.className||a===!1?"":f._data(this,"__className__")||""})},hasClass:function(a){var b=" "+a+" ",c=0,d=this.length;for(;c<d;c++)if(this[c].nodeType===1&&(" "+this[c].className+" ").replace(o," ").indexOf(b)>-1)return!0;return!1},val:function(a){var c,d,e,g=this[0];{if(!!arguments.length){e=f.isFunction(a);return this.each(function(d){var g=f(this),h;if(this.nodeType===1){e?h=a.call(this,d,g.val()):h=a,h==null?h="":typeof h=="number"?h+="":f.isArray(h)&&(h=f.map(h,function(a){return a==null?"":a+""})),c=f.valHooks[this.type]||f.valHooks[this.nodeName.toLowerCase()];if(!c||!("set"in c)||c.set(this,h,"value")===b)this.value=h}})}if(g){c=f.valHooks[g.type]||f.valHooks[g.nodeName.toLowerCase()];if(c&&"get"in c&&(d=c.get(g,"value"))!==b)return d;d=g.value;return typeof d=="string"?d.replace(q,""):d==null?"":d}}}}),f.extend({valHooks:{option:{get:function(a){var b=a
 .attributes.value;return!b||b.specified?a.value:a.text}},select:{get:function(a){var b,c,d,e,g=a.selectedIndex,h=[],i=a.options,j=a.type==="select-one";if(g<0)return null;c=j?g:0,d=j?g+1:i.length;for(;c<d;c++){e=i[c];if(e.selected&&(f.support.optDisabled?!e.disabled:e.getAttribute("disabled")===null)&&(!e.parentNode.disabled||!f.nodeName(e.parentNode,"optgroup"))){b=f(e).val();if(j)return b;h.push(b)}}if(j&&!h.length&&i.length)return f(i[g]).val();return h},set:function(a,b){var c=f.makeArray(b);f(a).find("option").each(function(){this.selected=f.inArray(f(this).val(),c)>=0}),c.length||(a.selectedIndex=-1);return c}}},attrFn:{val:!0,css:!0,html:!0,text:!0,data:!0,width:!0,height:!0,offset:!0},attr:function(a,c,d,e){var g,h,i,j=a.nodeType;if(!!a&&j!==3&&j!==8&&j!==2){if(e&&c in f.attrFn)return f(a)[c](d);if(typeof a.getAttribute=="undefined")return f.prop(a,c,d);i=j!==1||!f.isXMLDoc(a),i&&(c=c.toLowerCase(),h=f.attrHooks[c]||(u.test(c)?x:w));if(d!==b){if(d===null){f.removeAttr(a,c);r
 eturn}if(h&&"set"in h&&i&&(g=h.set(a,d,c))!==b)return g;a.setAttribute(c,""+d);return d}if(h&&"get"in h&&i&&(g=h.get(a,c))!==null)return g;g=a.getAttribute(c);return g===null?b:g}},removeAttr:function(a,b){var c,d,e,g,h,i=0;if(b&&a.nodeType===1){d=b.toLowerCase().split(p),g=d.length;for(;i<g;i++)e=d[i],e&&(c=f.propFix[e]||e,h=u.test(e),h||f.attr(a,e,""),a.removeAttribute(v?e:c),h&&c in a&&(a[c]=!1))}},attrHooks:{type:{set:function(a,b){if(r.test(a.nodeName)&&a.parentNode)f.error("type property can't be changed");else if(!f.support.radioValue&&b==="radio"&&f.nodeName(a,"input")){var c=a.value;a.setAttribute("type",b),c&&(a.value=c);return b}}},value:{get:function(a,b){if(w&&f.nodeName(a,"button"))return w.get(a,b);return b in a?a.value:null},set:function(a,b,c){if(w&&f.nodeName(a,"button"))return w.set(a,b,c);a.value=b}}},propFix:{tabindex:"tabIndex",readonly:"readOnly","for":"htmlFor","class":"className",maxlength:"maxLength",cellspacing:"cellSpacing",cellpadding:"cellPadding",rowsp
 an:"rowSpan",colspan:"colSpan",usemap:"useMap",frameborder:"frameBorder",contenteditable:"contentEditable"},prop:function(a,c,d){var e,g,h,i=a.nodeType;if(!!a&&i!==3&&i!==8&&i!==2){h=i!==1||!f.isXMLDoc(a),h&&(c=f.propFix[c]||c,g=f.propHooks[c]);return d!==b?g&&"set"in g&&(e=g.set(a,d,c))!==b?e:a[c]=d:g&&"get"in g&&(e=g.get(a,c))!==null?e:a[c]}},propHooks:{tabIndex:{get:function(a){var c=a.getAttributeNode("tabindex");return c&&c.specified?parseInt(c.value,10):s.test(a.nodeName)||t.test(a.nodeName)&&a.href?0:b}}}}),f.attrHooks.tabindex=f.propHooks.tabIndex,x={get:function(a,c){var d,e=f.prop(a,c);return e===!0||typeof e!="boolean"&&(d=a.getAttributeNode(c))&&d.nodeValue!==!1?c.toLowerCase():b},set:function(a,b,c){var d;b===!1?f.removeAttr(a,c):(d=f.propFix[c]||c,d in a&&(a[d]=!0),a.setAttribute(c,c.toLowerCase()));return c}},v||(y={name:!0,id:!0,coords:!0},w=f.valHooks.button={get:function(a,c){var d;d=a.getAttributeNode(c);return d&&(y[c]?d.nodeValue!=="":d.specified)?d.nodeValue:b}
 ,set:function(a,b,d){var e=a.getAttributeNode(d);e||(e=c.createAttribute(d),a.setAttributeNode(e));return e.nodeValue=b+""}},f.attrHooks.tabindex.set=w.set,f.each(["width","height"],function(a,b){f.attrHooks[b]=f.extend(f.attrHooks[b],{set:function(a,c){if(c===""){a.setAttribute(b,"auto");return c}}})}),f.attrHooks.contenteditable={get:w.get,set:function(a,b,c){b===""&&(b="false"),w.set(a,b,c)}}),f.support.hrefNormalized||f.each(["href","src","width","height"],function(a,c){f.attrHooks[c]=f.extend(f.attrHooks[c],{get:function(a){var d=a.getAttribute(c,2);return d===null?b:d}})}),f.support.style||(f.attrHooks.style={get:function(a){return a.style.cssText.toLowerCase()||b},set:function(a,b){return a.style.cssText=""+b}}),f.support.optSelected||(f.propHooks.selected=f.extend(f.propHooks.selected,{get:function(a){var b=a.parentNode;b&&(b.selectedIndex,b.parentNode&&b.parentNode.selectedIndex);return null}})),f.support.enctype||(f.propFix.enctype="encoding"),f.support.checkOn||f.each(["r
 adio","checkbox"],function(){f.valHooks[this]={get:function(a){return a.getAttribute("value")===null?"on":a.value}}}),f.each(["radio","checkbox"],function(){f.valHooks[this]=f.extend(f.valHooks[this],{set:function(a,b){if(f.isArray(b))return a.checked=f.inArray(f(a).val(),b)>=0}})});var z=/^(?:textarea|input|select)$/i,A=/^([^\.]*)?(?:\.(.+))?$/,B=/(?:^|\s)hover(\.\S+)?\b/,C=/^key/,D=/^(?:mouse|contextmenu)|click/,E=/^(?:focusinfocus|focusoutblur)$/,F=/^(\w*)(?:#([\w\-]+))?(?:\.([\w\-]+))?$/,G=function(
+a){var b=F.exec(a);b&&(b[1]=(b[1]||"").toLowerCase(),b[3]=b[3]&&new RegExp("(?:^|\\s)"+b[3]+"(?:\\s|$)"));return b},H=function(a,b){var c=a.attributes||{};return(!b[1]||a.nodeName.toLowerCase()===b[1])&&(!b[2]||(c.id||{}).value===b[2])&&(!b[3]||b[3].test((c["class"]||{}).value))},I=function(a){return f.event.special.hover?a:a.replace(B,"mouseenter$1 mouseleave$1")};f.event={add:function(a,c,d,e,g){var h,i,j,k,l,m,n,o,p,q,r,s;if(!(a.nodeType===3||a.nodeType===8||!c||!d||!(h=f._data(a)))){d.handler&&(p=d,d=p.handler,g=p.selector),d.guid||(d.guid=f.guid++),j=h.events,j||(h.events=j={}),i=h.handle,i||(h.handle=i=function(a){return typeof f!="undefined"&&(!a||f.event.triggered!==a.type)?f.event.dispatch.apply(i.elem,arguments):b},i.elem=a),c=f.trim(I(c)).split(" ");for(k=0;k<c.length;k++){l=A.exec(c[k])||[],m=l[1],n=(l[2]||"").split(".").sort(),s=f.event.special[m]||{},m=(g?s.delegateType:s.bindType)||m,s=f.event.special[m]||{},o=f.extend({type:m,origType:l[1],data:e,handler:d,guid:d.gui
 d,selector:g,quick:g&&G(g),namespace:n.join(".")},p),r=j[m];if(!r){r=j[m]=[],r.delegateCount=0;if(!s.setup||s.setup.call(a,e,n,i)===!1)a.addEventListener?a.addEventListener(m,i,!1):a.attachEvent&&a.attachEvent("on"+m,i)}s.add&&(s.add.call(a,o),o.handler.guid||(o.handler.guid=d.guid)),g?r.splice(r.delegateCount++,0,o):r.push(o),f.event.global[m]=!0}a=null}},global:{},remove:function(a,b,c,d,e){var g=f.hasData(a)&&f._data(a),h,i,j,k,l,m,n,o,p,q,r,s;if(!!g&&!!(o=g.events)){b=f.trim(I(b||"")).split(" ");for(h=0;h<b.length;h++){i=A.exec(b[h])||[],j=k=i[1],l=i[2];if(!j){for(j in o)f.event.remove(a,j+b[h],c,d,!0);continue}p=f.event.special[j]||{},j=(d?p.delegateType:p.bindType)||j,r=o[j]||[],m=r.length,l=l?new RegExp("(^|\\.)"+l.split(".").sort().join("\\.(?:.*\\.)?")+"(\\.|$)"):null;for(n=0;n<r.length;n++)s=r[n],(e||k===s.origType)&&(!c||c.guid===s.guid)&&(!l||l.test(s.namespace))&&(!d||d===s.selector||d==="**"&&s.selector)&&(r.splice(n--,1),s.selector&&r.delegateCount--,p.remove&&p.remov
 e.call(a,s));r.length===0&&m!==r.length&&((!p.teardown||p.teardown.call(a,l)===!1)&&f.removeEvent(a,j,g.handle),delete o[j])}f.isEmptyObject(o)&&(q=g.handle,q&&(q.elem=null),f.removeData(a,["events","handle"],!0))}},customEvent:{getData:!0,setData:!0,changeData:!0},trigger:function(c,d,e,g){if(!e||e.nodeType!==3&&e.nodeType!==8){var h=c.type||c,i=[],j,k,l,m,n,o,p,q,r,s;if(E.test(h+f.event.triggered))return;h.indexOf("!")>=0&&(h=h.slice(0,-1),k=!0),h.indexOf(".")>=0&&(i=h.split("."),h=i.shift(),i.sort());if((!e||f.event.customEvent[h])&&!f.event.global[h])return;c=typeof c=="object"?c[f.expando]?c:new f.Event(h,c):new f.Event(h),c.type=h,c.isTrigger=!0,c.exclusive=k,c.namespace=i.join("."),c.namespace_re=c.namespace?new RegExp("(^|\\.)"+i.join("\\.(?:.*\\.)?")+"(\\.|$)"):null,o=h.indexOf(":")<0?"on"+h:"";if(!e){j=f.cache;for(l in j)j[l].events&&j[l].events[h]&&f.event.trigger(c,d,j[l].handle.elem,!0);return}c.result=b,c.target||(c.target=e),d=d!=null?f.makeArray(d):[],d.unshift(c),p=
 f.event.special[h]||{};if(p.trigger&&p.trigger.apply(e,d)===!1)return;r=[[e,p.bindType||h]];if(!g&&!p.noBubble&&!f.isWindow(e)){s=p.delegateType||h,m=E.test(s+h)?e:e.parentNode,n=null;for(;m;m=m.parentNode)r.push([m,s]),n=m;n&&n===e.ownerDocument&&r.push([n.defaultView||n.parentWindow||a,s])}for(l=0;l<r.length&&!c.isPropagationStopped();l++)m=r[l][0],c.type=r[l][1],q=(f._data(m,"events")||{})[c.type]&&f._data(m,"handle"),q&&q.apply(m,d),q=o&&m[o],q&&f.acceptData(m)&&q.apply(m,d)===!1&&c.preventDefault();c.type=h,!g&&!c.isDefaultPrevented()&&(!p._default||p._default.apply(e.ownerDocument,d)===!1)&&(h!=="click"||!f.nodeName(e,"a"))&&f.acceptData(e)&&o&&e[h]&&(h!=="focus"&&h!=="blur"||c.target.offsetWidth!==0)&&!f.isWindow(e)&&(n=e[o],n&&(e[o]=null),f.event.triggered=h,e[h](),f.event.triggered=b,n&&(e[o]=n));return c.result}},dispatch:function(c){c=f.event.fix(c||a.event);var d=(f._data(this,"events")||{})[c.type]||[],e=d.delegateCount,g=[].slice.call(arguments,0),h=!c.exclusive&&!c.na
 mespace,i=f.event.special[c.type]||{},j=[],k,l,m,n,o,p,q,r,s,t,u;g[0]=c,c.delegateTarget=this;if(!i.preDispatch||i.preDispatch.call(this,c)!==!1){if(e&&(!c.button||c.type!=="click")){n=f(this),n.context=this.ownerDocument||this;for(m=c.target;m!=this;m=m.parentNode||this)if(m.disabled!==!0){p={},r=[],n[0]=m;for(k=0;k<e;k++)s=d[k],t=s.selector,p[t]===b&&(p[t]=s.quick?H(m,s.quick):n.is(t)),p[t]&&r.push(s);r.length&&j.push({elem:m,matches:r})}}d.length>e&&j.push({elem:this,matches:d.slice(e)});for(k=0;k<j.length&&!c.isPropagationStopped();k++){q=j[k],c.currentTarget=q.elem;for(l=0;l<q.matches.length&&!c.isImmediatePropagationStopped();l++){s=q.matches[l];if(h||!c.namespace&&!s.namespace||c.namespace_re&&c.namespace_re.test(s.namespace))c.data=s.data,c.handleObj=s,o=((f.event.special[s.origType]||{}).handle||s.handler).apply(q.elem,g),o!==b&&(c.result=o,o===!1&&(c.preventDefault(),c.stopPropagation()))}}i.postDispatch&&i.postDispatch.call(this,c);return c.result}},props:"attrChange attr
 Name 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(a,b){a.which==null&&(a.which=b.charCode!=null?b.charCode:b.keyCode);return a}},mouseHooks:{props:"button buttons clientX clientY fromElement offsetX offsetY pageX pageY screenX screenY toElement".split(" "),filter:function(a,d){var e,f,g,h=d.button,i=d.fromElement;a.pageX==null&&d.clientX!=null&&(e=a.target.ownerDocument||c,f=e.documentElement,g=e.body,a.pageX=d.clientX+(f&&f.scrollLeft||g&&g.scrollLeft||0)-(f&&f.clientLeft||g&&g.clientLeft||0),a.pageY=d.clientY+(f&&f.scrollTop||g&&g.scrollTop||0)-(f&&f.clientTop||g&&g.clientTop||0)),!a.relatedTarget&&i&&(a.relatedTarget=i===a.target?d.toElement:i),!a.which&&h!==b&&(a.which=h&1?1:h&2?3:h&4?2:0);return a}},fix:function(a){if(a[f.expando])return a;var d,e,g=a,h=f.event.fixHooks[a.type]||{},i=h.prop
 s?this.props.concat(h.props):this.props;a=f.Event(g);for(d=i.length;d;)e=i[--d],a[e]=g[e];a.target||(a.target=g.srcElement||c),a.target.nodeType===3&&(a.target=a.target.parentNode),a.metaKey===b&&(a.metaKey=a.ctrlKey);return h.filter?h.filter(a,g):a},special:{ready:{setup:f.bindReady},load:{noBubble:!0},focus:{delegateType:"focusin"},blur:{delegateType:"focusout"},beforeunload:{setup:function(a,b,c){f.isWindow(this)&&(this.onbeforeunload=c)},teardown:function(a,b){this.onbeforeunload===b&&(this.onbeforeunload=null)}}},simulate:function(a,b,c,d){var e=f.extend(new f.Event,c,{type:a,isSimulated:!0,originalEvent:{}});d?f.event.trigger(e,null,b):f.event.dispatch.call(b,e),e.isDefaultPrevented()&&c.preventDefault()}},f.event.handle=f.event.dispatch,f.removeEvent=c.removeEventListener?function(a,b,c){a.removeEventListener&&a.removeEventListener(b,c,!1)}:function(a,b,c){a.detachEvent&&a.detachEvent("on"+b,c)},f.Event=function(a,b){if(!(this instanceof f.Event))return new f.Event(a,b);a&&a.
 type?(this.originalEvent=a,this.type=a.type,this.isDefaultPrevented=a.defaultPrevented||a.returnValue===!1||a.getPreventDefault&&a.getPreventDefault()?K:J):this.type=a,b&&f.extend(this,b),this.timeStamp=a&&a.timeStamp||f.now(),this[f.expando]=!0},f.Event.prototype={preventDefault:function(){this.isDefaultPrevented=K;var a=this.originalEvent;!a||(a.preventDefault?a.preventDefault():a.returnValue=!1)},stopPropagation:function(){this.isPropagationStopped=K;var a=this.originalEvent;!a||(a.stopPropagation&&a.stopPropagation(),a.cancelBubble=!0)},stopImmediatePropagation:function(){this.isImmediatePropagationStopped=K,this.stopPropagation()},isDefaultPrevented:J,isPropagationStopped:J,isImmediatePropagationStopped:J},f.each({mouseenter:"mouseover",mouseleave:"mouseout"},function(a,b){f.event.special[a]={delegateType:b,bindType:b,handle:function(a){var c=this,d=a.relatedTarget,e=a.handleObj,g=e.selector,h;if(!d||d!==c&&!f.contains(c,d))a.type=e.origType,h=e.handler.apply(this,arguments),a.
 type=b;return h}}}),f.support.submitBubbles||(f.event.special.submit={setup:function(){if(f.nodeName(this,"form"))return!1;f.event.add(this,"click._submit keypress._submit",function(a){var c=a.target,d=f.nodeName(c,"input")||f.nodeName(c,"button")?c.form:b;d&&!d._submit_attached&&(f.event.add(d,"submit._submit",function(a){a._submit_bubble=!0}),d._submit_attached=!0)})},postDispatch:function(a){a._submit_bubble&&(delete a._submit_bubble,this.parentNode&&!a.isTrigger&&f.event.simulate("submit",this.parentNode,a,!0))},teardown:function(){if(f.nodeName(this,"form"))return!1;f.event.remove(this,"._submit")}}),f.support.changeBubbles||(f.event.special.change={setup:function(){if(z.test(this.nodeName)){if(this.type==="checkbox"||this.type==="radio")f.event.add(this,"propertychange._change",function(a){a.originalEvent.propertyName==="checked"&&(this._just_changed=!0)}),f.event.add(this,"click._change",function(a){this._just_changed&&!a.isTrigger&&(this._just_changed=!1,f.event.simulate("ch
 ange",this,a,!0))});return!1}f.event.add(this,"beforeactivate._change",function(a){var b=a.target;z.test(b.nodeName)&&!b._change_attached&&(f.event.add(b,"change._change",function(a){this.parentNode&&!a.isSimulated&&!a.isTrigger&&f.event.simulate("change",this.parentNode,a,!0)}),b._change_attached=!0)})},handle:function(a){var b=a.target;if(this!==b||a.isSimulated||a.isTrigger||b.type!=="radio"&&b.type!=="checkbox")return a.handleObj.handler.apply(this,arguments)},teardown:function(){f.event.remove(this,"._change");return z.test(this.nodeName)}}),f.support.focusinBubbles||f.each({focus:"focusin",blur:"focusout"},function(a,b){var d=0,e=function(a){f.event.simulate(b,a.target,f.event.fix(a),!0)};f.event.special[b]={setup:function(){d++===0&&c.addEventListener(a,e,!0)},teardown:function(){--d===0&&c.removeEventListener(a,e,!0)}}}),f.fn.extend({on:function(a,c,d,e,g){var h,i;if(typeof a=="object"){typeof c!="string"&&(d=d||c,c=b);for(i in a)this.on(i,c,d,a[i],g);return this}d==null&&e=
 =null?(e=c,d=c=b):e==null&&(typeof c=="string"?(e=d,d=b):(e=d,d=c,c=b));if(e===!1)e=J;else if(!e)return this;g===1&&(h=e,e=function(a){f().off(a);return h.apply(this,arguments)},e.guid=h.guid||(h.guid=f.guid++));return this.each(function(){f.event.add(this,a,e,d,c)})},one:function(a,b,c,d){return this.on(a,b,c,d,1)},off:function(a,c,d){if(a&&a.preventDefault&&a.handleObj){var e=a.handleObj;f(a.delegateTarget).off(e.namespace?e.origType+"."+e.namespace:e.origType,e.selector,e.handler);return this}if(typeof a=="object"){for(var g in a)this.off(g,c,a[g]);return this}if(c===!1||typeof c=="function")d=c,c=b;d===!1&&(d=J);return this.each(function(){f.event.remove(this,a,d,c)})},bind:function(a,b,c){return this.on(a,null,b,c)},unbind:function(a,b){return this.off(a,null,b)},live:function(a,b,c){f(this.context).on(a,this.selector,b,c);return this},die:function(a,b){f(this.context).off(a,this.selector||"**",b);return this},delegate:function(a,b,c,d){return this.on(b,a,c,d)},undelegate:funct
 ion(a,b,c){return arguments.length==1?this.off(a,"**"):this.off(b,a,c)},trigger:function(a,b){return this.each(function(){f.event.trigger(a,b,this)})},triggerHandler:function(a,b){if(this[0])return f.event.trigger(a,b,this[0],!0)},toggle:function(a){var b=arguments,c=a.guid||f.guid++,d=0,e=function(c){var e=(f._data(this,"lastToggle"+a.guid)||0)%d;f._data(this,"lastToggle"+a.guid,e+1),c.preventDefault();return b[e].apply(this,arguments)||!1};e.guid=c;while(d<b.length)b[d++].guid=c;return this.click(e)},hover:function(a,b){return this.mouseenter(a).mouseleave(b||a)}}),f.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(a,b){f.fn[b]=function(a,c){c==null&&(c=a,a=null);return arguments.length>0?this.on(b,null,a,c):this.trigger(b)},f.attrFn&&(f.attrFn[b]=!0),C.test(b)&&(f.event.fixHooks[b]=f.event.keyHooks),D.tes
 t(b)&&(f.event.fixHooks[b]=f.event.mouseHooks)}),function(){function x(a,b,c,e,f,g){for(var h=0,i=e.length;h<i;h++){var j=e[h];if(j){var k=!1;j=j[a];while(j){if(j[d]===c){k=e[j.sizset];break}if(j.nodeType===1){g||(j[d]=c,j.sizset=h);if(typeof b!="string"){if(j===b){k=!0;break}}else if(m.filter(b,[j]).length>0){k=j;break}}j=j[a]}e[h]=k}}}function w(a,b,c,e,f,g){for(var h=0,i=e.length;h<i;h++){var j=e[h];if(j){var k=!1;j=j[a];while(j){if(j[d]===c){k=e[j.sizset];break}j.nodeType===1&&!g&&(j[d]=c,j.sizset=h);if(j.nodeName.toLowerCase()===b){k=j;break}j=j[a]}e[h]=k}}}var a=/((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^\[\]]*\]|['"][^'"]*['"]|[^\[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g,d="sizcache"+(Math.random()+"").replace(".",""),e=0,g=Object.prototype.toString,h=!1,i=!0,j=/\\/g,k=/\r\n/g,l=/\W/;[0,0].sort(function(){i=!1;return 0});var m=function(b,d,e,f){e=e||[],d=d||c;var h=d;if(d.nodeType!==1&&d.nodeType!==9)return[];if(!b||typeof b!="string")return e;var i,j,k,
 l,n,q,r,t,u=!0,v=m.isXML(d),w=[],x=b;do{a.exec(""),i=a.exec(x);if(i){x=i[3],w.push(i[1]);if(i[2]){l=i[3];break}}}while(i);if(w.length>1&&p.exec(b))if(w.length===2&&o.relative[w[0]])j=y(w[0]+w[1],d,f);else{j=o.relative[w[0]]?[d]:m(w.shift(),d);while(w.length)b=w.shift(),o.relative[b]&&(b+=w.shift()),j=y(b,j,f)}else{!f&&w.length>1&&d.nodeType===9&&!v&&o.match.ID.test(w[0])&&!o.match.ID.test(w[w.length-1])&&(n=m.find(w.shift(),d,v),d=n.expr?m.filter(n.expr,n.set)[0]:n.set[0]);if(d){n=f?{expr:w.pop(),set:s(f)}:m.find(w.pop(),w.length===1&&(w[0]==="~"||w[0]==="+")&&d.parentNode?d.parentNode:d,v),j=n.expr?m.filter(n.expr,n.set):n.set,w.length>0?k=s(j):u=!1;while(w.length)q=w.pop(),r=q,o.relative[q]?r=w.pop():q="",r==null&&(r=d),o.relative[q](k,r,v)}else k=w=[]}k||(k=j),k||m.error(q||b);if(g.call(k)==="[object Array]")if(!u)e.push.apply(e,k);else if(d&&d.nodeType===1)for(t=0;k[t]!=null;t++)k[t]&&(k[t]===!0||k[t].nodeType===1&&m.contains(d,k[t]))&&e.push(j[t]);else for(t=0;k[t]!=null;t++)k[
 t]&&k[t].nodeType===1&&e.push(j[t]);else s(k,e);l&&(m(l,h,e,f),m.uniqueSort(e));return e};m.uniqueSort=function(a){if(u){h=i,a.sort(u);if(h)for(var b=1;b<a.length;b++)a[b]===a[b-1]&&a.splice(b--,1)}return a},m.matches=function(a,b){return m(a,null,null,b)},m.matchesSelector=function(a,b){return m(b,null,null,[a]).length>0},m.find=function(a,b,c){var d,e,f,g,h,i;if(!a)return[];for(e=0,f=o.order.length;e<f;e++){h=o.order[e];if(g=o.leftMatch[h].exec(a)){i=g[1],g.splice(1,1);if(i.substr(i.length-1)!=="\\"){g[1]=(g[1]||"").replace(j,""),d=o.find[h](g,b,c);if(d!=null){a=a.replace(o.match[h],"");break}}}}d||(d=typeof b.getElementsByTagName!="undefined"?b.getElementsByTagName("*"):[]);return{set:d,expr:a}},m.filter=function(a,c,d,e){var f,g,h,i,j,k,l,n,p,q=a,r=[],s=c,t=c&&c[0]&&m.isXML(c[0]);while(a&&c.length){for(h in o.filter)if((f=o.leftMatch[h].exec(a))!=null&&f[2]){k=o.filter[h],l=f[1],g=!1,f.splice(1,1);if(l.substr(l.length-1)==="\\")continue;s===r&&(r=[]);if(o.preFilter[h]){f=o.preFi
 lter[h](f,s,d,r,e,t);if(!f)g=i=!0;else if(f===!0)continue}if(f)for(n=0;(j=s[n])!=null;n++)j&&(i=k(j,f,n,s),p=e^i,d&&i!=null?p?g=!0:s[n]=!1:p&&(r.push(j),g=!0));if(i!==b){d||(s=r),a=a.replace(o.match[h],"");if(!g)return[];break}}if(a===q)if(g==null)m.error(a);else break;q=a}return s},m.error=function(a){throw new Error("Syntax error, unrecognized expression: "+a)};var n=m.getText=function(a){var b,c,d=a.nodeType,e="";if(d){if(d===1||d===9||d===11){if(typeof a.textContent=="string")return a.textContent;if(typeof a.innerText=="string")return a.innerText.replace(k,"");for(a=a.firstChild;a;a=a.nextSibling)e+=n(a)}else if(d===3||d===4)return a.nodeValue}else for(b=0;c=a[b];b++)c.nodeType!==8&&(e+=n(c));return e},o=m.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(a){return a.getAttribute("href")},type:function(a){return a.getAttribute("type")}},relative:{"+":function(a,b){var c=typeof b=="string",d=c&&!l.test(b),e=c&&!d;d&&(b=b.toLowerCase());for(var f=0,g=a.length,h;f<g;f++)if(h=a[f]){while((h=h.previousSibling)&&h.nodeType!==1);a[f]=e||h&&h.nodeName.toLowerCase()===b?h||!1:h===b}e&&m.filter(b,a,!0)},">":function(a,b){var c,d=typeof b=="string",e=0,f=a.length;if(d&&!l.test(b)){b=b.toLowerCase();for(;e<f;e++){c=a[e];if(c){var g=c.parentNode;a[e]=g.nodeName.toLowerCase()===b?g:!1}}}else{for(;e<f;e++)c=a[e],c&&(a[e]=d?c.parentNode:c.parentNode=
 ==b);d&&m.filter(b,a,!0)}},"":function(a,b,c){var d,f=e++,g=x;typeof b=="string"&&!l.test(b)&&(b=b.toLowerCase(),d=b,g=w),g("parentNode",b,f,a,d,c)},"~":function(a,b,c){var d,f=e++,g=x;typeof b=="string"&&!l.test(b)&&(b=b.toLowerCase(),d=b,g=w),g("previousSibling",b,f,a,d,c)}},find:{ID:function(a,b,c){if(typeof b.getElementById!="undefined"&&!c){var d=b.getElementById(a[1]);return d&&d.parentNode?[d]:[]}},NAME:function(a,b){if(typeof b.getElementsByName!="undefined"){var c=[],d=b.getElementsByName(a[1]);for(var e=0,f=d.length;e<f;e++)d[e].getAttribute("name")===a[1]&&c.push(d[e]);return c.length===0?null:c}},TAG:function(a,b){if(typeof b.getElementsByTagName!="undefined")return b.getElementsByTagName(a[1])}},preFilter:{CLASS:function(a,b,c,d,e,f){a=" "+a[1].replace(j,"")+" ";if(f)return a;for(var g=0,h;(h=b[g])!=null;g++)h&&(e^(h.className&&(" "+h.className+" ").replace(/[\t\n\r]/g," ").indexOf(a)>=0)?c||d.push(h):c&&(b[g]=!1));return!1},ID:function(a){return a[1].replace(j,"")},TAG
 :function(a,b){return a[1].replace(j,"").toLowerCase()},CHILD:function(a){if(a[1]==="nth"){a[2]||m.error(a[0]),a[2]=a[2].replace(/^\+|\s*/g,"");var b=/(-?)(\d*)(?:n([+\-]?\d*))?/.exec(a[2]==="even"&&"2n"||a[2]==="odd"&&"2n+1"||!/\D/.test(a[2])&&"0n+"+a[2]||a[2]);a[2]=b[1]+(b[2]||1)-0,a[3]=b[3]-0}else a[2]&&m.error(a[0]);a[0]=e++;return a},ATTR:function(a,b,c,d,e,f){var g=a[1]=a[1].replace(j,"");!f&&o.attrMap[g]&&(a[1]=o.attrMap[g]),a[4]=(a[4]||a[5]||"").replace(j,""),a[2]==="~="&&(a[4]=" "+a[4]+" ");return a},PSEUDO:function(b,c,d,e,f){if(b[1]==="not")if((a.exec(b[3])||"").length>1||/^\w/.test(b[3]))b[3]=m(b[3],null,null,c);else{var g=m.filter(b[3],c,d,!0^f);d||e.push.apply(e,g);return!1}else if(o.match.POS.test(b[0])||o.match.CHILD.test(b[0]))return!0;return b},POS:function(a){a.unshift(!0);return a}},filters:{enabled:function(a){return a.disabled===!1&&a.type!=="hidden"},disabled:function(a){return a.disabled===!0},checked:function(a){return a.checked===!0},selected:function(a){a.
 parentNode&&a.parentNode.selectedIndex;return a.selected===!0},parent:function(a){return!!a.firstChild},empty:function(a){return!a.firstChild},has:function(a,b,c){return!!m(c[3],a).length},header:function(a){return/h\d/i.test(a.nodeName)},text:function(a){var b=a.getAttribute("type"),c=a.type;return a.nodeName.toLowerCase()==="input"&&"text"===c&&(b===c||b===null)},radio:function(a){return a.nodeName.toLowerCase()==="input"&&"radio"===a.type},checkbox:function(a){return a.nodeName.toLowerCase()==="input"&&"checkbox"===a.type},file:function(a){return a.nodeName.toLowerCase()==="input"&&"file"===a.type},password:function(a){return a.nodeName.toLowerCase()==="input"&&"password"===a.type},submit:function(a){var b=a.nodeName.toLowerCase();return(b==="input"||b==="button")&&"submit"===a.type},image:function(a){return a.nodeName.toLowerCase()==="input"&&"image"===a.type},reset:function(a){var b=a.nodeName.toLowerCase();return(b==="input"||b==="button")&&"reset"===a.type},button:function(a)
 {var b=a.nodeName.toLowerCase();return b==="input"&&"button"===a.type||b==="button"},input:function(a){return/input|select|textarea|button/i.test(a.nodeName)},focus:function(a){return a===a.ownerDocument.activeElement}},setFilters:{first:function(a,b){return b===0},last:function(a,b,c,d){return b===d.length-1},even:function(a,b){return b%2===0},odd:function(a,b){return b%2===1},lt:function(a,b,c){return b<c[3]-0},gt:function(a,b,c){return b>c[3]-0},nth:function(a,b,c){return c[3]-0===b},eq:function(a,b,c){return c[3]-0===b}},filter:{PSEUDO:function(a,b,c,d){var e=b[1],f=o.filters[e];if(f)return f(a,c,b,d);if(e==="contains")return(a.textContent||a.innerText||n([a])||"").indexOf(b[3])>=0;if(e==="not"){var g=b[3];for(var h=0,i=g.length;h<i;h++)if(g[h]===a)return!1;return!0}m.error(e)},CHILD:function(a,b){var c,e,f,g,h,i,j,k=b[1],l=a;switch(k){case"only":case"first":while(l=l.previousSibling)if(l.nodeType===1)return!1;if(k==="first")return!0;l=a;case"last":while(l=l.nextSibling)if(l.nod
 eType===1)return!1;return!0;case"nth":c=b[2],e=b[3];if(c===1&&e===0)return!0;f=b[0],g=a.parentNode;if(g&&(g[d]!==f||!a.nodeIndex)){i=0;for(l=g.firstChild;l;l=l.nextSibling)l.nodeType===1&&(l.nodeIndex=++i);g[d]=f}j=a.nodeIndex-e;return c===0?j===0:j%c===0&&j/c>=0}},ID:function(a,b){return a.nodeType===1&&a.getAttribute("id")===b},TAG:function(a,b){return b==="*"&&a.nodeType===1||!!a.nodeName&&a.nodeName.toLowerCase()===b},CLASS:function(a,b){return(" "+(a.className||a.getAttribute("class"))+" ").indexOf(b)>-1},ATTR:function(a,b){var c=b[1],d=m.attr?m.attr(a,c):o.attrHandle[c]?o.attrHandle[c](a):a[c]!=null?a[c]:a.getAttribute(c),e=d+"",f=b[2],g=b[4];return d==null?f==="!=":!f&&m.attr?d!=null:f==="="?e===g:f==="*="?e.indexOf(g)>=0:f==="~="?(" "+e+" ").indexOf(g)>=0:g?f==="!="?e!==g:f==="^="?e.indexOf(g)===0:f==="$="?e.substr(e.length-g.length)===g:f==="|="?e===g||e.substr(0,g.length+1)===g+"-":!1:e&&d!==!1},POS:function(a,b,c,d){var e=b[2],f=o.setFilters[e];if(f)return f(a,c,b,d)}}},p
 =o.match.POS,q=function(a,b){return"\\"+(b-0+1)};for(var r in o.match)o.match[r]=new RegExp(o.match[r].source+/(?![^\[]*\])(?![^\(]*\))/.source),o.leftMatch[r]=new RegExp(/(^(?:.|\r|\n)*?)/.source+o.match[r].source.replace(/\\(\d+)/g,q));o.match.globalPOS=p;var s=function(a,b){a=Array.prototype.slice.call(a,0);if(b){b.push.apply(b,a);return b}return a};try{Array.prototype.slice.call(c.documentElement.childNodes,0)[0].nodeType}catch(t){s=function(a,b){var c=0,d=b||[];if(g.call(a)==="[object Array]")Array.prototype.push.apply(d,a);else if(typeof a.length=="number")for(var e=a.length;c<e;c++)d.push(a[c]);else for(;a[c];c++)d.push(a[c]);return d}}var u,v;c.documentElement.compareDocumentPosition?u=function(a,b){if(a===b){h=!0;return 0}if(!a.compareDocumentPosition||!b.compareDocumentPosition)return a.compareDocumentPosition?-1:1;return a.compareDocumentPosition(b)&4?-1:1}:(u=function(a,b){if(a===b){h=!0;return 0}if(a.sourceIndex&&b.sourceIndex)return a.sourceIndex-b.sourceIndex;var c,d,
 e=[],f=[],g=a.parentNode,i=b.parentNode,j=g;if(g===i)return v(a,b);if(!g)return-1;if(!i)return 1;while(j)e.unshift(j),j=j.parentNode;j=i;while(j)f.unshift(j),j=j.parentNode;c=e.length,d=f.length;for(var k=0;k<c&&k<d;k++)if(e[k]!==f[k])return v(e[k],f[k]);return k===c?v(a,f[k],-1):v(e[k],b,1)},v=function(a,b,c){if(a===b)return c;var d=a.nextSibling;while(d){if(d===b)return-1;d=d.nextSibling}return 1}),function(){var a=c.createElement("div"),d="script"+(new Date).getTime(),e=c.documentElement;a.innerHTML="<a name='"+d+"'/>",e.insertBefore(a,e.firstChild),c.getElementById(d)&&(o.find.ID=function(a,c,d){if(typeof c.getElementById!="undefined"&&!d){var e=c.getElementById(a[1]);return e?e.id===a[1]||typeof e.getAttributeNode!="undefined"&&e.getAttributeNode("id").nodeValue===a[1]?[e]:b:[]}},o.filter.ID=function(a,b){var c=typeof a.getAttributeNode!="undefined"&&a.getAttributeNode("id");return a.nodeType===1&&c&&c.nodeValue===b}),e.removeChild(a),e=a=null}(),function(){var a=c.createElemen
 t("div");a.appendChild(c.createComment("")),a.getElementsByTagName("*").length>0&&(o.find.TAG=function(a,b){var c=b.getElementsByTagName(a[1]);if(a[1]==="*"){var d=[];for(var e=0;c[e];e++)c[e].nodeType===1&&d.push(c[e]);c=d}return c}),a.innerHTML="<a href='#'></a>",a.firstChild&&typeof a.firstChild.getAttribute!="undefined"&&a.firstChild.getAttribute("href")!=="#"&&(o.attrHandle.href=function(a){return a.getAttribute("href",2)}),a=null}(),c.querySelectorAll&&function(){var a=m,b=c.createElement("div"),d="__sizzle__";b.innerHTML="<p class='TEST'></p>";if(!b.querySelectorAll||b.querySelectorAll(".TEST").length!==0){m=function(b,e,f,g){e=e||c;if(!g&&!m.isXML(e)){var h=/^(\w+$)|^\.([\w\-]+$)|^#([\w\-]+$)/.exec(b);if(h&&(e.nodeType===1||e.nodeType===9)){if(h[1])return s(e.getElementsByTagName(b),f);if(h[2]&&o.find.CLASS&&e.getElementsByClassName)return s(e.getElementsByClassName(h[2]),f)}if(e.nodeType===9){if(b==="body"&&e.body)return s([e.body],f);if(h&&h[3]){var i=e.getElementById(h[3]
 );if(!i||!i.parentNode)return s([],f);if(i.id===h[3])return s([i],f)}try{return s(e.querySelectorAll(b),f)}catch(j){}}else if(e.nodeType===1&&e.nodeName.toLowerCase()!=="object"){var k=e,l=e.getAttribute("id"),n=l||d,p=e.parentNode,q=/^\s*[+~]/.test(b);l?n=n.replace(/'/g,"\\$&"):e.setAttribute("id",n),q&&p&&(e=e.parentNode);try{if(!q||p)return s(e.querySelectorAll("[id='"+n+"'] "+b),f)}catch(r){}finally{l||k.removeAttribute("id")}}}return a(b,e,f,g)};for(var e in a)m[e]=a[e];b=null}}(),function(){var a=c.documentElement,b=a.matchesSelector||a.mozMatchesSelector||a.webkitMatchesSelector||a.msMatchesSelector;if(b){var d=!b.call(c.createElement("div"),"div"),e=!1;try{b.call(c.documentElement,"[test!='']:sizzle")}catch(f){e=!0}m.matchesSelector=function(a,c){c=c.replace(/\=\s*([^'"\]]*)\s*\]/g,"='$1']");if(!m.isXML(a))try{if(e||!o.match.PSEUDO.test(c)&&!/!=/.test(c)){var f=b.call(a,c);if(f||!d||a.document&&a.document.nodeType!==11)return f}}catch(g){}return m(c,null,null,[a]).length>0}}
 }(),function(){var a=c.createElement("div");a.innerHTML="<div class='test e'></div><div class='test'></div>";if(!!a.getElementsByClassName&&a.getElementsByClassName("e").length!==0){a.lastChild.className="e";if(a.getElementsByClassName("e").length===1)return;o.order.splice(1,0,"CLASS"),o.find.CLASS=function(a,b,c){if(typeof b.getElementsByClassName!="undefined"&&!c)return b.getElementsByClassName(a[1])},a=null}}(),c.documentElement.contains?m.contains=function(a,b){return a!==b&&(a.contains?a.contains(b):!0)}:c.documentElement.compareDocumentPosition?m.contains=function(a,b){return!!(a.compareDocumentPosition(b)&16)}:m.contains=function(){return!1},m.isXML=function(a){var b=(a?a.ownerDocument||a:0).documentElement;return b?b.nodeName!=="HTML":!1};var y=function(a,b,c){var d,e=[],f="",g=b.nodeType?[b]:b;while(d=o.match.PSEUDO.exec(a))f+=d[0],a=a.replace(o.match.PSEUDO,"");a=o.relative[a]?a+"*":a;for(var h=0,i=g.length;h<i;h++)m(a,g[h],e,c);return m.filter(f,e)};m.attr=f.attr,m.select
 ors.attrMap={},f.find=m,f.expr=m.selectors,f.expr[":"]=f.expr.filters,f.unique=m.uniqueSort,f.text=m.getText,f.isXMLDoc=m.isXML,f.contains=m.contains}();var L=/Until$/,M=/^(?:parents|prevUntil|prevAll)/,N=/,/,O=/^.[^:#\[\.,]*$/,P=Array.prototype.slice,Q=f.expr.match.globalPOS,R={children:!0,contents:!0,next:!0,prev:!0};f.fn.extend({find:function(a){var b=this,c,d;if(typeof a!="string")return f(a).filter(function(){for(c=0,d=b.length;c<d;c++)if(f.contains(b[c],this))return!0});var e=this.pushStack("","find",a),g,h,i;for(c=0,d=this.length;c<d;c++){g=e.length,f.find(a,this[c],e);if(c>0)for(h=g;h<e.length;h++)for(i=0;i<g;i++)if(e[i]===e[h]){e.splice(h--,1);break}}return e},has:function(a){var b=f(a);return this.filter(function(){for(var a=0,c=b.length;a<c;a++)if(f.contains(this,b[a]))return!0})},not:function(a){return this.pushStack(T(this,a,!1),"not",a)},filter:function(a){return this.pushStack(T(this,a,!0),"filter",a)},is:function(a){return!!a&&(typeof a=="string"?Q.test(a)?f(a,this.c
 ontext).index(this[0])>=0:f.filter(a,this).length>0:this.filter(a).length>0)},closest:function(a,b){var c=[],d,e,g=this[0];if(f.isArray(a)){var h=1;while(g&&g.ownerDocument&&g!==b){for(d=0;d<a.length;d++)f(g).is(a[d])&&c.push({selector:a[d],elem:g,level:h});g=g.parentNode,h++}return c}var i=Q.test(a)||typeof a!="string"?f(a,b||this.context):0;for(d=0,e=this.length;d<e;d++){g=this[d];while(g){if(i?i.index(g)>-1:f.find.matchesSelector(g,a)){c.push(g);break}g=g.parentNode;if(!g||!g.ownerDocument||g===b||g.nodeType===11)break}}c=c.length>1?f.unique(c):c;return this.pushStack(c,"closest",a)},index:function(a){if(!a)return this[0]&&this[0].parentNode?this.prevAll().length:-1;if(typeof a=="string")return f.inArray(this[0],f(a));return f.inArray(a.jquery?a[0]:a,this)},add:function(a,b){var c=typeof a=="string"?f(a,b):f.makeArray(a&&a.nodeType?[a]:a),d=f.merge(this.get(),c);return this.pushStack(S(c[0])||S(d[0])?d:f.unique(d))},andSelf:function(){return this.add(this.prevObject)}}),f.each({p
 arent:function(a){var b=a.parentNode;return b&&b.nodeType!==11?b:null},parents:function(a){return f.dir(a,"parentNode")},parentsUntil:function(a,b,c){return f.dir(a,"parentNode",c)},next:function(a){return f.nth(a,2,"nextSibling")},prev:function(a){return f.nth(a,2,"previousSibling")},nextAll:function(a){return f.dir(a,"nextSibling")},prevAll:function(a){return f.dir(a,"previousSibling")},nextUntil:function(a,b,c){return f.dir(a,"nextSibling",c)},prevUntil:function(a,b,c){return f.dir(a,"previousSibling",c)},siblings:function(a){return f.sibling((a.parentNode||{}).firstChild,a)},children:function(a){return f.sibling(a.firstChild)},contents:function(a){return f.nodeName(a,"iframe")?a.contentDocument||a.contentWindow.document:f.makeArray(a.childNodes)}},function(a,b){f.fn[a]=function(c,d){var e=f.map(this,b,c);L.test(a)||(d=c),d&&typeof d=="string"&&(e=f.filter(d,e)),e=this.length>1&&!R[a]?f.unique(e):e,(this.length>1||N.test(d))&&M.test(a)&&(e=e.reverse());return this.pushStack(e,a,P
 .call(arguments).join(","))}}),f.extend({filter:function(a,b,c){c&&(a=":not("+a+")");return b.length===1?f.find.matchesSelector(b[0],a)?[b[0]]:[]:f.find.matches(a,b)},dir:function(a,c,d){var e=[],g=a[c];while(g&&g.nodeType!==9&&(d===b||g.nodeType!==1||!f(g).is(d)))g.nodeType===1&&e.push(g),g=g[c];return e},nth:function(a,b,c,d){b=b||1;var e=0;for(;a;a=a[c])if(a.nodeType===1&&++e===b)break;return a},sibling:function(a,b){var c=[];for(;a;a=a.nextSibling)a.nodeType===1&&a!==b&&c.push(a);return c}});var V="abbr|article|aside|audio|bdi|canvas|data|datalist|details|figcaption|figure|footer|header|hgroup|mark|meter|nav|output|progress|section|summary|time|video",W=/ jQuery\d+="(?:\d+|null)"/g,X=/^\s+/,Y=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/ig,Z=/<([\w:]+)/,$=/<tbody/i,_=/<|&#?\w+;/,ba=/<(?:script|style)/i,bb=/<(?:script|object|embed|option|style)/i,bc=new RegExp("<(?:"+V+")[\\s/>]","i"),bd=/checked\s*(?:[^=]|=\s*.checked.)/i,be=/\/(java|ecma)script/i,bf=/^
 \s*<!(?:\[CDATA\[|\-\-)/,bg={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,"",""]},bh=U(c);bg.optgroup=bg.option,bg.tbody=bg.tfoot=bg.colgroup=bg.caption=bg.thead,bg.th=bg.td,f.support.htmlSerialize||(bg._default=[1,"div<div>","</div>"]),f.fn.extend({text:function(a){return f.access(this,function(a){return a===b?f.text(this):this.empty().append((this[0]&&this[0].ownerDocument||c).createTextNode(a))},null,a,arguments.length)},wrapAll:function(a){if(f.isFunction(a))return this.each(function(b){f(this).wrapAll(a.call(this,b))});if(this[0]){var b=f(a,this[0].ownerDocument).eq(0).clone(!0);this[0].parentNode&&b.insertBefore(this[0]),b.map(function(){var a=this;while(a.firstChild&&a.firstChild.nodeType===1)a=a.firstChi
 ld;return a}).append(this)}return this},wrapInner:function(a){if(f.isFunction(a))return this.each(function(b){f(this).wrapInner(a.call(this,b))});return this.each(function(){var b=f(this),c=b.contents();c.length?c.wrapAll(a):b.append(a)})},wrap:function(a){var b=f.isFunction(a);return this.each(function(c){f(this).wrapAll(b?a.call(this,c):a)})},unwrap:function(){return this.parent().each(function(){f.nodeName(this,"body")||f(this).replaceWith(this.childNodes)}).end()},append:function(){return this.domManip(arguments,!0,function(a){this.nodeType===1&&this.appendChild(a)})},prepend:function(){return this.domManip(arguments,!0,function(a){this.nodeType===1&&this.insertBefore(a,this.firstChild)})},before:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,!1,function(a){this.parentNode.insertBefore(a,this)});if(arguments.length){var a=f
+.clean(arguments);a.push.apply(a,this.toArray());return this.pushStack(a,"before",arguments)}},after:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,!1,function(a){this.parentNode.insertBefore(a,this.nextSibling)});if(arguments.length){var a=this.pushStack(this,"after",arguments);a.push.apply(a,f.clean(arguments));return a}},remove:function(a,b){for(var c=0,d;(d=this[c])!=null;c++)if(!a||f.filter(a,[d]).length)!b&&d.nodeType===1&&(f.cleanData(d.getElementsByTagName("*")),f.cleanData([d])),d.parentNode&&d.parentNode.removeChild(d);return this},empty:function(){for(var a=0,b;(b=this[a])!=null;a++){b.nodeType===1&&f.cleanData(b.getElementsByTagName("*"));while(b.firstChild)b.removeChild(b.firstChild)}return this},clone:function(a,b){a=a==null?!1:a,b=b==null?a:b;return this.map(function(){return f.clone(this,a,b)})},html:function(a){return f.access(this,function(a){var c=this[0]||{},d=0,e=this.length;if(a===b)return c.nodeType===1?c.innerHTML.replace(W,""):null;
 if(typeof a=="string"&&!ba.test(a)&&(f.support.leadingWhitespace||!X.test(a))&&!bg[(Z.exec(a)||["",""])[1].toLowerCase()]){a=a.replace(Y,"<$1></$2>");try{for(;d<e;d++)c=this[d]||{},c.nodeType===1&&(f.cleanData(c.getElementsByTagName("*")),c.innerHTML=a);c=0}catch(g){}}c&&this.empty().append(a)},null,a,arguments.length)},replaceWith:function(a){if(this[0]&&this[0].parentNode){if(f.isFunction(a))return this.each(function(b){var c=f(this),d=c.html();c.replaceWith(a.call(this,b,d))});typeof a!="string"&&(a=f(a).detach());return this.each(function(){var b=this.nextSibling,c=this.parentNode;f(this).remove(),b?f(b).before(a):f(c).append(a)})}return this.length?this.pushStack(f(f.isFunction(a)?a():a),"replaceWith",a):this},detach:function(a){return this.remove(a,!0)},domManip:function(a,c,d){var e,g,h,i,j=a[0],k=[];if(!f.support.checkClone&&arguments.length===3&&typeof j=="string"&&bd.test(j))return this.each(function(){f(this).domManip(a,c,d,!0)});if(f.isFunction(j))return this.each(functi
 on(e){var g=f(this);a[0]=j.call(this,e,c?g.html():b),g.domManip(a,c,d)});if(this[0]){i=j&&j.parentNode,f.support.parentNode&&i&&i.nodeType===11&&i.childNodes.length===this.length?e={fragment:i}:e=f.buildFragment(a,this,k),h=e.fragment,h.childNodes.length===1?g=h=h.firstChild:g=h.firstChild;if(g){c=c&&f.nodeName(g,"tr");for(var l=0,m=this.length,n=m-1;l<m;l++)d.call(c?bi(this[l],g):this[l],e.cacheable||m>1&&l<n?f.clone(h,!0,!0):h)}k.length&&f.each(k,function(a,b){b.src?f.ajax({type:"GET",global:!1,url:b.src,async:!1,dataType:"script"}):f.globalEval((b.text||b.textContent||b.innerHTML||"").replace(bf,"/*$0*/")),b.parentNode&&b.parentNode.removeChild(b)})}return this}}),f.buildFragment=function(a,b,d){var e,g,h,i,j=a[0];b&&b[0]&&(i=b[0].ownerDocument||b[0]),i.createDocumentFragment||(i=c),a.length===1&&typeof j=="string"&&j.length<512&&i===c&&j.charAt(0)==="<"&&!bb.test(j)&&(f.support.checkClone||!bd.test(j))&&(f.support.html5Clone||!bc.test(j))&&(g=!0,h=f.fragments[j],h&&h!==1&&(e=h))
 ,e||(e=i.createDocumentFragment(),f.clean(a,i,e,d)),g&&(f.fragments[j]=h?e:1);return{fragment:e,cacheable:g}},f.fragments={},f.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(a,b){f.fn[a]=function(c){var d=[],e=f(c),g=this.length===1&&this[0].parentNode;if(g&&g.nodeType===11&&g.childNodes.length===1&&e.length===1){e[b](this[0]);return this}for(var h=0,i=e.length;h<i;h++){var j=(h>0?this.clone(!0):this).get();f(e[h])[b](j),d=d.concat(j)}return this.pushStack(d,a,e.selector)}}),f.extend({clone:function(a,b,c){var d,e,g,h=f.support.html5Clone||f.isXMLDoc(a)||!bc.test("<"+a.nodeName+">")?a.cloneNode(!0):bo(a);if((!f.support.noCloneEvent||!f.support.noCloneChecked)&&(a.nodeType===1||a.nodeType===11)&&!f.isXMLDoc(a)){bk(a,h),d=bl(a),e=bl(h);for(g=0;d[g];++g)e[g]&&bk(d[g],e[g])}if(b){bj(a,h);if(c){d=bl(a),e=bl(h);for(g=0;d[g];++g)bj(d[g],e[g])}}d=e=null;return h},clean:function(a,b,d,e){var g,h,i,j=[];b=b||c,typeof b.
 createElement=="undefined"&&(b=b.ownerDocument||b[0]&&b[0].ownerDocument||c);for(var k=0,l;(l=a[k])!=null;k++){typeof l=="number"&&(l+="");if(!l)continue;if(typeof l=="string")if(!_.test(l))l=b.createTextNode(l);else{l=l.replace(Y,"<$1></$2>");var m=(Z.exec(l)||["",""])[1].toLowerCase(),n=bg[m]||bg._default,o=n[0],p=b.createElement("div"),q=bh.childNodes,r;b===c?bh.appendChild(p):U(b).appendChild(p),p.innerHTML=n[1]+l+n[2];while(o--)p=p.lastChild;if(!f.support.tbody){var s=$.test(l),t=m==="table"&&!s?p.firstChild&&p.firstChild.childNodes:n[1]==="<table>"&&!s?p.childNodes:[];for(i=t.length-1;i>=0;--i)f.nodeName(t[i],"tbody")&&!t[i].childNodes.length&&t[i].parentNode.removeChild(t[i])}!f.support.leadingWhitespace&&X.test(l)&&p.insertBefore(b.createTextNode(X.exec(l)[0]),p.firstChild),l=p.childNodes,p&&(p.parentNode.removeChild(p),q.length>0&&(r=q[q.length-1],r&&r.parentNode&&r.parentNode.removeChild(r)))}var u;if(!f.support.appendChecked)if(l[0]&&typeof (u=l.length)=="number")for(i=0;
 i<u;i++)bn(l[i]);else bn(l);l.nodeType?j.push(l):j=f.merge(j,l)}if(d){g=function(a){return!a.type||be.test(a.type)};for(k=0;j[k];k++){h=j[k];if(e&&f.nodeName(h,"script")&&(!h.type||be.test(h.type)))e.push(h.parentNode?h.parentNode.removeChild(h):h);else{if(h.nodeType===1){var v=f.grep(h.getElementsByTagName("script"),g);j.splice.apply(j,[k+1,0].concat(v))}d.appendChild(h)}}}return j},cleanData:function(a){var b,c,d=f.cache,e=f.event.special,g=f.support.deleteExpando;for(var h=0,i;(i=a[h])!=null;h++){if(i.nodeName&&f.noData[i.nodeName.toLowerCase()])continue;c=i[f.expando];if(c){b=d[c];if(b&&b.events){for(var j in b.events)e[j]?f.event.remove(i,j):f.removeEvent(i,j,b.handle);b.handle&&(b.handle.elem=null)}g?delete i[f.expando]:i.removeAttribute&&i.removeAttribute(f.expando),delete d[c]}}}});var bp=/alpha\([^)]*\)/i,bq=/opacity=([^)]*)/,br=/([A-Z]|^ms)/g,bs=/^[\-+]?(?:\d*\.)?\d+$/i,bt=/^-?(?:\d*\.)?\d+(?!px)[^\d\s]+$/i,bu=/^([\-+])=([\-+.\de]+)/,bv=/^margin/,bw={position:"absolute",vi
 sibility:"hidden",display:"block"},bx=["Top","Right","Bottom","Left"],by,bz,bA;f.fn.css=function(a,c){return f.access(this,function(a,c,d){return d!==b?f.style(a,c,d):f.css(a,c)},a,c,arguments.length>1)},f.extend({cssHooks:{opacity:{get:function(a,b){if(b){var c=by(a,"opacity");return c===""?"1":c}return a.style.opacity}}},cssNumber:{fillOpacity:!0,fontWeight:!0,lineHeight:!0,opacity:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{"float":f.support.cssFloat?"cssFloat":"styleFloat"},style:function(a,c,d,e){if(!!a&&a.nodeType!==3&&a.nodeType!==8&&!!a.style){var g,h,i=f.camelCase(c),j=a.style,k=f.cssHooks[i];c=f.cssProps[i]||i;if(d===b){if(k&&"get"in k&&(g=k.get(a,!1,e))!==b)return g;return j[c]}h=typeof d,h==="string"&&(g=bu.exec(d))&&(d=+(g[1]+1)*+g[2]+parseFloat(f.css(a,c)),h="number");if(d==null||h==="number"&&isNaN(d))return;h==="number"&&!f.cssNumber[i]&&(d+="px");if(!k||!("set"in k)||(d=k.set(a,d))!==b)try{j[c]=d}catch(l){}}},css:function(a,c,d){var e,g;c=f.camelCase(c),g=f
 .cssHooks[c],c=f.cssProps[c]||c,c==="cssFloat"&&(c="float");if(g&&"get"in g&&(e=g.get(a,!0,d))!==b)return e;if(by)return by(a,c)},swap:function(a,b,c){var d={},e,f;for(f in b)d[f]=a.style[f],a.style[f]=b[f];e=c.call(a);for(f in b)a.style[f]=d[f];return e}}),f.curCSS=f.css,c.defaultView&&c.defaultView.getComputedStyle&&(bz=function(a,b){var c,d,e,g,h=a.style;b=b.replace(br,"-$1").toLowerCase(),(d=a.ownerDocument.defaultView)&&(e=d.getComputedStyle(a,null))&&(c=e.getPropertyValue(b),c===""&&!f.contains(a.ownerDocument.documentElement,a)&&(c=f.style(a,b))),!f.support.pixelMargin&&e&&bv.test(b)&&bt.test(c)&&(g=h.width,h.width=c,c=e.width,h.width=g);return c}),c.documentElement.currentStyle&&(bA=function(a,b){var c,d,e,f=a.currentStyle&&a.currentStyle[b],g=a.style;f==null&&g&&(e=g[b])&&(f=e),bt.test(f)&&(c=g.left,d=a.runtimeStyle&&a.runtimeStyle.left,d&&(a.runtimeStyle.left=a.currentStyle.left),g.left=b==="fontSize"?"1em":f,f=g.pixelLeft+"px",g.left=c,d&&(a.runtimeStyle.left=d));return f
 ===""?"auto":f}),by=bz||bA,f.each(["height","width"],function(a,b){f.cssHooks[b]={get:function(a,c,d){if(c)return a.offsetWidth!==0?bB(a,b,d):f.swap(a,bw,function(){return bB(a,b,d)})},set:function(a,b){return bs.test(b)?b+"px":b}}}),f.support.opacity||(f.cssHooks.opacity={get:function(a,b){return bq.test((b&&a.currentStyle?a.currentStyle.filter:a.style.filter)||"")?parseFloat(RegExp.$1)/100+"":b?"1":""},set:function(a,b){var c=a.style,d=a.currentStyle,e=f.isNumeric(b)?"alpha(opacity="+b*100+")":"",g=d&&d.filter||c.filter||"";c.zoom=1;if(b>=1&&f.trim(g.replace(bp,""))===""){c.removeAttribute("filter");if(d&&!d.filter)return}c.filter=bp.test(g)?g.replace(bp,e):g+" "+e}}),f(function(){f.support.reliableMarginRight||(f.cssHooks.marginRight={get:function(a,b){return f.swap(a,{display:"inline-block"},function(){return b?by(a,"margin-right"):a.style.marginRight})}})}),f.expr&&f.expr.filters&&(f.expr.filters.hidden=function(a){var b=a.offsetWidth,c=a.offsetHeight;return b===0&&c===0||!f.su
 pport.reliableHiddenOffsets&&(a.style&&a.style.display||f.css(a,"display"))==="none"},f.expr.filters.visible=function(a){return!f.expr.filters.hidden(a)}),f.each({margin:"",padding:"",border:"Width"},function(a,b){f.cssHooks[a+b]={expand:function(c){var d,e=typeof c=="string"?c.split(" "):[c],f={};for(d=0;d<4;d++)f[a+bx[d]+b]=e[d]||e[d-2]||e[0];return f}}});var bC=/%20/g,bD=/\[\]$/,bE=/\r?\n/g,bF=/#.*$/,bG=/^(.*?):[ \t]*([^\r\n]*)\r?$/mg,bH=/^(?:color|date|datetime|datetime-local|email|hidden|month|number|password|range|search|tel|text|time|url|week)$/i,bI=/^(?:about|app|app\-storage|.+\-extension|file|res|widget):$/,bJ=/^(?:GET|HEAD)$/,bK=/^\/\//,bL=/\?/,bM=/<script\b[^<]*(?:(?!<\/script>)<[^<]*)*<\/script>/gi,bN=/^(?:select|textarea)/i,bO=/\s+/,bP=/([?&])_=[^&]*/,bQ=/^([\w\+\.\-]+:)(?:\/\/([^\/?#:]*)(?::(\d+))?)?/,bR=f.fn.load,bS={},bT={},bU,bV,bW=["*/"]+["*"];try{bU=e.href}catch(bX){bU=c.createElement("a"),bU.href="",bU=bU.href}bV=bQ.exec(bU.toLowerCase())||[],f.fn.extend({load:f
 unction(a,c,d){if(typeof a!="string"&&bR)return bR.apply(this,arguments);if(!this.length)return this;var e=a.indexOf(" ");if(e>=0){var g=a.slice(e,a.length);a=a.slice(0,e)}var h="GET";c&&(f.isFunction(c)?(d=c,c=b):typeof c=="object"&&(c=f.param(c,f.ajaxSettings.traditional),h="POST"));var i=this;f.ajax({url:a,type:h,dataType:"html",data:c,complete:function(a,b,c){c=a.responseText,a.isResolved()&&(a.done(function(a){c=a}),i.html(g?f("<div>").append(c.replace(bM,"")).find(g):c)),d&&i.each(d,[c,b,a])}});return this},serialize:function(){return f.param(this.serializeArray())},serializeArray:function(){return this.map(function(){return this.elements?f.makeArray(this.elements):this}).filter(function(){return this.name&&!this.disabled&&(this.checked||bN.test(this.nodeName)||bH.test(this.type))}).map(function(a,b){var c=f(this).val();return c==null?null:f.isArray(c)?f.map(c,function(a,c){return{name:b.name,value:a.replace(bE,"\r\n")}}):{name:b.name,value:c.replace(bE,"\r\n")}}).get()}}),f.e
 ach("ajaxStart ajaxStop ajaxComplete ajaxError ajaxSuccess ajaxSend".split(" "),function(a,b){f.fn[b]=function(a){return this.on(b,a)}}),f.each(["get","post"],function(a,c){f[c]=function(a,d,e,g){f.isFunction(d)&&(g=g||e,e=d,d=b);return f.ajax({type:c,url:a,data:d,success:e,dataType:g})}}),f.extend({getScript:function(a,c){return f.get(a,b,c,"script")},getJSON:function(a,b,c){return f.get(a,b,c,"json")},ajaxSetup:function(a,b){b?b$(a,f.ajaxSettings):(b=a,a=f.ajaxSettings),b$(a,b);return a},ajaxSettings:{url:bU,isLocal:bI.test(bV[1]),global:!0,type:"GET",contentType:"application/x-www-form-urlencoded; charset=UTF-8",processData:!0,async:!0,accepts:{xml:"application/xml, text/xml",html:"text/html",text:"text/plain",json:"application/json, text/javascript","*":bW},contents:{xml:/xml/,html:/html/,json:/json/},responseFields:{xml:"responseXML",text:"responseText"},converters:{"* text":a.String,"text html":!0,"text json":f.parseJSON,"text xml":f.parseXML},flatOptions:{context:!0,url:!0}},
 ajaxPrefilter:bY(bS),ajaxTransport:bY(bT),ajax:function(a,c){function w(a,c,l,m){if(s!==2){s=2,q&&clearTimeout(q),p=b,n=m||"",v.readyState=a>0?4:0;var o,r,u,w=c,x=l?ca(d,v,l):b,y,z;if(a>=200&&a<300||a===304){if(d.ifModified){if(y=v.getResponseHeader("Last-Modified"))f.lastModified[k]=y;if(z=v.getResponseHeader("Etag"))f.etag[k]=z}if(a===304)w="notmodified",o=!0;else try{r=cb(d,x),w="success",o=!0}catch(A){w="parsererror",u=A}}else{u=w;if(!w||a)w="error",a<0&&(a=0)}v.status=a,v.statusText=""+(c||w),o?h.resolveWith(e,[r,w,v]):h.rejectWith(e,[v,w,u]),v.statusCode(j),j=b,t&&g.trigger("ajax"+(o?"Success":"Error"),[v,d,o?r:u]),i.fireWith(e,[v,w]),t&&(g.trigger("ajaxComplete",[v,d]),--f.active||f.event.trigger("ajaxStop"))}}typeof a=="object"&&(c=a,a=b),c=c||{};var d=f.ajaxSetup({},c),e=d.context||d,g=e!==d&&(e.nodeType||e instanceof f)?f(e):f.event,h=f.Deferred(),i=f.Callbacks("once memory"),j=d.statusCode||{},k,l={},m={},n,o,p,q,r,s=0,t,u,v={readyState:0,setRequestHeader:function(a,b){if
 (!s){var c=a.toLowerCase();a=m[c]=m[c]||a,l[a]=b}return this},getAllResponseHeaders:function(){return s===2?n:null},getResponseHeader:function(a){var c;if(s===2){if(!o){o={};while(c=bG.exec(n))o[c[1].toLowerCase()]=c[2]}c=o[a.toLowerCase()]}return c===b?null:c},overrideMimeType:function(a){s||(d.mimeType=a);return this},abort:function(a){a=a||"abort",p&&p.abort(a),w(0,a);return this}};h.promise(v),v.success=v.done,v.error=v.fail,v.complete=i.add,v.statusCode=function(a){if(a){var b;if(s<2)for(b in a)j[b]=[j[b],a[b]];else b=a[v.status],v.then(b,b)}return this},d.url=((a||d.url)+"").replace(bF,"").replace(bK,bV[1]+"//"),d.dataTypes=f.trim(d.dataType||"*").toLowerCase().split(bO),d.crossDomain==null&&(r=bQ.exec(d.url.toLowerCase()),d.crossDomain=!(!r||r[1]==bV[1]&&r[2]==bV[2]&&(r[3]||(r[1]==="http:"?80:443))==(bV[3]||(bV[1]==="http:"?80:443)))),d.data&&d.processData&&typeof d.data!="string"&&(d.data=f.param(d.data,d.traditional)),bZ(bS,d,c,v);if(s===2)return!1;t=d.global,d.type=d.type.
 toUpperCase(),d.hasContent=!bJ.test(d.type),t&&f.active++===0&&f.event.trigger("ajaxStart");if(!d.hasContent){d.data&&(d.url+=(bL.test(d.url)?"&":"?")+d.data,delete d.data),k=d.url;if(d.cache===!1){var x=f.now(),y=d.url.replace(bP,"$1_="+x);d.url=y+(y===d.url?(bL.test(d.url)?"&":"?")+"_="+x:"")}}(d.data&&d.hasContent&&d.contentType!==!1||c.contentType)&&v.setRequestHeader("Content-Type",d.contentType),d.ifModified&&(k=k||d.url,f.lastModified[k]&&v.setRequestHeader("If-Modified-Since",f.lastModified[k]),f.etag[k]&&v.setRequestHeader("If-None-Match",f.etag[k])),v.setRequestHeader("Accept",d.dataTypes[0]&&d.accepts[d.dataTypes[0]]?d.accepts[d.dataTypes[0]]+(d.dataTypes[0]!=="*"?", "+bW+"; q=0.01":""):d.accepts["*"]);for(u in d.headers)v.setRequestHeader(u,d.headers[u]);if(d.beforeSend&&(d.beforeSend.call(e,v,d)===!1||s===2)){v.abort();return!1}for(u in{success:1,error:1,complete:1})v[u](d[u]);p=bZ(bT,d,c,v);if(!p)w(-1,"No Transport");else{v.readyState=1,t&&g.trigger("ajaxSend",[v,d]),d
 .async&&d.timeout>0&&(q=setTimeout(function(){v.abort("timeout")},d.timeout));try{s=1,p.send(l,w)}catch(z){if(s<2)w(-1,z);else throw z}}return v},param:function(a,c){var d=[],e=function(a,b){b=f.isFunction(b)?b():b,d[d.length]=encodeURIComponent(a)+"="+encodeURIComponent(b)};c===b&&(c=f.ajaxSettings.traditional);if(f.isArray(a)||a.jquery&&!f.isPlainObject(a))f.each(a,function(){e(this.name,this.value)});else for(var g in a)b_(g,a[g],c,e);return d.join("&").replace(bC,"+")}}),f.extend({active:0,lastModified:{},etag:{}});var cc=f.now(),cd=/(\=)\?(&|$)|\?\?/i;f.ajaxSetup({jsonp:"callback",jsonpCallback:function(){return f.expando+"_"+cc++}}),f.ajaxPrefilter("json jsonp",function(b,c,d){var e=typeof b.data=="string"&&/^application\/x\-www\-form\-urlencoded/.test(b.contentType);if(b.dataTypes[0]==="jsonp"||b.jsonp!==!1&&(cd.test(b.url)||e&&cd.test(b.data))){var g,h=b.jsonpCallback=f.isFunction(b.jsonpCallback)?b.jsonpCallback():b.jsonpCallback,i=a[h],j=b.url,k=b.data,l="$1"+h+"$2";b.json
 p!==!1&&(j=j.replace(cd,l),b.url===j&&(e&&(k=k.replace(cd,l)),b.data===k&&(j+=(/\?/.test(j)?"&":"?")+b.jsonp+"="+h))),b.url=j,b.data=k,a[h]=function(a){g=[a]},d.always(function(){a[h]=i,g&&f.isFunction(i)&&a[h](g[0])}),b.converters["script json"]=function(){g||f.error(h+" was not called");return g[0]},b.dataTypes[0]="json";return"script"}}),f.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/javascript|ecmascript/},converters:{"text script":function(a){f.globalEval(a);return a}}}),f.ajaxPrefilter("script",function(a){a.cache===b&&(a.cache=!1),a.crossDomain&&(a.type="GET",a.global=!1)}),f.ajaxTransport("script",function(a){if(a.crossDomain){var d,e=c.head||c.getElementsByTagName("head")[0]||c.documentElement;return{send:function(f,g){d=c.createElement("script"),d.async="async",a.scriptCharset&&(d.charset=a.scriptCharset),d.src=a.url,d.onload=d.onreadystatechange=function(a,c){if(c||!d.readyState||
 /loaded|complete/.test(d.readyState))d.onload=d.onreadystatechange=null,e&&d.parentNode&&e.removeChild(d),d=b,c||g(200,"success")},e.insertBefore(d,e.firstChild)},abort:function(){d&&d.onload(0,1)}}}});var ce=a.ActiveXObject?function(){for(var a in cg)cg[a](0,1)}:!1,cf=0,cg;f.ajaxSettings.xhr=a.ActiveXObject?function(){return!this.isLocal&&ch()||ci()}:ch,function(a){f.extend(f.support,{ajax:!!a,cors:!!a&&"withCredentials"in a})}(f.ajaxSettings.xhr()),f.support.ajax&&f.ajaxTransport(function(c){if(!c.crossDomain||f.support.cors){var d;return{send:function(e,g){var h=c.xhr(),i,j;c.username?h.open(c.type,c.url,c.async,c.username,c.password):h.open(c.type,c.url,c.async);if(c.xhrFields)for(j in c.xhrFields)h[j]=c.xhrFields[j];c.mimeType&&h.overrideMimeType&&h.overrideMimeType(c.mimeType),!c.crossDomain&&!e["X-Requested-With"]&&(e["X-Requested-With"]="XMLHttpRequest");try{for(j in e)h.setRequestHeader(j,e[j])}catch(k){}h.send(c.hasContent&&c.data||null),d=function(a,e){var j,k,l,m,n;try{i
 f(d&&(e||h.readyState===4)){d=b,i&&(h.onreadystatechange=f.noop,ce&&delete cg[i]);if(e)h.readyState!==4&&h.abort();else{j=h.status,l=h.getAllResponseHeaders(),m={},n=h.responseXML,n&&n.documentElement&&(m.xml=n);try{m.text=h.responseText}catch(a){}try{k=h.statusText}catch(o){k=""}!j&&c.isLocal&&!c.crossDomain?j=m.text?200:404:j===1223&&(j=204)}}}catch(p){e||g(-1,p)}m&&g(j,k,m,l)},!c.async||h.readyState===4?d():(i=++cf,ce&&(cg||(cg={},f(a).unload(ce)),cg[i]=d),h.onreadystatechange=d)},abort:function(){d&&d(0,1)}}}});var cj={},ck,cl,cm=/^(?:toggle|show|hide)$/,cn=/^([+\-]=)?([\d+.\-]+)([a-z%]*)$/i,co,cp=[["height","marginTop","marginBottom","paddingTop","paddingBottom"],["width","marginLeft","marginRight","paddingLeft","paddingRight"],["opacity"]],cq;f.fn.extend({show:function(a,b,c){var d,e;if(a||a===0)return this.animate(ct("show",3),a,b,c);for(var g=0,h=this.length;g<h;g++)d=this[g],d.style&&(e=d.style.display,!f._data(d,"olddisplay")&&e==="none"&&(e=d.style.display=""),(e===""&&f.
 css(d,"display")==="none"||!f.contains(d.ownerDocument.documentElement,d))&&f._data(d,"olddisplay",cu(d.nodeName)));for(g=0;g<h;g++){d=this[g];if(d.style){e=d.style.display;if(e===""||e==="none")d.style.display=f._data(d,"olddisplay")||""}}return this},hide:function(a,b,c){if(a||a===0)return this.animate(ct("hide",3),a,b,c);var d,e,g=0,h=this.length;for(;g<h;g++)d=this[g],d.style&&(e=f.css(d,"display"),e!=="none"&&!f._data(d,"olddisplay")&&f._data(d,"olddisplay",e));for(g=0;g<h;g++)this[g].style&&(this[g].style.display="none");return this},_toggle:f.fn.toggle,toggle:function(a,b,c){var d=typeof a=="boolean";f.isFunction(a)&&f.isFunction(b)?this._toggle.apply(this,arguments):a==null||d?this.each(function(){var b=d?a:f(this).is(":hidden");f(this)[b?"show":"hide"]()}):this.animate(ct("toggle",3),a,b,c);return this},fadeTo:function(a,b,c,d){return this.filter(":hidden").css("opacity",0).show().end().animate({opacity:b},a,c,d)},animate:function(a,b,c,d){function g(){e.queue===!1&&f._mark
 (this);var b=f.extend({},e),c=this.nodeType===1,d=c&&f(this).is(":hidden"),g,h,i,j,k,l,m,n,o,p,q;b.animatedProperties={};for(i in a){g=f.camelCase(i),i!==g&&(a[g]=a[i],delete a[i]);if((k=f.cssHooks[g])&&"expand"in k){l=k.expand(a[g]),delete a[g];for(i in l)i in a||(a[i]=l[i])}}for(g in a){h=a[g],f.isArray(h)?(b.animatedProperties[g]=h[1],h=a[g]=h[0]):b.animatedProperties[g]=b.specialEasing&&b.specialEasing[g]||b.easing||"swing";if(h==="hide"&&d||h==="show"&&!d)return b.complete.call(this);c&&(g==="height"||g==="width")&&(b.overflow=[this.style.overflow,this.style.overflowX,this.style.overflowY],f.css(this,"display")==="inline"&&f.css(this,"float")==="none"&&(!f.support.inlineBlockNeedsLayout||cu(this.nodeName)==="inline"?this.style.display="inline-block":this.style.zoom=1))}b.overflow!=null&&(this.style.overflow="hidden");for(i in a)j=new f.fx(this,b,i),h=a[i],cm.test(h)?(q=f._data(this,"toggle"+i)||(h==="toggle"?d?"show":"hide":0),q?(f._data(this,"toggle"+i,q==="show"?"hide":"show"
 ),j[q]()):j[h]()):(m=cn.exec(h),n=j.cur(),m?(o=parseFloat(m[2]),p=m[3]||(f.cssNumber[i]?"":"px"),p!=="px"&&(f.style(this,i,(o||1)+p),n=(o||1)/j.cur()*n,f.style(this,i,n+p)),m[1]&&(o=(m[1]==="-="?-1:1)*o+n),j.custom(n,o,p)):j.custom(n,h,""));return!0}var e=f.speed(b,c,d);if(f.isEmptyObject(a))return this.each(e.complete,[!1]);a=f.extend({},a);return e.queue===!1?this.each(g):this.queue(e.queue,g)},stop:function(a,c,d){typeof a!="string"&&(d=c,c=a,a=b),c&&a!==!1&&this.queue(a||"fx",[]);return this.each(function(){function h(a,b,c){var e=b[c];f.removeData(a,c,!0),e.stop(d)}var b,c=!1,e=f.timers,g=f._data(this);d||f._unmark(!0,this);if(a==null)for(b in g)g[b]&&g[b].stop&&b.indexOf(".run")===b.length-4&&h(this,g,b);else g[b=a+".run"]&&g[b].stop&&h(this,g,b);for(b=e.length;b--;)e[b].elem===this&&(a==null||e[b].queue===a)&&(d?e[b](!0):e[b].saveState(),c=!0,e.splice(b,1));(!d||!c)&&f.dequeue(this,a)})}}),f.each({slideDown:ct("show",1),slideUp:ct("hide",1),slideToggle:ct("toggle",1),fadeIn:{
 opacity:"show"},fadeOut:{opacity:"hide"},fadeToggle:{opacity:"toggle"}},function(a,b){f.fn[a]=function(a,c,d){return this.animate(b,a,c,d)}}),f.extend({speed:function(a,b,c){var d=a&&typeof a=="object"?f.extend({},a):{complete:c||!c&&b||f.isFunction(a)&&a,duration:a,easing:c&&b||b&&!f.isFunction(b)&&b};d.duration=f.fx.off?0:typeof d.duration=="number"?d.duration:d.duration in f.fx.speeds?f.fx.speeds[d.duration]:f.fx.speeds._default;if(d.queue==null||d.queue===!0)d.queue="fx";d.old=d.complete,d.complete=function(a){f.isFunction(d.old)&&d.old.call(this),d.queue?f.dequeue(this,d.queue):a!==!1&&f._unmark(this)};return d},easing:{linear:function(a){return a},swing:function(a){return-Math.cos(a*Math.PI)/2+.5}},timers:[],fx:function(a,b,c){this.options=b,this.elem=a,this.prop=c,b.orig=b.orig||{}}}),f.fx.prototype={update:function(){this.options.step&&this.options.step.call(this.elem,this.now,this),(f.fx.step[this.prop]||f.fx.step._default)(this)},cur:function(){if(this.elem[this.prop]!=nul
 l&&(!this.elem.style||this.elem.style[this.prop]==null))return this.elem[this.prop];var a,b=f.css(this.elem,this.prop);return isNaN(a=parseFloat(b))?!b||b==="auto"?0:b:a},custom:function(a,c,d){function h(a){return e.step(a)}var e=this,g=f.fx;this.startTime=cq||cr(),this.end=c,this.now=this.start=a,this.pos=this.state=0,this.unit=d||this.unit||(f.cssNumber[this.prop]?"":"px"),h.queue=this.options.queue,h.elem=this.elem,h.saveState=function(){f._data(e.elem,"fxshow"+e.prop)===b&&(e.options.hide?f._data(e.elem,"fxshow"+e.prop,e.start):e.options.show&&f._data(e.elem,"fxshow"+e.prop,e.end))},h()&&f.timers.push(h)&&!co&&(co=setInterval(g.tick,g.interval))},show:function(){var a=f._data(this.elem,"fxshow"+this.prop);this.options.orig[this.prop]=a||f.style(this.elem,this.prop),this.options.show=!0,a!==b?this.custom(this.cur(),a):this.custom(this.prop==="width"||this.prop==="height"?1:0,this.cur()),f(this.elem).show()},hide:function(){this.options.orig[this.prop]=f._data(this.elem,"fxshow"+
 this.prop)||f.style(this.elem,this.prop),this.options.hide=!0,this.custom(this.cur(),0)},step:function(a){var b,c,d,e=cq||cr(),g=!0,h=this.elem,i=this.options;if(a||e>=i.duration+this.startTime){this.now=this.end,this.pos=this.state=1,this.update(),i.animatedProperties[this.prop]=!0;for(b in i.animatedProperties)i.animatedProperties[b]!==!0&&(g=!1);if(g){i.overflow!=null&&!f.support.shrinkWrapBlocks&&f.each(["","X","Y"],function(a,b){h.style["overflow"+b]=i.overflow[a]}),i.hide&&f(h).hide();if(i.hide||i.show)for(b in i.animatedProperties)f.style(h,b,i.orig[b]),f.removeData(h,"fxshow"+b,!0),f.removeData(h,"toggle"+b,!0);d=i.complete,d&&(i.complete=!1,d.call(h))}return!1}i.duration==Infinity?this.now=e:(c=e-this.startTime,this.state=c/i.duration,this.pos=f.easing[i.animatedProperties[this.prop]](this.state,c,0,1,i.duration),this.now=this.start+(this.end-this.start)*this.pos),this.update();return!0}},f.extend(f.fx,{tick:function(){var a,b=f.timers,c=0;for(;c<b.length;c++)a=b[c],!a()&&b
 [c]===a&&b.splice(c--,1);b.length||f.fx.stop()},interval:13,stop:function(){clearInterval(co),co=null},speeds:{slow:600,fast:200,_default:400},step:{opacity:function(a){f.style(a.elem,"opacity",a.now)},_default:function(a){a.elem.style&&a.elem.style[a.prop]!=null?a.elem.style[a.prop]=a.now+a.unit:a.elem[a.prop]=a.now}}}),f.each(cp.concat.apply([],cp),function(a,b){b.indexOf("margin")&&(f.fx.step[b]=function(a){f.style(a.elem,b,Math.max(0,a.now)+a.unit)})}),f.expr&&f.expr.filters&&(f.expr.filters.animated=function(a){return f.grep(f.timers,function(b){return a===b.elem}).length});var cv,cw=/^t(?:able|d|h)$/i,cx=/^(?:body|html)$/i;"getBoundingClientRect"in c.documentElement?cv=function(a,b,c,d){try{d=a.getBoundingClientRect()}catch(e){}if(!d||!f.contains(c,a))return d?{top:d.top,left:d.left}:{top:0,left:0};var g=b.body,h=cy(b),i=c.clientTop||g.clientTop||0,j=c.clientLeft||g.clientLeft||0,k=h.pageYOffset||f.support.boxModel&&c.scrollTop||g.scrollTop,l=h.pageXOffset||f.support.boxModel&
 &c.scrollLeft||g.scrollLeft,m=d.top+k-i,n=d.left+l-j;return{top:m,left:n}}:cv=function(a,b,c){var d,e=a.offsetParent,g=a,h=b.body,i=b.defaultView,j=i?i.getComputedStyle(a,null):a.currentStyle,k=a.offsetTop,l=a.offsetLeft;while((a=a.parentNode)&&a!==h&&a!==c){if(f.support.fixedPosition&&j.position==="fixed")break;d=i?i.getComputedStyle(a,null):a.currentStyle,k-=a.scrollTop,l-=a.scrollLeft,a===e&&(k+=a.offsetTop,l+=a.offsetLeft,f.support.doesNotAddBorder&&(!f.support.doesAddBorderForTableAndCells||!cw.test(a.nodeName))&&(k+=parseFloat(d.borderTopWidth)||0,l+=parseFloat(d.borderLeftWidth)||0),g=e,e=a.offsetParent),f.support.subtractsBorderForOverflowNotVisible&&d.overflow!=="visible"&&(k+=parseFloat(d.borderTopWidth)||0,l+=parseFloat(d.borderLeftWidth)||0),j=d}if(j.position==="relative"||j.position==="static")k+=h.offsetTop,l+=h.offsetLeft;f.support.fixedPosition&&j.position==="fixed"&&(k+=Math.max(c.scrollTop,h.scrollTop),l+=Math.max(c.scrollLeft,h.scrollLeft));return{top:k,left:l}},f
 .fn.offset=function(a){if(arguments.length)return a===b?this:this.each(function(b){f.offset.setOffset(this,a,b)});var c=this[0],d=c&&c.ownerDocument;if(!d)return null;if(c===d.body)return f.offset.bodyOffset(c);return cv(c,d,d.documentElement)},f.offset={bodyOffset:function(a){var b=a.offsetTop,c=a.offsetLeft;f.support.doesNotIncludeMarginInBodyOffset&&(b+=parseFloat(f.css(a,"marginTop"))||0,c+=parseFloat(f.css(a,"marginLeft"))||0);return{top:b,left:c}},setOffset:function(a,b,c){var d=f.css(a,"position");d==="static"&&(a.style.position="relative");var e=f(a),g=e.offset(),h=f.css(a,"top"),i=f.css(a,"left"),j=(d==="absolute"||d==="fixed")&&f.inArray("auto",[h,i])>-1,k={},l={},m,n;j?(l=e.position(),m=l.top,n=l.left):(m=parseFloat(h)||0,n=parseFloat(i)||0),f.isFunction(b)&&(b=b.call(a,c,g)),b.top!=null&&(k.top=b.top-g.top+m),b.left!=null&&(k.left=b.left-g.left+n),"using"in b?b.using.call(a,k):e.css(k)}},f.fn.extend({position:function(){if(!this[0])return null;var a=this[0],b=this.offset
 Parent(),c=this.offset(),d=cx.test(b[0].nodeName)?{top:0,left:0}:b.offset();c.top-=parseFloat(f.css(a,"marginTop"))||0,c.left-=parseFloat(f.css(a,"marginLeft"))||0,d.top+=parseFloat(f.css(b[0],"borderTopWidth"))||0,d.left+=parseFloat(f.css(b[0],"borderLeftWidth"))||0;return{top:c.top-d.top,left:c.left-d.left}},offsetParent:function(){return this.map(function(){var a=this.offsetParent||c.body;while(a&&!cx.test(a.nodeName)&&f.css(a,"position")==="static")a=a.offsetParent;return a})}}),f.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(a,c){var d=/Y/.test(c);f.fn[a]=function(e){return f.access(this,function(a,e,g){var h=cy(a);if(g===b)return h?c in h?h[c]:f.support.boxModel&&h.document.documentElement[e]||h.document.body[e]:a[e];h?h.scrollTo(d?f(h).scrollLeft():g,d?g:f(h).scrollTop()):a[e]=g},a,e,arguments.length,null)}}),f.each({Height:"height",Width:"width"},function(a,c){var d="client"+a,e="scroll"+a,g="offset"+a;f.fn["inner"+a]=function(){var a=this[0];return a?a.st
 yle?parseFloat(f.css(a,c,"padding")):this[c]():null},f.fn["outer"+a]=function(a){var b=this[0];return b?b.style?parseFloat(f.css(b,c,a?"margin":"border")):this[c]():null},f.fn[c]=function(a){return f.access(this,function(a,c,h){var i,j,k,l;if(f.isWindow(a)){i=a.document,j=i.documentElement[d];return f.support.boxModel&&j||i.body&&i.body[d]||j}if(a.nodeType===9){i=a.documentElement;if(i[d]>=i[e])return i[d];return Math.max(a.body[e],i[e],a.body[g],i[g])}if(h===b){k=f.css(a,c),l=parseFloat(k);return f.isNumeric(l)?l:k}f(a).css(c,h)},c,a,arguments.length,null)}}),a.jQuery=a.$=f,typeof define=="function"&&define.amd&&define.amd.jQuery&&define("jquery",[],function(){return f})})(window);
\ No newline at end of file
diff --git a/www/secretary/workbench/jquery.timeago.js b/www/secretary/workbench/jquery.timeago.js
new file mode 100644
index 0000000..1417747
--- /dev/null
+++ b/www/secretary/workbench/jquery.timeago.js
@@ -0,0 +1,152 @@
+/**
+ * Timeago is a jQuery plugin that makes it easy to support automatically
+ * updating fuzzy timestamps (e.g. "4 minutes ago" or "about 1 day ago").
+ *
+ * @name timeago
+ * @version 0.11.3
+ * @requires jQuery v1.2.3+
+ * @author Ryan McGeary
+ * @license MIT License - http://www.opensource.org/licenses/mit-license.php
+ *
+ * For usage and examples, visit:
+ * http://timeago.yarp.com/
+ *
+ * Copyright (c) 2008-2012, Ryan McGeary (ryan -[at]- mcgeary [*dot*] org)
+ */
+(function($) {
+  $.timeago = function(timestamp) {
+    if (timestamp instanceof Date) {
+      return inWords(timestamp);
+    } else if (typeof timestamp === "string") {
+      return inWords($.timeago.parse(timestamp));
+    } else if (typeof timestamp === "number") {
+      return inWords(new Date(timestamp));
+    } else {
+      return inWords($.timeago.datetime(timestamp));
+    }
+  };
+  var $t = $.timeago;
+
+  $.extend($.timeago, {
+    settings: {
+      refreshMillis: 60000,
+      allowFuture: false,
+      strings: {
+        prefixAgo: null,
+        prefixFromNow: null,
+        suffixAgo: "ago",
+        suffixFromNow: "from now",
+        seconds: "less than a minute",
+        minute: "about a minute",
+        minutes: "%d minutes",
+        hour: "about an hour",
+        hours: "about %d hours",
+        day: "a day",
+        days: "%d days",
+        month: "about a month",
+        months: "%d months",
+        year: "about a year",
+        years: "%d years",
+        wordSeparator: " ",
+        numbers: []
+      }
+    },
+    inWords: function(distanceMillis) {
+      var $l = this.settings.strings;
+      var prefix = $l.prefixAgo;
+      var suffix = $l.suffixAgo;
+      if (this.settings.allowFuture) {
+        if (distanceMillis < 0) {
+          prefix = $l.prefixFromNow;
+          suffix = $l.suffixFromNow;
+        }
+      }
+
+      var seconds = Math.abs(distanceMillis) / 1000;
+      var minutes = seconds / 60;
+      var hours = minutes / 60;
+      var days = hours / 24;
+      var years = days / 365;
+
+      function substitute(stringOrFunction, number) {
+        var string = $.isFunction(stringOrFunction) ? stringOrFunction(number, distanceMillis) : stringOrFunction;
+        var value = ($l.numbers && $l.numbers[number]) || number;
+        return string.replace(/%d/i, value);
+      }
+
+      var words = seconds < 45 && substitute($l.seconds, Math.round(seconds)) ||
+        seconds < 90 && substitute($l.minute, 1) ||
+        minutes < 45 && substitute($l.minutes, Math.round(minutes)) ||
+        minutes < 90 && substitute($l.hour, 1) ||
+        hours < 24 && substitute($l.hours, Math.round(hours)) ||
+        hours < 42 && substitute($l.day, 1) ||
+        days < 30 && substitute($l.days, Math.round(days)) ||
+        days < 45 && substitute($l.month, 1) ||
+        days < 365 && substitute($l.months, Math.round(days / 30)) ||
+        years < 1.5 && substitute($l.year, 1) ||
+        substitute($l.years, Math.round(years));
+
+      var separator = $l.wordSeparator === undefined ?  " " : $l.wordSeparator;
+      return $.trim([prefix, words, suffix].join(separator));
+    },
+    parse: function(iso8601) {
+      var s = $.trim(iso8601);
+      s = s.replace(/\.\d\d\d+/,""); // remove milliseconds
+      s = s.replace(/-/,"/").replace(/-/,"/");
+      s = s.replace(/T/," ").replace(/Z/," UTC");
+      s = s.replace(/([\+\-]\d\d)\:?(\d\d)/," $1$2"); // -04:00 -> -0400
+      return new Date(s);
+    },
+    datetime: function(elem) {
+      var iso8601 = $t.isTime(elem) ? $(elem).attr("datetime") : $(elem).attr("title");
+      return $t.parse(iso8601);
+    },
+    isTime: function(elem) {
+      // jQuery's `is()` doesn't play well with HTML5 in IE
+      return $(elem).get(0).tagName.toLowerCase() === "time"; // $(elem).is("time");
+    }
+  });
+
+  $.fn.timeago = function() {
+    var self = this;
+    self.each(refresh);
+
+    var $s = $t.settings;
+    if ($s.refreshMillis > 0) {
+      setInterval(function() { self.each(refresh); }, $s.refreshMillis);
+    }
+    return self;
+  };
+
+  function refresh() {
+    var data = prepareData(this);
+    if (!isNaN(data.datetime)) {
+      $(this).text(inWords(data.datetime));
+    }
+    return this;
+  }
+
+  function prepareData(element) {
+    element = $(element);
+    if (!element.data("timeago")) {
+      element.data("timeago", { datetime: $t.datetime(element) });
+      var text = $.trim(element.text());
+      if (text.length > 0 && !($t.isTime(element) && element.attr("title"))) {
+        element.attr("title", text);
+      }
+    }
+    return element.data("timeago");
+  }
+
+  function inWords(date) {
+    return $t.inWords(distance(date));
+  }
+
+  function distance(date) {
+    return (new Date().getTime() - date.getTime());
+  }
+
+  // fix for IE6 suckage
+  document.createElement("abbr");
+  document.createElement("time");
+}(jQuery));
diff --git a/www/secretary/workbench/local_paths.rb b/www/secretary/workbench/local_paths.rb
new file mode 100644
index 0000000..3cbe131
--- /dev/null
+++ b/www/secretary/workbench/local_paths.rb
@@ -0,0 +1,35 @@
+# attempt to determine where 'HOME' is
+unless ENV['HOME']
+  ENV['HOME'] = $1 if ENV['SCRIPT_FILENAME'] =~ /(.*?)\/public_html\//
+  ENV['HOME'] = $1 if ENV['SCRIPT_FILENAME'] =~ /(.*?)\/Sites\//
+end
+
+# look for local_paths.yml or ~/.secassist (in that order)
+config = 'local_paths.yml'
+if not File.exist?(config) and ENV['HOME']
+  config = File.expand_path('~/.secassist')
+end
+
+# set constants based on the configuration file
+require 'yaml'
+YAML.load(open(config).read).each do |key, value|
+  Object.const_set key.upcase,
+    File.realpath(File.expand_path(value).untaint).untaint
+end
+
+# pending file
+PENDING_YML = File.join(RECEIVED, 'pending.yml')
+COMPLETED_YML = File.join(RECEIVED, 'completed.yml')
+
+# svn >= 1.5 requires a trailing '@' if the file name contains an '@'
+# http://stackoverflow.com/questions/1985203/why-subversion-skips-files-which-contain-the-symbol
+def svn_at name
+  svn_version = `svn --version --quiet`.chomp.split('.').map {|s| s.to_i}
+  if (svn_version <=> [1,6,4]) < 1
+    ''
+  elsif name.include? '@'
+    '@'
+  else
+    ''
+  end
+end
diff --git a/www/secretary/workbench/local_paths.yml b/www/secretary/workbench/local_paths.yml
new file mode 100644
index 0000000..8cc04d4
--- /dev/null
+++ b/www/secretary/workbench/local_paths.yml
@@ -0,0 +1,7 @@
+meeting:    /var/tools/secretary/foundation/Meetings/20150324
+foundation: /var/tools/secretary/foundation
+officers:   /var/tools/secretary/foundation/officers
+documents:  /var/tools/secretary/documents
+received:   /var/tools/secretary/documents/received
+mail:       /var/tools/secretary/secmail.rb
+subreq:     /var/tools/secretary/subreq
diff --git a/www/secretary/workbench/mem.erb b/www/secretary/workbench/mem.erb
new file mode 100644
index 0000000..1844415
--- /dev/null
+++ b/www/secretary/workbench/mem.erb
@@ -0,0 +1,15 @@
+to:   <%= realname.inspect %> <<%= memail %>>
+from: <%= from %>
+cc:   secretary@apache.org
+bcc:  <%= bcc %>
+subject: Your ASF Membership Application
+
+Dear <%= realname %>,
+
+This message acknowledges receipt of your membership application, which has been filed in the Apache Software Foundation records.
+
+You now have access to the foundation repository and will be subscribed to the members@apache.org mailing list shortly.
+
+Warm Regards,
+
+<%= sig %>
diff --git a/www/secretary/workbench/nda.erb b/www/secretary/workbench/nda.erb
new file mode 100644
index 0000000..5d57bac
--- /dev/null
+++ b/www/secretary/workbench/nda.erb
@@ -0,0 +1,13 @@
+to:   <%= realname.inspect %> <<%= nemail %>>
+from: <%= from %>
+cc:   secretary@apache.org
+bcc:  <%= bcc %>
+subject: Your JCP NDA
+
+Dear <%= realname %>,
+
+This message acknowledges receipt of your NDA, which has been filed in the Apache Software Foundation records.
+
+Warm Regards,
+
+<%= sig %>
diff --git a/www/secretary/workbench/spinner.gif b/www/secretary/workbench/spinner.gif
new file mode 100644
index 0000000..d0bce15
Binary files /dev/null and b/www/secretary/workbench/spinner.gif differ
diff --git a/www/secretary/workbench/unsigned.erb b/www/secretary/workbench/unsigned.erb
new file mode 100644
index 0000000..fd34a64
--- /dev/null
+++ b/www/secretary/workbench/unsigned.erb
@@ -0,0 +1,13 @@
+to:   <%= realname.inspect %> <<%= nemail %>>
+from: <%= from %>
+cc:   secretary@apache.org
+bcc:  <%= bcc %>
+subject: Unsigned Document
+
+Dear <%= realname %>,
+
+We received this document but it appears to be unsigned. Please print, sign, scan, and email the scanned pdf to secretary@apache.org. Alternatively, you can create a detached, ascii-armored pgp signature and send both the document and the signature to secretary@apache.org. 
+
+Warm Regards,
+
+<%= sig %>
diff --git a/www/secretary/workbench/upload.cgi b/www/secretary/workbench/upload.cgi
new file mode 100755
index 0000000..dffcdbd
--- /dev/null
+++ b/www/secretary/workbench/upload.cgi
@@ -0,0 +1,48 @@
+#!/usr/bin/ruby1.9.1
+require 'wunderbar'
+require 'mail'
+
+_html do
+  _head do
+    _title 'Upload an email'
+    _style %{
+      pre {font-weight: bold; margin: 0} 
+      pre._stdin  {color: #C000C0; margin-top: 1em} 
+      pre._stdout {color: #000} 
+      pre._stderr {color: #F00} 
+    }
+  end
+
+  _body do
+    _h2 'Upload an email'
+    _form method: 'post', enctype: 'multipart/form-data' do
+      _input type: 'file', name: 'file'
+      _input type: 'submit', value: 'send'
+    end
+
+    if @file
+      Dir.chdir('/var/tools/secretary/secmail') do
+        # write email to mailbox
+        upload = @file.read
+        mail = Mail.new {from upload[/^From: (.*?)[\r\n]/i, 1]}
+        time = Time.now.asctime
+        File.open('mailbox', 'w') do |file|
+          file.write "From #{mail.from.first}  #{time}\r\n"
+          file.write upload
+        end
+
+        # allow emails previously processed to be processed again
+        Dir['tally/*'].each {|file| File.unlink file.untaint}
+
+        _.system 'python secmail.py' 
+      end
+
+      Dir.chdir('/var/tools/secretary/documents') do
+        # update received
+        _.system 'svn update received' 
+      end
+
+      _script 'parent.frames[0].location.reload()'
+    end
+  end
+end
diff --git a/www/secretary/workbench/worklist.cgi b/www/secretary/workbench/worklist.cgi
new file mode 100755
index 0000000..3f99d4c
--- /dev/null
+++ b/www/secretary/workbench/worklist.cgi
@@ -0,0 +1,532 @@
+#!/usr/bin/ruby1.9.1
+require 'wunderbar'
+require 'yaml'
+
+DOCTYPES = %w{icla grant ccla nda other}
+
+_html do
+  _head_ do
+    _title 'worklist'
+    _link rel: 'stylesheet', type: "text/css", href: "worklist.css"
+    _script src: "jquery-1.7.2.min.js"
+    _script src: 'worklist.js'
+  end
+
+  _body? do
+
+    _pre do
+      _ `date` + "\n"
+      secmail_status = 'http://minotaur.apache.org/~apmail/secmail.txt'
+      secmail_status = 'http://140.211.11.9/~apmail/secmail.txt' # DNS issues
+      _a `curl -s #{secmail_status}`.sub(': ', ":\n"), href: secmail_status,
+        target: '_blank'
+    end
+
+    if `which svn`.empty?
+      _h2_.warn 'Unable to locate svn'
+      _p 'Search PATH used:'
+      _ul do
+        ENV['PATH'].split(File::PATH_SEPARATOR).each do |path|
+          _li { _code path }
+        end
+      end
+    end
+
+    begin
+      begin
+        require './local_paths'
+        DOCTYPES.insert(-2, 'mem') if defined?(MEETING)
+      rescue
+        _h2_ 'Syntax error in local_paths.yml'
+        raise 
+      end
+
+      files = []
+      ENV['LANG']||="en_US.UTF-8"
+      if defined?(MEETING)
+        IO.popen("svn st #{FOUNDATION}/members.txt").each do |line|
+          files << line.sub(FOUNDATION, 'foundation')
+        end
+        IO.popen("svn st #{MEETING}").each do |line|
+          files << line.sub(MEETING, 'meeting')
+        end
+      end
+      IO.popen("svn st #{OFFICERS}").each do |line|
+        files << line.sub(OFFICERS, 'officers')
+      end
+      IO.popen("svn st #{DOCUMENTS}").each do |line| 
+        files << line.sub(DOCUMENTS, 'documents')
+      end
+
+      message = 'Faxes received'
+
+      if File.exist? PENDING_YML
+        pending = YAML.load(open(PENDING_YML))
+        if pending.size == 1
+          pending = pending.first
+          if pending['doctype'] == 'icla'
+            message = "ICLA from #{pending['realname']}"
+          elsif pending['doctype'] == 'ccla'
+            message = "CCLA from #{pending['company']}"
+
+            unless pending['employees'].nil? or pending['employees'].empty?
+              message += " for "
+              message += pending['employees'].strip.gsub(/\s*\n\s*/, ', ')
+            end
+          elsif pending['doctype'] == 'grant'
+            message = "Grant from #{pending['from']}"
+          elsif pending['doctype'] == 'mem'
+            message = "Membership Application from #{pending['realname']}"
+          elsif pending['doctype'] == 'nda'
+            message = "NDA for #{pending['realname']}"
+          end
+        end
+      end
+
+      files.reject! {|f| f=~ /\/(activity|pending|completed)\.yml\s*$/}
+      unless files.empty? and !File.exist?(PENDING_YML)
+        _h2_ 'Pending'
+        files.each {|line| _pre line.strip.sub(/\s+/,' ')}
+        pending = YAML.load(open(PENDING_YML)) rescue []
+        pending.each {|vars| _pre "@ #{vars['email']}" if vars['email']}
+        _form.buttons target: 'viewport', action: 'file.cgi', method: 'post' do
+          _input name: 'message', id: 'message', type: 'hidden',
+            'data-value' => message
+          _input type: 'submit', name: 'action', value: 'Edit CC'
+          _input type: 'submit', name: 'action', value: 'Cleanup'
+          _input type: 'submit', name: 'action', value: 'Commit'
+        end
+      end
+
+      files = []
+      Dir.chdir("#{RECEIVED}") do
+        Dir["*"].sort_by {|name| File.stat(name.untaint).mtime}.each do |file|
+          next if %w{README deadletter archives}.include? file
+          next if %w{pending.yml completed.yml activity.yml}.include? file
+          next if file =~ /^to_\w+$/
+          if File.directory? file
+            next if Dir.entries(file).reject {|name| name=~/^\./}.empty?
+          end
+          File.chmod 0644, file if file =~ /\.pdf$/
+          files << file
+        end
+      end
+
+      _h2_ 'Work List'
+      if files.empty?
+        _p.worklist! { _i 'Empty' }
+      else
+        _ul.worklist! do
+          files.each do |file|
+            _li do
+              ondisk = File.join(RECEIVED,file)
+              file += '/' if File.directory? ondisk
+              _a file, 'data-mtime' => (File.stat(ondisk).mtime.to_i rescue nil)
+            end
+          end
+        end
+      end
+
+      _div_.classify! do
+        _h2_ 'Classification'
+
+        _form.doctype! target: 'viewport', action: 'file.cgi', method: 'post' do
+          _table_ do
+            _tr do
+              DOCTYPES.each do |doctype|
+                _td align: 'center' do
+                  _input type: 'radio', name: 'doctype', value: doctype
+                end
+              end
+            end
+            _tr do
+              DOCTYPES.each do |doctype|
+                _td doctype, align: 'center'
+              end
+            end
+          end
+
+          _input name: 'source', id: 'source', type: 'hidden'
+
+          _table_ id: 'icla-form' do
+            _tr do
+              _td.label 'Real Name'
+              _td.input do
+                _input name: 'realname', id: 'realname', type: 'text'
+              end
+            end
+            _tr do
+              _td.label 'Public Name'
+              _td.input do
+                _input name: 'pubname', id: 'pubname', type: 'text'
+              end
+            end
+            _tr do
+              _td.label 'E-mail'
+              _td do 
+                _input name: 'email', id: 'email', type: 'email'
+              end
+            end
+            _tr do
+              _td.label 'File Name'
+              _td.input do
+                _input name: 'filename', id: 'filename', type: 'text'
+              end
+            end
+          end
+
+          _div_ id: 'nda-form' do
+            _table do
+              _tr do
+                _td do
+                  _label 'Name', for: 'nname'
+                end
+                _td do
+                  _input type: :text, name: 'nname', id: 'nname'
+                end
+              end
+
+              _tr do
+                _td do
+                  _label 'ASF ID', for: 'nid'
+                end
+                _td do
+                  _input type: :text, name: 'nid', id: 'nid'
+                end
+              end
+
+              _tr do
+                _td.label 'EMail'
+                _td.input do
+                  _input name: 'nemail', id: 'nemail', type: 'email'
+                end
+              end
+
+              _tr do
+                _td.label 'File Name'
+                _td.input do
+                  _input name: 'nfilename', id: 'nfilename', type: 'text'
+                end
+              end
+            end
+          end
+
+          _div id: 'mem-form' do
+            if defined?(MEETING)
+              received = open("#{MEETING}/memapp-received.txt").read
+            else
+              received = ''
+            end
+
+            _table do
+              _tr do
+                _td do
+                  _label 'Public Name', for: 'mpname'
+                end
+                _td do
+                  _select id: 'mavailid', name: 'mavailid' do
+                    pattern = /^\w+\s+(\w+)\s+(\w+)\s+(\w+)\s+(\w+)\s+(.*)\n/
+                    _option value: '', selected: true
+                    options = []
+                    received.scan(pattern) do |apply, mail, karma, id, name|
+                      next unless apply=='no'
+                      options << [ name.strip, id ]
+                    end
+                    options.sort.each do |name, id|
+                      _option name, value: id
+                    end
+                  end
+                end
+              end
+        
+              _tr do
+                _td do
+                  _label 'Full Name', for: 'mfname'
+                end
+                _td do
+                  _input type: :text, name: 'mfname', id: 'mfname'
+                end
+              end
+        
+              _tr do
+                _td do
+                  _label 'Address', for: 'maddr'
+                end
+                _td do
+                  _textarea rows: 5, name: 'maddr', id: 'maddr'
+                end
+              end
+                
+              _tr do
+                _td do
+                  _label 'Country', for: 'mcountry'
+                end
+                _td do
+                  _input type: :text, name: 'mcountry', id: 'mcountry'
+                end
+              end
+                
+              _tr do
+                _td do
+                  _label 'Telephone', for: 'mtele'
+                end
+                _td do
+                  _input type: :text, name: 'mtele', id: 'mtele'
+                end
+              end
+                
+              _tr do
+                _td do
+                  _label 'Fax', for: 'mfax'
+                end
+                _td do
+                  _input type: :text, name: 'mfax', id: 'mfax'
+                end
+              end
+                
+              _tr do
+                _td do
+                  _label 'E-Mail', for: 'memail'
+                end
+                _td do
+                  _input type: :email, name: 'memail', id: 'memail'
+                end
+              end
+                
+              _tr do
+                _td do
+                  _label 'File Name', for: 'mfilename'
+                end
+                _td do
+                  _input type: :text, name: 'mfilename', id: 'mfilename'
+                end
+              end
+            end
+          end
+
+          _div_ id: 'grant-form' do
+            _table do
+              _tr do
+                _td.label 'From'
+                _td do
+                  _input name: 'from', type: 'text'
+                end
+              end
+              _tr do
+                _td.label 'For'
+                _td do
+                  _textarea name: 'description', rows: 5
+                end
+              end
+              _tr do
+                _td.label 'Signed By'
+                _td do
+                  _input name: 'gname', id: 'gname', type: 'text'
+                end
+              end
+              _tr do
+                _td.label 'E-mail'
+                _td do
+                  _input name: 'gemail', id: 'gemail', type: 'email'
+                end
+              end
+              _tr do
+                _td.label 'File Name'
+                _td.input do
+                  _input name: 'gfilename', type: 'text'
+                end
+              end
+            end
+          end
+
+          _table_ id: 'ccla-form' do
+            _tr do
+              _td.label 'Corporation'
+              _td.input do
+                _input name: 'company', id: 'company', type: 'text'
+              end
+            end
+            _tr do
+              _td.label 'Product'
+              _td.input do
+                _input name: 'product', id: 'product', type: 'text'
+              end
+            end
+            _tr do
+              _td.label 'Contact'
+              _td do
+                _input name: 'contact', id: 'contact', type: 'text'
+              end
+            end
+            _tr do
+              _td.label 'E-mail'
+              _td do
+                _input name: 'cemail', id: 'cemail', type: 'email'
+              end
+            end
+            _tr do
+              _td.label 'Employees'
+              _td { _textarea name: 'employees', rows: 5 }
+            end
+            _tr do
+              _td.label 'File Name'
+              _td.input do
+                _input name: 'cfilename', type: 'text'
+              end
+            end
+          end
+
+          _input name: 'replaces', id: 'replaces', type: 'hidden'
+
+          _div_.buttons!.buttons do
+            _input type: 'submit', value: 'File'
+            _input type: 'submit', name: 'action', value: 'Cancel'
+          end
+
+          _div_.buckets!.buttons do
+            _fieldset do
+              _legend 'Do:'
+              _input type: 'submit', name: 'dest', value: 'burst'
+              _input type: 'submit', name: 'dest', value: 'flip'
+              _input type: 'submit', name: 'dest', value: 'restore'
+              _input type: 'submit', name: 'dest', value: 'rotate right'
+              _input type: 'submit', name: 'dest', value: 'rotate left'
+            end
+            _fieldset do
+              _legend 'File:'
+              _input type: 'submit', name: 'dest', value: 'operations'
+              _input type: 'submit', name: 'dest', value: 'dup'
+              _input type: 'submit', name: 'dest', value: 'junk'
+              _input type: 'submit', name: 'dest', value: 'incomplete'
+              _input type: 'submit', name: 'dest', value: 'unsigned'
+            end
+          end
+
+          _table id: 'icla2-form' do
+            _tr do
+              _td.label 'User ID'
+              _td.input do
+                _input name: 'user', id: 'user', type: 'text'
+              end
+            end
+            _tr do
+              _td.label 'PMC'
+              _td.input do
+                _input name: 'pmc', id: 'pmc', type: 'text'
+              end
+            end
+            _tr do
+              _td.label 'Podling'
+              _td.input do
+                _input name: 'podling', id: 'podling', type: 'text'
+              end
+            end
+            _tr do
+              _td.label 'Vote Link'
+              _td.input do
+                _input name: 'votelink', id: 'votelink', type: 'text'
+              end
+            end
+          end
+
+          _table id: 'grant2-form' do
+            _tr do
+              _td.label 'PMC'
+              _td.input do
+                _input name: 'ggmc', id: 'gpmc', type: 'text'
+              end
+            end
+            _tr do
+              _td.label 'Podling'
+              _td.input do
+                _input name: 'gpodling', id: 'gpodling', type: 'text'
+              end
+            end
+          end
+
+          _table id: 'ccla2-form' do
+            _tr do
+              _td.label 'PMC'
+              _td.input do
+                _input name: 'cpmc', id: 'cpmc', type: 'text'
+              end
+            end
+            _tr do
+              _td.label 'Podling'
+              _td.input do
+                _input name: 'cpodling', id: 'cpodling', type: 'text'
+              end
+            end
+          end
+        end
+      end
+
+      _h2_ 'Links'
+      _ul do
+        _li do
+          _a 'Response time', target: 'viewport',
+            href: 'https://whimsy.apache.org/secretary/response-time'
+        end
+        _li do
+          _a 'Mail Search', href: 'https://mail-search.apache.org/',
+            target: 'viewport'
+        end
+        _li do
+          query = ''
+
+          if File.exist? COMPLETED_YML
+            last = YAML.load(File.read COMPLETED_YML).last
+            params = {}
+            %w{email user pmc podling votelink}.each do |name|
+              params[name] = last[name] if last[name]
+            end
+            unless params.empty?
+              query = '?' + params.
+                map {|name,value| "#{name}=#{CGI.escape value}"}.join('&')
+            end
+          end
+
+          _a 'New Account', target: 'viewport',
+            href: 'https://id.apache.org/acreq/members/' + query
+        end
+        _li do
+          _a 'Committers by id', target: 'viewport',
+            href: 'http://people.apache.org/committer-index.html'
+        end
+        _li do
+          _a 'Documents', target: 'viewport',
+            href: 'https://svn.apache.org/repos/private/documents/'
+        end
+        _li do
+          _a 'ICLA lint', target: 'viewport',
+            href: 'https://whimsy.apache.org/secretary/icla-lint'
+        end
+        _li do
+          _a 'Public names', target: 'viewport',
+            href: 'https://whimsy.apache.org/secretary/public-names'
+        end
+        _li do
+          _a 'Board subscriptions', target: 'viewport',
+            href: 'https://whimsy.apache.org/board/subscriptions/'
+        end
+        _li do
+          _a 'Mail aliases', target: 'viewport',
+            href: 'https://id.apache.org/info/MailAlias.txt'
+        end
+        _li do
+          _a 'Member list', target: 'viewport',
+            href: 'https://svn.apache.org/repos/private/foundation/members.txt'
+        end
+        _li do
+          _a 'How to use this tool', href: 'HOWTO.html',
+            target: 'viewport'
+        end
+
+        if File.exist? '/var/tools/secretary/secmail'
+          _li {_p {_hr}}
+          _li {_a 'Upload email', href: 'upload', target: 'viewport'}
+        end
+      end
+    end
+  end
+end
diff --git a/www/secretary/workbench/worklist.css b/www/secretary/workbench/worklist.css
new file mode 100644
index 0000000..041c4a8
--- /dev/null
+++ b/www/secretary/workbench/worklist.css
@@ -0,0 +1,23 @@
+html {background-color: #EEE}
+input[type="email"],input[type="text"],select {width: 100%}
+textarea {width: 100%}
+p#worklist {margin-left: 2em}
+#classify {display: none}
+#doctype > table:first-child {margin-bottom: 1em}
+table {width: 100%}
+td.label {width:10em;height:2.5em}
+td.input {width:100em}
+h2 {background: #303284; color:#FFF; border-radius: 1em; padding: .25em 1em}
+h2.warn {background:yellow; color:black}
+input[type="submit"].button {width: 5em} 
+input[type="submit"].bucket {width: 3.5em} 
+input[type="submit"] {border-radius: 2em}
+input.loading {background-color: #EF8}
+ul {list-style:none; padding-left:0}
+li {margin: 0.5em 2em 0 1em; padding-left: 1em; border-radius: 1em}
+li:hover {background-color: #F2EEB2}
+li.selected {background-color: #FE0}
+.buttons, .buckets {text-align:center; margin-bottom:0.5em}
+pre {margin:0 0 0 2em}
+.traceback {background-color:#ff0; border: 2px solid}
+.traceback {margin: 1em 0; padding: 1em}
diff --git a/www/secretary/workbench/worklist.js b/www/secretary/workbench/worklist.js
new file mode 100644
index 0000000..9850fcc
--- /dev/null
+++ b/www/secretary/workbench/worklist.js
@@ -0,0 +1,219 @@
+// prime the second frame
+if (parent.frames[1].location == 'about:blank') {
+  parent.frames[1].location.href = "file.cgi?action=update"
+}
+
+// Map non-ASCII characters to lower case ASCII
+function asciize(name) {
+  if (name.match(/[^\x00-\x7F]/)) {
+    // digraphs.  May be culturally sensitive
+    name=name.replace(/\u00df/g,'ss');
+    name=name.replace(/\u00e4|a\u0308/g,'ae');
+    name=name.replace(/\u00e5|a\u030a/g,'aa');
+    name=name.replace(/\u00e6/g,'ae');
+    name=name.replace(/\u00f1|n\u0303/g,'ny');
+    name=name.replace(/\u00f6|o\u0308/g,'oe');
+    name=name.replace(/\u00fc|u\u0308/g,'ue');
+
+    // latin 1
+    name=name.replace(/[\u00e0-\u00e5]/g,'a');
+    name=name.replace(/\u00e7/g,'c');
+    name=name.replace(/[\u00e8-\u00eb]/g,'e');
+    name=name.replace(/[\u00ec-\u00ef]/g,'i');
+    name=name.replace(/[\u00f2-\u00f6]|\u00f8/g,'o');
+    name=name.replace(/[\u00f9-\u00fc]/g,'u');
+    name=name.replace(/[\u00fd\u00ff]/g,'y');
+
+    // Latin Extended-A
+    name=name.replace(/[\u0100-\u0105]/g,'a');
+    name=name.replace(/[\u0106-\u010d]/g,'c');
+    name=name.replace(/[\u010e-\u0111]/g,'d');
+    name=name.replace(/[\u0112-\u011b]/g,'e');
+    name=name.replace(/[\u011c-\u0123]/g,'g');
+    name=name.replace(/[\u0124-\u0127]/g,'h');
+    name=name.replace(/[\u0128-\u0131]/g,'i');
+    name=name.replace(/[\u0132-\u0133]/g,'ij');
+    name=name.replace(/[\u0134-\u0135]/g,'j');
+    name=name.replace(/[\u0136-\u0138]/g,'k');
+    name=name.replace(/[\u0139-\u0142]/g,'l');
+    name=name.replace(/[\u0143-\u014b]/g,'n');
+    name=name.replace(/[\u014C-\u0151]/g,'o');
+    name=name.replace(/[\u0152-\u0153]/g,'oe');
+    name=name.replace(/[\u0154-\u0159]/g,'r');
+    name=name.replace(/[\u015a-\u0162]/g,'s');
+    name=name.replace(/[\u0162-\u0167]/g,'t');
+    name=name.replace(/[\u0168-\u0173]/g,'u');
+    name=name.replace(/[\u0174-\u0175]/g,'w');
+    name=name.replace(/[\u0176-\u0178]/g,'y');
+    name=name.replace(/[\u0179-\u017e]/g,'z');
+
+    // denormalized diacritics
+    name=name.replace(/[\u0300-\u036f]/g,'');
+  }
+
+  return name.trim().replace(/[^\w]+/g,'-');
+}
+
+// Generate file name from real name (icla)
+function generateFileName(selection) {
+  var value = asciize($('#realname').val());
+  var source = $('#source').val();
+  if (source.indexOf('.')>0) {
+    if (source.indexOf('@')<0 || source.match(/\.pdf$/)) {
+      value+=source.replace(/.*\./,'.');
+    }
+  }
+  return value.replace(/-+/g, '-').toLowerCase();
+}
+
+$(document).ready(function() {
+  // member autofill
+  $('#mavailid').change(function() {
+    var selected = $('#mavailid :selected'); 
+    if (!$('#memail').val()) $("#memail").val($(this).val()+"@apache.org");
+    $("#email").val($(this).val()+"@apache.org");
+    $("#mfname").val(selected.text());
+    $("#realname").val(selected.text());
+    $("#mfilename").val(generateFileName());
+    $("#maddr").focus();
+  });
+
+  // File selection
+  $('#worklist a').click(function() {
+    var link = $(this).text();
+    var directory = link.match("/$");
+    $("*[id$='-form']").hide();
+    $("#buttons").hide();
+    $("#buckets").hide();
+    $("#doctype")[0].reset();
+    $("#classify").show();
+    $("#source").val(link);
+
+    $("li:has(a)").removeClass('selected');
+    if (directory) {
+      $("li:has(a:contains('" + link + "/'))").addClass('selected');
+    } else {
+      $("li:has(a:contains('" + link + "'))").addClass('selected');
+    }
+
+    if (directory || link.match(/pgp\.txt$/)) {
+      parent.frames[1].location.href = 'file.cgi?action=view&dir=' +
+        encodeURIComponent(link);
+    } else {
+      var href = link;
+      if ($(this).attr('data-mtime')) href += '?' + $(this).attr('data-mtime');
+      parent.frames[1].location.href = '/members/received/' + href;
+    }
+
+    if (!link.match(/^eFax-\d+\.pdf$/)) {
+      $("#icla-form input").addClass("loading");
+      $("#ccla-form input").addClass("loading");
+      $("#grant-form input").addClass("loading");
+      $.post('file.cgi', {cmd: 'svninfo', source: link}, function(info) {
+        if (!$('#realname').val()) $('#realname').val(info.from);
+        if (!$('#nname').val())    $('#nname').val(info.from);
+        if (!$('#contact').val())  $('#contact').val(info.from);
+        if (!$('#gname').val())    $('#gname').val(info.from);
+        if (!$('#email').val())    $('#email').val(info.email);
+        if (!$('#cemail').val())   $('#cemail').val(info.email);
+        if (!$('#gemail').val())   $('#gemail').val(info.email);
+        if (!$('#nemail').val())   $('#nemail').val(info.email);
+        if (!$('#memail').val())   $('#memail').val(info.email);
+        if (!$('#nid').val()) {
+          var email = $('#email').val();
+          if (email.match(/^\w+@apache.org$/)) {
+            $('#nid').val(email.split('@')[0]);
+          }
+        }
+        $("#icla-form input").removeClass("loading");
+        $("#ccla-form input").removeClass("loading");
+        $("#grant-form input").removeClass("loading");
+      }, 'json');
+    }
+  });
+
+  // Classification
+  $('#doctype input[name=doctype]').click(function() {
+    var selection = $(this).attr('value');
+    $("*[id$='-form']").slideUp();
+    $("#"+selection+"-form").slideDown();
+    $("#"+selection+"2-form").slideDown();
+    if (selection == 'other') {
+      $("#buckets").show();
+      $("#buttons").hide();
+    } else {
+      $("#buckets").hide();
+      $("#buttons").show();
+    }
+    $("#replaces").val("");
+    if (selection == 'icla') {
+      $("#archive").removeAttr("disabled");
+    } else {
+      $("#archive").attr("disabled", "disabled");
+    }
+  });
+
+  // Fill in
+  $("#pubname").focus(function() {
+    if (this.value=='') this.value=$('#realname').val();
+  });
+
+  $("#email").focus(function() {
+    if (this.value=='') {
+      var source = $('#source').val();
+      if (source.indexOf('@') == -1) source='';
+      this.value = source.toLowerCase();
+    }
+  });
+
+  $("#filename, #nfilename").focus(function() {
+    if (this.value=='') this.value = generateFileName();
+  });
+
+  $("input[name=cfilename]").focus(function() {
+    if (this.value=='') {
+      var source = $('#source').val();
+      var value = $('#company').val();
+      var product = $('#product').val();
+      if (product) value += '-' + product;
+      value = asciize(value);
+      if (source.indexOf('.')>0) {
+        if (source.indexOf('@')<0 || source.match(/\.pdf$/)) {
+          value+=source.replace(/.*\./,'.');
+        }
+      }
+      value = value.replace(/-+/g,'-').toLowerCase();
+      value = value.replace(/-[.]/,'.');
+      value = value.replace(/-inc[.]/,'.');
+      this.value = value;
+    }
+  });
+
+  $("#nemail").focus(function() {
+    if (this.value=='') this.value=$('#nid').val()+'@apache.org';
+  });
+
+  // Commit prompt
+  $("input[value=Commit]").click(function() {
+    var message = prompt("Commit Message?", $('#message').attr('data-value'));
+    if (message) {
+      $('#message').attr('value', message);
+      return true;
+    } else {
+      return false;
+    }
+  });
+
+  // Cleanup prompt
+  $("input[value=Cleanup]").click(function() {
+    return confirm("Revert all changes and cleanup subversion?");
+  });
+
+  // Don't validate when junking
+  $("input[value=junk]").click(function() {
+    $('input').attr('formnovalidate', 'formnovalidate');
+    $('#message').attr('value', 'Spam')
+    return true;
+  });
+
+});
diff --git a/www/spinner.gif b/www/spinner.gif
new file mode 100644
index 0000000..d0bce15
Binary files /dev/null and b/www/spinner.gif differ
diff --git a/www/technology.html b/www/technology.html
new file mode 100644
index 0000000..7529d96
--- /dev/null
+++ b/www/technology.html
@@ -0,0 +1,45 @@
+<!DOCTYPE html>
+<html xmlns="http://www.w3.org/1999/xhtml">
+  <head>
+    <meta charset="utf-8"/>
+    <title>Technology behind Whimsy</title>
+    <style type="text/css">
+      h2 {text-decoration: underline}
+    </style>
+  </head>
+
+  <body>
+    <img title="ASF Logo" src="https://id.apache.org/img/asf_logo_wide.png"/>
+    <a href="http://whimsy.apache.org/">
+      <img src="whimsy.svg" width="80" title="whimsy"/>
+    </a>
+
+    <h2>Whimsy</h2>
+
+    <ul>
+      <li><a href="https://svn.apache.org/repos/infra/infrastructure/trunk/projects/whimsy">Source</a></li>
+      <li><a href="https://issues.apache.org/jira/browse/INFRA/component/12318503">Issue Tracker</a></li>
+    </ul>
+
+    <h2>Technology behind Whimsy</h2>
+
+    <ul>
+      <li><a href="http://www.w3.org/Style/CSS/">CSS</a></li>
+      <li><a href="http://dev.w3.org/html5/spec/spec.html">HTML5</a></li>
+      <li><a title="tecnically it is called ECMAScript" href="http://www.ecma-international.org/publications/standards/Ecma-262.htm">JavaScript</a></li>
+      <li><a href="http://jquery.com/">JQuery</a></li>
+      <li><a href="http://www.ruby-lang.org/en/">Ruby</a></li>
+      <li><a href="http://www.w3.org/TR/SVG/">SVG</a></li>
+      <li><a href="https://github.com/rubys/wunderbar#readme">Wunderbar</a></li>
+    </ul>
+
+    <h2>Technology behind the Technology</h2>
+
+    <ul>
+      <li><a href="http://httpd.apache.org/">Apache HTTPD</a></li>
+      <li><a href="http://tools.ietf.org/html/rfc3875">CGI</a></li>
+      <li><a href="http://www.openldap.org/">LDAP</a></li>
+      <li><a href="http://subversion.apache.org/">Subversion</a></li>
+    </ul>
+  </body>
+</html>
diff --git a/www/test/icla/.gitignore b/www/test/icla/.gitignore
new file mode 100644
index 0000000..d5c0120
--- /dev/null
+++ b/www/test/icla/.gitignore
@@ -0,0 +1,4 @@
+public/assets
+Gemfile.lock
+node_modules
+.vagrant
diff --git a/www/test/icla/Gemfile b/www/test/icla/Gemfile
new file mode 100644
index 0000000..14dcb45
--- /dev/null
+++ b/www/test/icla/Gemfile
@@ -0,0 +1,20 @@
+source 'https://rubygems.org'
+
+gem 'rake'
+gem 'wunderbar', '>= 1.0.0'
+gem 'ruby2js', '>= 2.0.0'
+gem 'sinatra'
+gem 'nokogumbo'
+gem 'execjs', ('<2.5.1' if RUBY_VERSION =~ /^1/)
+gem 'whimsy-asf', '>= 0.0.14'
+
+group :test do
+  gem 'rspec'
+  gem 'capybara'
+  gem 'poltergeist'
+end
+
+group :demo do
+  gem 'puma'
+  gem 'listen'
+end
diff --git a/www/test/icla/Rakefile b/www/test/icla/Rakefile
new file mode 100644
index 0000000..5f61857
--- /dev/null
+++ b/www/test/icla/Rakefile
@@ -0,0 +1,27 @@
+require 'whimsy/asf/config'
+
+task :server => 'views/pages.js.rb' do
+  ENV['RACK_ENV']='development'
+  require 'wunderbar/listen'
+end
+
+file "views/pages.js.rb" => FileList['views/pages/*.js.rb'] do
+  File.open('views/pages.js.rb', 'w') do |pages|
+    # define a dummy superclass
+    class React
+    end
+
+    # evaluate each page in a module, and output a 'require' statement for each
+    Dir.chdir(File.expand_path('../views', __FILE__)) do
+      Dir['pages/*.js.rb'].each do |page|
+	eval "module Pages; #{File.read page}; end"
+	pages.puts "require_relative #{page.sub(/\.js\.rb$/, '').inspect}"
+      end
+    end
+
+    # output a list of page class names
+    pages.print "\nPages = [\n  "
+    pages.print Pages.constants.map(&:to_s).map(&:inspect).join(",\n  ")
+    pages.puts "\n]"
+  end
+end
diff --git a/www/test/icla/config.ru b/www/test/icla/config.ru
new file mode 100644
index 0000000..f9c5286
--- /dev/null
+++ b/www/test/icla/config.ru
@@ -0,0 +1,9 @@
+require File.expand_path('../main.rb', __FILE__)
+
+require 'whimsy/asf/rack'
+
+# https://svn.apache.org/repos/infra/infrastructure/trunk/projects/whimsy/asf/rack.rb
+use ASF::Auth::Committers
+use ASF::HTTPS_workarounds
+
+run Sinatra::Application
diff --git a/www/test/icla/main.rb b/www/test/icla/main.rb
new file mode 100755
index 0000000..a70f322
--- /dev/null
+++ b/www/test/icla/main.rb
@@ -0,0 +1,48 @@
+#
+# Server side setup
+#
+
+require 'whimsy/asf'
+
+require 'wunderbar/sinatra'
+require 'wunderbar/react'
+require 'wunderbar/bootstrap/theme'
+require 'ruby2js/filter/functions'
+require 'ruby2js/filter/require'
+
+#
+# Sinatra routes
+#
+
+get '/' do
+  redirect to('/invite')
+end
+
+get '/invite' do
+  @view = 'invite'
+
+  # get a complete list of PMCs
+  @pmcs = ASF::Committee.list.map(&:name).sort
+
+  # for non ASF members, limit PMCs to ones for which the user is either a
+  # member of the PMC or is a committer.
+  user = ASF::Person.find(env.user)
+  unless user.asf_member?
+    committees = user.committees.map(&:name)
+    groups = user.groups.map(&:name)
+    @pmcs.select! {|pmc| committees.include?(pmc) or groups.include?(pmc)}
+  end
+
+  # render the HTML for the application
+  _html :app
+end
+
+get '/form' do
+  @view = 'interview'
+  _html :app
+end
+
+# posted actions
+post '/actions/:file' do
+  _json :"actions/#{params[:file]}"
+end
diff --git a/www/test/icla/package.json b/www/test/icla/package.json
new file mode 100644
index 0000000..47a81d4
--- /dev/null
+++ b/www/test/icla/package.json
@@ -0,0 +1,15 @@
+{
+  "package": "whimsy-icla",
+  "version": "0.1.0",
+
+  "repository": {
+    "type": "svn",
+    "url": "https://svn.apache.org/repos/infra/infrastructure/trunk/projects/whimsy/www/test/icla"
+  },
+
+  "devDependencies": {
+    "jsdom": "^4.0.1",
+    "jquery": "^2.1.3",
+    "react": "^0.13.1"
+  }
+}
diff --git a/www/test/icla/public/assets/bootstrap-min.css b/www/test/icla/public/assets/bootstrap-min.css
new file mode 100644
index 0000000..28f154d
--- /dev/null
+++ b/www/test/icla/public/assets/bootstrap-min.css
@@ -0,0 +1,5 @@
+/*!
+ * Bootstrap v3.3.2 (http://getbootstrap.com)
+ * Copyright 2011-2015 Twitter, Inc.
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
+ *//*! normalize.css v3.0.2 | MIT License | git.io/normalize */html{font-family:sans-serif;-webkit-text-size-adjust:100%;-ms-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:700}dfn{font-style:italic}h1{margin:.67em 0;font-size:2em}mark{color:#000;background:#ff0}small{font-size:80%}sub,sup{position:relative;font-size:75%;line-height:0;vertical-align:baseline}sup{top:-.5em}sub{bottom:-.25em}img{border:0}svg:not(:root){overflow:hidden}figure{margin:1em 40px}hr{height:0;-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box}pre{overflow:auto}code,kbd,pre,samp{font-family:monospace,monospace;font-size:1em}butt
 on,input,optgroup,select,textarea{margin:0;font:inherit;color:inherit}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{padding:0;border:0}input{line-height:normal}input[type=checkbox],input[type=radio]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;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-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;-webkit-appearance:textfield}input[type=search]::-webkit-search-cancel-button,input[type=search]::-webkit-search-decoration{-webkit-appearance:none}fieldset{padding:.35em .625em .75em;margin:0 2px;border:1px solid silver}legend{padding:0;border:0}textarea{overflow:auto}optgroup{fo
 nt-weight:700}table{border-spacing:0;border-collapse:collapse}td,th{padding:0}/*! Source: https://github.com/h5bp/html5-boilerplate/blob/master/src/css/main.css */@media print{*,:after,:before{color:#000!important;text-shadow:none!important;background:0 0!important;-webkit-box-shadow:none!important;box-shadow:none!important}a,a:visited{text-decoration:underline}a[href]:after{content:" (" attr(href) ")"}abbr[title]:after{content:" (" attr(title) ")"}a[href^="javascript:"]:after,a[href^="#"]:after{content:""}blockquote,pre{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}img,tr{page-break-inside:avoid}img{max-width:100%!important}h2,h3,p{orphans:3;widows:3}h2,h3{page-break-after:avoid}select{background:#fff!important}.navbar{display:none}.btn>.caret,.dropup>.btn>.caret{border-top-color:#000!important}.label{border:1px solid #000}.table{border-collapse:collapse!important}.table td,.table th{background-color:#fff!important}.table-bordered td,.table-bordered
  th{border:1px solid #ddd!important}}@font-face{font-family:'Glyphicons Halflings';src:url(../fonts/glyphicons-halflings-regular.eot);src:url(../fonts/glyphicons-halflings-regular.eot?#iefix) format('embedded-opentype'),url(../fonts/glyphicons-halflings-regular.woff2) format('woff2'),url(../fonts/glyphicons-halflings-regular.woff) format('woff'),url(../fonts/glyphicons-halflings-regular.ttf) format('truetype'),url(../fonts/glyphicons-halflings-regular.svg#glyphicons_halflingsregular) format('svg')}.glyphicon{position:relative;top:1px;display:inline-block;font-family:'Glyphicons Halflings';font-style:normal;font-weight:400;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.glyphicon-asterisk:before{content:"\2a"}.glyphicon-plus:before{content:"\2b"}.glyphicon-eur:before,.glyphicon-euro:before{content:"\20ac"}.glyphicon-minus:before{content:"\2212"}.glyphicon-cloud:before{content:"\2601"}.glyphicon-envelope:before{content:"\2709"}.glyphicon-pencil:befo
 re{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"}.glyphi
 con-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-fu
 ll: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-l
 ink: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{con
 tent:"\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"}.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:befo
 re{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{co
 ntent:"\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"}*{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}:after,:before{-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:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:14px;line-height:1.42857143;color:#333;background-color:#fff}button,input,select,textarea{font-family:inherit;font-size:inherit;line-height:inherit}a{color:#337ab7;text-decoration:none}a:focus,a:hover{color:#23527c;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}.carousel-inner>.item>a>img,.carousel-inner>.item>img,.img-responsive,.thumbnail a>img,.thumbnail>img{display:block;max-width:100%;height:auto}.img-rounded{border-radius:6px}.img-thumbnail{display:inline-block;max-width:100%;height:auto;padding:4px;line-height:1.42857143;background-color:#
 fff;border:1px solid #ddd;border-radius:4px;-webkit-transition:all .2s ease-in-out;-o-transition:all .2s ease-in-out;transition:all .2s ease-in-out}.img-circle{border-radius:50%}hr{margin-top:20px;margin-bottom:20px;border:0;border-top:1px solid #eee}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;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:400;line-height:1;color:#777}.h1,.h2,.h3,h1,h2,h3{margin-top:20px;margin-bottom:10px}.h1 .small,.h1 small,.h2 .small,.h2 small,.h3 .small,.h3 smal
 l,h1 .small,h1 small,h2 .small,h2 small,h3 .small,h3 small{font-size:65%}.h4,.h5,.h6,h4,h5,h6{margin-top:10px;margin-bottom:10px}.h4 .small,.h4 small,.h5 .small,.h5 small,.h6 .small,.h6 small,h4 .small,h4 small,h5 .small,h5 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 10px}.lead{margin-bottom:20px;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{padding:.2em;background-color:#fcf8e3}.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:#777}.text-primary{color:#337ab7}a.text-primary:hover{color:#286090}.text-success{color:#3c763
 d}a.text-success:hover{color:#2b542c}.text-info{color:#31708f}a.text-info:hover{color:#245269}.text-warning{color:#8a6d3b}a.text-warning:hover{color:#66512c}.text-danger{color:#a94442}a.text-danger:hover{color:#843534}.bg-primary{color:#fff;background-color:#337ab7}a.bg-primary:hover{background-color:#286090}.bg-success{background-color:#dff0d8}a.bg-success:hover{background-color:#c1e2b3}.bg-info{background-color:#d9edf7}a.bg-info:hover{background-color:#afd9ee}.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:9px;margin:40px 0 20px;border-bottom:1px solid #eee}ol,ul{margin-top:0;margin-bottom:10px}ol ol,ol ul,ul ol,ul ul{margin-bottom:0}.list-unstyled{padding-left:0;list-style:none}.list-inline{padding-left:0;margin-left:-5px;list-style:none}.list-inline>li{display:inline-block;padding-right:5px;padding-left:5px}dl{margin-top:0;margin-bottom:20px
 }dd,dt{line-height:1.42857143}dt{font-weight:700}dd{margin-left:0}@media (min-width:768px){.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}}abbr[data-original-title],abbr[title]{cursor:help;border-bottom:1px dotted #777}.initialism{font-size:90%;text-transform:uppercase}blockquote{padding:10px 20px;margin:0 0 20px;font-size:17.5px;border-left:5px solid #eee}blockquote ol:last-child,blockquote p:last-child,blockquote ul:last-child{margin-bottom:0}blockquote .small,blockquote footer,blockquote small{display:block;font-size:80%;line-height:1.42857143;color:#777}blockquote .small:before,blockquote footer:before,blockquote small:before{content:'\2014 \00A0'}.blockquote-reverse,blockquote.pull-right{padding-right:15px;padding-left:0;text-align:right;border-right:5px solid #eee;border-left:0}.blockquote-reverse .small:before,.blockquote-reverse footer:before,.blockquote-revers
 e small:before,blockquote.pull-right .small:before,blockquote.pull-right footer:before,blockquote.pull-right small:before{content:''}.blockquote-reverse .small:after,.blockquote-reverse footer:after,.blockquote-reverse small:after,blockquote.pull-right .small:after,blockquote.pull-right footer:after,blockquote.pull-right small:after{content:'\00A0 \2014'}address{margin-bottom:20px;font-style:normal;line-height:1.42857143}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:#fff;background-color:#333;border-radius:3px;-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,.25);box-shadow:inset 0 -1px 0 rgba(0,0,0,.25)}kbd kbd{padding:0;font-size:100%;font-weight:700;-webkit-box-shadow:none;box-shadow:none}pre{display:block;padding:9.5px;margin:0 0 10px;font-size:13px;line-height:1.42857143;color:#333;word-break:break-all;word-wrap:break-word
 ;background-color:#f5f5f5;border:1px solid #ccc;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{padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}@media (min-width:768px){.container{width:750px}}@media (min-width:992px){.container{width:970px}}@media (min-width:1200px){.container{width:1170px}}.container-fluid{padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}.row{margin-right:-15px;margin-left:-15px}.col-lg-1,.col-lg-10,.col-lg-11,.col-lg-12,.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-md-1,.col-md-10,.col-md-11,.col-md-12,.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-sm-1,.col-sm-10,.col-sm-11,.col-sm-12,.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-xs-1,.col-xs-10,.col-xs-11
 ,.col-xs-12,.col-xs-2,.col-xs-3,.col-xs-4,.col-xs-5,.col-xs-6,.col-xs-7,.col-xs-8,.col-xs-9{position:relative;min-height:1px;padding-right:15px;padding-left:15px}.col-xs-1,.col-xs-10,.col-xs-11,.col-xs-12,.col-xs-2,.col-xs-3,.col-xs-4,.col-xs-5,.col-xs-6,.col-xs-7,.col-xs-8,.col-xs-9{float:left}.col-xs-12{width:100%}.col-xs-11{width:91.66666667%}.col-xs-10{width:83.33333333%}.col-xs-9{width:75%}.col-xs-8{width:66.66666667%}.col-xs-7{width:58.33333333%}.col-xs-6{width:50%}.col-xs-5{width:41.66666667%}.col-xs-4{width:33.33333333%}.col-xs-3{width:25%}.col-xs-2{width:16.66666667%}.col-xs-1{width:8.33333333%}.col-xs-pull-12{right:100%}.col-xs-pull-11{right:91.66666667%}.col-xs-pull-10{right:83.33333333%}.col-xs-pull-9{right:75%}.col-xs-pull-8{right:66.66666667%}.col-xs-pull-7{right:58.33333333%}.col-xs-pull-6{right:50%}.col-xs-pull-5{right:41.66666667%}.col-xs-pull-4{right:33.33333333%}.col-xs-pull-3{right:25%}.col-xs-pull-2{right:16.66666667%}.col-xs-pull-1{right:8.33333333%}.col-xs-pul
 l-0{right:auto}.col-xs-push-12{left:100%}.col-xs-push-11{left:91.66666667%}.col-xs-push-10{left:83.33333333%}.col-xs-push-9{left:75%}.col-xs-push-8{left:66.66666667%}.col-xs-push-7{left:58.33333333%}.col-xs-push-6{left:50%}.col-xs-push-5{left:41.66666667%}.col-xs-push-4{left:33.33333333%}.col-xs-push-3{left:25%}.col-xs-push-2{left:16.66666667%}.col-xs-push-1{left:8.33333333%}.col-xs-push-0{left:auto}.col-xs-offset-12{margin-left:100%}.col-xs-offset-11{margin-left:91.66666667%}.col-xs-offset-10{margin-left:83.33333333%}.col-xs-offset-9{margin-left:75%}.col-xs-offset-8{margin-left:66.66666667%}.col-xs-offset-7{margin-left:58.33333333%}.col-xs-offset-6{margin-left:50%}.col-xs-offset-5{margin-left:41.66666667%}.col-xs-offset-4{margin-left:33.33333333%}.col-xs-offset-3{margin-left:25%}.col-xs-offset-2{margin-left:16.66666667%}.col-xs-offset-1{margin-left:8.33333333%}.col-xs-offset-0{margin-left:0}@media (min-width:768px){.col-sm-1,.col-sm-10,.col-sm-11,.col-sm-12,.col-sm-2,.col-sm-3,.col
 -sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9{float:left}.col-sm-12{width:100%}.col-sm-11{width:91.66666667%}.col-sm-10{width:83.33333333%}.col-sm-9{width:75%}.col-sm-8{width:66.66666667%}.col-sm-7{width:58.33333333%}.col-sm-6{width:50%}.col-sm-5{width:41.66666667%}.col-sm-4{width:33.33333333%}.col-sm-3{width:25%}.col-sm-2{width:16.66666667%}.col-sm-1{width:8.33333333%}.col-sm-pull-12{right:100%}.col-sm-pull-11{right:91.66666667%}.col-sm-pull-10{right:83.33333333%}.col-sm-pull-9{right:75%}.col-sm-pull-8{right:66.66666667%}.col-sm-pull-7{right:58.33333333%}.col-sm-pull-6{right:50%}.col-sm-pull-5{right:41.66666667%}.col-sm-pull-4{right:33.33333333%}.col-sm-pull-3{right:25%}.col-sm-pull-2{right:16.66666667%}.col-sm-pull-1{right:8.33333333%}.col-sm-pull-0{right:auto}.col-sm-push-12{left:100%}.col-sm-push-11{left:91.66666667%}.col-sm-push-10{left:83.33333333%}.col-sm-push-9{left:75%}.col-sm-push-8{left:66.66666667%}.col-sm-push-7{left:58.33333333%}.col-sm-push-6{left:50%}.col-s
 m-push-5{left:41.66666667%}.col-sm-push-4{left:33.33333333%}.col-sm-push-3{left:25%}.col-sm-push-2{left:16.66666667%}.col-sm-push-1{left:8.33333333%}.col-sm-push-0{left:auto}.col-sm-offset-12{margin-left:100%}.col-sm-offset-11{margin-left:91.66666667%}.col-sm-offset-10{margin-left:83.33333333%}.col-sm-offset-9{margin-left:75%}.col-sm-offset-8{margin-left:66.66666667%}.col-sm-offset-7{margin-left:58.33333333%}.col-sm-offset-6{margin-left:50%}.col-sm-offset-5{margin-left:41.66666667%}.col-sm-offset-4{margin-left:33.33333333%}.col-sm-offset-3{margin-left:25%}.col-sm-offset-2{margin-left:16.66666667%}.col-sm-offset-1{margin-left:8.33333333%}.col-sm-offset-0{margin-left:0}}@media (min-width:992px){.col-md-1,.col-md-10,.col-md-11,.col-md-12,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9{float:left}.col-md-12{width:100%}.col-md-11{width:91.66666667%}.col-md-10{width:83.33333333%}.col-md-9{width:75%}.col-md-8{width:66.66666667%}.col-md-7{width:58.33333333%}.
 col-md-6{width:50%}.col-md-5{width:41.66666667%}.col-md-4{width:33.33333333%}.col-md-3{width:25%}.col-md-2{width:16.66666667%}.col-md-1{width:8.33333333%}.col-md-pull-12{right:100%}.col-md-pull-11{right:91.66666667%}.col-md-pull-10{right:83.33333333%}.col-md-pull-9{right:75%}.col-md-pull-8{right:66.66666667%}.col-md-pull-7{right:58.33333333%}.col-md-pull-6{right:50%}.col-md-pull-5{right:41.66666667%}.col-md-pull-4{right:33.33333333%}.col-md-pull-3{right:25%}.col-md-pull-2{right:16.66666667%}.col-md-pull-1{right:8.33333333%}.col-md-pull-0{right:auto}.col-md-push-12{left:100%}.col-md-push-11{left:91.66666667%}.col-md-push-10{left:83.33333333%}.col-md-push-9{left:75%}.col-md-push-8{left:66.66666667%}.col-md-push-7{left:58.33333333%}.col-md-push-6{left:50%}.col-md-push-5{left:41.66666667%}.col-md-push-4{left:33.33333333%}.col-md-push-3{left:25%}.col-md-push-2{left:16.66666667%}.col-md-push-1{left:8.33333333%}.col-md-push-0{left:auto}.col-md-offset-12{margin-left:100%}.col-md-offset-11{m
 argin-left:91.66666667%}.col-md-offset-10{margin-left:83.33333333%}.col-md-offset-9{margin-left:75%}.col-md-offset-8{margin-left:66.66666667%}.col-md-offset-7{margin-left:58.33333333%}.col-md-offset-6{margin-left:50%}.col-md-offset-5{margin-left:41.66666667%}.col-md-offset-4{margin-left:33.33333333%}.col-md-offset-3{margin-left:25%}.col-md-offset-2{margin-left:16.66666667%}.col-md-offset-1{margin-left:8.33333333%}.col-md-offset-0{margin-left:0}}@media (min-width:1200px){.col-lg-1,.col-lg-10,.col-lg-11,.col-lg-12,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9{float:left}.col-lg-12{width:100%}.col-lg-11{width:91.66666667%}.col-lg-10{width:83.33333333%}.col-lg-9{width:75%}.col-lg-8{width:66.66666667%}.col-lg-7{width:58.33333333%}.col-lg-6{width:50%}.col-lg-5{width:41.66666667%}.col-lg-4{width:33.33333333%}.col-lg-3{width:25%}.col-lg-2{width:16.66666667%}.col-lg-1{width:8.33333333%}.col-lg-pull-12{right:100%}.col-lg-pull-11{right:91.66666667%}.col-lg-pul
 l-10{right:83.33333333%}.col-lg-pull-9{right:75%}.col-lg-pull-8{right:66.66666667%}.col-lg-pull-7{right:58.33333333%}.col-lg-pull-6{right:50%}.col-lg-pull-5{right:41.66666667%}.col-lg-pull-4{right:33.33333333%}.col-lg-pull-3{right:25%}.col-lg-pull-2{right:16.66666667%}.col-lg-pull-1{right:8.33333333%}.col-lg-pull-0{right:auto}.col-lg-push-12{left:100%}.col-lg-push-11{left:91.66666667%}.col-lg-push-10{left:83.33333333%}.col-lg-push-9{left:75%}.col-lg-push-8{left:66.66666667%}.col-lg-push-7{left:58.33333333%}.col-lg-push-6{left:50%}.col-lg-push-5{left:41.66666667%}.col-lg-push-4{left:33.33333333%}.col-lg-push-3{left:25%}.col-lg-push-2{left:16.66666667%}.col-lg-push-1{left:8.33333333%}.col-lg-push-0{left:auto}.col-lg-offset-12{margin-left:100%}.col-lg-offset-11{margin-left:91.66666667%}.col-lg-offset-10{margin-left:83.33333333%}.col-lg-offset-9{margin-left:75%}.col-lg-offset-8{margin-left:66.66666667%}.col-lg-offset-7{margin-left:58.33333333%}.col-lg-offset-6{margin-left:50%}.col-lg-of
 fset-5{margin-left:41.66666667%}.col-lg-offset-4{margin-left:33.33333333%}.col-lg-offset-3{margin-left:25%}.col-lg-offset-2{margin-left:16.66666667%}.col-lg-offset-1{margin-left:8.33333333%}.col-lg-offset-0{margin-left:0}}table{background-color:transparent}caption{padding-top:8px;padding-bottom:8px;color:#777;text-align:left}th{text-align:left}.table{width:100%;max-width:100%;margin-bottom:20px}.table>tbody>tr>td,.table>tbody>tr>th,.table>tfoot>tr>td,.table>tfoot>tr>th,.table>thead>tr>td,.table>thead>tr>th{padding:8px;line-height:1.42857143;vertical-align:top;border-top:1px solid #ddd}.table>thead>tr>th{vertical-align:bottom;border-bottom:2px solid #ddd}.table>caption+thead>tr:first-child>td,.table>caption+thead>tr:first-child>th,.table>colgroup+thead>tr:first-child>td,.table>colgroup+thead>tr:first-child>th,.table>thead:first-child>tr:first-child>td,.table>thead:first-child>tr:first-child>th{border-top:0}.table>tbody+tbody{border-top:2px solid #ddd}.table .table{background-color:#f
 ff}.table-condensed>tbody>tr>td,.table-condensed>tbody>tr>th,.table-condensed>tfoot>tr>td,.table-condensed>tfoot>tr>th,.table-condensed>thead>tr>td,.table-condensed>thead>tr>th{padding:5px}.table-bordered{border:1px solid #ddd}.table-bordered>tbody>tr>td,.table-bordered>tbody>tr>th,.table-bordered>tfoot>tr>td,.table-bordered>tfoot>tr>th,.table-bordered>thead>tr>td,.table-bordered>thead>tr>th{border:1px solid #ddd}.table-bordered>thead>tr>td,.table-bordered>thead>tr>th{border-bottom-width:2px}.table-striped>tbody>tr:nth-of-type(odd){background-color:#f9f9f9}.table-hover>tbody>tr:hover{background-color:#f5f5f5}table col[class*=col-]{position:static;display:table-column;float:none}table td[class*=col-],table th[class*=col-]{position:static;display:table-cell;float:none}.table>tbody>tr.active>td,.table>tbody>tr.active>th,.table>tbody>tr>td.active,.table>tbody>tr>th.active,.table>tfoot>tr.active>td,.table>tfoot>tr.active>th,.table>tfoot>tr>td.active,.table>tfoot>tr>th.active,.table>thead
 >tr.active>td,.table>thead>tr.active>th,.table>thead>tr>td.active,.table>thead>tr>th.active{background-color:#f5f5f5}.table-hover>tbody>tr.active:hover>td,.table-hover>tbody>tr.active:hover>th,.table-hover>tbody>tr:hover>.active,.table-hover>tbody>tr>td.active:hover,.table-hover>tbody>tr>th.active:hover{background-color:#e8e8e8}.table>tbody>tr.success>td,.table>tbody>tr.success>th,.table>tbody>tr>td.success,.table>tbody>tr>th.success,.table>tfoot>tr.success>td,.table>tfoot>tr.success>th,.table>tfoot>tr>td.success,.table>tfoot>tr>th.success,.table>thead>tr.success>td,.table>thead>tr.success>th,.table>thead>tr>td.success,.table>thead>tr>th.success{background-color:#dff0d8}.table-hover>tbody>tr.success:hover>td,.table-hover>tbody>tr.success:hover>th,.table-hover>tbody>tr:hover>.success,.table-hover>tbody>tr>td.success:hover,.table-hover>tbody>tr>th.success:hover{background-color:#d0e9c6}.table>tbody>tr.info>td,.table>tbody>tr.info>th,.table>tbody>tr>td.info,.table>tbody>tr>th.info,.tab
 le>tfoot>tr.info>td,.table>tfoot>tr.info>th,.table>tfoot>tr>td.info,.table>tfoot>tr>th.info,.table>thead>tr.info>td,.table>thead>tr.info>th,.table>thead>tr>td.info,.table>thead>tr>th.info{background-color:#d9edf7}.table-hover>tbody>tr.info:hover>td,.table-hover>tbody>tr.info:hover>th,.table-hover>tbody>tr:hover>.info,.table-hover>tbody>tr>td.info:hover,.table-hover>tbody>tr>th.info:hover{background-color:#c4e3f3}.table>tbody>tr.warning>td,.table>tbody>tr.warning>th,.table>tbody>tr>td.warning,.table>tbody>tr>th.warning,.table>tfoot>tr.warning>td,.table>tfoot>tr.warning>th,.table>tfoot>tr>td.warning,.table>tfoot>tr>th.warning,.table>thead>tr.warning>td,.table>thead>tr.warning>th,.table>thead>tr>td.warning,.table>thead>tr>th.warning{background-color:#fcf8e3}.table-hover>tbody>tr.warning:hover>td,.table-hover>tbody>tr.warning:hover>th,.table-hover>tbody>tr:hover>.warning,.table-hover>tbody>tr>td.warning:hover,.table-hover>tbody>tr>th.warning:hover{background-color:#faf2cc}.table>tbody>t
 r.danger>td,.table>tbody>tr.danger>th,.table>tbody>tr>td.danger,.table>tbody>tr>th.danger,.table>tfoot>tr.danger>td,.table>tfoot>tr.danger>th,.table>tfoot>tr>td.danger,.table>tfoot>tr>th.danger,.table>thead>tr.danger>td,.table>thead>tr.danger>th,.table>thead>tr>td.danger,.table>thead>tr>th.danger{background-color:#f2dede}.table-hover>tbody>tr.danger:hover>td,.table-hover>tbody>tr.danger:hover>th,.table-hover>tbody>tr:hover>.danger,.table-hover>tbody>tr>td.danger:hover,.table-hover>tbody>tr>th.danger:hover{background-color:#ebcccc}.table-responsive{min-height:.01%;overflow-x:auto}@media screen and (max-width:767px){.table-responsive{width:100%;margin-bottom:15px;overflow-y:hidden;-ms-overflow-style:-ms-autohiding-scrollbar;border:1px solid #ddd}.table-responsive>.table{margin-bottom:0}.table-responsive>.table>tbody>tr>td,.table-responsive>.table>tbody>tr>th,.table-responsive>.table>tfoot>tr>td,.table-responsive>.table>tfoot>tr>th,.table-responsive>.table>thead>tr>td,.table-responsive
 >.table>thead>tr>th{white-space:nowrap}.table-responsive>.table-bordered{border:0}.table-responsive>.table-bordered>tbody>tr>td:first-child,.table-responsive>.table-bordered>tbody>tr>th:first-child,.table-responsive>.table-bordered>tfoot>tr>td:first-child,.table-responsive>.table-bordered>tfoot>tr>th:first-child,.table-responsive>.table-bordered>thead>tr>td:first-child,.table-responsive>.table-bordered>thead>tr>th:first-child{border-left:0}.table-responsive>.table-bordered>tbody>tr>td:last-child,.table-responsive>.table-bordered>tbody>tr>th:last-child,.table-responsive>.table-bordered>tfoot>tr>td:last-child,.table-responsive>.table-bordered>tfoot>tr>th:last-child,.table-responsive>.table-bordered>thead>tr>td:last-child,.table-responsive>.table-bordered>thead>tr>th:last-child{border-right:0}.table-responsive>.table-bordered>tbody>tr:last-child>td,.table-responsive>.table-bordered>tbody>tr:last-child>th,.table-responsive>.table-bordered>tfoot>tr:last-child>td,.table-responsive>.table-
 bordered>tfoot>tr:last-child>th{border-bottom:0}}fieldset{min-width:0;padding:0;margin:0;border:0}legend{display:block;width:100%;padding:0;margin-bottom:20px;font-size:21px;line-height:inherit;color:#333;border:0;border-bottom:1px solid #e5e5e5}label{display:inline-block;max-width:100%;margin-bottom:5px;font-weight:700}input[type=search]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}input[type=checkbox],input[type=radio]{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=checkbox]:focus,input[type=radio]: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.42857143;color:#555}.form-control{display:block;width:100%;height:34px;padding:6px 12px;font-size:14px;line-height:1.42857143;color:#555;background-
 color:#fff;background-image:none;border:1px solid #ccc;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075);-webkit-transition:border-color ease-in-out .15s,-webkit-box-shadow ease-in-out .15s;-o-transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s;transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s}.form-control:focus{border-color:#66afe9;outline:0;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(102,175,233,.6);box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(102,175,233,.6)}.form-control::-moz-placeholder{color:#999;opacity:1}.form-control:-ms-input-placeholder{color:#999}.form-control::-webkit-input-placeholder{color:#999}.form-control[disabled],.form-control[readonly],fieldset[disabled] .form-control{cursor:not-allowed;background-color:#eee;opacity:1}textarea.form-control{height:auto}input[type=search]{-webkit-appearance:none}@media screen and (-webkit-min-devic
 e-pixel-ratio:0){input[type=date],input[type=time],input[type=datetime-local],input[type=month]{line-height:34px}.input-group-sm input[type=date],.input-group-sm input[type=time],.input-group-sm input[type=datetime-local],.input-group-sm input[type=month],input[type=date].input-sm,input[type=time].input-sm,input[type=datetime-local].input-sm,input[type=month].input-sm{line-height:30px}.input-group-lg input[type=date],.input-group-lg input[type=time],.input-group-lg input[type=datetime-local],.input-group-lg input[type=month],input[type=date].input-lg,input[type=time].input-lg,input[type=datetime-local].input-lg,input[type=month].input-lg{line-height:46px}}.form-group{margin-bottom:15px}.checkbox,.radio{position:relative;display:block;margin-top:10px;margin-bottom:10px}.checkbox label,.radio label{min-height:20px;padding-left:20px;margin-bottom:0;font-weight:400;cursor:pointer}.checkbox input[type=checkbox],.checkbox-inline input[type=checkbox],.radio input[type=radio],.radio-inline 
 input[type=radio]{position:absolute;margin-top:4px \9;margin-left:-20px}.checkbox+.checkbox,.radio+.radio{margin-top:-5px}.checkbox-inline,.radio-inline{display:inline-block;padding-left:20px;margin-bottom:0;font-weight:400;vertical-align:middle;cursor:pointer}.checkbox-inline+.checkbox-inline,.radio-inline+.radio-inline{margin-top:0;margin-left:10px}fieldset[disabled] input[type=checkbox],fieldset[disabled] input[type=radio],input[type=checkbox].disabled,input[type=checkbox][disabled],input[type=radio].disabled,input[type=radio][disabled]{cursor:not-allowed}.checkbox-inline.disabled,.radio-inline.disabled,fieldset[disabled] .checkbox-inline,fieldset[disabled] .radio-inline{cursor:not-allowed}.checkbox.disabled label,.radio.disabled label,fieldset[disabled] .checkbox label,fieldset[disabled] .radio 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-right:0;padding-left:0
 }.input-sm{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}select.input-sm{height:30px;line-height:30px}select[multiple].input-sm,textarea.input-sm{height:auto}.form-group-sm .form-control{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}select.form-group-sm .form-control{height:30px;line-height:30px}select[multiple].form-group-sm .form-control,textarea.form-group-sm .form-control{height:auto}.form-group-sm .form-control-static{height:30px;padding:5px 10px;font-size:12px;line-height:1.5}.input-lg{height:46px;padding:10px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}select.input-lg{height:46px;line-height:46px}select[multiple].input-lg,textarea.input-lg{height:auto}.form-group-lg .form-control{height:46px;padding:10px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}select.form-group-lg .form-control{height:46px;line-height:46px}select[multiple].form-group-lg .form-control,textarea.form-group-lg .for
 m-control{height:auto}.form-group-lg .form-control-static{height:46px;padding:10px 16px;font-size:18px;line-height:1.3333333}.has-feedback{position:relative}.has-feedback .form-control{padding-right:42.5px}.form-control-feedback{position:absolute;top:0;right:0;z-index:2;display:block;width:34px;height:34px;line-height:34px;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 .checkbox,.has-success .checkbox-inline,.has-success .control-label,.has-success .help-block,.has-success .radio,.has-success .radio-inline,.has-success.checkbox label,.has-success.checkbox-inline label,.has-success.radio label,.has-success.radio-inline label{color:#3c763d}.has-success .form-control{border-color:#3c763d;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-success .form-control:focus{border-color:#2b542c;-we
 bkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #67b168;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #67b168}.has-success .input-group-addon{color:#3c763d;background-color:#dff0d8;border-color:#3c763d}.has-success .form-control-feedback{color:#3c763d}.has-warning .checkbox,.has-warning .checkbox-inline,.has-warning .control-label,.has-warning .help-block,.has-warning .radio,.has-warning .radio-inline,.has-warning.checkbox label,.has-warning.checkbox-inline label,.has-warning.radio label,.has-warning.radio-inline label{color:#8a6d3b}.has-warning .form-control{border-color:#8a6d3b;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-warning .form-control:focus{border-color:#66512c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #c0a16b;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #c0a16b}.has-warning .input-group-addon{color:#8a6d3b;background-color:#fcf8e3;border-color:#8a6d3b}.has-warning .form-contro
 l-feedback{color:#8a6d3b}.has-error .checkbox,.has-error .checkbox-inline,.has-error .control-label,.has-error .help-block,.has-error .radio,.has-error .radio-inline,.has-error.checkbox label,.has-error.checkbox-inline label,.has-error.radio label,.has-error.radio-inline label{color:#a94442}.has-error .form-control{border-color:#a94442;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-error .form-control:focus{border-color:#843534;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #ce8483;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #ce8483}.has-error .input-group-addon{color:#a94442;background-color:#f2dede;border-color:#a94442}.has-error .form-control-feedback{color:#a94442}.has-feedback label~.form-control-feedback{top:25px}.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:inli
 ne-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 .form-control,.form-inline .input-group .input-group-addon,.form-inline .input-group .input-group-btn{width:auto}.form-inline .input-group>.form-control{width:100%}.form-inline .control-label{margin-bottom:0;vertical-align:middle}.form-inline .checkbox,.form-inline .radio{display:inline-block;margin-top:0;margin-bottom:0;vertical-align:middle}.form-inline .checkbox label,.form-inline .radio label{padding-left:0}.form-inline .checkbox input[type=checkbox],.form-inline .radio input[type=radio]{position:relative;margin-left:0}.form-inline .has-feedback .form-control-feedback{top:0}}.form-horizontal .checkbox,.form-horizontal .checkbox-inline,.form-horizontal .radio,.form-horizontal .radio-inline{padding-top:7px;m
 argin-top:0;margin-bottom:0}.form-horizontal .checkbox,.form-horizontal .radio{min-height:27px}.form-horizontal .form-group{margin-right:-15px;margin-left:-15px}@media (min-width:768px){.form-horizontal .control-label{padding-top:7px;margin-bottom:0;text-align:right}}.form-horizontal .has-feedback .form-control-feedback{right:15px}@media (min-width:768px){.form-horizontal .form-group-lg .control-label{padding-top:14.33px}}@media (min-width:768px){.form-horizontal .form-group-sm .control-label{padding-top:6px}}.btn{display:inline-block;padding:6px 12px;margin-bottom:0;font-size:14px;font-weight:400;line-height:1.42857143;text-align:center;white-space:nowrap;vertical-align:middle;-ms-touch-action:manipulation;touch-action:manipulation;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;background-image:none;border:1px solid transparent;border-radius:4px}.btn.active.focus,.btn.active:focus,.btn.focus,.btn:active.focus,.btn:active:focus,.b
 tn:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}.btn.focus,.btn:focus,.btn:hover{color:#333;text-decoration:none}.btn.active,.btn:active{background-image:none;outline:0;-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,.125);box-shadow:inset 0 3px 5px rgba(0,0,0,.125)}.btn.disabled,.btn[disabled],fieldset[disabled] .btn{pointer-events:none;cursor:not-allowed;filter:alpha(opacity=65);-webkit-box-shadow:none;box-shadow:none;opacity:.65}.btn-default{color:#333;background-color:#fff;border-color:#ccc}.btn-default.active,.btn-default.focus,.btn-default:active,.btn-default:focus,.btn-default:hover,.open>.dropdown-toggle.btn-default{color:#333;background-color:#e6e6e6;border-color:#adadad}.btn-default.active,.btn-default:active,.open>.dropdown-toggle.btn-default{background-image:none}.btn-default.disabled,.btn-default.disabled.active,.btn-default.disabled.focus,.btn-default.disabled:active,.btn-default.disabled:focus,.btn-default.disabled:hover,.btn-d
 efault[disabled],.btn-default[disabled].active,.btn-default[disabled].focus,.btn-default[disabled]:active,.btn-default[disabled]:focus,.btn-default[disabled]:hover,fieldset[disabled] .btn-default,fieldset[disabled] .btn-default.active,fieldset[disabled] .btn-default.focus,fieldset[disabled] .btn-default:active,fieldset[disabled] .btn-default:focus,fieldset[disabled] .btn-default:hover{background-color:#fff;border-color:#ccc}.btn-default .badge{color:#fff;background-color:#333}.btn-primary{color:#fff;background-color:#337ab7;border-color:#2e6da4}.btn-primary.active,.btn-primary.focus,.btn-primary:active,.btn-primary:focus,.btn-primary:hover,.open>.dropdown-toggle.btn-primary{color:#fff;background-color:#286090;border-color:#204d74}.btn-primary.active,.btn-primary:active,.open>.dropdown-toggle.btn-primary{background-image:none}.btn-primary.disabled,.btn-primary.disabled.active,.btn-primary.disabled.focus,.btn-primary.disabled:active,.btn-primary.disabled:focus,.btn-primary.disabled:ho
 ver,.btn-primary[disabled],.btn-primary[disabled].active,.btn-primary[disabled].focus,.btn-primary[disabled]:active,.btn-primary[disabled]:focus,.btn-primary[disabled]:hover,fieldset[disabled] .btn-primary,fieldset[disabled] .btn-primary.active,fieldset[disabled] .btn-primary.focus,fieldset[disabled] .btn-primary:active,fieldset[disabled] .btn-primary:focus,fieldset[disabled] .btn-primary:hover{background-color:#337ab7;border-color:#2e6da4}.btn-primary .badge{color:#337ab7;background-color:#fff}.btn-success{color:#fff;background-color:#5cb85c;border-color:#4cae4c}.btn-success.active,.btn-success.focus,.btn-success:active,.btn-success:focus,.btn-success:hover,.open>.dropdown-toggle.btn-success{color:#fff;background-color:#449d44;border-color:#398439}.btn-success.active,.btn-success:active,.open>.dropdown-toggle.btn-success{background-image:none}.btn-success.disabled,.btn-success.disabled.active,.btn-success.disabled.focus,.btn-success.disabled:active,.btn-success.disabled:focus,.btn-
 success.disabled:hover,.btn-success[disabled],.btn-success[disabled].active,.btn-success[disabled].focus,.btn-success[disabled]:active,.btn-success[disabled]:focus,.btn-success[disabled]:hover,fieldset[disabled] .btn-success,fieldset[disabled] .btn-success.active,fieldset[disabled] .btn-success.focus,fieldset[disabled] .btn-success:active,fieldset[disabled] .btn-success:focus,fieldset[disabled] .btn-success:hover{background-color:#5cb85c;border-color:#4cae4c}.btn-success .badge{color:#5cb85c;background-color:#fff}.btn-info{color:#fff;background-color:#5bc0de;border-color:#46b8da}.btn-info.active,.btn-info.focus,.btn-info:active,.btn-info:focus,.btn-info:hover,.open>.dropdown-toggle.btn-info{color:#fff;background-color:#31b0d5;border-color:#269abc}.btn-info.active,.btn-info:active,.open>.dropdown-toggle.btn-info{background-image:none}.btn-info.disabled,.btn-info.disabled.active,.btn-info.disabled.focus,.btn-info.disabled:active,.btn-info.disabled:focus,.btn-info.disabled:hover,.btn-i
 nfo[disabled],.btn-info[disabled].active,.btn-info[disabled].focus,.btn-info[disabled]:active,.btn-info[disabled]:focus,.btn-info[disabled]:hover,fieldset[disabled] .btn-info,fieldset[disabled] .btn-info.active,fieldset[disabled] .btn-info.focus,fieldset[disabled] .btn-info:active,fieldset[disabled] .btn-info:focus,fieldset[disabled] .btn-info:hover{background-color:#5bc0de;border-color:#46b8da}.btn-info .badge{color:#5bc0de;background-color:#fff}.btn-warning{color:#fff;background-color:#f0ad4e;border-color:#eea236}.btn-warning.active,.btn-warning.focus,.btn-warning:active,.btn-warning:focus,.btn-warning:hover,.open>.dropdown-toggle.btn-warning{color:#fff;background-color:#ec971f;border-color:#d58512}.btn-warning.active,.btn-warning:active,.open>.dropdown-toggle.btn-warning{background-image:none}.btn-warning.disabled,.btn-warning.disabled.active,.btn-warning.disabled.focus,.btn-warning.disabled:active,.btn-warning.disabled:focus,.btn-warning.disabled:hover,.btn-warning[disabled],.bt
 n-warning[disabled].active,.btn-warning[disabled].focus,.btn-warning[disabled]:active,.btn-warning[disabled]:focus,.btn-warning[disabled]:hover,fieldset[disabled] .btn-warning,fieldset[disabled] .btn-warning.active,fieldset[disabled] .btn-warning.focus,fieldset[disabled] .btn-warning:active,fieldset[disabled] .btn-warning:focus,fieldset[disabled] .btn-warning:hover{background-color:#f0ad4e;border-color:#eea236}.btn-warning .badge{color:#f0ad4e;background-color:#fff}.btn-danger{color:#fff;background-color:#d9534f;border-color:#d43f3a}.btn-danger.active,.btn-danger.focus,.btn-danger:active,.btn-danger:focus,.btn-danger:hover,.open>.dropdown-toggle.btn-danger{color:#fff;background-color:#c9302c;border-color:#ac2925}.btn-danger.active,.btn-danger:active,.open>.dropdown-toggle.btn-danger{background-image:none}.btn-danger.disabled,.btn-danger.disabled.active,.btn-danger.disabled.focus,.btn-danger.disabled:active,.btn-danger.disabled:focus,.btn-danger.disabled:hover,.btn-danger[disabled],.
 btn-danger[disabled].active,.btn-danger[disabled].focus,.btn-danger[disabled]:active,.btn-danger[disabled]:focus,.btn-danger[disabled]:hover,fieldset[disabled] .btn-danger,fieldset[disabled] .btn-danger.active,fieldset[disabled] .btn-danger.focus,fieldset[disabled] .btn-danger:active,fieldset[disabled] .btn-danger:focus,fieldset[disabled] .btn-danger:hover{background-color:#d9534f;border-color:#d43f3a}.btn-danger .badge{color:#d9534f;background-color:#fff}.btn-link{font-weight:400;color:#337ab7;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:active,.btn-link:focus,.btn-link:hover{border-color:transparent}.btn-link:focus,.btn-link:hover{color:#23527c;text-decoration:underline;background-color:transparent}.btn-link[disabled]:focus,.btn-link[disabled]:hover,fieldset[disabled] .btn-link:focus,fieldset[disabled] .btn-link:hover{color:#777;t
 ext-decoration:none}.btn-group-lg>.btn,.btn-lg{padding:10px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}.btn-group-sm>.btn,.btn-sm{padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}.btn-group-xs>.btn,.btn-xs{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=button].btn-block,input[type=reset].btn-block,input[type=submit].btn-block{width:100%}.fade{opacity:0;-webkit-transition:opacity .15s linear;-o-transition:opacity .15s linear;transition:opacity .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-timing-function:ease;-o-transition-timing-function:ease;transition-timing-function:ease;-webkit-transition-duration:.35s;-o-transition-duration:.35
 s;transition-duration:.35s;-webkit-transition-property:height,visibility;-o-transition-property:height,visibility;transition-property:height,visibility}.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}.dropdown,.dropup{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;font-size:14px;text-align:left;list-style:none;background-color:#fff;-webkit-background-clip:padding-box;background-clip:padding-box;border:1px solid #ccc;border:1px solid rgba(0,0,0,.15);border-radius:4px;-webkit-box-shadow:0 6px 12px rgba(0,0,0,.175);box-shadow:0 6px 12px rgba(0,0,0,.175)}.dropdown-menu.pull-right{right:0;left:auto}.dropdown-menu .divider{height:1px;margin:9px 0;overflow:hidden;background-color:#e5e5e5}.dropdown-menu>li>a{display:block;padding:3px 2
 0px;clear:both;font-weight:400;line-height:1.42857143;color:#333;white-space:nowrap}.dropdown-menu>li>a:focus,.dropdown-menu>li>a:hover{color:#262626;text-decoration:none;background-color:#f5f5f5}.dropdown-menu>.active>a,.dropdown-menu>.active>a:focus,.dropdown-menu>.active>a:hover{color:#fff;text-decoration:none;background-color:#337ab7;outline:0}.dropdown-menu>.disabled>a,.dropdown-menu>.disabled>a:focus,.dropdown-menu>.disabled>a:hover{color:#777}.dropdown-menu>.disabled>a:focus,.dropdown-menu>.disabled>a:hover{text-decoration:none;cursor:not-allowed;background-color:transparent;background-image:none;filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.open>.dropdown-menu{display:block}.open>a{outline:0}.dropdown-menu-right{right:0;left:auto}.dropdown-menu-left{right:auto;left:0}.dropdown-header{display:block;padding:3px 20px;font-size:12px;line-height:1.42857143;color:#777;white-space:nowrap}.dropdown-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:990
 }.pull-right>.dropdown-menu{right:0;left:auto}.dropup .caret,.navbar-fixed-bottom .dropdown .caret{content:"";border-top:0;border-bottom:4px solid}.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{right:auto;left:0}}.btn-group,.btn-group-vertical{position:relative;display:inline-block;vertical-align:middle}.btn-group-vertical>.btn,.btn-group>.btn{position:relative;float:left}.btn-group-vertical>.btn.active,.btn-group-vertical>.btn:active,.btn-group-vertical>.btn:focus,.btn-group-vertical>.btn:hover,.btn-group>.btn.active,.btn-group>.btn:active,.btn-group>.btn:focus,.btn-group>.btn:hover{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 .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-top-right-radius:0;border-bottom-right-radius:0}.btn-group>.btn:last-child:not(:first-child),.btn-group>.dropdown-toggle:not(:first-child){border-top-left-radius:0;border-bottom-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-top-right-radius:0;border-bottom-right-radius:0}.btn-group>.btn-group:last-child:not(:first-child)>.btn:first-child{border-top-left-radius:0;border-bottom-left-radius:0}.btn-group .dropdown-toggle:active,.btn-group.open .dropdown-toggle{outline:0}.btn-group>.btn+.dropdown-tog
 gle{padding-right:8px;padding-left:8px}.btn-group>.btn-lg+.dropdown-toggle{padding-right:12px;padding-left:12px}.btn-group.open .dropdown-toggle{-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,.125);box-shadow:inset 0 3px 5px rgba(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>.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-top-left-radius:0;border-top-right-radius:0;border-bottom-left-radius:4px}.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-left-radius:0;border-top-right-radius:0}.btn-group-justified{display:table;width:100%;table-layout:fixed;border-collapse:separate}.btn-group-justified>.btn,.btn-group-justified>.btn-group{display:table-cell;float:none;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=checkbox],[data-toggle=buttons]>.btn input[type=radio],[data-toggle=bu
 ttons]>.btn-group>.btn input[type=checkbox],[data-toggle=buttons]>.btn-group>.btn input[type=radio]{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-right:0;padding-left:0}.input-group .form-control{position:relative;z-index:2;float:left;width:100%;margin-bottom:0}.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.3333333;border-radius:6px}select.input-group-lg>.form-control,select.input-group-lg>.input-group-addon,select.input-group-lg>.input-group-btn>.btn{height:46px;line-height:46px}select[multiple].input-group-lg>.form-control,select[multiple].input-group-lg>.input-group-addon,select[multiple].input-group-lg>.input-group-btn>.btn,textarea.input-group-lg>.form-control,textarea.input-group-lg>.input-group-addon,textarea.input-group-lg>.input-group-bt
 n>.btn{height:auto}.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-group-sm>.form-control,select.input-group-sm>.input-group-addon,select.input-group-sm>.input-group-btn>.btn{height:30px;line-height:30px}select[multiple].input-group-sm>.form-control,select[multiple].input-group-sm>.input-group-addon,select[multiple].input-group-sm>.input-group-btn>.btn,textarea.input-group-sm>.form-control,textarea.input-group-sm>.input-group-addon,textarea.input-group-sm>.input-group-btn>.btn{height:auto}.input-group .form-control,.input-group-addon,.input-group-btn{display:table-cell}.input-group .form-control:not(:first-child):not(:last-child),.input-group-addon:not(:first-child):not(:last-child),.input-group-btn:not(:first-child):not(:last-child){border-radius:0}.input-group-addon,.input-group-btn{width:1%;white-space:nowrap;vertical-align:middle}.inpu
 t-group-addon{padding:6px 12px;font-size:14px;font-weight:400;line-height:1;color:#555;text-align:center;background-color:#eee;border:1px solid #ccc;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=checkbox],.input-group-addon input[type=radio]{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-group:not(:last-child)>.btn,.input-group-btn:last-child>.btn:not(:last-child):not(.dropdown-toggle){border-top-right-radius:0;border-bottom-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:first-child>.btn-group:not(:first-child)>.btn,.input-group-btn:first-
 child>.btn:not(:first-child),.input-group-btn:last-child>.btn,.input-group-btn:last-child>.btn-group>.btn,.input-group-btn:last-child>.dropdown-toggle{border-top-left-radius:0;border-bottom-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:active,.input-group-btn>.btn:focus,.input-group-btn>.btn:hover{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{padding-left:0;margin-bottom:0;list-style:none}.nav>li{position:relative;display:block}.nav>li>a{position:relative;display:block;padding:10px 15px}.nav>li>a:focus,.nav>li>a:hover{text-decoration:none;background-color:#eee}.nav>li.disabled>a{color:#777}.nav>li.disabled>a:focus,.nav>li.disabled>a:hover{color:#777;text-
 decoration:none;cursor:not-allowed;background-color:transparent}.nav .open>a,.nav .open>a:focus,.nav .open>a:hover{background-color:#eee;border-color:#337ab7}.nav .nav-divider{height:1px;margin:9px 0;overflow:hidden;background-color:#e5e5e5}.nav>li>a>img{max-width:none}.nav-tabs{border-bottom:1px solid #ddd}.nav-tabs>li{float:left;margin-bottom:-1px}.nav-tabs>li>a{margin-right:2px;line-height:1.42857143;border:1px solid transparent;border-radius:4px 4px 0 0}.nav-tabs>li>a:hover{border-color:#eee #eee #ddd}.nav-tabs>li.active>a,.nav-tabs>li.active>a:focus,.nav-tabs>li.active>a:hover{color:#555;cursor:default;background-color:#fff;border:1px solid #ddd;border-bottom-color:transparent}.nav-tabs.nav-justified{width:100%;border-bottom:0}.nav-tabs.nav-justified>li{float:none}.nav-tabs.nav-justified>li>a{margin-bottom:5px;text-align:center}.nav-tabs.nav-justified>.dropdown .dropdown-menu{top:auto;left:auto}@media (min-width:768px){.nav-tabs.nav-justified>li{display:table-cell;width:1%}.nav
 -tabs.nav-justified>li>a{margin-bottom:0}}.nav-tabs.nav-justified>li>a{margin-right:0;border-radius:4px}.nav-tabs.nav-justified>.active>a,.nav-tabs.nav-justified>.active>a:focus,.nav-tabs.nav-justified>.active>a:hover{border:1px solid #ddd}@media (min-width:768px){.nav-tabs.nav-justified>li>a{border-bottom:1px solid #ddd;border-radius:4px 4px 0 0}.nav-tabs.nav-justified>.active>a,.nav-tabs.nav-justified>.active>a:focus,.nav-tabs.nav-justified>.active>a:hover{border-bottom-color:#fff}}.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:focus,.nav-pills>li.active>a:hover{color:#fff;background-color:#337ab7}.nav-stacked>li{float:none}.nav-stacked>li+li{margin-top:2px;margin-left:0}.nav-justified{width:100%}.nav-justified>li{float:none}.nav-justified>li>a{margin-bottom:5px;text-align:center}.nav-justified>.dropdown .dropdown-menu{top:auto;left:auto}@media (min-width:768px){.nav-justified>li{display:tab
 le-cell;width:1%}.nav-justified>li>a{margin-bottom:0}}.nav-tabs-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:focus,.nav-tabs-justified>.active>a:hover{border:1px solid #ddd}@media (min-width:768px){.nav-tabs-justified>li>a{border-bottom:1px solid #ddd;border-radius:4px 4px 0 0}.nav-tabs-justified>.active>a,.nav-tabs-justified>.active>a:focus,.nav-tabs-justified>.active>a:hover{border-bottom-color:#fff}}.tab-content>.tab-pane{display:none;visibility:hidden}.tab-content>.active{display:block;visibility:visible}.nav-tabs .dropdown-menu{margin-top:-1px;border-top-left-radius:0;border-top-right-radius:0}.navbar{position:relative;min-height:50px;margin-bottom:20px;border:1px solid transparent}@media (min-width:768px){.navbar{border-radius:4px}}@media (min-width:768px){.navbar-header{float:left}}.navbar-collapse{padding-right:15px;padding-left:15px;overflow-x:visible;-webkit-overflow-scrollin
 g:touch;border-top:1px solid transparent;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.1);box-shadow:inset 0 1px 0 rgba(255,255,255,.1)}.navbar-collapse.in{overflow-y:auto}@media (min-width:768px){.navbar-collapse{width:auto;border-top:0;-webkit-box-shadow:none;box-shadow:none}.navbar-collapse.collapse{display:block!important;height:auto!important;padding-bottom:0;overflow:visible!important;visibility:visible!important}.navbar-collapse.in{overflow-y:visible}.navbar-fixed-bottom .navbar-collapse,.navbar-fixed-top .navbar-collapse,.navbar-static-top .navbar-collapse{padding-right:0;padding-left:0}}.navbar-fixed-bottom .navbar-collapse,.navbar-fixed-top .navbar-collapse{max-height:340px}@media (max-device-width:480px) and (orientation:landscape){.navbar-fixed-bottom .navbar-collapse,.navbar-fixed-top .navbar-collapse{max-height:200px}}.container-fluid>.navbar-collapse,.container-fluid>.navbar-header,.container>.navbar-collapse,.container>.navbar-header{margin-right:-15px;margin-le
 ft:-15px}@media (min-width:768px){.container-fluid>.navbar-collapse,.container-fluid>.navbar-header,.container>.navbar-collapse,.container>.navbar-header{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-bottom,.navbar-fixed-top{position:fixed;right:0;left:0;z-index:1030}@media (min-width:768px){.navbar-fixed-bottom,.navbar-fixed-top{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;height:50px;padding:15px 15px;font-size:18px;line-height:20px}.navbar-brand:focus,.navbar-brand:hover{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;padding:9px 10px;margin-top:8px;margin-right:15px;margin-bottom:8px;background-colo
 r: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:7.5px -15px}.navbar-nav>li>a{padding-top:10px;padding-bottom:10px;line-height:20px}@media (max-width:767px){.navbar-nav .open .dropdown-menu{position:static;float:none;width:auto;margin-top:0;background-color:transparent;border:0;-webkit-box-shadow:none;box-shadow:none}.navbar-nav .open .dropdown-menu .dropdown-header,.navbar-nav .open .dropdown-menu>li>a{padding:5px 15px 5px 25px}.navbar-nav .open .dropdown-menu>li>a{line-height:20px}.navbar-nav .open .dropdown-menu>li>a:focus,.navbar-nav .open .dropdown-menu>li>a:hover{background-image:none}}@media (min-width:768px){.navbar-nav{float:left;margin:0}.navbar-nav>li{float:left}.navbar-nav>li>a{padding-top:15px;padding-bottom
 :15px}}.navbar-form{padding:10px 15px;margin-top:8px;margin-right:-15px;margin-bottom:8px;margin-left:-15px;border-top:1px solid transparent;border-bottom:1px solid transparent;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.1),0 1px 0 rgba(255,255,255,.1);box-shadow:inset 0 1px 0 rgba(255,255,255,.1),0 1px 0 rgba(255,255,255,.1)}@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 .form-control,.navbar-form .input-group .input-group-addon,.navbar-form .input-group .input-group-btn{width:auto}.navbar-form .input-group>.form-control{width:100%}.navbar-form .control-label{margin-bottom:0;vertical-align:middle}.navbar-form .checkbox,.navbar-form .radio{display:inline-block;margin-top:0;margin-bottom:0
 ;vertical-align:middle}.navbar-form .checkbox label,.navbar-form .radio label{padding-left:0}.navbar-form .checkbox input[type=checkbox],.navbar-form .radio input[type=radio]{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;padding-top:0;padding-bottom:0;margin-right:0;margin-left:0;border:0;-webkit-box-shadow:none;box-shadow:none}}.navbar-nav>li>.dropdown-menu{margin-top:0;border-top-left-radius:0;border-top-right-radius:0}.navbar-fixed-bottom .navbar-nav>li>.dropdown-menu{margin-bottom:0;border-top-left-radius:4px;border-top-right-radius:4px;border-bottom-right-radius:0;border-bottom-left-radius:0}.navbar-btn{margin-top:8px;margin-bottom:8px}.navbar-btn.btn-sm{margin-top:10px;margin-bottom:10px}.navbar-btn.btn-xs{margin-top:14px;margin-bottom:14px}.navbar-text{margin-top:15p
 x;margin-bottom:15px}@media (min-width:768px){.navbar-text{float:left;margin-right:15px;margin-left: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:#f8f8f8;border-color:#e7e7e7}.navbar-default .navbar-brand{color:#777}.navbar-default .navbar-brand:focus,.navbar-default .navbar-brand:hover{color:#5e5e5e;background-color:transparent}.navbar-default .navbar-text{color:#777}.navbar-default .navbar-nav>li>a{color:#777}.navbar-default .navbar-nav>li>a:focus,.navbar-default .navbar-nav>li>a:hover{color:#333;background-color:transparent}.navbar-default .navbar-nav>.active>a,.navbar-default .navbar-nav>.active>a:focus,.navbar-default .navbar-nav>.active>a:hover{color:#555;background-color:#e7e7e7}.navbar-default .navbar-nav>.disabled>a,.navbar-default .navbar-nav>.disabled>a:focus,.navbar-default .navbar-nav>.disabled>a:hover{color:#ccc;backgrou
 nd-color:transparent}.navbar-default .navbar-toggle{border-color:#ddd}.navbar-default .navbar-toggle:focus,.navbar-default .navbar-toggle:hover{background-color:#ddd}.navbar-default .navbar-toggle .icon-bar{background-color:#888}.navbar-default .navbar-collapse,.navbar-default .navbar-form{border-color:#e7e7e7}.navbar-default .navbar-nav>.open>a,.navbar-default .navbar-nav>.open>a:focus,.navbar-default .navbar-nav>.open>a:hover{color:#555;background-color:#e7e7e7}@media (max-width:767px){.navbar-default .navbar-nav .open .dropdown-menu>li>a{color:#777}.navbar-default .navbar-nav .open .dropdown-menu>li>a:focus,.navbar-default .navbar-nav .open .dropdown-menu>li>a:hover{color:#333;background-color:transparent}.navbar-default .navbar-nav .open .dropdown-menu>.active>a,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:focus,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:hover{color:#555;background-color:#e7e7e7}.navbar-default .navbar-nav .open .dropdown-menu>.disa
 bled>a,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:focus,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:hover{color:#ccc;background-color:transparent}}.navbar-default .navbar-link{color:#777}.navbar-default .navbar-link:hover{color:#333}.navbar-default .btn-link{color:#777}.navbar-default .btn-link:focus,.navbar-default .btn-link:hover{color:#333}.navbar-default .btn-link[disabled]:focus,.navbar-default .btn-link[disabled]:hover,fieldset[disabled] .navbar-default .btn-link:focus,fieldset[disabled] .navbar-default .btn-link:hover{color:#ccc}.navbar-inverse{background-color:#222;border-color:#080808}.navbar-inverse .navbar-brand{color:#9d9d9d}.navbar-inverse .navbar-brand:focus,.navbar-inverse .navbar-brand:hover{color:#fff;background-color:transparent}.navbar-inverse .navbar-text{color:#9d9d9d}.navbar-inverse .navbar-nav>li>a{color:#9d9d9d}.navbar-inverse .navbar-nav>li>a:focus,.navbar-inverse .navbar-nav>li>a:hover{color:#fff;background-color:transpare
 nt}.navbar-inverse .navbar-nav>.active>a,.navbar-inverse .navbar-nav>.active>a:focus,.navbar-inverse .navbar-nav>.active>a:hover{color:#fff;background-color:#080808}.navbar-inverse .navbar-nav>.disabled>a,.navbar-inverse .navbar-nav>.disabled>a:focus,.navbar-inverse .navbar-nav>.disabled>a:hover{color:#444;background-color:transparent}.navbar-inverse .navbar-toggle{border-color:#333}.navbar-inverse .navbar-toggle:focus,.navbar-inverse .navbar-toggle:hover{background-color:#333}.navbar-inverse .navbar-toggle .icon-bar{background-color:#fff}.navbar-inverse .navbar-collapse,.navbar-inverse .navbar-form{border-color:#101010}.navbar-inverse .navbar-nav>.open>a,.navbar-inverse .navbar-nav>.open>a:focus,.navbar-inverse .navbar-nav>.open>a:hover{color:#fff;background-color:#080808}@media (max-width:767px){.navbar-inverse .navbar-nav .open .dropdown-menu>.dropdown-header{border-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu .divider{background-color:#080808}.navbar-inverse .n
 avbar-nav .open .dropdown-menu>li>a{color:#9d9d9d}.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:focus,.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:hover{color:#fff;background-color:transparent}.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:focus,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:hover{color:#fff;background-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:focus,.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:hover{color:#444;background-color:transparent}}.navbar-inverse .navbar-link{color:#9d9d9d}.navbar-inverse .navbar-link:hover{color:#fff}.navbar-inverse .btn-link{color:#9d9d9d}.navbar-inverse .btn-link:focus,.navbar-inverse .btn-link:hover{color:#fff}.navbar-inverse .btn-link[disabled]:focus,.navbar-inverse .btn-link[disabled]:hover,fieldset[disabled] .navbar-inverse .bt
 n-link:focus,fieldset[disabled] .navbar-inverse .btn-link:hover{color:#444}.breadcrumb{padding:8px 15px;margin-bottom:20px;list-style:none;background-color:#f5f5f5;border-radius:4px}.breadcrumb>li{display:inline-block}.breadcrumb>li+li:before{padding:0 5px;color:#ccc;content:"/\00a0"}.breadcrumb>.active{color:#777}.pagination{display:inline-block;padding-left:0;margin:20px 0;border-radius:4px}.pagination>li{display:inline}.pagination>li>a,.pagination>li>span{position:relative;float:left;padding:6px 12px;margin-left:-1px;line-height:1.42857143;color:#337ab7;text-decoration:none;background-color:#fff;border:1px solid #ddd}.pagination>li:first-child>a,.pagination>li:first-child>span{margin-left:0;border-top-left-radius:4px;border-bottom-left-radius:4px}.pagination>li:last-child>a,.pagination>li:last-child>span{border-top-right-radius:4px;border-bottom-right-radius:4px}.pagination>li>a:focus,.pagination>li>a:hover,.pagination>li>span:focus,.pagination>li>span:hover{color:#23527c;backgro
 und-color:#eee;border-color:#ddd}.pagination>.active>a,.pagination>.active>a:focus,.pagination>.active>a:hover,.pagination>.active>span,.pagination>.active>span:focus,.pagination>.active>span:hover{z-index:2;color:#fff;cursor:default;background-color:#337ab7;border-color:#337ab7}.pagination>.disabled>a,.pagination>.disabled>a:focus,.pagination>.disabled>a:hover,.pagination>.disabled>span,.pagination>.disabled>span:focus,.pagination>.disabled>span:hover{color:#777;cursor:not-allowed;background-color:#fff;border-color:#ddd}.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-top-left-radius:6px;border-bottom-left-radius:6px}.pagination-lg>li:last-child>a,.pagination-lg>li:last-child>span{border-top-right-radius:6px;border-bottom-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{bord
 er-top-left-radius:3px;border-bottom-left-radius:3px}.pagination-sm>li:last-child>a,.pagination-sm>li:last-child>span{border-top-right-radius:3px;border-bottom-right-radius:3px}.pager{padding-left:0;margin:20px 0;text-align:center;list-style:none}.pager li{display:inline}.pager li>a,.pager li>span{display:inline-block;padding:5px 14px;background-color:#fff;border:1px solid #ddd;border-radius:15px}.pager li>a:focus,.pager li>a:hover{text-decoration:none;background-color:#eee}.pager .next>a,.pager .next>span{float:right}.pager .previous>a,.pager .previous>span{float:left}.pager .disabled>a,.pager .disabled>a:focus,.pager .disabled>a:hover,.pager .disabled>span{color:#777;cursor:not-allowed;background-color:#fff}.label{display:inline;padding:.2em .6em .3em;font-size:75%;font-weight:700;line-height:1;color:#fff;text-align:center;white-space:nowrap;vertical-align:baseline;border-radius:.25em}a.label:focus,a.label:hover{color:#fff;text-decoration:none;cursor:pointer}.label:empty{display:n
 one}.btn .label{position:relative;top:-1px}.label-default{background-color:#777}.label-default[href]:focus,.label-default[href]:hover{background-color:#5e5e5e}.label-primary{background-color:#337ab7}.label-primary[href]:focus,.label-primary[href]:hover{background-color:#286090}.label-success{background-color:#5cb85c}.label-success[href]:focus,.label-success[href]:hover{background-color:#449d44}.label-info{background-color:#5bc0de}.label-info[href]:focus,.label-info[href]:hover{background-color:#31b0d5}.label-warning{background-color:#f0ad4e}.label-warning[href]:focus,.label-warning[href]:hover{background-color:#ec971f}.label-danger{background-color:#d9534f}.label-danger[href]:focus,.label-danger[href]:hover{background-color:#c9302c}.badge{display:inline-block;min-width:10px;padding:3px 7px;font-size:12px;font-weight:700;line-height:1;color:#fff;text-align:center;white-space:nowrap;vertical-align:baseline;background-color:#777;border-radius:10px}.badge:empty{display:none}.btn .badge{
 position:relative;top:-1px}.btn-xs .badge{top:0;padding:1px 5px}a.badge:focus,a.badge:hover{color:#fff;text-decoration:none;cursor:pointer}.list-group-item.active>.badge,.nav-pills>.active>a>.badge{color:#337ab7;background-color:#fff}.list-group-item>.badge{float:right}.list-group-item>.badge+.badge{margin-right:5px}.nav-pills>li>a>.badge{margin-left:3px}.jumbotron{padding:30px 15px;margin-bottom:30px;color:inherit;background-color:#eee}.jumbotron .h1,.jumbotron h1{color:inherit}.jumbotron p{margin-bottom:15px;font-size:21px;font-weight:200}.jumbotron>hr{border-top-color:#d5d5d5}.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-right:60px;padding-left:60px}.jumbotron .h1,.jumbotron h1{font-size:63px}}.thumbnail{display:block;padding:4px;margin-bottom:20px;line-height:1.42857143;background-color:#fff;border:1px 
 solid #ddd;border-radius:4px;-webkit-transition:border .2s ease-in-out;-o-transition:border .2s ease-in-out;transition:border .2s ease-in-out}.thumbnail a>img,.thumbnail>img{margin-right:auto;margin-left:auto}a.thumbnail.active,a.thumbnail:focus,a.thumbnail:hover{border-color:#337ab7}.thumbnail .caption{padding:9px;color:#333}.alert{padding:15px;margin-bottom:20px;border:1px solid transparent;border-radius:4px}.alert h4{margin-top:0;color:inherit}.alert .alert-link{font-weight:700}.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{color:#3c763d;background-color:#dff0d8;border-color:#d6e9c6}.alert-success hr{border-top-color:#c9e2b3}.alert-success .alert-link{color:#2b542c}.alert-info{color:#31708f;background-color:#d9edf7;border-color:#bce8f1}.alert-info hr{border-top-color:#a6e1ec}.alert-info .aler
 t-link{color:#245269}.alert-warning{color:#8a6d3b;background-color:#fcf8e3;border-color:#faebcc}.alert-warning hr{border-top-color:#f7e1b5}.alert-warning .alert-link{color:#66512c}.alert-danger{color:#a94442;background-color:#f2dede;border-color:#ebccd1}.alert-danger hr{border-top-color:#e4b9c0}.alert-danger .alert-link{color:#843534}@-webkit-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@-o-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{height:20px;margin-bottom:20px;overflow:hidden;background-color:#f5f5f5;border-radius:4px;-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,.1);box-shadow:inset 0 1px 2px rgba(0,0,0,.1)}.progress-bar{float:left;width:0;height:100%;font-size:12px;line-height:20px;color:#fff;text-align:center;background-color:#337ab7;-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,.15);b
 ox-shadow:inset 0 -1px 0 rgba(0,0,0,.15);-webkit-transition:width .6s ease;-o-transition:width .6s ease;transition:width .6s ease}.progress-bar-striped,.progress-striped .progress-bar{background-image:-webkit-linear-gradient(45deg,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(45deg,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(45deg,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);-webkit-background-size:40px 40px;background-size:40px 40px}.progress-bar.active,.progress.active .progress-bar{-webkit-animation:progress-bar-stripes 2s linear infinite;-o-animation:progress-bar-stripes 2s linear infinite;animation:progress-bar-stripes 2s linear infi
 nite}.progress-bar-success{background-color:#5cb85c}.progress-striped .progress-bar-success{background-image:-webkit-linear-gradient(45deg,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(45deg,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(45deg,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)}.progress-bar-info{background-color:#5bc0de}.progress-striped .progress-bar-info{background-image:-webkit-linear-gradient(45deg,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(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transpare
 nt 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,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)}.progress-bar-warning{background-color:#f0ad4e}.progress-striped .progress-bar-warning{background-image:-webkit-linear-gradient(45deg,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(45deg,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(45deg,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)}.progress-bar-danger{background-color:#d9534f}.progress-striped .progress-bar-danger{background-ima
 ge:-webkit-linear-gradient(45deg,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(45deg,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(45deg,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)}.media{margin-top:15px}.media:first-child{margin-top:0}.media,.media-body{overflow:hidden;zoom:1}.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-body,.media-left,.media-right{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-lef
 t:0;list-style:none}.list-group{padding-left:0;margin-bottom:20px}.list-group-item{position:relative;display:block;padding:10px 15px;margin-bottom:-1px;background-color:#fff;border:1px solid #ddd}.list-group-item:first-child{border-top-left-radius:4px;border-top-right-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:#555}a.list-group-item .list-group-item-heading{color:#333}a.list-group-item:focus,a.list-group-item:hover{color:#555;text-decoration:none;background-color:#f5f5f5}.list-group-item.disabled,.list-group-item.disabled:focus,.list-group-item.disabled:hover{color:#777;cursor:not-allowed;background-color:#eee}.list-group-item.disabled .list-group-item-heading,.list-group-item.disabled:focus .list-group-item-heading,.list-group-item.disabled:hover .list-group-item-heading{color:inherit}.list-group-item.disabled .list-group-item-text,.list-group-item.disabled:focus .list-group-item-text,.
 list-group-item.disabled:hover .list-group-item-text{color:#777}.list-group-item.active,.list-group-item.active:focus,.list-group-item.active:hover{z-index:2;color:#fff;background-color:#337ab7;border-color:#337ab7}.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: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,.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{color:inherit}.list-group-item.active .list-group-item-text,.list-group-item.active:focus .list-group-item-text,.list-group-item.active:hover .list-group-item-text{color:#c7ddef}.list-group-item-success{color:#3c763d;background-color:#dff0d8}a.list-group-item-succes
 s{color:#3c763d}a.list-group-item-success .list-group-item-heading{color:inherit}a.list-group-item-success:focus,a.list-group-item-success:hover{color:#3c763d;background-color:#d0e9c6}a.list-group-item-success.active,a.list-group-item-success.active:focus,a.list-group-item-success.active:hover{color:#fff;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:focus,a.list-group-item-info:hover{color:#31708f;background-color:#c4e3f3}a.list-group-item-info.active,a.list-group-item-info.active:focus,a.list-group-item-info.active:hover{color:#fff;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:focus,a.list-group-item-warning:ho
 ver{color:#8a6d3b;background-color:#faf2cc}a.list-group-item-warning.active,a.list-group-item-warning.active:focus,a.list-group-item-warning.active:hover{color:#fff;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:focus,a.list-group-item-danger:hover{color:#a94442;background-color:#ebcccc}a.list-group-item-danger.active,a.list-group-item-danger.active:focus,a.list-group-item-danger.active:hover{color:#fff;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:20px;background-color:#fff;border:1px solid transparent;border-radius:4px;-webkit-box-shadow:0 1px 1px rgba(0,0,0,.05);box-shadow:0 1px 1px rgba(0,0,0,.05)}.panel-body{padding:15px}.panel-heading{padding:10px 15px;border-bo
 ttom:1px solid transparent;border-top-left-radius:3px;border-top-right-radius:3px}.panel-heading>.dropdown .dropdown-toggle{color:inherit}.panel-title{margin-top:0;margin-bottom:0;font-size:16px;color:inherit}.panel-title>.small,.panel-title>.small>a,.panel-title>a,.panel-title>small,.panel-title>small>a{color:inherit}.panel-footer{padding:10px 15px;background-color:#f5f5f5;border-top:1px solid #ddd;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-left-radius:3px;border-top-right-radius:3px}.panel>.list-group:last-child .list-group-item:last-child,.panel>.panel-collapse>.list-group:last-child .list-group-item:last-child{bord
 er-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>.panel-collapse>.table,.panel>.table,.panel>.table-responsive>.table{margin-bottom:0}.panel>.panel-collapse>.table caption,.panel>.table caption,.panel>.table-responsive>.table caption{padding-right:15px;padding-left:15px}.panel>.table-responsive:first-child>.table:first-child,.panel>.table:first-child{border-top-left-radius:3px;border-top-right-radius:3px}.panel>.table-responsive:first-child>.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:first-child>tbody:first-child>tr:first-child,.panel>.table:first-child>thead:first-child>tr:first-child{border-top-left-radius:3px;border-top-right-radius:3px}.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-chil
 d td:first-child,.panel>.table-responsive:first-child>.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: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:first-child>thead:first-child>tr:first-child td:first-child,.panel>.table:first-child>thead:first-child>tr:first-child th:first-child{border-top-left-radius:3px}.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,.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: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:first-child>thead:first-child>tr:first-child td:last-child,.panel>.table:first-child>thead:first-child>tr:first-child th:last-child{border-top-right-radius:3px}.panel>.table-responsive:last-child>.table:last-child,.panel>.table:last-child{border-bottom-right-radius:3px;border-bottom-left-radius:3px}.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,.panel>.table:last-child>tbody:last-child>tr:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child{border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child td:first-child,.panel>.table-responsive:la
 st-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,.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{border-bottom-left-radius:3px}.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,.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{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 #ddd}.panel>.table>tbody:first-child>tr:first-child td,.panel>.table>tbody:first-child>tr:first-child th{border-top:0}.panel>.table-bordered,.panel>.table-responsive>.table-bordered{border:0}.panel>.table-bordered>tbody>tr>td:first-child,.panel>.table-bordered>tbody>tr>th:first-child,.panel>.table-bordered>tfoot>tr>td:first-child,.panel>.table-bordered>tfoot>tr>th:first-child,.panel>.table-bordered>thead>tr>td:first-child,.panel>.table-bordered>thead>tr>th:first-child,.panel>.table-responsive>.table-bordered>tbody>tr>td:first-child,.panel>.table-r
 esponsive>.table-bordered>tbody>tr>th:first-child,.panel>.table-responsive>.table-bordered>tfoot>tr>td:first-child,.panel>.table-responsive>.table-bordered>tfoot>tr>th:first-child,.panel>.table-responsive>.table-bordered>thead>tr>td:first-child,.panel>.table-responsive>.table-bordered>thead>tr>th:first-child{border-left:0}.panel>.table-bordered>tbody>tr>td:last-child,.panel>.table-bordered>tbody>tr>th:last-child,.panel>.table-bordered>tfoot>tr>td:last-child,.panel>.table-bordered>tfoot>tr>th:last-child,.panel>.table-bordered>thead>tr>td:last-child,.panel>.table-bordered>thead>tr>th:last-child,.panel>.table-responsive>.table-bordered>tbody>tr>td:last-child,.panel>.table-responsive>.table-bordered>tbody>tr>th:last-child,.panel>.table-responsive>.table-bordered>tfoot>tr>td:last-child,.panel>.table-responsive>.table-bordered>tfoot>tr>th:last-child,.panel>.table-responsive>.table-bordered>thead>tr>td:last-child,.panel>.table-responsive>.table-bordered>thead>tr>th:last-child{border-right:
 0}.panel>.table-bordered>tbody>tr:first-child>td,.panel>.table-bordered>tbody>tr:first-child>th,.panel>.table-bordered>thead>tr:first-child>td,.panel>.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,.panel>.table-responsive>.table-bordered>thead>tr:first-child>td,.panel>.table-responsive>.table-bordered>thead>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{margin-bottom:0;border:0}.panel-group{margin-botto
 m:20px}.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>.list-group,.panel-group .panel-heading+.panel-collapse>.panel-body{border-top:1px solid #ddd}.panel-group .panel-footer{border-top:0}.panel-group .panel-footer+.panel-collapse .panel-body{border-bottom:1px solid #ddd}.panel-default{border-color:#ddd}.panel-default>.panel-heading{color:#333;background-color:#f5f5f5;border-color:#ddd}.panel-default>.panel-heading+.panel-collapse>.panel-body{border-top-color:#ddd}.panel-default>.panel-heading .badge{color:#f5f5f5;background-color:#333}.panel-default>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#ddd}.panel-primary{border-color:#337ab7}.panel-primary>.panel-heading{color:#fff;background-color:#337ab7;border-color:#337ab7}.panel-primary>.panel-heading+.panel-collapse>.panel-body{border-top-color:#337ab7}.panel-primary>.panel-heading 
 .badge{color:#337ab7;background-color:#fff}.panel-primary>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#337ab7}.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:#bce8f1}.panel-info>.panel-heading{color:#31708f;background-color:#d9edf7;border-color:#bce8f1}.panel-info>.panel-heading+.panel-collapse>.panel-body{border-top-color:#bce8f1}.panel-info>.panel-heading .badge{color:#d9edf7;background-color:#31708f}.panel-info>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#bce8f1}.panel-warning{border-color:#faebcc}.panel-warning>.panel-heading{color:#8a6d3b;background-color:#fcf8e3;border-color:#faebcc}.panel-warning>.pa
 nel-heading+.panel-collapse>.panel-body{border-top-color:#faebcc}.panel-warning>.panel-heading .badge{color:#fcf8e3;background-color:#8a6d3b}.panel-warning>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#faebcc}.panel-danger{border-color:#ebccd1}.panel-danger>.panel-heading{color:#a94442;background-color:#f2dede;border-color:#ebccd1}.panel-danger>.panel-heading+.panel-collapse>.panel-body{border-top-color:#ebccd1}.panel-danger>.panel-heading .badge{color:#f2dede;background-color:#a94442}.panel-danger>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#ebccd1}.embed-responsive{position:relative;display:block;height:0;padding:0;overflow:hidden}.embed-responsive .embed-responsive-item,.embed-responsive embed,.embed-responsive iframe,.embed-responsive object,.embed-responsive video{position:absolute;top:0;bottom:0;left:0;width:100%;height: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:#f5f5f5;border:1px solid #e3e3e3;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.05);box-shadow:inset 0 1px 1px rgba(0,0,0,.05)}.well blockquote{border-color:#ddd;border-color:rgba(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:700;line-height:1;color:#000;text-shadow:0 1px 0 #fff;filter:alpha(opacity=20);opacity:.2}.close:focus,.close:hover{color:#000;text-decoration:none;cursor:pointer;filter:alpha(opacity=50);opacity:.5}button.close{-webkit-appearance:none;padding:0;cursor:pointer;background:0 0;border:0}.modal-open{overflow:hidden}.modal{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1040;display:none;overflow:hidden;-webkit-overflow-scrolling:touch;outline:0}.modal.fade .modal-dialog{-webkit-transition:-webkit-transform .3s ease-out;-o-transition:-o-transform .3s ease-out;transition:tra
 nsform .3s ease-out;-webkit-transform:translate(0,-25%);-ms-transform:translate(0,-25%);-o-transform:translate(0,-25%);transform:translate(0,-25%)}.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:#fff;-webkit-background-clip:padding-box;background-clip:padding-box;border:1px solid #999;border:1px solid rgba(0,0,0,.2);border-radius:6px;outline:0;-webkit-box-shadow:0 3px 9px rgba(0,0,0,.5);box-shadow:0 3px 9px rgba(0,0,0,.5)}.modal-backdrop{position:absolute;top:0;right:0;left:0;background-color:#000}.modal-backdrop.fade{filter:alpha(opacity=0);opacity:0}.modal-backdrop.in{filter:alpha(opacity=50);opacity:.5}.modal-header{min-height:16.43px;padding:15px;border-bottom:1px solid #e5e5e5}.modal-header .close{margin-top:-2px}.modal-title{margin:
 0;line-height:1.42857143}.modal-body{position:relative;padding:15px}.modal-footer{padding:15px;text-align:right;border-top:1px solid #e5e5e5}.modal-footer .btn+.btn{margin-bottom:0;margin-left:5px}.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,.5);box-shadow:0 5px 15px rgba(0,0,0,.5)}.modal-sm{width:300px}}@media (min-width:992px){.modal-lg{width:900px}}.tooltip{position:absolute;z-index:1070;display:block;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:12px;font-weight:400;line-height:1.4;visibility:visible;filter:alpha(opacity=0);opacity:0}.tooltip.in{filter:alpha(opacity=90);opacity:.9}.tooltip.top{padding:5px 0;margin-top:-3px}.tooltip.right{padding:0 5px;margin-left:3px}.tooltip.bottom{paddin
 g:5px 0;margin-top:3px}.tooltip.left{padding:0 5px;margin-left:-3px}.tooltip-inner{max-width:200px;padding:3px 8px;color:#fff;text-align:center;text-decoration:none;background-color:#000;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:#000}.tooltip.top-left .tooltip-arrow{right:5px;bottom:0;margin-bottom:-5px;border-width:5px 5px 0;border-top-color:#000}.tooltip.top-right .tooltip-arrow{bottom:0;left:5px;margin-bottom:-5px;border-width:5px 5px 0;border-top-color:#000}.tooltip.right .tooltip-arrow{top:50%;left:0;margin-top:-5px;border-width:5px 5px 5px 0;border-right-color:#000}.tooltip.left .tooltip-arrow{top:50%;right:0;margin-top:-5px;border-width:5px 0 5px 5px;border-left-color:#000}.tooltip.bottom .tooltip-arrow{top:0;left:50%;margin-left:-5px;border-width:0 5px 5px;border-bottom-color:#000}.tooltip.bottom-left .to
 oltip-arrow{top:0;right:5px;margin-top:-5px;border-width:0 5px 5px;border-bottom-color:#000}.tooltip.bottom-right .tooltip-arrow{top:0;left:5px;margin-top:-5px;border-width:0 5px 5px;border-bottom-color:#000}.popover{position:absolute;top:0;left:0;z-index:1060;display:none;max-width:276px;padding:1px;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:14px;font-weight:400;line-height:1.42857143;text-align:left;white-space:normal;background-color:#fff;-webkit-background-clip:padding-box;background-clip:padding-box;border:1px solid #ccc;border:1px solid rgba(0,0,0,.2);border-radius:6px;-webkit-box-shadow:0 5px 10px rgba(0,0,0,.2);box-shadow:0 5px 10px rgba(0,0,0,.2)}.popover.top{margin-top:-10px}.popover.right{margin-left:10px}.popover.bottom{margin-top:10px}.popover.left{margin-left:-10px}.popover-title{padding:8px 14px;margin:0;font-size:14px;background-color:#f7f7f7;border-bottom:1px solid #ebebeb;border-radius:5px 5px 0 0}.popover-content{padding:9px 14px}.popover>.a
 rrow,.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{content:"";border-width:10px}.popover.top>.arrow{bottom:-11px;left:50%;margin-left:-11px;border-top-color:#999;border-top-color:rgba(0,0,0,.25);border-bottom-width:0}.popover.top>.arrow:after{bottom:1px;margin-left:-10px;content:" ";border-top-color:#fff;border-bottom-width:0}.popover.right>.arrow{top:50%;left:-11px;margin-top:-11px;border-right-color:#999;border-right-color:rgba(0,0,0,.25);border-left-width:0}.popover.right>.arrow:after{bottom:-10px;left:1px;content:" ";border-right-color:#fff;border-left-width:0}.popover.bottom>.arrow{top:-11px;left:50%;margin-left:-11px;border-top-width:0;border-bottom-color:#999;border-bottom-color:rgba(0,0,0,.25)}.popover.bottom>.arrow:after{top:1px;margin-left:-10px;content:" ";border-top-width:0;border-bottom-color:#fff}.popover.left>.arrow{top:50%;right:-11px;margin-to
 p:-11px;border-right-width:0;border-left-color:#999;border-left-color:rgba(0,0,0,.25)}.popover.left>.arrow:after{right:1px;bottom:-10px;content:" ";border-right-width:0;border-left-color:#fff}.carousel{position:relative}.carousel-inner{position:relative;width:100%;overflow:hidden}.carousel-inner>.item{position:relative;display:none;-webkit-transition:.6s ease-in-out left;-o-transition:.6s ease-in-out left;transition:.6s ease-in-out left}.carousel-inner>.item>a>img,.carousel-inner>.item>img{line-height:1}@media all and (transform-3d),(-webkit-transform-3d){.carousel-inner>.item{-webkit-transition:-webkit-transform .6s ease-in-out;-o-transition:-o-transform .6s ease-in-out;transition:transform .6s ease-in-out;-webkit-backface-visibility:hidden;backface-visibility:hidden;-webkit-perspective:1000;perspective:1000}.carousel-inner>.item.active.right,.carousel-inner>.item.next{left:0;-webkit-transform:translate3d(100%,0,0);transform:translate3d(100%,0,0)}.carousel-inner>.item.active.left,.
 carousel-inner>.item.prev{left:0;-webkit-transform:translate3d(-100%,0,0);transform:translate3d(-100%,0,0)}.carousel-inner>.item.active,.carousel-inner>.item.next.left,.carousel-inner>.item.prev.right{left:0;-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,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;bottom:0;left:0;width:15%;font-size:20px;color:#fff;text-align:center;text-shadow:0 1px 2px rgba(0,0,0,.6);filter:alpha(opacity=50);opacity:.5}.carousel-control.left{background-image:-webkit-linear-gradient(left,rgba(0,0,0,.5) 0,rgba(0,0,0,.0001) 100%);background-image:-o-linear-g
 radient(left,rgba(0,0,0,.5) 0,rgba(0,0,0,.0001) 100%);background-image:-webkit-gradient(linear,left top,right top,from(rgba(0,0,0,.5)),to(rgba(0,0,0,.0001)));background-image:linear-gradient(to right,rgba(0,0,0,.5) 0,rgba(0,0,0,.0001) 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#80000000', endColorstr='#00000000', GradientType=1);background-repeat:repeat-x}.carousel-control.right{right:0;left:auto;background-image:-webkit-linear-gradient(left,rgba(0,0,0,.0001) 0,rgba(0,0,0,.5) 100%);background-image:-o-linear-gradient(left,rgba(0,0,0,.0001) 0,rgba(0,0,0,.5) 100%);background-image:-webkit-gradient(linear,left top,right top,from(rgba(0,0,0,.0001)),to(rgba(0,0,0,.5)));background-image:linear-gradient(to right,rgba(0,0,0,.0001) 0,rgba(0,0,0,.5) 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#00000000', endColorstr='#80000000', GradientType=1);background-repeat:repeat-x}.carousel-control:focus,.carousel-control:hover{color:#fff;text-deco
 ration:none;filter:alpha(opacity=90);outline:0;opacity:.9}.carousel-control .glyphicon-chevron-left,.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next,.carousel-control .icon-prev{position:absolute;top:50%;z-index:5;display:inline-block}.carousel-control .glyphicon-chevron-left,.carousel-control .icon-prev{left:50%;margin-left:-10px}.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next{right:50%;margin-right:-10px}.carousel-control .icon-next,.carousel-control .icon-prev{width:20px;height:20px;margin-top:-10px;font-family:serif;line-height:1}.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%;padding-left:0;margin-left:-30%;text-align:center;list-style:none}.carousel-indicators li{display:inline-block;width:10px;height:10px;margin:1px;text-indent:-999px;cursor:pointer;background-color:#000 \9;background-color:rgba
 (0,0,0,0);border:1px solid #fff;border-radius:10px}.carousel-indicators .active{width:12px;height:12px;margin:0;background-color:#fff}.carousel-caption{position:absolute;right:15%;bottom:20px;left:15%;z-index:10;padding-top:20px;padding-bottom:20px;color:#fff;text-align:center;text-shadow:0 1px 2px rgba(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-next,.carousel-control .icon-prev{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{right:20%;left:20%;padding-bottom:30px}.carousel-indicators{bottom:20px}}.btn-group-vertical>.btn-group:after,.btn-group-vertical>.btn-group:before,.btn-toolbar:after,.btn-toolbar:before,.clearfix:after,.clearf
 ix:before,.container-fluid:after,.container-fluid:before,.container:after,.container:before,.dl-horizontal dd:after,.dl-horizontal dd:before,.form-horizontal .form-group:after,.form-horizontal .form-group:before,.modal-footer:after,.modal-footer:before,.nav:after,.nav:before,.navbar-collapse:after,.navbar-collapse:before,.navbar-header:after,.navbar-header:before,.navbar:after,.navbar:before,.pager:after,.pager:before,.panel-body:after,.panel-body:before,.row:after,.row:before{display:table;content:" "}.btn-group-vertical>.btn-group:after,.btn-toolbar:after,.clearfix:after,.container-fluid:after,.container:after,.dl-horizontal dd:after,.form-horizontal .form-group:after,.modal-footer:after,.nav:after,.navbar-collapse:after,.navbar-header:after,.navbar:after,.pager:after,.panel-body:after,.row:after{clear:both}.center-block{display:block;margin-right:auto;margin-left:auto}.pull-right{float:right!important}.pull-left{float:left!important}.hide{display:none!important}.show{display:bloc
 k!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-lg,.visible-md,.visible-sm,.visible-xs{display:none!important}.visible-lg-block,.visible-lg-inline,.visible-lg-inline-block,.visible-md-block,.visible-md-inline,.visible-md-inline-block,.visible-sm-block,.visible-sm-inline,.visible-sm-inline-block,.visible-xs-block,.visible-xs-inline,.visible-xs-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}td.visible-xs,th.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!impo
 rtant}}@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}td.visible-sm,th.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}td.visible-md,th.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-blo
 ck!important}}@media (min-width:1200px){.visible-lg{display:block!important}table.visible-lg{display:table}tr.visible-lg{display:table-row!important}td.visible-lg,th.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}td.visible-print,th.visible-print{display:table-cell!important}}.visible-print-block{display:none!important}@med
 ia 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}}
\ No newline at end of file
diff --git a/www/test/icla/public/assets/bootstrap-min.js b/www/test/icla/public/assets/bootstrap-min.js
new file mode 100644
index 0000000..c6d3692
--- /dev/null
+++ b/www/test/icla/public/assets/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("checke
 d",!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.$i
 ndicators=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.tri
 gger(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.tran
 sitioning=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){"ontouchst
 art"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_DUR
 ATION=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").tri
 gger(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.on
 e("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.bo
 dy.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.isDefaultPreve
 nted()||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).dat
 a("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(){v
 ar 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.prototy
 pe.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.too
 ltip=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.fi
 nd(".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(fun
 ction(){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.scrol
 lspy.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.pinnedOf
 fset=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/www/test/icla/public/assets/bootstrap-theme.min.css b/www/test/icla/public/assets/bootstrap-theme.min.css
new file mode 100644
index 0000000..ac8dd55
--- /dev/null
+++ b/www/test/icla/public/assets/bootstrap-theme.min.css
@@ -0,0 +1,5 @@
+/*!
+ * Bootstrap v3.3.2 (http://getbootstrap.com)
+ * Copyright 2011-2015 Twitter, Inc.
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
+ */.btn-danger,.btn-default,.btn-info,.btn-primary,.btn-success,.btn-warning{text-shadow:0 -1px 0 rgba(0,0,0,.2);-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.15),0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 0 rgba(255,255,255,.15),0 1px 1px rgba(0,0,0,.075)}.btn-danger.active,.btn-danger:active,.btn-default.active,.btn-default:active,.btn-info.active,.btn-info:active,.btn-primary.active,.btn-primary:active,.btn-success.active,.btn-success:active,.btn-warning.active,.btn-warning:active{-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,.125);box-shadow:inset 0 3px 5px rgba(0,0,0,.125)}.btn-danger .badge,.btn-default .badge,.btn-info .badge,.btn-primary .badge,.btn-success .badge,.btn-warning .badge{text-shadow:none}.btn.active,.btn:active{background-image:none}.btn-default{text-shadow:0 1px 0 #fff;background-image:-webkit-linear-gradient(top,#fff 0,#e0e0e0 100%);background-image:-o-linear-gradient(top,#fff 0,#e0e0e0 100%);background-image:-webkit-gradient(linear,left top,left b
 ottom,from(#fff),to(#e0e0e0));background-image:linear-gradient(to bottom,#fff 0,#e0e0e0 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#ffe0e0e0', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-color:#dbdbdb;border-color:#ccc}.btn-default:focus,.btn-default:hover{background-color:#e0e0e0;background-position:0 -15px}.btn-default.active,.btn-default:active{background-color:#e0e0e0;border-color:#dbdbdb}.btn-default.disabled,.btn-default:disabled,.btn-default[disabled]{background-color:#e0e0e0;background-image:none}.btn-primary{background-image:-webkit-linear-gradient(top,#337ab7 0,#265a88 100%);background-image:-o-linear-gradient(top,#337ab7 0,#265a88 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#337ab7),to(#265a88));background-image:linear-gradient(to bottom,#337ab7 0,#265a88 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColors
 tr='#ff337ab7', endColorstr='#ff265a88', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-color:#245580}.btn-primary:focus,.btn-primary:hover{background-color:#265a88;background-position:0 -15px}.btn-primary.active,.btn-primary:active{background-color:#265a88;border-color:#245580}.btn-primary.disabled,.btn-primary:disabled,.btn-primary[disabled]{background-color:#265a88;background-image:none}.btn-success{background-image:-webkit-linear-gradient(top,#5cb85c 0,#419641 100%);background-image:-o-linear-gradient(top,#5cb85c 0,#419641 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#5cb85c),to(#419641));background-image:linear-gradient(to bottom,#5cb85c 0,#419641 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c', endColorstr='#ff419641', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-color:#3e8f3e}.bt
 n-success:focus,.btn-success:hover{background-color:#419641;background-position:0 -15px}.btn-success.active,.btn-success:active{background-color:#419641;border-color:#3e8f3e}.btn-success.disabled,.btn-success:disabled,.btn-success[disabled]{background-color:#419641;background-image:none}.btn-info{background-image:-webkit-linear-gradient(top,#5bc0de 0,#2aabd2 100%);background-image:-o-linear-gradient(top,#5bc0de 0,#2aabd2 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#5bc0de),to(#2aabd2));background-image:linear-gradient(to bottom,#5bc0de 0,#2aabd2 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff2aabd2', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-color:#28a4c9}.btn-info:focus,.btn-info:hover{background-color:#2aabd2;background-position:0 -15px}.btn-info.active,.btn-info:active{background-color:#2aabd2;border-color:#28a4c9}.btn-info.disa
 bled,.btn-info:disabled,.btn-info[disabled]{background-color:#2aabd2;background-image:none}.btn-warning{background-image:-webkit-linear-gradient(top,#f0ad4e 0,#eb9316 100%);background-image:-o-linear-gradient(top,#f0ad4e 0,#eb9316 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#f0ad4e),to(#eb9316));background-image:linear-gradient(to bottom,#f0ad4e 0,#eb9316 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e', endColorstr='#ffeb9316', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-color:#e38d13}.btn-warning:focus,.btn-warning:hover{background-color:#eb9316;background-position:0 -15px}.btn-warning.active,.btn-warning:active{background-color:#eb9316;border-color:#e38d13}.btn-warning.disabled,.btn-warning:disabled,.btn-warning[disabled]{background-color:#eb9316;background-image:none}.btn-danger{background-image:-webkit-linear-gradient(top,#d9534f 0,#c12e2a 100%);b
 ackground-image:-o-linear-gradient(top,#d9534f 0,#c12e2a 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#d9534f),to(#c12e2a));background-image:linear-gradient(to bottom,#d9534f 0,#c12e2a 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f', endColorstr='#ffc12e2a', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-color:#b92c28}.btn-danger:focus,.btn-danger:hover{background-color:#c12e2a;background-position:0 -15px}.btn-danger.active,.btn-danger:active{background-color:#c12e2a;border-color:#b92c28}.btn-danger.disabled,.btn-danger:disabled,.btn-danger[disabled]{background-color:#c12e2a;background-image:none}.img-thumbnail,.thumbnail{-webkit-box-shadow:0 1px 2px rgba(0,0,0,.075);box-shadow:0 1px 2px rgba(0,0,0,.075)}.dropdown-menu>li>a:focus,.dropdown-menu>li>a:hover{background-color:#e8e8e8;background-image:-webkit-linear-gradient(top,#f5f5f5 0,#e8e8e8 100%);backgro
 und-image:-o-linear-gradient(top,#f5f5f5 0,#e8e8e8 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#f5f5f5),to(#e8e8e8));background-image:linear-gradient(to bottom,#f5f5f5 0,#e8e8e8 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#ffe8e8e8', GradientType=0);background-repeat:repeat-x}.dropdown-menu>.active>a,.dropdown-menu>.active>a:focus,.dropdown-menu>.active>a:hover{background-color:#2e6da4;background-image:-webkit-linear-gradient(top,#337ab7 0,#2e6da4 100%);background-image:-o-linear-gradient(top,#337ab7 0,#2e6da4 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#337ab7),to(#2e6da4));background-image:linear-gradient(to bottom,#337ab7 0,#2e6da4 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2e6da4', GradientType=0);background-repeat:repeat-x}.navbar-default{background-image:-webkit-linear-gradient(top,#fff 0,#f8f8f8 100%);background-
 image:-o-linear-gradient(top,#fff 0,#f8f8f8 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#fff),to(#f8f8f8));background-image:linear-gradient(to bottom,#fff 0,#f8f8f8 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#fff8f8f8', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-radius:4px;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.15),0 1px 5px rgba(0,0,0,.075);box-shadow:inset 0 1px 0 rgba(255,255,255,.15),0 1px 5px rgba(0,0,0,.075)}.navbar-default .navbar-nav>.active>a,.navbar-default .navbar-nav>.open>a{background-image:-webkit-linear-gradient(top,#dbdbdb 0,#e2e2e2 100%);background-image:-o-linear-gradient(top,#dbdbdb 0,#e2e2e2 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#dbdbdb),to(#e2e2e2));background-image:linear-gradient(to bottom,#dbdbdb 0,#e2e2e2 100%);filter:progid:DXImageTransform.Microsoft.gradient(
 startColorstr='#ffdbdbdb', endColorstr='#ffe2e2e2', GradientType=0);background-repeat:repeat-x;-webkit-box-shadow:inset 0 3px 9px rgba(0,0,0,.075);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)}.navbar-inverse{background-image:-webkit-linear-gradient(top,#3c3c3c 0,#222 100%);background-image:-o-linear-gradient(top,#3c3c3c 0,#222 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#3c3c3c),to(#222));background-image:linear-gradient(to bottom,#3c3c3c 0,#222 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff3c3c3c', endColorstr='#ff222222', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x}.navbar-inverse .navbar-nav>.active>a,.navbar-inverse .navbar-nav>.open>a{background-image:-webkit-linear-gradient(top,#080808 0,#0f0f0f 100%);background-image:-o-linear-gradient(top,#080808 0,#0f0f0f 100%);background-image:-webki
 t-gradient(linear,left top,left bottom,from(#080808),to(#0f0f0f));background-image:linear-gradient(to bottom,#080808 0,#0f0f0f 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff080808', endColorstr='#ff0f0f0f', GradientType=0);background-repeat:repeat-x;-webkit-box-shadow:inset 0 3px 9px rgba(0,0,0,.25);box-shadow:inset 0 3px 9px rgba(0,0,0,.25)}.navbar-inverse .navbar-brand,.navbar-inverse .navbar-nav>li>a{text-shadow:0 -1px 0 rgba(0,0,0,.25)}.navbar-fixed-bottom,.navbar-fixed-top,.navbar-static-top{border-radius:0}@media (max-width:767px){.navbar .navbar-nav .open .dropdown-menu>.active>a,.navbar .navbar-nav .open .dropdown-menu>.active>a:focus,.navbar .navbar-nav .open .dropdown-menu>.active>a:hover{color:#fff;background-image:-webkit-linear-gradient(top,#337ab7 0,#2e6da4 100%);background-image:-o-linear-gradient(top,#337ab7 0,#2e6da4 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#337ab7),to(#2e6da4));background-image:linear-grad
 ient(to bottom,#337ab7 0,#2e6da4 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2e6da4', GradientType=0);background-repeat:repeat-x}}.alert{text-shadow:0 1px 0 rgba(255,255,255,.2);-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.25),0 1px 2px rgba(0,0,0,.05);box-shadow:inset 0 1px 0 rgba(255,255,255,.25),0 1px 2px rgba(0,0,0,.05)}.alert-success{background-image:-webkit-linear-gradient(top,#dff0d8 0,#c8e5bc 100%);background-image:-o-linear-gradient(top,#dff0d8 0,#c8e5bc 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#dff0d8),to(#c8e5bc));background-image:linear-gradient(to bottom,#dff0d8 0,#c8e5bc 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8', endColorstr='#ffc8e5bc', GradientType=0);background-repeat:repeat-x;border-color:#b2dba1}.alert-info{background-image:-webkit-linear-gradient(top,#d9edf7 0,#b9def0 100%);background-image:-o-linear-gradient(top,#d9edf7 0,#b9def0 1
 00%);background-image:-webkit-gradient(linear,left top,left bottom,from(#d9edf7),to(#b9def0));background-image:linear-gradient(to bottom,#d9edf7 0,#b9def0 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7', endColorstr='#ffb9def0', GradientType=0);background-repeat:repeat-x;border-color:#9acfea}.alert-warning{background-image:-webkit-linear-gradient(top,#fcf8e3 0,#f8efc0 100%);background-image:-o-linear-gradient(top,#fcf8e3 0,#f8efc0 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#fcf8e3),to(#f8efc0));background-image:linear-gradient(to bottom,#fcf8e3 0,#f8efc0 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3', endColorstr='#fff8efc0', GradientType=0);background-repeat:repeat-x;border-color:#f5e79e}.alert-danger{background-image:-webkit-linear-gradient(top,#f2dede 0,#e7c3c3 100%);background-image:-o-linear-gradient(top,#f2dede 0,#e7c3c3 100%);background-image:-webkit-gradient(linear,left top,lef
 t bottom,from(#f2dede),to(#e7c3c3));background-image:linear-gradient(to bottom,#f2dede 0,#e7c3c3 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede', endColorstr='#ffe7c3c3', GradientType=0);background-repeat:repeat-x;border-color:#dca7a7}.progress{background-image:-webkit-linear-gradient(top,#ebebeb 0,#f5f5f5 100%);background-image:-o-linear-gradient(top,#ebebeb 0,#f5f5f5 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#ebebeb),to(#f5f5f5));background-image:linear-gradient(to bottom,#ebebeb 0,#f5f5f5 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffebebeb', endColorstr='#fff5f5f5', GradientType=0);background-repeat:repeat-x}.progress-bar{background-image:-webkit-linear-gradient(top,#337ab7 0,#286090 100%);background-image:-o-linear-gradient(top,#337ab7 0,#286090 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#337ab7),to(#286090));background-image:linear-gradient(to bottom,#337a
 b7 0,#286090 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff286090', GradientType=0);background-repeat:repeat-x}.progress-bar-success{background-image:-webkit-linear-gradient(top,#5cb85c 0,#449d44 100%);background-image:-o-linear-gradient(top,#5cb85c 0,#449d44 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#5cb85c),to(#449d44));background-image:linear-gradient(to bottom,#5cb85c 0,#449d44 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c', endColorstr='#ff449d44', GradientType=0);background-repeat:repeat-x}.progress-bar-info{background-image:-webkit-linear-gradient(top,#5bc0de 0,#31b0d5 100%);background-image:-o-linear-gradient(top,#5bc0de 0,#31b0d5 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#5bc0de),to(#31b0d5));background-image:linear-gradient(to bottom,#5bc0de 0,#31b0d5 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5
 bc0de', endColorstr='#ff31b0d5', GradientType=0);background-repeat:repeat-x}.progress-bar-warning{background-image:-webkit-linear-gradient(top,#f0ad4e 0,#ec971f 100%);background-image:-o-linear-gradient(top,#f0ad4e 0,#ec971f 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#f0ad4e),to(#ec971f));background-image:linear-gradient(to bottom,#f0ad4e 0,#ec971f 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e', endColorstr='#ffec971f', GradientType=0);background-repeat:repeat-x}.progress-bar-danger{background-image:-webkit-linear-gradient(top,#d9534f 0,#c9302c 100%);background-image:-o-linear-gradient(top,#d9534f 0,#c9302c 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#d9534f),to(#c9302c));background-image:linear-gradient(to bottom,#d9534f 0,#c9302c 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f', endColorstr='#ffc9302c', GradientType=0);background-repeat:repeat-x}.progress-
 bar-striped{background-image:-webkit-linear-gradient(45deg,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(45deg,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(45deg,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)}.list-group{border-radius:4px;-webkit-box-shadow:0 1px 2px rgba(0,0,0,.075);box-shadow:0 1px 2px rgba(0,0,0,.075)}.list-group-item.active,.list-group-item.active:focus,.list-group-item.active:hover{text-shadow:0 -1px 0 #286090;background-image:-webkit-linear-gradient(top,#337ab7 0,#2b669a 100%);background-image:-o-linear-gradient(top,#337ab7 0,#2b669a 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#337ab7),to(#
 2b669a));background-image:linear-gradient(to bottom,#337ab7 0,#2b669a 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2b669a', GradientType=0);background-repeat:repeat-x;border-color:#2b669a}.list-group-item.active .badge,.list-group-item.active:focus .badge,.list-group-item.active:hover .badge{text-shadow:none}.panel{-webkit-box-shadow:0 1px 2px rgba(0,0,0,.05);box-shadow:0 1px 2px rgba(0,0,0,.05)}.panel-default>.panel-heading{background-image:-webkit-linear-gradient(top,#f5f5f5 0,#e8e8e8 100%);background-image:-o-linear-gradient(top,#f5f5f5 0,#e8e8e8 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#f5f5f5),to(#e8e8e8));background-image:linear-gradient(to bottom,#f5f5f5 0,#e8e8e8 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#ffe8e8e8', GradientType=0);background-repeat:repeat-x}.panel-primary>.panel-heading{background-image:-webkit-linear-gradient(top,#337a
 b7 0,#2e6da4 100%);background-image:-o-linear-gradient(top,#337ab7 0,#2e6da4 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#337ab7),to(#2e6da4));background-image:linear-gradient(to bottom,#337ab7 0,#2e6da4 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2e6da4', GradientType=0);background-repeat:repeat-x}.panel-success>.panel-heading{background-image:-webkit-linear-gradient(top,#dff0d8 0,#d0e9c6 100%);background-image:-o-linear-gradient(top,#dff0d8 0,#d0e9c6 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#dff0d8),to(#d0e9c6));background-image:linear-gradient(to bottom,#dff0d8 0,#d0e9c6 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8', endColorstr='#ffd0e9c6', GradientType=0);background-repeat:repeat-x}.panel-info>.panel-heading{background-image:-webkit-linear-gradient(top,#d9edf7 0,#c4e3f3 100%);background-image:-o-linear-gradient(top,#d9edf7 0,#c4
 e3f3 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#d9edf7),to(#c4e3f3));background-image:linear-gradient(to bottom,#d9edf7 0,#c4e3f3 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7', endColorstr='#ffc4e3f3', GradientType=0);background-repeat:repeat-x}.panel-warning>.panel-heading{background-image:-webkit-linear-gradient(top,#fcf8e3 0,#faf2cc 100%);background-image:-o-linear-gradient(top,#fcf8e3 0,#faf2cc 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#fcf8e3),to(#faf2cc));background-image:linear-gradient(to bottom,#fcf8e3 0,#faf2cc 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3', endColorstr='#fffaf2cc', GradientType=0);background-repeat:repeat-x}.panel-danger>.panel-heading{background-image:-webkit-linear-gradient(top,#f2dede 0,#ebcccc 100%);background-image:-o-linear-gradient(top,#f2dede 0,#ebcccc 100%);background-image:-webkit-gradient(linear,left top,left bott
 om,from(#f2dede),to(#ebcccc));background-image:linear-gradient(to bottom,#f2dede 0,#ebcccc 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede', endColorstr='#ffebcccc', GradientType=0);background-repeat:repeat-x}.well{background-image:-webkit-linear-gradient(top,#e8e8e8 0,#f5f5f5 100%);background-image:-o-linear-gradient(top,#e8e8e8 0,#f5f5f5 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#e8e8e8),to(#f5f5f5));background-image:linear-gradient(to bottom,#e8e8e8 0,#f5f5f5 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffe8e8e8', endColorstr='#fff5f5f5', GradientType=0);background-repeat:repeat-x;border-color:#dcdcdc;-webkit-box-shadow:inset 0 1px 3px rgba(0,0,0,.05),0 1px 0 rgba(255,255,255,.1);box-shadow:inset 0 1px 3px rgba(0,0,0,.05),0 1px 0 rgba(255,255,255,.1)}
\ No newline at end of file
diff --git a/www/test/icla/public/assets/jquery-min.js b/www/test/icla/public/assets/jquery-min.js
new file mode 100644
index 0000000..e6a051d
--- /dev/null
+++ b/www/test/icla/public/assets/jquery-min.js
@@ -0,0 +1,4 @@
+/*! jQuery v1.11.2 | (c) 2005, 2014 jQuery Foundation, Inc. | jquery.org/license */
+!function(a,b){"object"==typeof module&&"object"==typeof module.exports?module.exports=a.document?b(a,!0):function(a){if(!a.document)throw new Error("jQuery requires a window with a document");return b(a)}:b(a)}("undefined"!=typeof window?window:this,function(a,b){var c=[],d=c.slice,e=c.concat,f=c.push,g=c.indexOf,h={},i=h.toString,j=h.hasOwnProperty,k={},l="1.11.2",m=function(a,b){return new m.fn.init(a,b)},n=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,o=/^-ms-/,p=/-([\da-z])/gi,q=function(a,b){return b.toUpperCase()};m.fn=m.prototype={jquery:l,constructor:m,selector:"",length:0,toArray:function(){return d.call(this)},get:function(a){return null!=a?0>a?this[a+this.length]:this[a]:d.call(this)},pushStack:function(a){var b=m.merge(this.constructor(),a);return b.prevObject=this,b.context=this.context,b},each:function(a,b){return m.each(this,a,b)},map:function(a){return this.pushStack(m.map(this,function(b,c){return a.call(b,c,b)}))},slice:function(){return this.pushStack(d.apply(this,argumen
 ts))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},eq:function(a){var b=this.length,c=+a+(0>a?b:0);return this.pushStack(c>=0&&b>c?[this[c]]:[])},end:function(){return this.prevObject||this.constructor(null)},push:f,sort:c.sort,splice:c.splice},m.extend=m.fn.extend=function(){var a,b,c,d,e,f,g=arguments[0]||{},h=1,i=arguments.length,j=!1;for("boolean"==typeof g&&(j=g,g=arguments[h]||{},h++),"object"==typeof g||m.isFunction(g)||(g={}),h===i&&(g=this,h--);i>h;h++)if(null!=(e=arguments[h]))for(d in e)a=g[d],c=e[d],g!==c&&(j&&c&&(m.isPlainObject(c)||(b=m.isArray(c)))?(b?(b=!1,f=a&&m.isArray(a)?a:[]):f=a&&m.isPlainObject(a)?a:{},g[d]=m.extend(j,f,c)):void 0!==c&&(g[d]=c));return g},m.extend({expando:"jQuery"+(l+Math.random()).replace(/\D/g,""),isReady:!0,error:function(a){throw new Error(a)},noop:function(){},isFunction:function(a){return"function"===m.type(a)},isArray:Array.isArray||function(a){return"array"===m.type(a)},isWindow:function(a){return null!=a&&a=
 =a.window},isNumeric:function(a){return!m.isArray(a)&&a-parseFloat(a)+1>=0},isEmptyObject:function(a){var b;for(b in a)return!1;return!0},isPlainObject:function(a){var b;if(!a||"object"!==m.type(a)||a.nodeType||m.isWindow(a))return!1;try{if(a.constructor&&!j.call(a,"constructor")&&!j.call(a.constructor.prototype,"isPrototypeOf"))return!1}catch(c){return!1}if(k.ownLast)for(b in a)return j.call(a,b);for(b in a);return void 0===b||j.call(a,b)},type:function(a){return null==a?a+"":"object"==typeof a||"function"==typeof a?h[i.call(a)]||"object":typeof a},globalEval:function(b){b&&m.trim(b)&&(a.execScript||function(b){a.eval.call(a,b)})(b)},camelCase:function(a){return a.replace(o,"ms-").replace(p,q)},nodeName:function(a,b){return a.nodeName&&a.nodeName.toLowerCase()===b.toLowerCase()},each:function(a,b,c){var d,e=0,f=a.length,g=r(a);if(c){if(g){for(;f>e;e++)if(d=b.apply(a[e],c),d===!1)break}else for(e in a)if(d=b.apply(a[e],c),d===!1)break}else if(g){for(;f>e;e++)if(d=b.call(a[e],e,a[e])
 ,d===!1)break}else for(e in a)if(d=b.call(a[e],e,a[e]),d===!1)break;return a},trim:function(a){return null==a?"":(a+"").replace(n,"")},makeArray:function(a,b){var c=b||[];return null!=a&&(r(Object(a))?m.merge(c,"string"==typeof a?[a]:a):f.call(c,a)),c},inArray:function(a,b,c){var d;if(b){if(g)return g.call(b,a,c);for(d=b.length,c=c?0>c?Math.max(0,d+c):c:0;d>c;c++)if(c in b&&b[c]===a)return c}return-1},merge:function(a,b){var c=+b.length,d=0,e=a.length;while(c>d)a[e++]=b[d++];if(c!==c)while(void 0!==b[d])a[e++]=b[d++];return a.length=e,a},grep:function(a,b,c){for(var d,e=[],f=0,g=a.length,h=!c;g>f;f++)d=!b(a[f],f),d!==h&&e.push(a[f]);return e},map:function(a,b,c){var d,f=0,g=a.length,h=r(a),i=[];if(h)for(;g>f;f++)d=b(a[f],f,c),null!=d&&i.push(d);else for(f in a)d=b(a[f],f,c),null!=d&&i.push(d);return e.apply([],i)},guid:1,proxy:function(a,b){var c,e,f;return"string"==typeof b&&(f=a[b],b=a,a=f),m.isFunction(a)?(c=d.call(arguments,2),e=function(){return a.apply(b||this,c.concat(d.call(
 arguments)))},e.guid=a.guid=a.guid||m.guid++,e):void 0},now:function(){return+new Date},support:k}),m.each("Boolean Number String Function Array Date RegExp Object Error".split(" "),function(a,b){h["[object "+b+"]"]=b.toLowerCase()});function r(a){var b=a.length,c=m.type(a);return"function"===c||m.isWindow(a)?!1:1===a.nodeType&&b?!0:"array"===c||0===b||"number"==typeof b&&b>0&&b-1 in a}var s=function(a){var b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u="sizzle"+1*new Date,v=a.document,w=0,x=0,y=hb(),z=hb(),A=hb(),B=function(a,b){return a===b&&(l=!0),0},C=1<<31,D={}.hasOwnProperty,E=[],F=E.pop,G=E.push,H=E.push,I=E.slice,J=function(a,b){for(var c=0,d=a.length;d>c;c++)if(a[c]===b)return c;return-1},K="checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",L="[\\x20\\t\\r\\n\\f]",M="(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+",N=M.replace("w","w#"),O="\\["+L+"*("+M+")(?:"+L+"*([*^$|!~]?=)"+L+"*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^
 \\\\\"])*)\"|("+N+"))|)"+L+"*\\]",P=":("+M+")(?:\\((('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|((?:\\\\.|[^\\\\()[\\]]|"+O+")*)|.*)\\)|)",Q=new RegExp(L+"+","g"),R=new RegExp("^"+L+"+|((?:^|[^\\\\])(?:\\\\.)*)"+L+"+$","g"),S=new RegExp("^"+L+"*,"+L+"*"),T=new RegExp("^"+L+"*([>+~]|"+L+")"+L+"*"),U=new RegExp("="+L+"*([^\\]'\"]*?)"+L+"*\\]","g"),V=new RegExp(P),W=new RegExp("^"+N+"$"),X={ID:new RegExp("^#("+M+")"),CLASS:new RegExp("^\\.("+M+")"),TAG:new RegExp("^("+M.replace("w","w*")+")"),ATTR:new RegExp("^"+O),PSEUDO:new RegExp("^"+P),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+L+"*(even|odd|(([+-]|)(\\d*)n|)"+L+"*(?:([+-]|)"+L+"*(\\d+)|))"+L+"*\\)|)","i"),bool:new RegExp("^(?:"+K+")$","i"),needsContext:new RegExp("^"+L+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+L+"*((?:-\\d)?\\d*)"+L+"*\\)|)(?=[^-]|$)","i")},Y=/^(?:input|select|textarea|button)$/i,Z=/^h\d$/i,$=/^[^{]+\{\s*\[native \w/,_=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,ab=/[+~]/,bb
 =/'|\\/g,cb=new RegExp("\\\\([\\da-f]{1,6}"+L+"?|("+L+")|.)","ig"),db=function(a,b,c){var d="0x"+b-65536;return d!==d||c?b:0>d?String.fromCharCode(d+65536):String.fromCharCode(d>>10|55296,1023&d|56320)},eb=function(){m()};try{H.apply(E=I.call(v.childNodes),v.childNodes),E[v.childNodes.length].nodeType}catch(fb){H={apply:E.length?function(a,b){G.apply(a,I.call(b))}:function(a,b){var c=a.length,d=0;while(a[c++]=b[d++]);a.length=c-1}}}function gb(a,b,d,e){var f,h,j,k,l,o,r,s,w,x;if((b?b.ownerDocument||b:v)!==n&&m(b),b=b||n,d=d||[],k=b.nodeType,"string"!=typeof a||!a||1!==k&&9!==k&&11!==k)return d;if(!e&&p){if(11!==k&&(f=_.exec(a)))if(j=f[1]){if(9===k){if(h=b.getElementById(j),!h||!h.parentNode)return d;if(h.id===j)return d.push(h),d}else if(b.ownerDocument&&(h=b.ownerDocument.getElementById(j))&&t(b,h)&&h.id===j)return d.push(h),d}else{if(f[2])return H.apply(d,b.getElementsByTagName(a)),d;if((j=f[3])&&c.getElementsByClassName)return H.apply(d,b.getElementsByClassName(j)),d}if(c.qsa&&(!
 q||!q.test(a))){if(s=r=u,w=b,x=1!==k&&a,1===k&&"object"!==b.nodeName.toLowerCase()){o=g(a),(r=b.getAttribute("id"))?s=r.replace(bb,"\\$&"):b.setAttribute("id",s),s="[id='"+s+"'] ",l=o.length;while(l--)o[l]=s+rb(o[l]);w=ab.test(a)&&pb(b.parentNode)||b,x=o.join(",")}if(x)try{return H.apply(d,w.querySelectorAll(x)),d}catch(y){}finally{r||b.removeAttribute("id")}}}return i(a.replace(R,"$1"),b,d,e)}function hb(){var a=[];function b(c,e){return a.push(c+" ")>d.cacheLength&&delete b[a.shift()],b[c+" "]=e}return b}function ib(a){return a[u]=!0,a}function jb(a){var b=n.createElement("div");try{return!!a(b)}catch(c){return!1}finally{b.parentNode&&b.parentNode.removeChild(b),b=null}}function kb(a,b){var c=a.split("|"),e=a.length;while(e--)d.attrHandle[c[e]]=b}function lb(a,b){var c=b&&a,d=c&&1===a.nodeType&&1===b.nodeType&&(~b.sourceIndex||C)-(~a.sourceIndex||C);if(d)return d;if(c)while(c=c.nextSibling)if(c===b)return-1;return a?1:-1}function mb(a){return function(b){var c=b.nodeName.toLowerCa
 se();return"input"===c&&b.type===a}}function nb(a){return function(b){var c=b.nodeName.toLowerCase();return("input"===c||"button"===c)&&b.type===a}}function ob(a){return ib(function(b){return b=+b,ib(function(c,d){var e,f=a([],c.length,b),g=f.length;while(g--)c[e=f[g]]&&(c[e]=!(d[e]=c[e]))})})}function pb(a){return a&&"undefined"!=typeof a.getElementsByTagName&&a}c=gb.support={},f=gb.isXML=function(a){var b=a&&(a.ownerDocument||a).documentElement;return b?"HTML"!==b.nodeName:!1},m=gb.setDocument=function(a){var b,e,g=a?a.ownerDocument||a:v;return g!==n&&9===g.nodeType&&g.documentElement?(n=g,o=g.documentElement,e=g.defaultView,e&&e!==e.top&&(e.addEventListener?e.addEventListener("unload",eb,!1):e.attachEvent&&e.attachEvent("onunload",eb)),p=!f(g),c.attributes=jb(function(a){return a.className="i",!a.getAttribute("className")}),c.getElementsByTagName=jb(function(a){return a.appendChild(g.createComment("")),!a.getElementsByTagName("*").length}),c.getElementsByClassName=$.test(g.getEle
 mentsByClassName),c.getById=jb(function(a){return o.appendChild(a).id=u,!g.getElementsByName||!g.getElementsByName(u).length}),c.getById?(d.find.ID=function(a,b){if("undefined"!=typeof b.getElementById&&p){var c=b.getElementById(a);return c&&c.parentNode?[c]:[]}},d.filter.ID=function(a){var b=a.replace(cb,db);return function(a){return a.getAttribute("id")===b}}):(delete d.find.ID,d.filter.ID=function(a){var b=a.replace(cb,db);return function(a){var c="undefined"!=typeof a.getAttributeNode&&a.getAttributeNode("id");return c&&c.value===b}}),d.find.TAG=c.getElementsByTagName?function(a,b){return"undefined"!=typeof b.getElementsByTagName?b.getElementsByTagName(a):c.qsa?b.querySelectorAll(a):void 0}:function(a,b){var c,d=[],e=0,f=b.getElementsByTagName(a);if("*"===a){while(c=f[e++])1===c.nodeType&&d.push(c);return d}return f},d.find.CLASS=c.getElementsByClassName&&function(a,b){return p?b.getElementsByClassName(a):void 0},r=[],q=[],(c.qsa=$.test(g.querySelectorAll))&&(jb(function(a){o.ap
 pendChild(a).innerHTML="<a id='"+u+"'></a><select id='"+u+"-\f]' msallowcapture=''><option selected=''></option></select>",a.querySelectorAll("[msallowcapture^='']").length&&q.push("[*^$]="+L+"*(?:''|\"\")"),a.querySelectorAll("[selected]").length||q.push("\\["+L+"*(?:value|"+K+")"),a.querySelectorAll("[id~="+u+"-]").length||q.push("~="),a.querySelectorAll(":checked").length||q.push(":checked"),a.querySelectorAll("a#"+u+"+*").length||q.push(".#.+[+~]")}),jb(function(a){var b=g.createElement("input");b.setAttribute("type","hidden"),a.appendChild(b).setAttribute("name","D"),a.querySelectorAll("[name=d]").length&&q.push("name"+L+"*[*^$|!~]?="),a.querySelectorAll(":enabled").length||q.push(":enabled",":disabled"),a.querySelectorAll("*,:x"),q.push(",.*:")})),(c.matchesSelector=$.test(s=o.matches||o.webkitMatchesSelector||o.mozMatchesSelector||o.oMatchesSelector||o.msMatchesSelector))&&jb(function(a){c.disconnectedMatch=s.call(a,"div"),s.call(a,"[s!='']:x"),r.push("!=",P)}),q=q.length&&ne
 w RegExp(q.join("|")),r=r.length&&new RegExp(r.join("|")),b=$.test(o.compareDocumentPosition),t=b||$.test(o.contains)?function(a,b){var c=9===a.nodeType?a.documentElement:a,d=b&&b.parentNode;return a===d||!(!d||1!==d.nodeType||!(c.contains?c.contains(d):a.compareDocumentPosition&&16&a.compareDocumentPosition(d)))}:function(a,b){if(b)while(b=b.parentNode)if(b===a)return!0;return!1},B=b?function(a,b){if(a===b)return l=!0,0;var d=!a.compareDocumentPosition-!b.compareDocumentPosition;return d?d:(d=(a.ownerDocument||a)===(b.ownerDocument||b)?a.compareDocumentPosition(b):1,1&d||!c.sortDetached&&b.compareDocumentPosition(a)===d?a===g||a.ownerDocument===v&&t(v,a)?-1:b===g||b.ownerDocument===v&&t(v,b)?1:k?J(k,a)-J(k,b):0:4&d?-1:1)}:function(a,b){if(a===b)return l=!0,0;var c,d=0,e=a.parentNode,f=b.parentNode,h=[a],i=[b];if(!e||!f)return a===g?-1:b===g?1:e?-1:f?1:k?J(k,a)-J(k,b):0;if(e===f)return lb(a,b);c=a;while(c=c.parentNode)h.unshift(c);c=b;while(c=c.parentNode)i.unshift(c);while(h[d]===i
 [d])d++;return d?lb(h[d],i[d]):h[d]===v?-1:i[d]===v?1:0},g):n},gb.matches=function(a,b){return gb(a,null,null,b)},gb.matchesSelector=function(a,b){if((a.ownerDocument||a)!==n&&m(a),b=b.replace(U,"='$1']"),!(!c.matchesSelector||!p||r&&r.test(b)||q&&q.test(b)))try{var d=s.call(a,b);if(d||c.disconnectedMatch||a.document&&11!==a.document.nodeType)return d}catch(e){}return gb(b,n,null,[a]).length>0},gb.contains=function(a,b){return(a.ownerDocument||a)!==n&&m(a),t(a,b)},gb.attr=function(a,b){(a.ownerDocument||a)!==n&&m(a);var e=d.attrHandle[b.toLowerCase()],f=e&&D.call(d.attrHandle,b.toLowerCase())?e(a,b,!p):void 0;return void 0!==f?f:c.attributes||!p?a.getAttribute(b):(f=a.getAttributeNode(b))&&f.specified?f.value:null},gb.error=function(a){throw new Error("Syntax error, unrecognized expression: "+a)},gb.uniqueSort=function(a){var b,d=[],e=0,f=0;if(l=!c.detectDuplicates,k=!c.sortStable&&a.slice(0),a.sort(B),l){while(b=a[f++])b===a[f]&&(e=d.push(f));while(e--)a.splice(d[e],1)}return k=nul
 l,a},e=gb.getText=function(a){var b,c="",d=0,f=a.nodeType;if(f){if(1===f||9===f||11===f){if("string"==typeof a.textContent)return a.textContent;for(a=a.firstChild;a;a=a.nextSibling)c+=e(a)}else if(3===f||4===f)return a.nodeValue}else while(b=a[d++])c+=e(b);return c},d=gb.selectors={cacheLength:50,createPseudo:ib,match:X,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(a){return a[1]=a[1].replace(cb,db),a[3]=(a[3]||a[4]||a[5]||"").replace(cb,db),"~="===a[2]&&(a[3]=" "+a[3]+" "),a.slice(0,4)},CHILD:function(a){return a[1]=a[1].toLowerCase(),"nth"===a[1].slice(0,3)?(a[3]||gb.error(a[0]),a[4]=+(a[4]?a[5]+(a[6]||1):2*("even"===a[3]||"odd"===a[3])),a[5]=+(a[7]+a[8]||"odd"===a[3])):a[3]&&gb.error(a[0]),a},PSEUDO:function(a){var b,c=!a[6]&&a[2];return X.CHILD.test(a[0])?null:(a[3]?a[2]=a[4]||a[5]||"":c&&V.test(c)&&(b=g(c,!0))&&(b=c.indexOf(")",c.length-b)-c.length
 )&&(a[0]=a[0].slice(0,b),a[2]=c.slice(0,b)),a.slice(0,3))}},filter:{TAG:function(a){var b=a.replace(cb,db).toLowerCase();return"*"===a?function(){return!0}:function(a){return a.nodeName&&a.nodeName.toLowerCase()===b}},CLASS:function(a){var b=y[a+" "];return b||(b=new RegExp("(^|"+L+")"+a+"("+L+"|$)"))&&y(a,function(a){return b.test("string"==typeof a.className&&a.className||"undefined"!=typeof a.getAttribute&&a.getAttribute("class")||"")})},ATTR:function(a,b,c){return function(d){var e=gb.attr(d,a);return null==e?"!="===b:b?(e+="","="===b?e===c:"!="===b?e!==c:"^="===b?c&&0===e.indexOf(c):"*="===b?c&&e.indexOf(c)>-1:"$="===b?c&&e.slice(-c.length)===c:"~="===b?(" "+e.replace(Q," ")+" ").indexOf(c)>-1:"|="===b?e===c||e.slice(0,c.length+1)===c+"-":!1):!0}},CHILD:function(a,b,c,d,e){var f="nth"!==a.slice(0,3),g="last"!==a.slice(-4),h="of-type"===b;return 1===d&&0===e?function(a){return!!a.parentNode}:function(b,c,i){var j,k,l,m,n,o,p=f!==g?"nextSibling":"previousSibling",q=b.parentNode,r
 =h&&b.nodeName.toLowerCase(),s=!i&&!h;if(q){if(f){while(p){l=b;while(l=l[p])if(h?l.nodeName.toLowerCase()===r:1===l.nodeType)return!1;o=p="only"===a&&!o&&"nextSibling"}return!0}if(o=[g?q.firstChild:q.lastChild],g&&s){k=q[u]||(q[u]={}),j=k[a]||[],n=j[0]===w&&j[1],m=j[0]===w&&j[2],l=n&&q.childNodes[n];while(l=++n&&l&&l[p]||(m=n=0)||o.pop())if(1===l.nodeType&&++m&&l===b){k[a]=[w,n,m];break}}else if(s&&(j=(b[u]||(b[u]={}))[a])&&j[0]===w)m=j[1];else while(l=++n&&l&&l[p]||(m=n=0)||o.pop())if((h?l.nodeName.toLowerCase()===r:1===l.nodeType)&&++m&&(s&&((l[u]||(l[u]={}))[a]=[w,m]),l===b))break;return m-=e,m===d||m%d===0&&m/d>=0}}},PSEUDO:function(a,b){var c,e=d.pseudos[a]||d.setFilters[a.toLowerCase()]||gb.error("unsupported pseudo: "+a);return e[u]?e(b):e.length>1?(c=[a,a,"",b],d.setFilters.hasOwnProperty(a.toLowerCase())?ib(function(a,c){var d,f=e(a,b),g=f.length;while(g--)d=J(a,f[g]),a[d]=!(c[d]=f[g])}):function(a){return e(a,0,c)}):e}},pseudos:{not:ib(function(a){var b=[],c=[],d=h(a.repla
 ce(R,"$1"));return d[u]?ib(function(a,b,c,e){var f,g=d(a,null,e,[]),h=a.length;while(h--)(f=g[h])&&(a[h]=!(b[h]=f))}):function(a,e,f){return b[0]=a,d(b,null,f,c),b[0]=null,!c.pop()}}),has:ib(function(a){return function(b){return gb(a,b).length>0}}),contains:ib(function(a){return a=a.replace(cb,db),function(b){return(b.textContent||b.innerText||e(b)).indexOf(a)>-1}}),lang:ib(function(a){return W.test(a||"")||gb.error("unsupported lang: "+a),a=a.replace(cb,db).toLowerCase(),function(b){var c;do if(c=p?b.lang:b.getAttribute("xml:lang")||b.getAttribute("lang"))return c=c.toLowerCase(),c===a||0===c.indexOf(a+"-");while((b=b.parentNode)&&1===b.nodeType);return!1}}),target:function(b){var c=a.location&&a.location.hash;return c&&c.slice(1)===b.id},root:function(a){return a===o},focus:function(a){return a===n.activeElement&&(!n.hasFocus||n.hasFocus())&&!!(a.type||a.href||~a.tabIndex)},enabled:function(a){return a.disabled===!1},disabled:function(a){return a.disabled===!0},checked:function(a)
 {var b=a.nodeName.toLowerCase();return"input"===b&&!!a.checked||"option"===b&&!!a.selected},selected:function(a){return a.parentNode&&a.parentNode.selectedIndex,a.selected===!0},empty:function(a){for(a=a.firstChild;a;a=a.nextSibling)if(a.nodeType<6)return!1;return!0},parent:function(a){return!d.pseudos.empty(a)},header:function(a){return Z.test(a.nodeName)},input:function(a){return Y.test(a.nodeName)},button:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&"button"===a.type||"button"===b},text:function(a){var b;return"input"===a.nodeName.toLowerCase()&&"text"===a.type&&(null==(b=a.getAttribute("type"))||"text"===b.toLowerCase())},first:ob(function(){return[0]}),last:ob(function(a,b){return[b-1]}),eq:ob(function(a,b,c){return[0>c?c+b:c]}),even:ob(function(a,b){for(var c=0;b>c;c+=2)a.push(c);return a}),odd:ob(function(a,b){for(var c=1;b>c;c+=2)a.push(c);return a}),lt:ob(function(a,b,c){for(var d=0>c?c+b:c;--d>=0;)a.push(d);return a}),gt:ob(function(a,b,c){for(var d=0>c?c+
 b:c;++d<b;)a.push(d);return a})}},d.pseudos.nth=d.pseudos.eq;for(b in{radio:!0,checkbox:!0,file:!0,password:!0,image:!0})d.pseudos[b]=mb(b);for(b in{submit:!0,reset:!0})d.pseudos[b]=nb(b);function qb(){}qb.prototype=d.filters=d.pseudos,d.setFilters=new qb,g=gb.tokenize=function(a,b){var c,e,f,g,h,i,j,k=z[a+" "];if(k)return b?0:k.slice(0);h=a,i=[],j=d.preFilter;while(h){(!c||(e=S.exec(h)))&&(e&&(h=h.slice(e[0].length)||h),i.push(f=[])),c=!1,(e=T.exec(h))&&(c=e.shift(),f.push({value:c,type:e[0].replace(R," ")}),h=h.slice(c.length));for(g in d.filter)!(e=X[g].exec(h))||j[g]&&!(e=j[g](e))||(c=e.shift(),f.push({value:c,type:g,matches:e}),h=h.slice(c.length));if(!c)break}return b?h.length:h?gb.error(a):z(a,i).slice(0)};function rb(a){for(var b=0,c=a.length,d="";c>b;b++)d+=a[b].value;return d}function sb(a,b,c){var d=b.dir,e=c&&"parentNode"===d,f=x++;return b.first?function(b,c,f){while(b=b[d])if(1===b.nodeType||e)return a(b,c,f)}:function(b,c,g){var h,i,j=[w,f];if(g){while(b=b[d])if((1===
 b.nodeType||e)&&a(b,c,g))return!0}else while(b=b[d])if(1===b.nodeType||e){if(i=b[u]||(b[u]={}),(h=i[d])&&h[0]===w&&h[1]===f)return j[2]=h[2];if(i[d]=j,j[2]=a(b,c,g))return!0}}}function tb(a){return a.length>1?function(b,c,d){var e=a.length;while(e--)if(!a[e](b,c,d))return!1;return!0}:a[0]}function ub(a,b,c){for(var d=0,e=b.length;e>d;d++)gb(a,b[d],c);return c}function vb(a,b,c,d,e){for(var f,g=[],h=0,i=a.length,j=null!=b;i>h;h++)(f=a[h])&&(!c||c(f,d,e))&&(g.push(f),j&&b.push(h));return g}function wb(a,b,c,d,e,f){return d&&!d[u]&&(d=wb(d)),e&&!e[u]&&(e=wb(e,f)),ib(function(f,g,h,i){var j,k,l,m=[],n=[],o=g.length,p=f||ub(b||"*",h.nodeType?[h]:h,[]),q=!a||!f&&b?p:vb(p,m,a,h,i),r=c?e||(f?a:o||d)?[]:g:q;if(c&&c(q,r,h,i),d){j=vb(r,n),d(j,[],h,i),k=j.length;while(k--)(l=j[k])&&(r[n[k]]=!(q[n[k]]=l))}if(f){if(e||a){if(e){j=[],k=r.length;while(k--)(l=r[k])&&j.push(q[k]=l);e(null,r=[],j,i)}k=r.length;while(k--)(l=r[k])&&(j=e?J(f,l):m[k])>-1&&(f[j]=!(g[j]=l))}}else r=vb(r===g?r.splice(o,r.leng
 th):r),e?e(null,g,r,i):H.apply(g,r)})}function xb(a){for(var b,c,e,f=a.length,g=d.relative[a[0].type],h=g||d.relative[" "],i=g?1:0,k=sb(function(a){return a===b},h,!0),l=sb(function(a){return J(b,a)>-1},h,!0),m=[function(a,c,d){var e=!g&&(d||c!==j)||((b=c).nodeType?k(a,c,d):l(a,c,d));return b=null,e}];f>i;i++)if(c=d.relative[a[i].type])m=[sb(tb(m),c)];else{if(c=d.filter[a[i].type].apply(null,a[i].matches),c[u]){for(e=++i;f>e;e++)if(d.relative[a[e].type])break;return wb(i>1&&tb(m),i>1&&rb(a.slice(0,i-1).concat({value:" "===a[i-2].type?"*":""})).replace(R,"$1"),c,e>i&&xb(a.slice(i,e)),f>e&&xb(a=a.slice(e)),f>e&&rb(a))}m.push(c)}return tb(m)}function yb(a,b){var c=b.length>0,e=a.length>0,f=function(f,g,h,i,k){var l,m,o,p=0,q="0",r=f&&[],s=[],t=j,u=f||e&&d.find.TAG("*",k),v=w+=null==t?1:Math.random()||.1,x=u.length;for(k&&(j=g!==n&&g);q!==x&&null!=(l=u[q]);q++){if(e&&l){m=0;while(o=a[m++])if(o(l,g,h)){i.push(l);break}k&&(w=v)}c&&((l=!o&&l)&&p--,f&&r.push(l))}if(p+=q,c&&q!==p){m=0;while(
 o=b[m++])o(r,s,g,h);if(f){if(p>0)while(q--)r[q]||s[q]||(s[q]=F.call(i));s=vb(s)}H.apply(i,s),k&&!f&&s.length>0&&p+b.length>1&&gb.uniqueSort(i)}return k&&(w=v,j=t),r};return c?ib(f):f}return h=gb.compile=function(a,b){var c,d=[],e=[],f=A[a+" "];if(!f){b||(b=g(a)),c=b.length;while(c--)f=xb(b[c]),f[u]?d.push(f):e.push(f);f=A(a,yb(e,d)),f.selector=a}return f},i=gb.select=function(a,b,e,f){var i,j,k,l,m,n="function"==typeof a&&a,o=!f&&g(a=n.selector||a);if(e=e||[],1===o.length){if(j=o[0]=o[0].slice(0),j.length>2&&"ID"===(k=j[0]).type&&c.getById&&9===b.nodeType&&p&&d.relative[j[1].type]){if(b=(d.find.ID(k.matches[0].replace(cb,db),b)||[])[0],!b)return e;n&&(b=b.parentNode),a=a.slice(j.shift().value.length)}i=X.needsContext.test(a)?0:j.length;while(i--){if(k=j[i],d.relative[l=k.type])break;if((m=d.find[l])&&(f=m(k.matches[0].replace(cb,db),ab.test(j[0].type)&&pb(b.parentNode)||b))){if(j.splice(i,1),a=f.length&&rb(j),!a)return H.apply(e,f),e;break}}}return(n||h(a,o))(f,b,!p,e,ab.test(a)&&pb
 (b.parentNode)||b),e},c.sortStable=u.split("").sort(B).join("")===u,c.detectDuplicates=!!l,m(),c.sortDetached=jb(function(a){return 1&a.compareDocumentPosition(n.createElement("div"))}),jb(function(a){return a.innerHTML="<a href='#'></a>","#"===a.firstChild.getAttribute("href")})||kb("type|href|height|width",function(a,b,c){return c?void 0:a.getAttribute(b,"type"===b.toLowerCase()?1:2)}),c.attributes&&jb(function(a){return a.innerHTML="<input/>",a.firstChild.setAttribute("value",""),""===a.firstChild.getAttribute("value")})||kb("value",function(a,b,c){return c||"input"!==a.nodeName.toLowerCase()?void 0:a.defaultValue}),jb(function(a){return null==a.getAttribute("disabled")})||kb(K,function(a,b,c){var d;return c?void 0:a[b]===!0?b.toLowerCase():(d=a.getAttributeNode(b))&&d.specified?d.value:null}),gb}(a);m.find=s,m.expr=s.selectors,m.expr[":"]=m.expr.pseudos,m.unique=s.uniqueSort,m.text=s.getText,m.isXMLDoc=s.isXML,m.contains=s.contains;var t=m.expr.match.needsContext,u=/^<(\w+)\s*\/
 ?>(?:<\/\1>|)$/,v=/^.[^:#\[\.,]*$/;function w(a,b,c){if(m.isFunction(b))return m.grep(a,function(a,d){return!!b.call(a,d,a)!==c});if(b.nodeType)return m.grep(a,function(a){return a===b!==c});if("string"==typeof b){if(v.test(b))return m.filter(b,a,c);b=m.filter(b,a)}return m.grep(a,function(a){return m.inArray(a,b)>=0!==c})}m.filter=function(a,b,c){var d=b[0];return c&&(a=":not("+a+")"),1===b.length&&1===d.nodeType?m.find.matchesSelector(d,a)?[d]:[]:m.find.matches(a,m.grep(b,function(a){return 1===a.nodeType}))},m.fn.extend({find:function(a){var b,c=[],d=this,e=d.length;if("string"!=typeof a)return this.pushStack(m(a).filter(function(){for(b=0;e>b;b++)if(m.contains(d[b],this))return!0}));for(b=0;e>b;b++)m.find(a,d[b],c);return c=this.pushStack(e>1?m.unique(c):c),c.selector=this.selector?this.selector+" "+a:a,c},filter:function(a){return this.pushStack(w(this,a||[],!1))},not:function(a){return this.pushStack(w(this,a||[],!0))},is:function(a){return!!w(this,"string"==typeof a&&t.test(a
 )?m(a):a||[],!1).length}});var x,y=a.document,z=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]*))$/,A=m.fn.init=function(a,b){var c,d;if(!a)return this;if("string"==typeof a){if(c="<"===a.charAt(0)&&">"===a.charAt(a.length-1)&&a.length>=3?[null,a,null]:z.exec(a),!c||!c[1]&&b)return!b||b.jquery?(b||x).find(a):this.constructor(b).find(a);if(c[1]){if(b=b instanceof m?b[0]:b,m.merge(this,m.parseHTML(c[1],b&&b.nodeType?b.ownerDocument||b:y,!0)),u.test(c[1])&&m.isPlainObject(b))for(c in b)m.isFunction(this[c])?this[c](b[c]):this.attr(c,b[c]);return this}if(d=y.getElementById(c[2]),d&&d.parentNode){if(d.id!==c[2])return x.find(a);this.length=1,this[0]=d}return this.context=y,this.selector=a,this}return a.nodeType?(this.context=this[0]=a,this.length=1,this):m.isFunction(a)?"undefined"!=typeof x.ready?x.ready(a):a(m):(void 0!==a.selector&&(this.selector=a.selector,this.context=a.context),m.makeArray(a,this))};A.prototype=m.fn,x=m(y);var B=/^(?:parents|prev(?:Until|All))/,C={children:!0,contents:!0,next:!0
 ,prev:!0};m.extend({dir:function(a,b,c){var d=[],e=a[b];while(e&&9!==e.nodeType&&(void 0===c||1!==e.nodeType||!m(e).is(c)))1===e.nodeType&&d.push(e),e=e[b];return d},sibling:function(a,b){for(var c=[];a;a=a.nextSibling)1===a.nodeType&&a!==b&&c.push(a);return c}}),m.fn.extend({has:function(a){var b,c=m(a,this),d=c.length;return this.filter(function(){for(b=0;d>b;b++)if(m.contains(this,c[b]))return!0})},closest:function(a,b){for(var c,d=0,e=this.length,f=[],g=t.test(a)||"string"!=typeof a?m(a,b||this.context):0;e>d;d++)for(c=this[d];c&&c!==b;c=c.parentNode)if(c.nodeType<11&&(g?g.index(c)>-1:1===c.nodeType&&m.find.matchesSelector(c,a))){f.push(c);break}return this.pushStack(f.length>1?m.unique(f):f)},index:function(a){return a?"string"==typeof a?m.inArray(this[0],m(a)):m.inArray(a.jquery?a[0]:a,this):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(a,b){return this.pushStack(m.unique(m.merge(this.get(),m(a,b))))},addBack:function(a){return this.add(null==a?thi
 s.prevObject:this.prevObject.filter(a))}});function D(a,b){do a=a[b];while(a&&1!==a.nodeType);return a}m.each({parent:function(a){var b=a.parentNode;return b&&11!==b.nodeType?b:null},parents:function(a){return m.dir(a,"parentNode")},parentsUntil:function(a,b,c){return m.dir(a,"parentNode",c)},next:function(a){return D(a,"nextSibling")},prev:function(a){return D(a,"previousSibling")},nextAll:function(a){return m.dir(a,"nextSibling")},prevAll:function(a){return m.dir(a,"previousSibling")},nextUntil:function(a,b,c){return m.dir(a,"nextSibling",c)},prevUntil:function(a,b,c){return m.dir(a,"previousSibling",c)},siblings:function(a){return m.sibling((a.parentNode||{}).firstChild,a)},children:function(a){return m.sibling(a.firstChild)},contents:function(a){return m.nodeName(a,"iframe")?a.contentDocument||a.contentWindow.document:m.merge([],a.childNodes)}},function(a,b){m.fn[a]=function(c,d){var e=m.map(this,b,c);return"Until"!==a.slice(-5)&&(d=c),d&&"string"==typeof d&&(e=m.filter(d,e)),th
 is.length>1&&(C[a]||(e=m.unique(e)),B.test(a)&&(e=e.reverse())),this.pushStack(e)}});var E=/\S+/g,F={};function G(a){var b=F[a]={};return m.each(a.match(E)||[],function(a,c){b[c]=!0}),b}m.Callbacks=function(a){a="string"==typeof a?F[a]||G(a):m.extend({},a);var b,c,d,e,f,g,h=[],i=!a.once&&[],j=function(l){for(c=a.memory&&l,d=!0,f=g||0,g=0,e=h.length,b=!0;h&&e>f;f++)if(h[f].apply(l[0],l[1])===!1&&a.stopOnFalse){c=!1;break}b=!1,h&&(i?i.length&&j(i.shift()):c?h=[]:k.disable())},k={add:function(){if(h){var d=h.length;!function f(b){m.each(b,function(b,c){var d=m.type(c);"function"===d?a.unique&&k.has(c)||h.push(c):c&&c.length&&"string"!==d&&f(c)})}(arguments),b?e=h.length:c&&(g=d,j(c))}return this},remove:function(){return h&&m.each(arguments,function(a,c){var d;while((d=m.inArray(c,h,d))>-1)h.splice(d,1),b&&(e>=d&&e--,f>=d&&f--)}),this},has:function(a){return a?m.inArray(a,h)>-1:!(!h||!h.length)},empty:function(){return h=[],e=0,this},disable:function(){return h=i=c=void 0,this},disable
 d:function(){return!h},lock:function(){return i=void 0,c||k.disable(),this},locked:function(){return!i},fireWith:function(a,c){return!h||d&&!i||(c=c||[],c=[a,c.slice?c.slice():c],b?i.push(c):j(c)),this},fire:function(){return k.fireWith(this,arguments),this},fired:function(){return!!d}};return k},m.extend({Deferred:function(a){var b=[["resolve","done",m.Callbacks("once memory"),"resolved"],["reject","fail",m.Callbacks("once memory"),"rejected"],["notify","progress",m.Callbacks("memory")]],c="pending",d={state:function(){return c},always:function(){return e.done(arguments).fail(arguments),this},then:function(){var a=arguments;return m.Deferred(function(c){m.each(b,function(b,f){var g=m.isFunction(a[b])&&a[b];e[f[1]](function(){var a=g&&g.apply(this,arguments);a&&m.isFunction(a.promise)?a.promise().done(c.resolve).fail(c.reject).progress(c.notify):c[f[0]+"With"](this===d?c.promise():this,g?[a]:arguments)})}),a=null}).promise()},promise:function(a){return null!=a?m.extend(a,d):d}},e={}
 ;return d.pipe=d.then,m.each(b,function(a,f){var g=f[2],h=f[3];d[f[1]]=g.add,h&&g.add(function(){c=h},b[1^a][2].disable,b[2][2].lock),e[f[0]]=function(){return e[f[0]+"With"](this===e?d:this,arguments),this},e[f[0]+"With"]=g.fireWith}),d.promise(e),a&&a.call(e,e),e},when:function(a){var b=0,c=d.call(arguments),e=c.length,f=1!==e||a&&m.isFunction(a.promise)?e:0,g=1===f?a:m.Deferred(),h=function(a,b,c){return function(e){b[a]=this,c[a]=arguments.length>1?d.call(arguments):e,c===i?g.notifyWith(b,c):--f||g.resolveWith(b,c)}},i,j,k;if(e>1)for(i=new Array(e),j=new Array(e),k=new Array(e);e>b;b++)c[b]&&m.isFunction(c[b].promise)?c[b].promise().done(h(b,k,c)).fail(g.reject).progress(h(b,j,i)):--f;return f||g.resolveWith(k,c),g.promise()}});var H;m.fn.ready=function(a){return m.ready.promise().done(a),this},m.extend({isReady:!1,readyWait:1,holdReady:function(a){a?m.readyWait++:m.ready(!0)},ready:function(a){if(a===!0?!--m.readyWait:!m.isReady){if(!y.body)return setTimeout(m.ready);m.isReady=
 !0,a!==!0&&--m.readyWait>0||(H.resolveWith(y,[m]),m.fn.triggerHandler&&(m(y).triggerHandler("ready"),m(y).off("ready")))}}});function I(){y.addEventListener?(y.removeEventListener("DOMContentLoaded",J,!1),a.removeEventListener("load",J,!1)):(y.detachEvent("onreadystatechange",J),a.detachEvent("onload",J))}function J(){(y.addEventListener||"load"===event.type||"complete"===y.readyState)&&(I(),m.ready())}m.ready.promise=function(b){if(!H)if(H=m.Deferred(),"complete"===y.readyState)setTimeout(m.ready);else if(y.addEventListener)y.addEventListener("DOMContentLoaded",J,!1),a.addEventListener("load",J,!1);else{y.attachEvent("onreadystatechange",J),a.attachEvent("onload",J);var c=!1;try{c=null==a.frameElement&&y.documentElement}catch(d){}c&&c.doScroll&&!function e(){if(!m.isReady){try{c.doScroll("left")}catch(a){return setTimeout(e,50)}I(),m.ready()}}()}return H.promise(b)};var K="undefined",L;for(L in m(k))break;k.ownLast="0"!==L,k.inlineBlockNeedsLayout=!1,m(function(){var a,b,c,d;c=y.ge
 tElementsByTagName("body")[0],c&&c.style&&(b=y.createElement("div"),d=y.createElement("div"),d.style.cssText="position:absolute;border:0;width:0;height:0;top:0;left:-9999px",c.appendChild(d).appendChild(b),typeof b.style.zoom!==K&&(b.style.cssText="display:inline;margin:0;border:0;padding:1px;width:1px;zoom:1",k.inlineBlockNeedsLayout=a=3===b.offsetWidth,a&&(c.style.zoom=1)),c.removeChild(d))}),function(){var a=y.createElement("div");if(null==k.deleteExpando){k.deleteExpando=!0;try{delete a.test}catch(b){k.deleteExpando=!1}}a=null}(),m.acceptData=function(a){var b=m.noData[(a.nodeName+" ").toLowerCase()],c=+a.nodeType||1;return 1!==c&&9!==c?!1:!b||b!==!0&&a.getAttribute("classid")===b};var M=/^(?:\{[\w\W]*\}|\[[\w\W]*\])$/,N=/([A-Z])/g;function O(a,b,c){if(void 0===c&&1===a.nodeType){var d="data-"+b.replace(N,"-$1").toLowerCase();if(c=a.getAttribute(d),"string"==typeof c){try{c="true"===c?!0:"false"===c?!1:"null"===c?null:+c+""===c?+c:M.test(c)?m.parseJSON(c):c}catch(e){}m.data(a,b,
 c)}else c=void 0}return c}function P(a){var b;for(b in a)if(("data"!==b||!m.isEmptyObject(a[b]))&&"toJSON"!==b)return!1;
+return!0}function Q(a,b,d,e){if(m.acceptData(a)){var f,g,h=m.expando,i=a.nodeType,j=i?m.cache:a,k=i?a[h]:a[h]&&h;if(k&&j[k]&&(e||j[k].data)||void 0!==d||"string"!=typeof b)return k||(k=i?a[h]=c.pop()||m.guid++:h),j[k]||(j[k]=i?{}:{toJSON:m.noop}),("object"==typeof b||"function"==typeof b)&&(e?j[k]=m.extend(j[k],b):j[k].data=m.extend(j[k].data,b)),g=j[k],e||(g.data||(g.data={}),g=g.data),void 0!==d&&(g[m.camelCase(b)]=d),"string"==typeof b?(f=g[b],null==f&&(f=g[m.camelCase(b)])):f=g,f}}function R(a,b,c){if(m.acceptData(a)){var d,e,f=a.nodeType,g=f?m.cache:a,h=f?a[m.expando]:m.expando;if(g[h]){if(b&&(d=c?g[h]:g[h].data)){m.isArray(b)?b=b.concat(m.map(b,m.camelCase)):b in d?b=[b]:(b=m.camelCase(b),b=b in d?[b]:b.split(" ")),e=b.length;while(e--)delete d[b[e]];if(c?!P(d):!m.isEmptyObject(d))return}(c||(delete g[h].data,P(g[h])))&&(f?m.cleanData([a],!0):k.deleteExpando||g!=g.window?delete g[h]:g[h]=null)}}}m.extend({cache:{},noData:{"applet ":!0,"embed ":!0,"object ":"clsid:D27CDB6E-AE6D
 -11cf-96B8-444553540000"},hasData:function(a){return a=a.nodeType?m.cache[a[m.expando]]:a[m.expando],!!a&&!P(a)},data:function(a,b,c){return Q(a,b,c)},removeData:function(a,b){return R(a,b)},_data:function(a,b,c){return Q(a,b,c,!0)},_removeData:function(a,b){return R(a,b,!0)}}),m.fn.extend({data:function(a,b){var c,d,e,f=this[0],g=f&&f.attributes;if(void 0===a){if(this.length&&(e=m.data(f),1===f.nodeType&&!m._data(f,"parsedAttrs"))){c=g.length;while(c--)g[c]&&(d=g[c].name,0===d.indexOf("data-")&&(d=m.camelCase(d.slice(5)),O(f,d,e[d])));m._data(f,"parsedAttrs",!0)}return e}return"object"==typeof a?this.each(function(){m.data(this,a)}):arguments.length>1?this.each(function(){m.data(this,a,b)}):f?O(f,a,m.data(f,a)):void 0},removeData:function(a){return this.each(function(){m.removeData(this,a)})}}),m.extend({queue:function(a,b,c){var d;return a?(b=(b||"fx")+"queue",d=m._data(a,b),c&&(!d||m.isArray(c)?d=m._data(a,b,m.makeArray(c)):d.push(c)),d||[]):void 0},dequeue:function(a,b){b=b||"fx
 ";var c=m.queue(a,b),d=c.length,e=c.shift(),f=m._queueHooks(a,b),g=function(){m.dequeue(a,b)};"inprogress"===e&&(e=c.shift(),d--),e&&("fx"===b&&c.unshift("inprogress"),delete f.stop,e.call(a,g,f)),!d&&f&&f.empty.fire()},_queueHooks:function(a,b){var c=b+"queueHooks";return m._data(a,c)||m._data(a,c,{empty:m.Callbacks("once memory").add(function(){m._removeData(a,b+"queue"),m._removeData(a,c)})})}}),m.fn.extend({queue:function(a,b){var c=2;return"string"!=typeof a&&(b=a,a="fx",c--),arguments.length<c?m.queue(this[0],a):void 0===b?this:this.each(function(){var c=m.queue(this,a,b);m._queueHooks(this,a),"fx"===a&&"inprogress"!==c[0]&&m.dequeue(this,a)})},dequeue:function(a){return this.each(function(){m.dequeue(this,a)})},clearQueue:function(a){return this.queue(a||"fx",[])},promise:function(a,b){var c,d=1,e=m.Deferred(),f=this,g=this.length,h=function(){--d||e.resolveWith(f,[f])};"string"!=typeof a&&(b=a,a=void 0),a=a||"fx";while(g--)c=m._data(f[g],a+"queueHooks"),c&&c.empty&&(d++,c.em
 pty.add(h));return h(),e.promise(b)}});var S=/[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/.source,T=["Top","Right","Bottom","Left"],U=function(a,b){return a=b||a,"none"===m.css(a,"display")||!m.contains(a.ownerDocument,a)},V=m.access=function(a,b,c,d,e,f,g){var h=0,i=a.length,j=null==c;if("object"===m.type(c)){e=!0;for(h in c)m.access(a,b,h,c[h],!0,f,g)}else if(void 0!==d&&(e=!0,m.isFunction(d)||(g=!0),j&&(g?(b.call(a,d),b=null):(j=b,b=function(a,b,c){return j.call(m(a),c)})),b))for(;i>h;h++)b(a[h],c,g?d:d.call(a[h],h,b(a[h],c)));return e?a:j?b.call(a):i?b(a[0],c):f},W=/^(?:checkbox|radio)$/i;!function(){var a=y.createElement("input"),b=y.createElement("div"),c=y.createDocumentFragment();if(b.innerHTML="  <link/><table></table><a href='/a'>a</a><input type='checkbox'/>",k.leadingWhitespace=3===b.firstChild.nodeType,k.tbody=!b.getElementsByTagName("tbody").length,k.htmlSerialize=!!b.getElementsByTagName("link").length,k.html5Clone="<:nav></:nav>"!==y.createElement("nav").cloneNode(!0).outerH
 TML,a.type="checkbox",a.checked=!0,c.appendChild(a),k.appendChecked=a.checked,b.innerHTML="<textarea>x</textarea>",k.noCloneChecked=!!b.cloneNode(!0).lastChild.defaultValue,c.appendChild(b),b.innerHTML="<input type='radio' checked='checked' name='t'/>",k.checkClone=b.cloneNode(!0).cloneNode(!0).lastChild.checked,k.noCloneEvent=!0,b.attachEvent&&(b.attachEvent("onclick",function(){k.noCloneEvent=!1}),b.cloneNode(!0).click()),null==k.deleteExpando){k.deleteExpando=!0;try{delete b.test}catch(d){k.deleteExpando=!1}}}(),function(){var b,c,d=y.createElement("div");for(b in{submit:!0,change:!0,focusin:!0})c="on"+b,(k[b+"Bubbles"]=c in a)||(d.setAttribute(c,"t"),k[b+"Bubbles"]=d.attributes[c].expando===!1);d=null}();var X=/^(?:input|select|textarea)$/i,Y=/^key/,Z=/^(?:mouse|pointer|contextmenu)|click/,$=/^(?:focusinfocus|focusoutblur)$/,_=/^([^.]*)(?:\.(.+)|)$/;function ab(){return!0}function bb(){return!1}function cb(){try{return y.activeElement}catch(a){}}m.event={global:{},add:function(a
 ,b,c,d,e){var f,g,h,i,j,k,l,n,o,p,q,r=m._data(a);if(r){c.handler&&(i=c,c=i.handler,e=i.selector),c.guid||(c.guid=m.guid++),(g=r.events)||(g=r.events={}),(k=r.handle)||(k=r.handle=function(a){return typeof m===K||a&&m.event.triggered===a.type?void 0:m.event.dispatch.apply(k.elem,arguments)},k.elem=a),b=(b||"").match(E)||[""],h=b.length;while(h--)f=_.exec(b[h])||[],o=q=f[1],p=(f[2]||"").split(".").sort(),o&&(j=m.event.special[o]||{},o=(e?j.delegateType:j.bindType)||o,j=m.event.special[o]||{},l=m.extend({type:o,origType:q,data:d,handler:c,guid:c.guid,selector:e,needsContext:e&&m.expr.match.needsContext.test(e),namespace:p.join(".")},i),(n=g[o])||(n=g[o]=[],n.delegateCount=0,j.setup&&j.setup.call(a,d,p,k)!==!1||(a.addEventListener?a.addEventListener(o,k,!1):a.attachEvent&&a.attachEvent("on"+o,k))),j.add&&(j.add.call(a,l),l.handler.guid||(l.handler.guid=c.guid)),e?n.splice(n.delegateCount++,0,l):n.push(l),m.event.global[o]=!0);a=null}},remove:function(a,b,c,d,e){var f,g,h,i,j,k,l,n,o,p,q
 ,r=m.hasData(a)&&m._data(a);if(r&&(k=r.events)){b=(b||"").match(E)||[""],j=b.length;while(j--)if(h=_.exec(b[j])||[],o=q=h[1],p=(h[2]||"").split(".").sort(),o){l=m.event.special[o]||{},o=(d?l.delegateType:l.bindType)||o,n=k[o]||[],h=h[2]&&new RegExp("(^|\\.)"+p.join("\\.(?:.*\\.|)")+"(\\.|$)"),i=f=n.length;while(f--)g=n[f],!e&&q!==g.origType||c&&c.guid!==g.guid||h&&!h.test(g.namespace)||d&&d!==g.selector&&("**"!==d||!g.selector)||(n.splice(f,1),g.selector&&n.delegateCount--,l.remove&&l.remove.call(a,g));i&&!n.length&&(l.teardown&&l.teardown.call(a,p,r.handle)!==!1||m.removeEvent(a,o,r.handle),delete k[o])}else for(o in k)m.event.remove(a,o+b[j],c,d,!0);m.isEmptyObject(k)&&(delete r.handle,m._removeData(a,"events"))}},trigger:function(b,c,d,e){var f,g,h,i,k,l,n,o=[d||y],p=j.call(b,"type")?b.type:b,q=j.call(b,"namespace")?b.namespace.split("."):[];if(h=l=d=d||y,3!==d.nodeType&&8!==d.nodeType&&!$.test(p+m.event.triggered)&&(p.indexOf(".")>=0&&(q=p.split("."),p=q.shift(),q.sort()),g=p.in
 dexOf(":")<0&&"on"+p,b=b[m.expando]?b:new m.Event(p,"object"==typeof b&&b),b.isTrigger=e?2:3,b.namespace=q.join("."),b.namespace_re=b.namespace?new RegExp("(^|\\.)"+q.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,b.result=void 0,b.target||(b.target=d),c=null==c?[b]:m.makeArray(c,[b]),k=m.event.special[p]||{},e||!k.trigger||k.trigger.apply(d,c)!==!1)){if(!e&&!k.noBubble&&!m.isWindow(d)){for(i=k.delegateType||p,$.test(i+p)||(h=h.parentNode);h;h=h.parentNode)o.push(h),l=h;l===(d.ownerDocument||y)&&o.push(l.defaultView||l.parentWindow||a)}n=0;while((h=o[n++])&&!b.isPropagationStopped())b.type=n>1?i:k.bindType||p,f=(m._data(h,"events")||{})[b.type]&&m._data(h,"handle"),f&&f.apply(h,c),f=g&&h[g],f&&f.apply&&m.acceptData(h)&&(b.result=f.apply(h,c),b.result===!1&&b.preventDefault());if(b.type=p,!e&&!b.isDefaultPrevented()&&(!k._default||k._default.apply(o.pop(),c)===!1)&&m.acceptData(d)&&g&&d[p]&&!m.isWindow(d)){l=d[g],l&&(d[g]=null),m.event.triggered=p;try{d[p]()}catch(r){}m.event.triggered=void 0
 ,l&&(d[g]=l)}return b.result}},dispatch:function(a){a=m.event.fix(a);var b,c,e,f,g,h=[],i=d.call(arguments),j=(m._data(this,"events")||{})[a.type]||[],k=m.event.special[a.type]||{};if(i[0]=a,a.delegateTarget=this,!k.preDispatch||k.preDispatch.call(this,a)!==!1){h=m.event.handlers.call(this,a,j),b=0;while((f=h[b++])&&!a.isPropagationStopped()){a.currentTarget=f.elem,g=0;while((e=f.handlers[g++])&&!a.isImmediatePropagationStopped())(!a.namespace_re||a.namespace_re.test(e.namespace))&&(a.handleObj=e,a.data=e.data,c=((m.event.special[e.origType]||{}).handle||e.handler).apply(f.elem,i),void 0!==c&&(a.result=c)===!1&&(a.preventDefault(),a.stopPropagation()))}return k.postDispatch&&k.postDispatch.call(this,a),a.result}},handlers:function(a,b){var c,d,e,f,g=[],h=b.delegateCount,i=a.target;if(h&&i.nodeType&&(!a.button||"click"!==a.type))for(;i!=this;i=i.parentNode||this)if(1===i.nodeType&&(i.disabled!==!0||"click"!==a.type)){for(e=[],f=0;h>f;f++)d=b[f],c=d.selector+" ",void 0===e[c]&&(e[c]=d
 .needsContext?m(c,this).index(i)>=0:m.find(c,this,null,[i]).length),e[c]&&e.push(d);e.length&&g.push({elem:i,handlers:e})}return h<b.length&&g.push({elem:this,handlers:b.slice(h)}),g},fix:function(a){if(a[m.expando])return a;var b,c,d,e=a.type,f=a,g=this.fixHooks[e];g||(this.fixHooks[e]=g=Z.test(e)?this.mouseHooks:Y.test(e)?this.keyHooks:{}),d=g.props?this.props.concat(g.props):this.props,a=new m.Event(f),b=d.length;while(b--)c=d[b],a[c]=f[c];return a.target||(a.target=f.srcElement||y),3===a.target.nodeType&&(a.target=a.target.parentNode),a.metaKey=!!a.metaKey,g.filter?g.filter(a,f):a},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(a,b){return null==a.which&&(a.which=null!=b.charCode?b.charCode:b.keyCode),a}},mouseHooks:{props:"button buttons clientX clientY fromElement offsetX offsetY pageX pageY screenX screenY
  toElement".split(" "),filter:function(a,b){var c,d,e,f=b.button,g=b.fromElement;return null==a.pageX&&null!=b.clientX&&(d=a.target.ownerDocument||y,e=d.documentElement,c=d.body,a.pageX=b.clientX+(e&&e.scrollLeft||c&&c.scrollLeft||0)-(e&&e.clientLeft||c&&c.clientLeft||0),a.pageY=b.clientY+(e&&e.scrollTop||c&&c.scrollTop||0)-(e&&e.clientTop||c&&c.clientTop||0)),!a.relatedTarget&&g&&(a.relatedTarget=g===a.target?b.toElement:g),a.which||void 0===f||(a.which=1&f?1:2&f?3:4&f?2:0),a}},special:{load:{noBubble:!0},focus:{trigger:function(){if(this!==cb()&&this.focus)try{return this.focus(),!1}catch(a){}},delegateType:"focusin"},blur:{trigger:function(){return this===cb()&&this.blur?(this.blur(),!1):void 0},delegateType:"focusout"},click:{trigger:function(){return m.nodeName(this,"input")&&"checkbox"===this.type&&this.click?(this.click(),!1):void 0},_default:function(a){return m.nodeName(a.target,"a")}},beforeunload:{postDispatch:function(a){void 0!==a.result&&a.originalEvent&&(a.originalEve
 nt.returnValue=a.result)}}},simulate:function(a,b,c,d){var e=m.extend(new m.Event,c,{type:a,isSimulated:!0,originalEvent:{}});d?m.event.trigger(e,null,b):m.event.dispatch.call(b,e),e.isDefaultPrevented()&&c.preventDefault()}},m.removeEvent=y.removeEventListener?function(a,b,c){a.removeEventListener&&a.removeEventListener(b,c,!1)}:function(a,b,c){var d="on"+b;a.detachEvent&&(typeof a[d]===K&&(a[d]=null),a.detachEvent(d,c))},m.Event=function(a,b){return this instanceof m.Event?(a&&a.type?(this.originalEvent=a,this.type=a.type,this.isDefaultPrevented=a.defaultPrevented||void 0===a.defaultPrevented&&a.returnValue===!1?ab:bb):this.type=a,b&&m.extend(this,b),this.timeStamp=a&&a.timeStamp||m.now(),void(this[m.expando]=!0)):new m.Event(a,b)},m.Event.prototype={isDefaultPrevented:bb,isPropagationStopped:bb,isImmediatePropagationStopped:bb,preventDefault:function(){var a=this.originalEvent;this.isDefaultPrevented=ab,a&&(a.preventDefault?a.preventDefault():a.returnValue=!1)},stopPropagation:fu
 nction(){var a=this.originalEvent;this.isPropagationStopped=ab,a&&(a.stopPropagation&&a.stopPropagation(),a.cancelBubble=!0)},stopImmediatePropagation:function(){var a=this.originalEvent;this.isImmediatePropagationStopped=ab,a&&a.stopImmediatePropagation&&a.stopImmediatePropagation(),this.stopPropagation()}},m.each({mouseenter:"mouseover",mouseleave:"mouseout",pointerenter:"pointerover",pointerleave:"pointerout"},function(a,b){m.event.special[a]={delegateType:b,bindType:b,handle:function(a){var c,d=this,e=a.relatedTarget,f=a.handleObj;return(!e||e!==d&&!m.contains(d,e))&&(a.type=f.origType,c=f.handler.apply(this,arguments),a.type=b),c}}}),k.submitBubbles||(m.event.special.submit={setup:function(){return m.nodeName(this,"form")?!1:void m.event.add(this,"click._submit keypress._submit",function(a){var b=a.target,c=m.nodeName(b,"input")||m.nodeName(b,"button")?b.form:void 0;c&&!m._data(c,"submitBubbles")&&(m.event.add(c,"submit._submit",function(a){a._submit_bubble=!0}),m._data(c,"subm
 itBubbles",!0))})},postDispatch:function(a){a._submit_bubble&&(delete a._submit_bubble,this.parentNode&&!a.isTrigger&&m.event.simulate("submit",this.parentNode,a,!0))},teardown:function(){return m.nodeName(this,"form")?!1:void m.event.remove(this,"._submit")}}),k.changeBubbles||(m.event.special.change={setup:function(){return X.test(this.nodeName)?(("checkbox"===this.type||"radio"===this.type)&&(m.event.add(this,"propertychange._change",function(a){"checked"===a.originalEvent.propertyName&&(this._just_changed=!0)}),m.event.add(this,"click._change",function(a){this._just_changed&&!a.isTrigger&&(this._just_changed=!1),m.event.simulate("change",this,a,!0)})),!1):void m.event.add(this,"beforeactivate._change",function(a){var b=a.target;X.test(b.nodeName)&&!m._data(b,"changeBubbles")&&(m.event.add(b,"change._change",function(a){!this.parentNode||a.isSimulated||a.isTrigger||m.event.simulate("change",this.parentNode,a,!0)}),m._data(b,"changeBubbles",!0))})},handle:function(a){var b=a.targe
 t;return this!==b||a.isSimulated||a.isTrigger||"radio"!==b.type&&"checkbox"!==b.type?a.handleObj.handler.apply(this,arguments):void 0},teardown:function(){return m.event.remove(this,"._change"),!X.test(this.nodeName)}}),k.focusinBubbles||m.each({focus:"focusin",blur:"focusout"},function(a,b){var c=function(a){m.event.simulate(b,a.target,m.event.fix(a),!0)};m.event.special[b]={setup:function(){var d=this.ownerDocument||this,e=m._data(d,b);e||d.addEventListener(a,c,!0),m._data(d,b,(e||0)+1)},teardown:function(){var d=this.ownerDocument||this,e=m._data(d,b)-1;e?m._data(d,b,e):(d.removeEventListener(a,c,!0),m._removeData(d,b))}}}),m.fn.extend({on:function(a,b,c,d,e){var f,g;if("object"==typeof a){"string"!=typeof b&&(c=c||b,b=void 0);for(f in a)this.on(f,b,c,a[f],e);return this}if(null==c&&null==d?(d=b,c=b=void 0):null==d&&("string"==typeof b?(d=c,c=void 0):(d=c,c=b,b=void 0)),d===!1)d=bb;else if(!d)return this;return 1===e&&(g=d,d=function(a){return m().off(a),g.apply(this,arguments)},
 d.guid=g.guid||(g.guid=m.guid++)),this.each(function(){m.event.add(this,a,d,c,b)})},one:function(a,b,c,d){return this.on(a,b,c,d,1)},off:function(a,b,c){var d,e;if(a&&a.preventDefault&&a.handleObj)return d=a.handleObj,m(a.delegateTarget).off(d.namespace?d.origType+"."+d.namespace:d.origType,d.selector,d.handler),this;if("object"==typeof a){for(e in a)this.off(e,b,a[e]);return this}return(b===!1||"function"==typeof b)&&(c=b,b=void 0),c===!1&&(c=bb),this.each(function(){m.event.remove(this,a,c,b)})},trigger:function(a,b){return this.each(function(){m.event.trigger(a,b,this)})},triggerHandler:function(a,b){var c=this[0];return c?m.event.trigger(a,b,c,!0):void 0}});function db(a){var b=eb.split("|"),c=a.createDocumentFragment();if(c.createElement)while(b.length)c.createElement(b.pop());return c}var eb="abbr|article|aside|audio|bdi|canvas|data|datalist|details|figcaption|figure|footer|header|hgroup|mark|meter|nav|output|progress|section|summary|time|video",fb=/ jQuery\d+="(?:null|\d+)"/g
 ,gb=new RegExp("<(?:"+eb+")[\\s/>]","i"),hb=/^\s+/,ib=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/gi,jb=/<([\w:]+)/,kb=/<tbody/i,lb=/<|&#?\w+;/,mb=/<(?:script|style|link)/i,nb=/checked\s*(?:[^=]|=\s*.checked.)/i,ob=/^$|\/(?:java|ecma)script/i,pb=/^true\/(.*)/,qb=/^\s*<!(?:\[CDATA\[|--)|(?:\]\]|--)>\s*$/g,rb={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:k.htmlSerialize?[0,"",""]:[1,"X<div>","</div>"]},sb=db(y),tb=sb.appendChild(y.createElement("div"));rb.optgroup=rb.option,rb.tbody=rb.tfoot=rb.colgroup=rb.caption=rb.thead,rb.th=rb.td;function ub(a,b){var c,d,e=0,f=typeof a.getElementsByTagName!==K?a.getElementsByTagName(b||"*"):typeof a.querySelectorAll!==K
 ?a.querySelectorAll(b||"*"):void 0;if(!f)for(f=[],c=a.childNodes||a;null!=(d=c[e]);e++)!b||m.nodeName(d,b)?f.push(d):m.merge(f,ub(d,b));return void 0===b||b&&m.nodeName(a,b)?m.merge([a],f):f}function vb(a){W.test(a.type)&&(a.defaultChecked=a.checked)}function wb(a,b){return m.nodeName(a,"table")&&m.nodeName(11!==b.nodeType?b:b.firstChild,"tr")?a.getElementsByTagName("tbody")[0]||a.appendChild(a.ownerDocument.createElement("tbody")):a}function xb(a){return a.type=(null!==m.find.attr(a,"type"))+"/"+a.type,a}function yb(a){var b=pb.exec(a.type);return b?a.type=b[1]:a.removeAttribute("type"),a}function zb(a,b){for(var c,d=0;null!=(c=a[d]);d++)m._data(c,"globalEval",!b||m._data(b[d],"globalEval"))}function Ab(a,b){if(1===b.nodeType&&m.hasData(a)){var c,d,e,f=m._data(a),g=m._data(b,f),h=f.events;if(h){delete g.handle,g.events={};for(c in h)for(d=0,e=h[c].length;e>d;d++)m.event.add(b,c,h[c][d])}g.data&&(g.data=m.extend({},g.data))}}function Bb(a,b){var c,d,e;if(1===b.nodeType){if(c=b.nodeN
 ame.toLowerCase(),!k.noCloneEvent&&b[m.expando]){e=m._data(b);for(d in e.events)m.removeEvent(b,d,e.handle);b.removeAttribute(m.expando)}"script"===c&&b.text!==a.text?(xb(b).text=a.text,yb(b)):"object"===c?(b.parentNode&&(b.outerHTML=a.outerHTML),k.html5Clone&&a.innerHTML&&!m.trim(b.innerHTML)&&(b.innerHTML=a.innerHTML)):"input"===c&&W.test(a.type)?(b.defaultChecked=b.checked=a.checked,b.value!==a.value&&(b.value=a.value)):"option"===c?b.defaultSelected=b.selected=a.defaultSelected:("input"===c||"textarea"===c)&&(b.defaultValue=a.defaultValue)}}m.extend({clone:function(a,b,c){var d,e,f,g,h,i=m.contains(a.ownerDocument,a);if(k.html5Clone||m.isXMLDoc(a)||!gb.test("<"+a.nodeName+">")?f=a.cloneNode(!0):(tb.innerHTML=a.outerHTML,tb.removeChild(f=tb.firstChild)),!(k.noCloneEvent&&k.noCloneChecked||1!==a.nodeType&&11!==a.nodeType||m.isXMLDoc(a)))for(d=ub(f),h=ub(a),g=0;null!=(e=h[g]);++g)d[g]&&Bb(e,d[g]);if(b)if(c)for(h=h||ub(a),d=d||ub(f),g=0;null!=(e=h[g]);g++)Ab(e,d[g]);else Ab(a,f);ret
 urn d=ub(f,"script"),d.length>0&&zb(d,!i&&ub(a,"script")),d=h=e=null,f},buildFragment:function(a,b,c,d){for(var e,f,g,h,i,j,l,n=a.length,o=db(b),p=[],q=0;n>q;q++)if(f=a[q],f||0===f)if("object"===m.type(f))m.merge(p,f.nodeType?[f]:f);else if(lb.test(f)){h=h||o.appendChild(b.createElement("div")),i=(jb.exec(f)||["",""])[1].toLowerCase(),l=rb[i]||rb._default,h.innerHTML=l[1]+f.replace(ib,"<$1></$2>")+l[2],e=l[0];while(e--)h=h.lastChild;if(!k.leadingWhitespace&&hb.test(f)&&p.push(b.createTextNode(hb.exec(f)[0])),!k.tbody){f="table"!==i||kb.test(f)?"<table>"!==l[1]||kb.test(f)?0:h:h.firstChild,e=f&&f.childNodes.length;while(e--)m.nodeName(j=f.childNodes[e],"tbody")&&!j.childNodes.length&&f.removeChild(j)}m.merge(p,h.childNodes),h.textContent="";while(h.firstChild)h.removeChild(h.firstChild);h=o.lastChild}else p.push(b.createTextNode(f));h&&o.removeChild(h),k.appendChecked||m.grep(ub(p,"input"),vb),q=0;while(f=p[q++])if((!d||-1===m.inArray(f,d))&&(g=m.contains(f.ownerDocument,f),h=ub(o.ap
 pendChild(f),"script"),g&&zb(h),c)){e=0;while(f=h[e++])ob.test(f.type||"")&&c.push(f)}return h=null,o},cleanData:function(a,b){for(var d,e,f,g,h=0,i=m.expando,j=m.cache,l=k.deleteExpando,n=m.event.special;null!=(d=a[h]);h++)if((b||m.acceptData(d))&&(f=d[i],g=f&&j[f])){if(g.events)for(e in g.events)n[e]?m.event.remove(d,e):m.removeEvent(d,e,g.handle);j[f]&&(delete j[f],l?delete d[i]:typeof d.removeAttribute!==K?d.removeAttribute(i):d[i]=null,c.push(f))}}}),m.fn.extend({text:function(a){return V(this,function(a){return void 0===a?m.text(this):this.empty().append((this[0]&&this[0].ownerDocument||y).createTextNode(a))},null,a,arguments.length)},append:function(){return this.domManip(arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=wb(this,a);b.appendChild(a)}})},prepend:function(){return this.domManip(arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=wb(this,a);b.insertBefore(a,b.firstChild)}})},before:functi
 on(){return this.domManip(arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this)})},after:function(){return this.domManip(arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this.nextSibling)})},remove:function(a,b){for(var c,d=a?m.filter(a,this):this,e=0;null!=(c=d[e]);e++)b||1!==c.nodeType||m.cleanData(ub(c)),c.parentNode&&(b&&m.contains(c.ownerDocument,c)&&zb(ub(c,"script")),c.parentNode.removeChild(c));return this},empty:function(){for(var a,b=0;null!=(a=this[b]);b++){1===a.nodeType&&m.cleanData(ub(a,!1));while(a.firstChild)a.removeChild(a.firstChild);a.options&&m.nodeName(a,"select")&&(a.options.length=0)}return this},clone:function(a,b){return a=null==a?!1:a,b=null==b?a:b,this.map(function(){return m.clone(this,a,b)})},html:function(a){return V(this,function(a){var b=this[0]||{},c=0,d=this.length;if(void 0===a)return 1===b.nodeType?b.innerHTML.replace(fb,""):void 0;if(!("string"!=typeof a||mb.test(a)||!k.htmlSerialize&&gb.test(a)||!k.lead
 ingWhitespace&&hb.test(a)||rb[(jb.exec(a)||["",""])[1].toLowerCase()])){a=a.replace(ib,"<$1></$2>");try{for(;d>c;c++)b=this[c]||{},1===b.nodeType&&(m.cleanData(ub(b,!1)),b.innerHTML=a);b=0}catch(e){}}b&&this.empty().append(a)},null,a,arguments.length)},replaceWith:function(){var a=arguments[0];return this.domManip(arguments,function(b){a=this.parentNode,m.cleanData(ub(this)),a&&a.replaceChild(b,this)}),a&&(a.length||a.nodeType)?this:this.remove()},detach:function(a){return this.remove(a,!0)},domManip:function(a,b){a=e.apply([],a);var c,d,f,g,h,i,j=0,l=this.length,n=this,o=l-1,p=a[0],q=m.isFunction(p);if(q||l>1&&"string"==typeof p&&!k.checkClone&&nb.test(p))return this.each(function(c){var d=n.eq(c);q&&(a[0]=p.call(this,c,d.html())),d.domManip(a,b)});if(l&&(i=m.buildFragment(a,this[0].ownerDocument,!1,this),c=i.firstChild,1===i.childNodes.length&&(i=c),c)){for(g=m.map(ub(i,"script"),xb),f=g.length;l>j;j++)d=i,j!==o&&(d=m.clone(d,!0,!0),f&&m.merge(g,ub(d,"script"))),b.call(this[j],d,j
 );if(f)for(h=g[g.length-1].ownerDocument,m.map(g,yb),j=0;f>j;j++)d=g[j],ob.test(d.type||"")&&!m._data(d,"globalEval")&&m.contains(h,d)&&(d.src?m._evalUrl&&m._evalUrl(d.src):m.globalEval((d.text||d.textContent||d.innerHTML||"").replace(qb,"")));i=c=null}return this}}),m.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(a,b){m.fn[a]=function(a){for(var c,d=0,e=[],g=m(a),h=g.length-1;h>=d;d++)c=d===h?this:this.clone(!0),m(g[d])[b](c),f.apply(e,c.get());return this.pushStack(e)}});var Cb,Db={};function Eb(b,c){var d,e=m(c.createElement(b)).appendTo(c.body),f=a.getDefaultComputedStyle&&(d=a.getDefaultComputedStyle(e[0]))?d.display:m.css(e[0],"display");return e.detach(),f}function Fb(a){var b=y,c=Db[a];return c||(c=Eb(a,b),"none"!==c&&c||(Cb=(Cb||m("<iframe frameborder='0' width='0' height='0'/>")).appendTo(b.documentElement),b=(Cb[0].contentWindow||Cb[0].contentDocument).document,b.write(),b.close(),c=Eb(a,b),Cb.deta
 ch()),Db[a]=c),c}!function(){var a;k.shrinkWrapBlocks=function(){if(null!=a)return a;a=!1;var b,c,d;return c=y.getElementsByTagName("body")[0],c&&c.style?(b=y.createElement("div"),d=y.createElement("div"),d.style.cssText="position:absolute;border:0;width:0;height:0;top:0;left:-9999px",c.appendChild(d).appendChild(b),typeof b.style.zoom!==K&&(b.style.cssText="-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;display:block;margin:0;border:0;padding:1px;width:1px;zoom:1",b.appendChild(y.createElement("div")).style.width="5px",a=3!==b.offsetWidth),c.removeChild(d),a):void 0}}();var Gb=/^margin/,Hb=new RegExp("^("+S+")(?!px)[a-z%]+$","i"),Ib,Jb,Kb=/^(top|right|bottom|left)$/;a.getComputedStyle?(Ib=function(b){return b.ownerDocument.defaultView.opener?b.ownerDocument.defaultView.getComputedStyle(b,null):a.getComputedStyle(b,null)},Jb=function(a,b,c){var d,e,f,g,h=a.style;return c=c||Ib(a),g=c?c.getPropertyValue(b)||c[b]:void 0,c&&(""!==g||m.contains(a.owner
 Document,a)||(g=m.style(a,b)),Hb.test(g)&&Gb.test(b)&&(d=h.width,e=h.minWidth,f=h.maxWidth,h.minWidth=h.maxWidth=h.width=g,g=c.width,h.width=d,h.minWidth=e,h.maxWidth=f)),void 0===g?g:g+""}):y.documentElement.currentStyle&&(Ib=function(a){return a.currentStyle},Jb=function(a,b,c){var d,e,f,g,h=a.style;return c=c||Ib(a),g=c?c[b]:void 0,null==g&&h&&h[b]&&(g=h[b]),Hb.test(g)&&!Kb.test(b)&&(d=h.left,e=a.runtimeStyle,f=e&&e.left,f&&(e.left=a.currentStyle.left),h.left="fontSize"===b?"1em":g,g=h.pixelLeft+"px",h.left=d,f&&(e.left=f)),void 0===g?g:g+""||"auto"});function Lb(a,b){return{get:function(){var c=a();if(null!=c)return c?void delete this.get:(this.get=b).apply(this,arguments)}}}!function(){var b,c,d,e,f,g,h;if(b=y.createElement("div"),b.innerHTML="  <link/><table></table><a href='/a'>a</a><input type='checkbox'/>",d=b.getElementsByTagName("a")[0],c=d&&d.style){c.cssText="float:left;opacity:.5",k.opacity="0.5"===c.opacity,k.cssFloat=!!c.cssFloat,b.style.backgroundClip="content-box",
 b.cloneNode(!0).style.backgroundClip="",k.clearCloneStyle="content-box"===b.style.backgroundClip,k.boxSizing=""===c.boxSizing||""===c.MozBoxSizing||""===c.WebkitBoxSizing,m.extend(k,{reliableHiddenOffsets:function(){return null==g&&i(),g},boxSizingReliable:function(){return null==f&&i(),f},pixelPosition:function(){return null==e&&i(),e},reliableMarginRight:function(){return null==h&&i(),h}});function i(){var b,c,d,i;c=y.getElementsByTagName("body")[0],c&&c.style&&(b=y.createElement("div"),d=y.createElement("div"),d.style.cssText="position:absolute;border:0;width:0;height:0;top:0;left:-9999px",c.appendChild(d).appendChild(b),b.style.cssText="-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;display:block;margin-top:1%;top:1%;border:1px;padding:1px;width:4px;position:absolute",e=f=!1,h=!0,a.getComputedStyle&&(e="1%"!==(a.getComputedStyle(b,null)||{}).top,f="4px"===(a.getComputedStyle(b,null)||{width:"4px"}).width,i=b.appendChild(y.createElement("div")),i.s
 tyle.cssText=b.style.cssText="-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;display:block;margin:0;border:0;padding:0",i.style.marginRight=i.style.width="0",b.style.width="1px",h=!parseFloat((a.getComputedStyle(i,null)||{}).marginRight),b.removeChild(i)),b.innerHTML="<table><tr><td></td><td>t</td></tr></table>",i=b.getElementsByTagName("td"),i[0].style.cssText="margin:0;border:0;padding:0;display:none",g=0===i[0].offsetHeight,g&&(i[0].style.display="",i[1].style.display="none",g=0===i[0].offsetHeight),c.removeChild(d))}}}(),m.swap=function(a,b,c,d){var e,f,g={};for(f in b)g[f]=a.style[f],a.style[f]=b[f];e=c.apply(a,d||[]);for(f in b)a.style[f]=g[f];return e};var Mb=/alpha\([^)]*\)/i,Nb=/opacity\s*=\s*([^)]*)/,Ob=/^(none|table(?!-c[ea]).+)/,Pb=new RegExp("^("+S+")(.*)$","i"),Qb=new RegExp("^([+-])=("+S+")","i"),Rb={position:"absolute",visibility:"hidden",display:"block"},Sb={letterSpacing:"0",fontWeight:"400"},Tb=["Webkit","O","Moz","ms"];function 
 Ub(a,b){if(b in a)return b;var c=b.charAt(0).toUpperCase()+b.slice(1),d=b,e=Tb.length;while(e--)if(b=Tb[e]+c,b in a)return b;return d}function Vb(a,b){for(var c,d,e,f=[],g=0,h=a.length;h>g;g++)d=a[g],d.style&&(f[g]=m._data(d,"olddisplay"),c=d.style.display,b?(f[g]||"none"!==c||(d.style.display=""),""===d.style.display&&U(d)&&(f[g]=m._data(d,"olddisplay",Fb(d.nodeName)))):(e=U(d),(c&&"none"!==c||!e)&&m._data(d,"olddisplay",e?c:m.css(d,"display"))));for(g=0;h>g;g++)d=a[g],d.style&&(b&&"none"!==d.style.display&&""!==d.style.display||(d.style.display=b?f[g]||"":"none"));return a}function Wb(a,b,c){var d=Pb.exec(b);return d?Math.max(0,d[1]-(c||0))+(d[2]||"px"):b}function Xb(a,b,c,d,e){for(var f=c===(d?"border":"content")?4:"width"===b?1:0,g=0;4>f;f+=2)"margin"===c&&(g+=m.css(a,c+T[f],!0,e)),d?("content"===c&&(g-=m.css(a,"padding"+T[f],!0,e)),"margin"!==c&&(g-=m.css(a,"border"+T[f]+"Width",!0,e))):(g+=m.css(a,"padding"+T[f],!0,e),"padding"!==c&&(g+=m.css(a,"border"+T[f]+"Width",!0,e)));re
 turn g}function Yb(a,b,c){var d=!0,e="width"===b?a.offsetWidth:a.offsetHeight,f=Ib(a),g=k.boxSizing&&"border-box"===m.css(a,"boxSizing",!1,f);if(0>=e||null==e){if(e=Jb(a,b,f),(0>e||null==e)&&(e=a.style[b]),Hb.test(e))return e;d=g&&(k.boxSizingReliable()||e===a.style[b]),e=parseFloat(e)||0}return e+Xb(a,b,c||(g?"border":"content"),d,f)+"px"}m.extend({cssHooks:{opacity:{get:function(a,b){if(b){var c=Jb(a,"opacity");return""===c?"1":c}}}},cssNumber:{columnCount:!0,fillOpacity:!0,flexGrow:!0,flexShrink:!0,fontWeight:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{"float":k.cssFloat?"cssFloat":"styleFloat"},style:function(a,b,c,d){if(a&&3!==a.nodeType&&8!==a.nodeType&&a.style){var e,f,g,h=m.camelCase(b),i=a.style;if(b=m.cssProps[h]||(m.cssProps[h]=Ub(i,h)),g=m.cssHooks[b]||m.cssHooks[h],void 0===c)return g&&"get"in g&&void 0!==(e=g.get(a,!1,d))?e:i[b];if(f=typeof c,"string"===f&&(e=Qb.exec(c))&&(c=(e[1]+1)*e[2]+parseFloat(m.css(a,b)),f="number"),nul
 l!=c&&c===c&&("number"!==f||m.cssNumber[h]||(c+="px"),k.clearCloneStyle||""!==c||0!==b.indexOf("background")||(i[b]="inherit"),!(g&&"set"in g&&void 0===(c=g.set(a,c,d)))))try{i[b]=c}catch(j){}}},css:function(a,b,c,d){var e,f,g,h=m.camelCase(b);return b=m.cssProps[h]||(m.cssProps[h]=Ub(a.style,h)),g=m.cssHooks[b]||m.cssHooks[h],g&&"get"in g&&(f=g.get(a,!0,c)),void 0===f&&(f=Jb(a,b,d)),"normal"===f&&b in Sb&&(f=Sb[b]),""===c||c?(e=parseFloat(f),c===!0||m.isNumeric(e)?e||0:f):f}}),m.each(["height","width"],function(a,b){m.cssHooks[b]={get:function(a,c,d){return c?Ob.test(m.css(a,"display"))&&0===a.offsetWidth?m.swap(a,Rb,function(){return Yb(a,b,d)}):Yb(a,b,d):void 0},set:function(a,c,d){var e=d&&Ib(a);return Wb(a,c,d?Xb(a,b,d,k.boxSizing&&"border-box"===m.css(a,"boxSizing",!1,e),e):0)}}}),k.opacity||(m.cssHooks.opacity={get:function(a,b){return Nb.test((b&&a.currentStyle?a.currentStyle.filter:a.style.filter)||"")?.01*parseFloat(RegExp.$1)+"":b?"1":""},set:function(a,b){var c=a.style,d
 =a.currentStyle,e=m.isNumeric(b)?"alpha(opacity="+100*b+")":"",f=d&&d.filter||c.filter||"";c.zoom=1,(b>=1||""===b)&&""===m.trim(f.replace(Mb,""))&&c.removeAttribute&&(c.removeAttribute("filter"),""===b||d&&!d.filter)||(c.filter=Mb.test(f)?f.replace(Mb,e):f+" "+e)}}),m.cssHooks.marginRight=Lb(k.reliableMarginRight,function(a,b){return b?m.swap(a,{display:"inline-block"},Jb,[a,"marginRight"]):void 0}),m.each({margin:"",padding:"",border:"Width"},function(a,b){m.cssHooks[a+b]={expand:function(c){for(var d=0,e={},f="string"==typeof c?c.split(" "):[c];4>d;d++)e[a+T[d]+b]=f[d]||f[d-2]||f[0];return e}},Gb.test(a)||(m.cssHooks[a+b].set=Wb)}),m.fn.extend({css:function(a,b){return V(this,function(a,b,c){var d,e,f={},g=0;if(m.isArray(b)){for(d=Ib(a),e=b.length;e>g;g++)f[b[g]]=m.css(a,b[g],!1,d);return f}return void 0!==c?m.style(a,b,c):m.css(a,b)},a,b,arguments.length>1)},show:function(){return Vb(this,!0)},hide:function(){return Vb(this)},toggle:function(a){return"boolean"==typeof a?a?this.sh
 ow():this.hide():this.each(function(){U(this)?m(this).show():m(this).hide()})}});function Zb(a,b,c,d,e){return new Zb.prototype.init(a,b,c,d,e)
+}m.Tween=Zb,Zb.prototype={constructor:Zb,init:function(a,b,c,d,e,f){this.elem=a,this.prop=c,this.easing=e||"swing",this.options=b,this.start=this.now=this.cur(),this.end=d,this.unit=f||(m.cssNumber[c]?"":"px")},cur:function(){var a=Zb.propHooks[this.prop];return a&&a.get?a.get(this):Zb.propHooks._default.get(this)},run:function(a){var b,c=Zb.propHooks[this.prop];return this.pos=b=this.options.duration?m.easing[this.easing](a,this.options.duration*a,0,1,this.options.duration):a,this.now=(this.end-this.start)*b+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),c&&c.set?c.set(this):Zb.propHooks._default.set(this),this}},Zb.prototype.init.prototype=Zb.prototype,Zb.propHooks={_default:{get:function(a){var b;return null==a.elem[a.prop]||a.elem.style&&null!=a.elem.style[a.prop]?(b=m.css(a.elem,a.prop,""),b&&"auto"!==b?b:0):a.elem[a.prop]},set:function(a){m.fx.step[a.prop]?m.fx.step[a.prop](a):a.elem.style&&(null!=a.elem.style[m.cssProps[a.prop]]||m.cssHooks[a.pr
 op])?m.style(a.elem,a.prop,a.now+a.unit):a.elem[a.prop]=a.now}}},Zb.propHooks.scrollTop=Zb.propHooks.scrollLeft={set:function(a){a.elem.nodeType&&a.elem.parentNode&&(a.elem[a.prop]=a.now)}},m.easing={linear:function(a){return a},swing:function(a){return.5-Math.cos(a*Math.PI)/2}},m.fx=Zb.prototype.init,m.fx.step={};var $b,_b,ac=/^(?:toggle|show|hide)$/,bc=new RegExp("^(?:([+-])=|)("+S+")([a-z%]*)$","i"),cc=/queueHooks$/,dc=[ic],ec={"*":[function(a,b){var c=this.createTween(a,b),d=c.cur(),e=bc.exec(b),f=e&&e[3]||(m.cssNumber[a]?"":"px"),g=(m.cssNumber[a]||"px"!==f&&+d)&&bc.exec(m.css(c.elem,a)),h=1,i=20;if(g&&g[3]!==f){f=f||g[3],e=e||[],g=+d||1;do h=h||".5",g/=h,m.style(c.elem,a,g+f);while(h!==(h=c.cur()/d)&&1!==h&&--i)}return e&&(g=c.start=+g||+d||0,c.unit=f,c.end=e[1]?g+(e[1]+1)*e[2]:+e[2]),c}]};function fc(){return setTimeout(function(){$b=void 0}),$b=m.now()}function gc(a,b){var c,d={height:a},e=0;for(b=b?1:0;4>e;e+=2-b)c=T[e],d["margin"+c]=d["padding"+c]=a;return b&&(d.opacity=d.
 width=a),d}function hc(a,b,c){for(var d,e=(ec[b]||[]).concat(ec["*"]),f=0,g=e.length;g>f;f++)if(d=e[f].call(c,b,a))return d}function ic(a,b,c){var d,e,f,g,h,i,j,l,n=this,o={},p=a.style,q=a.nodeType&&U(a),r=m._data(a,"fxshow");c.queue||(h=m._queueHooks(a,"fx"),null==h.unqueued&&(h.unqueued=0,i=h.empty.fire,h.empty.fire=function(){h.unqueued||i()}),h.unqueued++,n.always(function(){n.always(function(){h.unqueued--,m.queue(a,"fx").length||h.empty.fire()})})),1===a.nodeType&&("height"in b||"width"in b)&&(c.overflow=[p.overflow,p.overflowX,p.overflowY],j=m.css(a,"display"),l="none"===j?m._data(a,"olddisplay")||Fb(a.nodeName):j,"inline"===l&&"none"===m.css(a,"float")&&(k.inlineBlockNeedsLayout&&"inline"!==Fb(a.nodeName)?p.zoom=1:p.display="inline-block")),c.overflow&&(p.overflow="hidden",k.shrinkWrapBlocks()||n.always(function(){p.overflow=c.overflow[0],p.overflowX=c.overflow[1],p.overflowY=c.overflow[2]}));for(d in b)if(e=b[d],ac.exec(e)){if(delete b[d],f=f||"toggle"===e,e===(q?"hide":"sh
 ow")){if("show"!==e||!r||void 0===r[d])continue;q=!0}o[d]=r&&r[d]||m.style(a,d)}else j=void 0;if(m.isEmptyObject(o))"inline"===("none"===j?Fb(a.nodeName):j)&&(p.display=j);else{r?"hidden"in r&&(q=r.hidden):r=m._data(a,"fxshow",{}),f&&(r.hidden=!q),q?m(a).show():n.done(function(){m(a).hide()}),n.done(function(){var b;m._removeData(a,"fxshow");for(b in o)m.style(a,b,o[b])});for(d in o)g=hc(q?r[d]:0,d,n),d in r||(r[d]=g.start,q&&(g.end=g.start,g.start="width"===d||"height"===d?1:0))}}function jc(a,b){var c,d,e,f,g;for(c in a)if(d=m.camelCase(c),e=b[d],f=a[c],m.isArray(f)&&(e=f[1],f=a[c]=f[0]),c!==d&&(a[d]=f,delete a[c]),g=m.cssHooks[d],g&&"expand"in g){f=g.expand(f),delete a[d];for(c in f)c in a||(a[c]=f[c],b[c]=e)}else b[d]=e}function kc(a,b,c){var d,e,f=0,g=dc.length,h=m.Deferred().always(function(){delete i.elem}),i=function(){if(e)return!1;for(var b=$b||fc(),c=Math.max(0,j.startTime+j.duration-b),d=c/j.duration||0,f=1-d,g=0,i=j.tweens.length;i>g;g++)j.tweens[g].run(f);return h.noti
 fyWith(a,[j,f,c]),1>f&&i?c:(h.resolveWith(a,[j]),!1)},j=h.promise({elem:a,props:m.extend({},b),opts:m.extend(!0,{specialEasing:{}},c),originalProperties:b,originalOptions:c,startTime:$b||fc(),duration:c.duration,tweens:[],createTween:function(b,c){var d=m.Tween(a,j.opts,b,c,j.opts.specialEasing[b]||j.opts.easing);return j.tweens.push(d),d},stop:function(b){var c=0,d=b?j.tweens.length:0;if(e)return this;for(e=!0;d>c;c++)j.tweens[c].run(1);return b?h.resolveWith(a,[j,b]):h.rejectWith(a,[j,b]),this}}),k=j.props;for(jc(k,j.opts.specialEasing);g>f;f++)if(d=dc[f].call(j,a,k,j.opts))return d;return m.map(k,hc,j),m.isFunction(j.opts.start)&&j.opts.start.call(a,j),m.fx.timer(m.extend(i,{elem:a,anim:j,queue:j.opts.queue})),j.progress(j.opts.progress).done(j.opts.done,j.opts.complete).fail(j.opts.fail).always(j.opts.always)}m.Animation=m.extend(kc,{tweener:function(a,b){m.isFunction(a)?(b=a,a=["*"]):a=a.split(" ");for(var c,d=0,e=a.length;e>d;d++)c=a[d],ec[c]=ec[c]||[],ec[c].unshift(b)},prefil
 ter:function(a,b){b?dc.unshift(a):dc.push(a)}}),m.speed=function(a,b,c){var d=a&&"object"==typeof a?m.extend({},a):{complete:c||!c&&b||m.isFunction(a)&&a,duration:a,easing:c&&b||b&&!m.isFunction(b)&&b};return d.duration=m.fx.off?0:"number"==typeof d.duration?d.duration:d.duration in m.fx.speeds?m.fx.speeds[d.duration]:m.fx.speeds._default,(null==d.queue||d.queue===!0)&&(d.queue="fx"),d.old=d.complete,d.complete=function(){m.isFunction(d.old)&&d.old.call(this),d.queue&&m.dequeue(this,d.queue)},d},m.fn.extend({fadeTo:function(a,b,c,d){return this.filter(U).css("opacity",0).show().end().animate({opacity:b},a,c,d)},animate:function(a,b,c,d){var e=m.isEmptyObject(a),f=m.speed(b,c,d),g=function(){var b=kc(this,m.extend({},a),f);(e||m._data(this,"finish"))&&b.stop(!0)};return g.finish=g,e||f.queue===!1?this.each(g):this.queue(f.queue,g)},stop:function(a,b,c){var d=function(a){var b=a.stop;delete a.stop,b(c)};return"string"!=typeof a&&(c=b,b=a,a=void 0),b&&a!==!1&&this.queue(a||"fx",[]),thi
 s.each(function(){var b=!0,e=null!=a&&a+"queueHooks",f=m.timers,g=m._data(this);if(e)g[e]&&g[e].stop&&d(g[e]);else for(e in g)g[e]&&g[e].stop&&cc.test(e)&&d(g[e]);for(e=f.length;e--;)f[e].elem!==this||null!=a&&f[e].queue!==a||(f[e].anim.stop(c),b=!1,f.splice(e,1));(b||!c)&&m.dequeue(this,a)})},finish:function(a){return a!==!1&&(a=a||"fx"),this.each(function(){var b,c=m._data(this),d=c[a+"queue"],e=c[a+"queueHooks"],f=m.timers,g=d?d.length:0;for(c.finish=!0,m.queue(this,a,[]),e&&e.stop&&e.stop.call(this,!0),b=f.length;b--;)f[b].elem===this&&f[b].queue===a&&(f[b].anim.stop(!0),f.splice(b,1));for(b=0;g>b;b++)d[b]&&d[b].finish&&d[b].finish.call(this);delete c.finish})}}),m.each(["toggle","show","hide"],function(a,b){var c=m.fn[b];m.fn[b]=function(a,d,e){return null==a||"boolean"==typeof a?c.apply(this,arguments):this.animate(gc(b,!0),a,d,e)}}),m.each({slideDown:gc("show"),slideUp:gc("hide"),slideToggle:gc("toggle"),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"},fadeToggle:{opacity:"to
 ggle"}},function(a,b){m.fn[a]=function(a,c,d){return this.animate(b,a,c,d)}}),m.timers=[],m.fx.tick=function(){var a,b=m.timers,c=0;for($b=m.now();c<b.length;c++)a=b[c],a()||b[c]!==a||b.splice(c--,1);b.length||m.fx.stop(),$b=void 0},m.fx.timer=function(a){m.timers.push(a),a()?m.fx.start():m.timers.pop()},m.fx.interval=13,m.fx.start=function(){_b||(_b=setInterval(m.fx.tick,m.fx.interval))},m.fx.stop=function(){clearInterval(_b),_b=null},m.fx.speeds={slow:600,fast:200,_default:400},m.fn.delay=function(a,b){return a=m.fx?m.fx.speeds[a]||a:a,b=b||"fx",this.queue(b,function(b,c){var d=setTimeout(b,a);c.stop=function(){clearTimeout(d)}})},function(){var a,b,c,d,e;b=y.createElement("div"),b.setAttribute("className","t"),b.innerHTML="  <link/><table></table><a href='/a'>a</a><input type='checkbox'/>",d=b.getElementsByTagName("a")[0],c=y.createElement("select"),e=c.appendChild(y.createElement("option")),a=b.getElementsByTagName("input")[0],d.style.cssText="top:1px",k.getSetAttribute="t"!==b.
 className,k.style=/top/.test(d.getAttribute("style")),k.hrefNormalized="/a"===d.getAttribute("href"),k.checkOn=!!a.value,k.optSelected=e.selected,k.enctype=!!y.createElement("form").enctype,c.disabled=!0,k.optDisabled=!e.disabled,a=y.createElement("input"),a.setAttribute("value",""),k.input=""===a.getAttribute("value"),a.value="t",a.setAttribute("type","radio"),k.radioValue="t"===a.value}();var lc=/\r/g;m.fn.extend({val:function(a){var b,c,d,e=this[0];{if(arguments.length)return d=m.isFunction(a),this.each(function(c){var e;1===this.nodeType&&(e=d?a.call(this,c,m(this).val()):a,null==e?e="":"number"==typeof e?e+="":m.isArray(e)&&(e=m.map(e,function(a){return null==a?"":a+""})),b=m.valHooks[this.type]||m.valHooks[this.nodeName.toLowerCase()],b&&"set"in b&&void 0!==b.set(this,e,"value")||(this.value=e))});if(e)return b=m.valHooks[e.type]||m.valHooks[e.nodeName.toLowerCase()],b&&"get"in b&&void 0!==(c=b.get(e,"value"))?c:(c=e.value,"string"==typeof c?c.replace(lc,""):null==c?"":c)}}}),
 m.extend({valHooks:{option:{get:function(a){var b=m.find.attr(a,"value");return null!=b?b:m.trim(m.text(a))}},select:{get:function(a){for(var b,c,d=a.options,e=a.selectedIndex,f="select-one"===a.type||0>e,g=f?null:[],h=f?e+1:d.length,i=0>e?h:f?e:0;h>i;i++)if(c=d[i],!(!c.selected&&i!==e||(k.optDisabled?c.disabled:null!==c.getAttribute("disabled"))||c.parentNode.disabled&&m.nodeName(c.parentNode,"optgroup"))){if(b=m(c).val(),f)return b;g.push(b)}return g},set:function(a,b){var c,d,e=a.options,f=m.makeArray(b),g=e.length;while(g--)if(d=e[g],m.inArray(m.valHooks.option.get(d),f)>=0)try{d.selected=c=!0}catch(h){d.scrollHeight}else d.selected=!1;return c||(a.selectedIndex=-1),e}}}}),m.each(["radio","checkbox"],function(){m.valHooks[this]={set:function(a,b){return m.isArray(b)?a.checked=m.inArray(m(a).val(),b)>=0:void 0}},k.checkOn||(m.valHooks[this].get=function(a){return null===a.getAttribute("value")?"on":a.value})});var mc,nc,oc=m.expr.attrHandle,pc=/^(?:checked|selected)$/i,qc=k.getSe
 tAttribute,rc=k.input;m.fn.extend({attr:function(a,b){return V(this,m.attr,a,b,arguments.length>1)},removeAttr:function(a){return this.each(function(){m.removeAttr(this,a)})}}),m.extend({attr:function(a,b,c){var d,e,f=a.nodeType;if(a&&3!==f&&8!==f&&2!==f)return typeof a.getAttribute===K?m.prop(a,b,c):(1===f&&m.isXMLDoc(a)||(b=b.toLowerCase(),d=m.attrHooks[b]||(m.expr.match.bool.test(b)?nc:mc)),void 0===c?d&&"get"in d&&null!==(e=d.get(a,b))?e:(e=m.find.attr(a,b),null==e?void 0:e):null!==c?d&&"set"in d&&void 0!==(e=d.set(a,c,b))?e:(a.setAttribute(b,c+""),c):void m.removeAttr(a,b))},removeAttr:function(a,b){var c,d,e=0,f=b&&b.match(E);if(f&&1===a.nodeType)while(c=f[e++])d=m.propFix[c]||c,m.expr.match.bool.test(c)?rc&&qc||!pc.test(c)?a[d]=!1:a[m.camelCase("default-"+c)]=a[d]=!1:m.attr(a,c,""),a.removeAttribute(qc?c:d)},attrHooks:{type:{set:function(a,b){if(!k.radioValue&&"radio"===b&&m.nodeName(a,"input")){var c=a.value;return a.setAttribute("type",b),c&&(a.value=c),b}}}}}),nc={set:func
 tion(a,b,c){return b===!1?m.removeAttr(a,c):rc&&qc||!pc.test(c)?a.setAttribute(!qc&&m.propFix[c]||c,c):a[m.camelCase("default-"+c)]=a[c]=!0,c}},m.each(m.expr.match.bool.source.match(/\w+/g),function(a,b){var c=oc[b]||m.find.attr;oc[b]=rc&&qc||!pc.test(b)?function(a,b,d){var e,f;return d||(f=oc[b],oc[b]=e,e=null!=c(a,b,d)?b.toLowerCase():null,oc[b]=f),e}:function(a,b,c){return c?void 0:a[m.camelCase("default-"+b)]?b.toLowerCase():null}}),rc&&qc||(m.attrHooks.value={set:function(a,b,c){return m.nodeName(a,"input")?void(a.defaultValue=b):mc&&mc.set(a,b,c)}}),qc||(mc={set:function(a,b,c){var d=a.getAttributeNode(c);return d||a.setAttributeNode(d=a.ownerDocument.createAttribute(c)),d.value=b+="","value"===c||b===a.getAttribute(c)?b:void 0}},oc.id=oc.name=oc.coords=function(a,b,c){var d;return c?void 0:(d=a.getAttributeNode(b))&&""!==d.value?d.value:null},m.valHooks.button={get:function(a,b){var c=a.getAttributeNode(b);return c&&c.specified?c.value:void 0},set:mc.set},m.attrHooks.contente
 ditable={set:function(a,b,c){mc.set(a,""===b?!1:b,c)}},m.each(["width","height"],function(a,b){m.attrHooks[b]={set:function(a,c){return""===c?(a.setAttribute(b,"auto"),c):void 0}}})),k.style||(m.attrHooks.style={get:function(a){return a.style.cssText||void 0},set:function(a,b){return a.style.cssText=b+""}});var sc=/^(?:input|select|textarea|button|object)$/i,tc=/^(?:a|area)$/i;m.fn.extend({prop:function(a,b){return V(this,m.prop,a,b,arguments.length>1)},removeProp:function(a){return a=m.propFix[a]||a,this.each(function(){try{this[a]=void 0,delete this[a]}catch(b){}})}}),m.extend({propFix:{"for":"htmlFor","class":"className"},prop:function(a,b,c){var d,e,f,g=a.nodeType;if(a&&3!==g&&8!==g&&2!==g)return f=1!==g||!m.isXMLDoc(a),f&&(b=m.propFix[b]||b,e=m.propHooks[b]),void 0!==c?e&&"set"in e&&void 0!==(d=e.set(a,c,b))?d:a[b]=c:e&&"get"in e&&null!==(d=e.get(a,b))?d:a[b]},propHooks:{tabIndex:{get:function(a){var b=m.find.attr(a,"tabindex");return b?parseInt(b,10):sc.test(a.nodeName)||tc.te
 st(a.nodeName)&&a.href?0:-1}}}}),k.hrefNormalized||m.each(["href","src"],function(a,b){m.propHooks[b]={get:function(a){return a.getAttribute(b,4)}}}),k.optSelected||(m.propHooks.selected={get:function(a){var b=a.parentNode;return b&&(b.selectedIndex,b.parentNode&&b.parentNode.selectedIndex),null}}),m.each(["tabIndex","readOnly","maxLength","cellSpacing","cellPadding","rowSpan","colSpan","useMap","frameBorder","contentEditable"],function(){m.propFix[this.toLowerCase()]=this}),k.enctype||(m.propFix.enctype="encoding");var uc=/[\t\r\n\f]/g;m.fn.extend({addClass:function(a){var b,c,d,e,f,g,h=0,i=this.length,j="string"==typeof a&&a;if(m.isFunction(a))return this.each(function(b){m(this).addClass(a.call(this,b,this.className))});if(j)for(b=(a||"").match(E)||[];i>h;h++)if(c=this[h],d=1===c.nodeType&&(c.className?(" "+c.className+" ").replace(uc," "):" ")){f=0;while(e=b[f++])d.indexOf(" "+e+" ")<0&&(d+=e+" ");g=m.trim(d),c.className!==g&&(c.className=g)}return this},removeClass:function(a){
 var b,c,d,e,f,g,h=0,i=this.length,j=0===arguments.length||"string"==typeof a&&a;if(m.isFunction(a))return this.each(function(b){m(this).removeClass(a.call(this,b,this.className))});if(j)for(b=(a||"").match(E)||[];i>h;h++)if(c=this[h],d=1===c.nodeType&&(c.className?(" "+c.className+" ").replace(uc," "):"")){f=0;while(e=b[f++])while(d.indexOf(" "+e+" ")>=0)d=d.replace(" "+e+" "," ");g=a?m.trim(d):"",c.className!==g&&(c.className=g)}return this},toggleClass:function(a,b){var c=typeof a;return"boolean"==typeof b&&"string"===c?b?this.addClass(a):this.removeClass(a):this.each(m.isFunction(a)?function(c){m(this).toggleClass(a.call(this,c,this.className,b),b)}:function(){if("string"===c){var b,d=0,e=m(this),f=a.match(E)||[];while(b=f[d++])e.hasClass(b)?e.removeClass(b):e.addClass(b)}else(c===K||"boolean"===c)&&(this.className&&m._data(this,"__className__",this.className),this.className=this.className||a===!1?"":m._data(this,"__className__")||"")})},hasClass:function(a){for(var b=" "+a+" ",c
 =0,d=this.length;d>c;c++)if(1===this[c].nodeType&&(" "+this[c].className+" ").replace(uc," ").indexOf(b)>=0)return!0;return!1}}),m.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(a,b){m.fn[b]=function(a,c){return arguments.length>0?this.on(b,null,a,c):this.trigger(b)}}),m.fn.extend({hover:function(a,b){return this.mouseenter(a).mouseleave(b||a)},bind:function(a,b,c){return this.on(a,null,b,c)},unbind:function(a,b){return this.off(a,null,b)},delegate:function(a,b,c,d){return this.on(b,a,c,d)},undelegate:function(a,b,c){return 1===arguments.length?this.off(a,"**"):this.off(b,a||"**",c)}});var vc=m.now(),wc=/\?/,xc=/(,)|(\[|{)|(}|])|"(?:[^"\\\r\n]|\\["\\\/bfnrt]|\\u[\da-fA-F]{4})*"\s*:?|true|false|null|-?(?!0\d)\d+(?:\.\d+|)(?:[eE][+-]?\d+|)/g;m.parseJSON=function(b){if(a.JSON&&a.JSON.parse)return a.JSON.parse
 (b+"");var c,d=null,e=m.trim(b+"");return e&&!m.trim(e.replace(xc,function(a,b,e,f){return c&&b&&(d=0),0===d?a:(c=e||b,d+=!f-!e,"")}))?Function("return "+e)():m.error("Invalid JSON: "+b)},m.parseXML=function(b){var c,d;if(!b||"string"!=typeof b)return null;try{a.DOMParser?(d=new DOMParser,c=d.parseFromString(b,"text/xml")):(c=new ActiveXObject("Microsoft.XMLDOM"),c.async="false",c.loadXML(b))}catch(e){c=void 0}return c&&c.documentElement&&!c.getElementsByTagName("parsererror").length||m.error("Invalid XML: "+b),c};var yc,zc,Ac=/#.*$/,Bc=/([?&])_=[^&]*/,Cc=/^(.*?):[ \t]*([^\r\n]*)\r?$/gm,Dc=/^(?:about|app|app-storage|.+-extension|file|res|widget):$/,Ec=/^(?:GET|HEAD)$/,Fc=/^\/\//,Gc=/^([\w.+-]+:)(?:\/\/(?:[^\/?#]*@|)([^\/?#:]*)(?::(\d+)|)|)/,Hc={},Ic={},Jc="*/".concat("*");try{zc=location.href}catch(Kc){zc=y.createElement("a"),zc.href="",zc=zc.href}yc=Gc.exec(zc.toLowerCase())||[];function Lc(a){return function(b,c){"string"!=typeof b&&(c=b,b="*");var d,e=0,f=b.toLowerCase().match(E)
 ||[];if(m.isFunction(c))while(d=f[e++])"+"===d.charAt(0)?(d=d.slice(1)||"*",(a[d]=a[d]||[]).unshift(c)):(a[d]=a[d]||[]).push(c)}}function Mc(a,b,c,d){var e={},f=a===Ic;function g(h){var i;return e[h]=!0,m.each(a[h]||[],function(a,h){var j=h(b,c,d);return"string"!=typeof j||f||e[j]?f?!(i=j):void 0:(b.dataTypes.unshift(j),g(j),!1)}),i}return g(b.dataTypes[0])||!e["*"]&&g("*")}function Nc(a,b){var c,d,e=m.ajaxSettings.flatOptions||{};for(d in b)void 0!==b[d]&&((e[d]?a:c||(c={}))[d]=b[d]);return c&&m.extend(!0,a,c),a}function Oc(a,b,c){var d,e,f,g,h=a.contents,i=a.dataTypes;while("*"===i[0])i.shift(),void 0===e&&(e=a.mimeType||b.getResponseHeader("Content-Type"));if(e)for(g in h)if(h[g]&&h[g].test(e)){i.unshift(g);break}if(i[0]in c)f=i[0];else{for(g in c){if(!i[0]||a.converters[g+" "+i[0]]){f=g;break}d||(d=g)}f=f||d}return f?(f!==i[0]&&i.unshift(f),c[f]):void 0}function Pc(a,b,c,d){var e,f,g,h,i,j={},k=a.dataTypes.slice();if(k[1])for(g in a.converters)j[g.toLowerCase()]=a.converters[g];
 f=k.shift();while(f)if(a.responseFields[f]&&(c[a.responseFields[f]]=b),!i&&d&&a.dataFilter&&(b=a.dataFilter(b,a.dataType)),i=f,f=k.shift())if("*"===f)f=i;else if("*"!==i&&i!==f){if(g=j[i+" "+f]||j["* "+f],!g)for(e in j)if(h=e.split(" "),h[1]===f&&(g=j[i+" "+h[0]]||j["* "+h[0]])){g===!0?g=j[e]:j[e]!==!0&&(f=h[0],k.unshift(h[1]));break}if(g!==!0)if(g&&a["throws"])b=g(b);else try{b=g(b)}catch(l){return{state:"parsererror",error:g?l:"No conversion from "+i+" to "+f}}}return{state:"success",data:b}}m.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:zc,type:"GET",isLocal:Dc.test(yc[1]),global:!0,processData:!0,async:!0,contentType:"application/x-www-form-urlencoded; charset=UTF-8",accepts:{"*":Jc,text:"text/plain",html:"text/html",xml:"application/xml, text/xml",json:"application/json, text/javascript"},contents:{xml:/xml/,html:/html/,json:/json/},responseFields:{xml:"responseXML",text:"responseText",json:"responseJSON"},converters:{"* text":String,"text html":!0,"text json":m.p
 arseJSON,"text xml":m.parseXML},flatOptions:{url:!0,context:!0}},ajaxSetup:function(a,b){return b?Nc(Nc(a,m.ajaxSettings),b):Nc(m.ajaxSettings,a)},ajaxPrefilter:Lc(Hc),ajaxTransport:Lc(Ic),ajax:function(a,b){"object"==typeof a&&(b=a,a=void 0),b=b||{};var c,d,e,f,g,h,i,j,k=m.ajaxSetup({},b),l=k.context||k,n=k.context&&(l.nodeType||l.jquery)?m(l):m.event,o=m.Deferred(),p=m.Callbacks("once memory"),q=k.statusCode||{},r={},s={},t=0,u="canceled",v={readyState:0,getResponseHeader:function(a){var b;if(2===t){if(!j){j={};while(b=Cc.exec(f))j[b[1].toLowerCase()]=b[2]}b=j[a.toLowerCase()]}return null==b?null:b},getAllResponseHeaders:function(){return 2===t?f:null},setRequestHeader:function(a,b){var c=a.toLowerCase();return t||(a=s[c]=s[c]||a,r[a]=b),this},overrideMimeType:function(a){return t||(k.mimeType=a),this},statusCode:function(a){var b;if(a)if(2>t)for(b in a)q[b]=[q[b],a[b]];else v.always(a[v.status]);return this},abort:function(a){var b=a||u;return i&&i.abort(b),x(0,b),this}};if(o.pro
 mise(v).complete=p.add,v.success=v.done,v.error=v.fail,k.url=((a||k.url||zc)+"").replace(Ac,"").replace(Fc,yc[1]+"//"),k.type=b.method||b.type||k.method||k.type,k.dataTypes=m.trim(k.dataType||"*").toLowerCase().match(E)||[""],null==k.crossDomain&&(c=Gc.exec(k.url.toLowerCase()),k.crossDomain=!(!c||c[1]===yc[1]&&c[2]===yc[2]&&(c[3]||("http:"===c[1]?"80":"443"))===(yc[3]||("http:"===yc[1]?"80":"443")))),k.data&&k.processData&&"string"!=typeof k.data&&(k.data=m.param(k.data,k.traditional)),Mc(Hc,k,b,v),2===t)return v;h=m.event&&k.global,h&&0===m.active++&&m.event.trigger("ajaxStart"),k.type=k.type.toUpperCase(),k.hasContent=!Ec.test(k.type),e=k.url,k.hasContent||(k.data&&(e=k.url+=(wc.test(e)?"&":"?")+k.data,delete k.data),k.cache===!1&&(k.url=Bc.test(e)?e.replace(Bc,"$1_="+vc++):e+(wc.test(e)?"&":"?")+"_="+vc++)),k.ifModified&&(m.lastModified[e]&&v.setRequestHeader("If-Modified-Since",m.lastModified[e]),m.etag[e]&&v.setRequestHeader("If-None-Match",m.etag[e])),(k.data&&k.hasContent&&k
 .contentType!==!1||b.contentType)&&v.setRequestHeader("Content-Type",k.contentType),v.setRequestHeader("Accept",k.dataTypes[0]&&k.accepts[k.dataTypes[0]]?k.accepts[k.dataTypes[0]]+("*"!==k.dataTypes[0]?", "+Jc+"; q=0.01":""):k.accepts["*"]);for(d in k.headers)v.setRequestHeader(d,k.headers[d]);if(k.beforeSend&&(k.beforeSend.call(l,v,k)===!1||2===t))return v.abort();u="abort";for(d in{success:1,error:1,complete:1})v[d](k[d]);if(i=Mc(Ic,k,b,v)){v.readyState=1,h&&n.trigger("ajaxSend",[v,k]),k.async&&k.timeout>0&&(g=setTimeout(function(){v.abort("timeout")},k.timeout));try{t=1,i.send(r,x)}catch(w){if(!(2>t))throw w;x(-1,w)}}else x(-1,"No Transport");function x(a,b,c,d){var j,r,s,u,w,x=b;2!==t&&(t=2,g&&clearTimeout(g),i=void 0,f=d||"",v.readyState=a>0?4:0,j=a>=200&&300>a||304===a,c&&(u=Oc(k,v,c)),u=Pc(k,u,v,j),j?(k.ifModified&&(w=v.getResponseHeader("Last-Modified"),w&&(m.lastModified[e]=w),w=v.getResponseHeader("etag"),w&&(m.etag[e]=w)),204===a||"HEAD"===k.type?x="nocontent":304===a?x="
 notmodified":(x=u.state,r=u.data,s=u.error,j=!s)):(s=x,(a||!x)&&(x="error",0>a&&(a=0))),v.status=a,v.statusText=(b||x)+"",j?o.resolveWith(l,[r,x,v]):o.rejectWith(l,[v,x,s]),v.statusCode(q),q=void 0,h&&n.trigger(j?"ajaxSuccess":"ajaxError",[v,k,j?r:s]),p.fireWith(l,[v,x]),h&&(n.trigger("ajaxComplete",[v,k]),--m.active||m.event.trigger("ajaxStop")))}return v},getJSON:function(a,b,c){return m.get(a,b,c,"json")},getScript:function(a,b){return m.get(a,void 0,b,"script")}}),m.each(["get","post"],function(a,b){m[b]=function(a,c,d,e){return m.isFunction(c)&&(e=e||d,d=c,c=void 0),m.ajax({url:a,type:b,dataType:e,data:c,success:d})}}),m._evalUrl=function(a){return m.ajax({url:a,type:"GET",dataType:"script",async:!1,global:!1,"throws":!0})},m.fn.extend({wrapAll:function(a){if(m.isFunction(a))return this.each(function(b){m(this).wrapAll(a.call(this,b))});if(this[0]){var b=m(a,this[0].ownerDocument).eq(0).clone(!0);this[0].parentNode&&b.insertBefore(this[0]),b.map(function(){var a=this;while(a.fi
 rstChild&&1===a.firstChild.nodeType)a=a.firstChild;return a}).append(this)}return this},wrapInner:function(a){return this.each(m.isFunction(a)?function(b){m(this).wrapInner(a.call(this,b))}:function(){var b=m(this),c=b.contents();c.length?c.wrapAll(a):b.append(a)})},wrap:function(a){var b=m.isFunction(a);return this.each(function(c){m(this).wrapAll(b?a.call(this,c):a)})},unwrap:function(){return this.parent().each(function(){m.nodeName(this,"body")||m(this).replaceWith(this.childNodes)}).end()}}),m.expr.filters.hidden=function(a){return a.offsetWidth<=0&&a.offsetHeight<=0||!k.reliableHiddenOffsets()&&"none"===(a.style&&a.style.display||m.css(a,"display"))},m.expr.filters.visible=function(a){return!m.expr.filters.hidden(a)};var Qc=/%20/g,Rc=/\[\]$/,Sc=/\r?\n/g,Tc=/^(?:submit|button|image|reset|file)$/i,Uc=/^(?:input|select|textarea|keygen)/i;function Vc(a,b,c,d){var e;if(m.isArray(b))m.each(b,function(b,e){c||Rc.test(a)?d(a,e):Vc(a+"["+("object"==typeof e?b:"")+"]",e,c,d)});else if(c
 ||"object"!==m.type(b))d(a,b);else for(e in b)Vc(a+"["+e+"]",b[e],c,d)}m.param=function(a,b){var c,d=[],e=function(a,b){b=m.isFunction(b)?b():null==b?"":b,d[d.length]=encodeURIComponent(a)+"="+encodeURIComponent(b)};if(void 0===b&&(b=m.ajaxSettings&&m.ajaxSettings.traditional),m.isArray(a)||a.jquery&&!m.isPlainObject(a))m.each(a,function(){e(this.name,this.value)});else for(c in a)Vc(c,a[c],b,e);return d.join("&").replace(Qc,"+")},m.fn.extend({serialize:function(){return m.param(this.serializeArray())},serializeArray:function(){return this.map(function(){var a=m.prop(this,"elements");return a?m.makeArray(a):this}).filter(function(){var a=this.type;return this.name&&!m(this).is(":disabled")&&Uc.test(this.nodeName)&&!Tc.test(a)&&(this.checked||!W.test(a))}).map(function(a,b){var c=m(this).val();return null==c?null:m.isArray(c)?m.map(c,function(a){return{name:b.name,value:a.replace(Sc,"\r\n")}}):{name:b.name,value:c.replace(Sc,"\r\n")}}).get()}}),m.ajaxSettings.xhr=void 0!==a.ActiveXOb
 ject?function(){return!this.isLocal&&/^(get|post|head|put|delete|options)$/i.test(this.type)&&Zc()||$c()}:Zc;var Wc=0,Xc={},Yc=m.ajaxSettings.xhr();a.attachEvent&&a.attachEvent("onunload",function(){for(var a in Xc)Xc[a](void 0,!0)}),k.cors=!!Yc&&"withCredentials"in Yc,Yc=k.ajax=!!Yc,Yc&&m.ajaxTransport(function(a){if(!a.crossDomain||k.cors){var b;return{send:function(c,d){var e,f=a.xhr(),g=++Wc;if(f.open(a.type,a.url,a.async,a.username,a.password),a.xhrFields)for(e in a.xhrFields)f[e]=a.xhrFields[e];a.mimeType&&f.overrideMimeType&&f.overrideMimeType(a.mimeType),a.crossDomain||c["X-Requested-With"]||(c["X-Requested-With"]="XMLHttpRequest");for(e in c)void 0!==c[e]&&f.setRequestHeader(e,c[e]+"");f.send(a.hasContent&&a.data||null),b=function(c,e){var h,i,j;if(b&&(e||4===f.readyState))if(delete Xc[g],b=void 0,f.onreadystatechange=m.noop,e)4!==f.readyState&&f.abort();else{j={},h=f.status,"string"==typeof f.responseText&&(j.text=f.responseText);try{i=f.statusText}catch(k){i=""}h||!a.isLo
 cal||a.crossDomain?1223===h&&(h=204):h=j.text?200:404}j&&d(h,i,j,f.getAllResponseHeaders())},a.async?4===f.readyState?setTimeout(b):f.onreadystatechange=Xc[g]=b:b()},abort:function(){b&&b(void 0,!0)}}}});function Zc(){try{return new a.XMLHttpRequest}catch(b){}}function $c(){try{return new a.ActiveXObject("Microsoft.XMLHTTP")}catch(b){}}m.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/(?:java|ecma)script/},converters:{"text script":function(a){return m.globalEval(a),a}}}),m.ajaxPrefilter("script",function(a){void 0===a.cache&&(a.cache=!1),a.crossDomain&&(a.type="GET",a.global=!1)}),m.ajaxTransport("script",function(a){if(a.crossDomain){var b,c=y.head||m("head")[0]||y.documentElement;return{send:function(d,e){b=y.createElement("script"),b.async=!0,a.scriptCharset&&(b.charset=a.scriptCharset),b.src=a.url,b.onload=b.onreadystatechange=function(a,c){(c||!b.readyState||/loaded|complete/.test(b.ready
 State))&&(b.onload=b.onreadystatechange=null,b.parentNode&&b.parentNode.removeChild(b),b=null,c||e(200,"success"))},c.insertBefore(b,c.firstChild)},abort:function(){b&&b.onload(void 0,!0)}}}});var _c=[],ad=/(=)\?(?=&|$)|\?\?/;m.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var a=_c.pop()||m.expando+"_"+vc++;return this[a]=!0,a}}),m.ajaxPrefilter("json jsonp",function(b,c,d){var e,f,g,h=b.jsonp!==!1&&(ad.test(b.url)?"url":"string"==typeof b.data&&!(b.contentType||"").indexOf("application/x-www-form-urlencoded")&&ad.test(b.data)&&"data");return h||"jsonp"===b.dataTypes[0]?(e=b.jsonpCallback=m.isFunction(b.jsonpCallback)?b.jsonpCallback():b.jsonpCallback,h?b[h]=b[h].replace(ad,"$1"+e):b.jsonp!==!1&&(b.url+=(wc.test(b.url)?"&":"?")+b.jsonp+"="+e),b.converters["script json"]=function(){return g||m.error(e+" was not called"),g[0]},b.dataTypes[0]="json",f=a[e],a[e]=function(){g=arguments},d.always(function(){a[e]=f,b[e]&&(b.jsonpCallback=c.jsonpCallback,_c.push(e)),g&&m.isFunction(f
 )&&f(g[0]),g=f=void 0}),"script"):void 0}),m.parseHTML=function(a,b,c){if(!a||"string"!=typeof a)return null;"boolean"==typeof b&&(c=b,b=!1),b=b||y;var d=u.exec(a),e=!c&&[];return d?[b.createElement(d[1])]:(d=m.buildFragment([a],b,e),e&&e.length&&m(e).remove(),m.merge([],d.childNodes))};var bd=m.fn.load;m.fn.load=function(a,b,c){if("string"!=typeof a&&bd)return bd.apply(this,arguments);var d,e,f,g=this,h=a.indexOf(" ");return h>=0&&(d=m.trim(a.slice(h,a.length)),a=a.slice(0,h)),m.isFunction(b)?(c=b,b=void 0):b&&"object"==typeof b&&(f="POST"),g.length>0&&m.ajax({url:a,type:f,dataType:"html",data:b}).done(function(a){e=arguments,g.html(d?m("<div>").append(m.parseHTML(a)).find(d):a)}).complete(c&&function(a,b){g.each(c,e||[a.responseText,b,a])}),this},m.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(a,b){m.fn[b]=function(a){return this.on(b,a)}}),m.expr.filters.animated=function(a){return m.grep(m.timers,function(b){return a===b.elem}).length
 };var cd=a.document.documentElement;function dd(a){return m.isWindow(a)?a:9===a.nodeType?a.defaultView||a.parentWindow:!1}m.offset={setOffset:function(a,b,c){var d,e,f,g,h,i,j,k=m.css(a,"position"),l=m(a),n={};"static"===k&&(a.style.position="relative"),h=l.offset(),f=m.css(a,"top"),i=m.css(a,"left"),j=("absolute"===k||"fixed"===k)&&m.inArray("auto",[f,i])>-1,j?(d=l.position(),g=d.top,e=d.left):(g=parseFloat(f)||0,e=parseFloat(i)||0),m.isFunction(b)&&(b=b.call(a,c,h)),null!=b.top&&(n.top=b.top-h.top+g),null!=b.left&&(n.left=b.left-h.left+e),"using"in b?b.using.call(a,n):l.css(n)}},m.fn.extend({offset:function(a){if(arguments.length)return void 0===a?this:this.each(function(b){m.offset.setOffset(this,a,b)});var b,c,d={top:0,left:0},e=this[0],f=e&&e.ownerDocument;if(f)return b=f.documentElement,m.contains(b,e)?(typeof e.getBoundingClientRect!==K&&(d=e.getBoundingClientRect()),c=dd(f),{top:d.top+(c.pageYOffset||b.scrollTop)-(b.clientTop||0),left:d.left+(c.pageXOffset||b.scrollLeft)-(b.
 clientLeft||0)}):d},position:function(){if(this[0]){var a,b,c={top:0,left:0},d=this[0];return"fixed"===m.css(d,"position")?b=d.getBoundingClientRect():(a=this.offsetParent(),b=this.offset(),m.nodeName(a[0],"html")||(c=a.offset()),c.top+=m.css(a[0],"borderTopWidth",!0),c.left+=m.css(a[0],"borderLeftWidth",!0)),{top:b.top-c.top-m.css(d,"marginTop",!0),left:b.left-c.left-m.css(d,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var a=this.offsetParent||cd;while(a&&!m.nodeName(a,"html")&&"static"===m.css(a,"position"))a=a.offsetParent;return a||cd})}}),m.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(a,b){var c=/Y/.test(b);m.fn[a]=function(d){return V(this,function(a,d,e){var f=dd(a);return void 0===e?f?b in f?f[b]:f.document.documentElement[d]:a[d]:void(f?f.scrollTo(c?m(f).scrollLeft():e,c?e:m(f).scrollTop()):a[d]=e)},a,d,arguments.length,null)}}),m.each(["top","left"],function(a,b){m.cssHooks[b]=Lb(k.pixelPosition,function(a,c){return c?(c=Jb(a,b
 ),Hb.test(c)?m(a).position()[b]+"px":c):void 0})}),m.each({Height:"height",Width:"width"},function(a,b){m.each({padding:"inner"+a,content:b,"":"outer"+a},function(c,d){m.fn[d]=function(d,e){var f=arguments.length&&(c||"boolean"!=typeof d),g=c||(d===!0||e===!0?"margin":"border");return V(this,function(b,c,d){var e;return m.isWindow(b)?b.document.documentElement["client"+a]:9===b.nodeType?(e=b.documentElement,Math.max(b.body["scroll"+a],e["scroll"+a],b.body["offset"+a],e["offset"+a],e["client"+a])):void 0===d?m.css(b,c,g):m.style(b,c,d,g)},b,f?d:void 0,f,null)}})}),m.fn.size=function(){return this.length},m.fn.andSelf=m.fn.addBack,"function"==typeof define&&define.amd&&define("jquery",[],function(){return m});var ed=a.jQuery,fd=a.$;return m.noConflict=function(b){return a.$===m&&(a.$=fd),b&&a.jQuery===m&&(a.jQuery=ed),m},typeof b===K&&(a.jQuery=a.$=m),m});
diff --git a/www/test/icla/public/assets/react-min.js b/www/test/icla/public/assets/react-min.js
new file mode 100644
index 0000000..9040c97
--- /dev/null
+++ b/www/test/icla/public/assets/react-min.js
@@ -0,0 +1,15 @@
+/**
+ * React v0.13.2
+ *
+ * Copyright 2013-2015, Facebook, Inc.
+ * All rights reserved.
+ *
+ * This source code is licensed under the BSD-style license found in the
+ * LICENSE file in the root directory of this source tree. An additional grant
+ * of patent rights can be found in the PATENTS file in the same directory.
+ *
+ */
+!function(e){if("object"==typeof exports&&"undefined"!=typeof module)module.exports=e();else if("function"==typeof define&&define.amd)define([],e);else{var t;t="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:this,t.React=e()}}(function(){return function e(t,n,r){function o(a,u){if(!n[a]){if(!t[a]){var s="function"==typeof require&&require;if(!u&&s)return s(a,!0);if(i)return i(a,!0);var l=new Error("Cannot find module '"+a+"'");throw l.code="MODULE_NOT_FOUND",l}var c=n[a]={exports:{}};t[a][0].call(c.exports,function(e){var n=t[a][1][e];return o(n?n:e)},c,c.exports,e,t,n,r)}return n[a].exports}for(var i="function"==typeof require&&require,a=0;a<r.length;a++)o(r[a]);return o}({1:[function(e,t,n){"use strict";var r=e(19),o=e(32),i=e(34),a=e(33),u=e(38),s=e(39),l=e(55),c=(e(56),e(40)),p=e(51),d=e(54),f=e(64),h=e(68),m=e(73),v=e(76),g=e(79),y=e(82),C=e(27),E=e(115),b=e(142);d.inject();var _=l.createElement,x=l.createFactory,D=l.cloneElemen
 t,M=m.measure("React","render",h.render),N={Children:{map:o.map,forEach:o.forEach,count:o.count,only:b},Component:i,DOM:c,PropTypes:v,initializeTouchEvents:function(e){r.useTouchEvents=e},createClass:a.createClass,createElement:_,cloneElement:D,createFactory:x,createMixin:function(e){return e},constructAndRenderComponent:h.constructAndRenderComponent,constructAndRenderComponentByID:h.constructAndRenderComponentByID,findDOMNode:E,render:M,renderToString:y.renderToString,renderToStaticMarkup:y.renderToStaticMarkup,unmountComponentAtNode:h.unmountComponentAtNode,isValidElement:l.isValidElement,withContext:u.withContext,__spread:C};"undefined"!=typeof __REACT_DEVTOOLS_GLOBAL_HOOK__&&"function"==typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.inject&&__REACT_DEVTOOLS_GLOBAL_HOOK__.inject({CurrentOwner:s,InstanceHandles:f,Mount:h,Reconciler:g,TextComponent:p});N.version="0.13.2",t.exports=N},{115:115,142:142,19:19,27:27,32:32,33:33,34:34,38:38,39:39,40:40,51:51,54:54,55:55,56:56,64:64,68:68,73:73,7
 6:76,79:79,82:82}],2:[function(e,t,n){"use strict";var r=e(117),o={componentDidMount:function(){this.props.autoFocus&&r(this.getDOMNode())}};t.exports=o},{117:117}],3:[function(e,t,n){"use strict";function r(){var e=window.opera;return"object"==typeof e&&"function"==typeof e.version&&parseInt(e.version(),10)<=12}function o(e){return(e.ctrlKey||e.altKey||e.metaKey)&&!(e.ctrlKey&&e.altKey)}function i(e){switch(e){case T.topCompositionStart:return R.compositionStart;case T.topCompositionEnd:return R.compositionEnd;case T.topCompositionUpdate:return R.compositionUpdate}}function a(e,t){return e===T.topKeyDown&&t.keyCode===b}function u(e,t){switch(e){case T.topKeyUp:return-1!==E.indexOf(t.keyCode);case T.topKeyDown:return t.keyCode!==b;case T.topKeyPress:case T.topMouseDown:case T.topBlur:return!0;default:return!1}}function s(e){var t=e.detail;return"object"==typeof t&&"data"in t?t.data:null}function l(e,t,n,r){var o,l;if(_?o=i(e):w?u(e,r)&&(o=R.compositionEnd):a(e,r)&&(o=R.compositionSt
 art),!o)return null;M&&(w||o!==R.compositionStart?o===R.compositionEnd&&w&&(l=w.getData()):w=v.getPooled(t));var c=g.getPooled(o,n,r);if(l)c.data=l;else{var p=s(r);null!==p&&(c.data=p)}return h.accumulateTwoPhaseDispatches(c),c}function c(e,t){switch(e){case T.topCompositionEnd:return s(t);case T.topKeyPress:var n=t.which;return n!==N?null:(P=!0,I);case T.topTextInput:var r=t.data;return r===I&&P?null:r;default:return null}}function p(e,t){if(w){if(e===T.topCompositionEnd||u(e,t)){var n=w.getData();return v.release(w),w=null,n}return null}switch(e){case T.topPaste:return null;case T.topKeyPress:return t.which&&!o(t)?String.fromCharCode(t.which):null;case T.topCompositionEnd:return M?null:t.data;default:return null}}function d(e,t,n,r){var o;if(o=D?c(e,r):p(e,r),!o)return null;var i=y.getPooled(R.beforeInput,n,r);return i.data=o,h.accumulateTwoPhaseDispatches(i),i}var f=e(15),h=e(20),m=e(21),v=e(22),g=e(91),y=e(95),C=e(139),E=[9,13,27,32],b=229,_=m.canUseDOM&&"CompositionEvent"in win
 dow,x=null;m.canUseDOM&&"documentMode"in document&&(x=document.documentMode);var D=m.canUseDOM&&"TextEvent"in window&&!x&&!r(),M=m.canUseDOM&&(!_||x&&x>8&&11>=x),N=32,I=String.fromCharCode(N),T=f.topLevelTypes,R={beforeInput:{phasedRegistrationNames:{bubbled:C({onBeforeInput:null}),captured:C({onBeforeInputCapture:null})},dependencies:[T.topCompositionEnd,T.topKeyPress,T.topTextInput,T.topPaste]},compositionEnd:{phasedRegistrationNames:{bubbled:C({onCompositionEnd:null}),captured:C({onCompositionEndCapture:null})},dependencies:[T.topBlur,T.topCompositionEnd,T.topKeyDown,T.topKeyPress,T.topKeyUp,T.topMouseDown]},compositionStart:{phasedRegistrationNames:{bubbled:C({onCompositionStart:null}),captured:C({onCompositionStartCapture:null})},dependencies:[T.topBlur,T.topCompositionStart,T.topKeyDown,T.topKeyPress,T.topKeyUp,T.topMouseDown]},compositionUpdate:{phasedRegistrationNames:{bubbled:C({onCompositionUpdate:null}),captured:C({onCompositionUpdateCapture:null})},dependencies:[T.topBlu
 r,T.topCompositionUpdate,T.topKeyDown,T.topKeyPress,T.topKeyUp,T.topMouseDown]}},P=!1,w=null,O={eventTypes:R,extractEvents:function(e,t,n,r){return[l(e,t,n,r),d(e,t,n,r)]}};t.exports=O},{139:139,15:15,20:20,21:21,22:22,91:91,95:95}],4:[function(e,t,n){"use strict";function r(e,t){return e+t.charAt(0).toUpperCase()+t.substring(1)}var o={boxFlex:!0,boxFlexGroup:!0,columnCount:!0,flex:!0,flexGrow:!0,flexPositive:!0,flexShrink:!0,flexNegative:!0,fontWeight:!0,lineClamp:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0,fillOpacity:!0,strokeDashoffset:!0,strokeOpacity:!0,strokeWidth:!0},i=["Webkit","ms","Moz","O"];Object.keys(o).forEach(function(e){i.forEach(function(t){o[r(t,e)]=o[e]})});var a={background:{backgroundImage:!0,backgroundPosition:!0,backgroundRepeat:!0,backgroundColor:!0},border:{borderWidth:!0,borderStyle:!0,borderColor:!0},borderBottom:{borderBottomWidth:!0,borderBottomStyle:!0,borderBottomColor:!0},borderLeft:{borderLeftWidth:!0,borderLeftStyle:
 !0,borderLeftColor:!0},borderRight:{borderRightWidth:!0,borderRightStyle:!0,borderRightColor:!0},borderTop:{borderTopWidth:!0,borderTopStyle:!0,borderTopColor:!0},font:{fontStyle:!0,fontVariant:!0,fontWeight:!0,fontSize:!0,lineHeight:!0,fontFamily:!0}},u={isUnitlessNumber:o,shorthandPropertyExpansions:a};t.exports=u},{}],5:[function(e,t,n){"use strict";var r=e(4),o=e(21),i=(e(106),e(111)),a=e(131),u=e(141),s=(e(150),u(function(e){return a(e)})),l="cssFloat";o.canUseDOM&&void 0===document.documentElement.style.cssFloat&&(l="styleFloat");var c={createMarkupForStyles:function(e){var t="";for(var n in e)if(e.hasOwnProperty(n)){var r=e[n];null!=r&&(t+=s(n)+":",t+=i(n,r)+";")}return t||null},setValueForStyles:function(e,t){var n=e.style;for(var o in t)if(t.hasOwnProperty(o)){var a=i(o,t[o]);if("float"===o&&(o=l),a)n[o]=a;else{var u=r.shorthandPropertyExpansions[o];if(u)for(var s in u)n[s]="";else n[o]=""}}}};t.exports=c},{106:106,111:111,131:131,141:141,150:150,21:21,4:4}],6:[function(e,t
 ,n){"use strict";function r(){this._callbacks=null,this._contexts=null}var o=e(28),i=e(27),a=e(133);i(r.prototype,{enqueue:function(e,t){this._callbacks=this._callbacks||[],this._contexts=this._contexts||[],this._callbacks.push(e),this._contexts.push(t)},notifyAll:function(){var e=this._callbacks,t=this._contexts;if(e){a(e.length===t.length),this._callbacks=null,this._contexts=null;for(var n=0,r=e.length;r>n;n++)e[n].call(t[n]);e.length=0,t.length=0}},reset:function(){this._callbacks=null,this._contexts=null},destructor:function(){this.reset()}}),o.addPoolingTo(r),t.exports=r},{133:133,27:27,28:28}],7:[function(e,t,n){"use strict";function r(e){return"SELECT"===e.nodeName||"INPUT"===e.nodeName&&"file"===e.type}function o(e){var t=x.getPooled(T.change,P,e);E.accumulateTwoPhaseDispatches(t),_.batchedUpdates(i,t)}function i(e){C.enqueueEvents(e),C.processEventQueue()}function a(e,t){R=e,P=t,R.attachEvent("onchange",o)}function u(){R&&(R.detachEvent("onchange",o),R=null,P=null)}function
  s(e,t,n){return e===I.topChange?n:void 0}function l(e,t,n){e===I.topFocus?(u(),a(t,n)):e===I.topBlur&&u()}function c(e,t){R=e,P=t,w=e.value,O=Object.getOwnPropertyDescriptor(e.constructor.prototype,"value"),Object.defineProperty(R,"value",k),R.attachEvent("onpropertychange",d)}function p(){R&&(delete R.value,R.detachEvent("onpropertychange",d),R=null,P=null,w=null,O=null)}function d(e){if("value"===e.propertyName){var t=e.srcElement.value;t!==w&&(w=t,o(e))}}function f(e,t,n){return e===I.topInput?n:void 0}function h(e,t,n){e===I.topFocus?(p(),c(t,n)):e===I.topBlur&&p()}function m(e,t,n){return e!==I.topSelectionChange&&e!==I.topKeyUp&&e!==I.topKeyDown||!R||R.value===w?void 0:(w=R.value,P)}function v(e){return"INPUT"===e.nodeName&&("checkbox"===e.type||"radio"===e.type)}function g(e,t,n){return e===I.topClick?n:void 0}var y=e(15),C=e(17),E=e(20),b=e(21),_=e(85),x=e(93),D=e(134),M=e(136),N=e(139),I=y.topLevelTypes,T={change:{phasedRegistrationNames:{bubbled:N({onChange:null}),capture
 d:N({onChangeCapture:null})},dependencies:[I.topBlur,I.topChange,I.topClick,I.topFocus,I.topInput,I.topKeyDown,I.topKeyUp,I.topSelectionChange]}},R=null,P=null,w=null,O=null,S=!1;b.canUseDOM&&(S=D("change")&&(!("documentMode"in document)||document.documentMode>8));var A=!1;b.canUseDOM&&(A=D("input")&&(!("documentMode"in document)||document.documentMode>9));var k={get:function(){return O.get.call(this)},set:function(e){w=""+e,O.set.call(this,e)}},L={eventTypes:T,extractEvents:function(e,t,n,o){var i,a;if(r(t)?S?i=s:a=l:M(t)?A?i=f:(i=m,a=h):v(t)&&(i=g),i){var u=i(e,t,n);if(u){var c=x.getPooled(T.change,u,o);return E.accumulateTwoPhaseDispatches(c),c}}a&&a(e,t,n)}};t.exports=L},{134:134,136:136,139:139,15:15,17:17,20:20,21:21,85:85,93:93}],8:[function(e,t,n){"use strict";var r=0,o={createReactRootIndex:function(){return r++}};t.exports=o},{}],9:[function(e,t,n){"use strict";function r(e,t,n){e.insertBefore(t,e.childNodes[n]||null)}var o=e(12),i=e(70),a=e(145),u=e(133),s={dangerouslyRep
 laceNodeWithMarkup:o.dangerouslyReplaceNodeWithMarkup,updateTextContent:a,processUpdates:function(e,t){for(var n,s=null,l=null,c=0;c<e.length;c++)if(n=e[c],n.type===i.MOVE_EXISTING||n.type===i.REMOVE_NODE){var p=n.fromIndex,d=n.parentNode.childNodes[p],f=n.parentID;u(d),s=s||{},s[f]=s[f]||[],s[f][p]=d,l=l||[],l.push(d)}var h=o.dangerouslyRenderMarkup(t);if(l)for(var m=0;m<l.length;m++)l[m].parentNode.removeChild(l[m]);for(var v=0;v<e.length;v++)switch(n=e[v],n.type){case i.INSERT_MARKUP:r(n.parentNode,h[n.markupIndex],n.toIndex);break;case i.MOVE_EXISTING:r(n.parentNode,s[n.parentID][n.fromIndex],n.toIndex);break;case i.TEXT_CONTENT:a(n.parentNode,n.textContent);break;case i.REMOVE_NODE:}}};t.exports=s},{12:12,133:133,145:145,70:70}],10:[function(e,t,n){"use strict";function r(e,t){return(e&t)===t}var o=e(133),i={MUST_USE_ATTRIBUTE:1,MUST_USE_PROPERTY:2,HAS_SIDE_EFFECTS:4,HAS_BOOLEAN_VALUE:8,HAS_NUMERIC_VALUE:16,HAS_POSITIVE_NUMERIC_VALUE:48,HAS_OVERLOADED_BOOLEAN_VALUE:64,injectDOM
 PropertyConfig:function(e){var t=e.Properties||{},n=e.DOMAttributeNames||{},a=e.DOMPropertyNames||{},s=e.DOMMutationMethods||{};e.isCustomAttribute&&u._isCustomAttributeFunctions.push(e.isCustomAttribute);for(var l in t){o(!u.isStandardName.hasOwnProperty(l)),u.isStandardName[l]=!0;var c=l.toLowerCase();if(u.getPossibleStandardName[c]=l,n.hasOwnProperty(l)){var p=n[l];u.getPossibleStandardName[p]=l,u.getAttributeName[l]=p}else u.getAttributeName[l]=c;u.getPropertyName[l]=a.hasOwnProperty(l)?a[l]:l,s.hasOwnProperty(l)?u.getMutationMethod[l]=s[l]:u.getMutationMethod[l]=null;var d=t[l];u.mustUseAttribute[l]=r(d,i.MUST_USE_ATTRIBUTE),u.mustUseProperty[l]=r(d,i.MUST_USE_PROPERTY),u.hasSideEffects[l]=r(d,i.HAS_SIDE_EFFECTS),u.hasBooleanValue[l]=r(d,i.HAS_BOOLEAN_VALUE),u.hasNumericValue[l]=r(d,i.HAS_NUMERIC_VALUE),u.hasPositiveNumericValue[l]=r(d,i.HAS_POSITIVE_NUMERIC_VALUE),u.hasOverloadedBooleanValue[l]=r(d,i.HAS_OVERLOADED_BOOLEAN_VALUE),o(!u.mustUseAttribute[l]||!u.mustUseProperty[l]
 ),o(u.mustUseProperty[l]||!u.hasSideEffects[l]),o(!!u.hasBooleanValue[l]+!!u.hasNumericValue[l]+!!u.hasOverloadedBooleanValue[l]<=1)}}},a={},u={ID_ATTRIBUTE_NAME:"data-reactid",isStandardName:{},getPossibleStandardName:{},getAttributeName:{},getPropertyName:{},getMutationMethod:{},mustUseAttribute:{},mustUseProperty:{},hasSideEffects:{},hasBooleanValue:{},hasNumericValue:{},hasPositiveNumericValue:{},hasOverloadedBooleanValue:{},_isCustomAttributeFunctions:[],isCustomAttribute:function(e){for(var t=0;t<u._isCustomAttributeFunctions.length;t++){var n=u._isCustomAttributeFunctions[t];if(n(e))return!0}return!1},getDefaultValueForProperty:function(e,t){var n,r=a[e];return r||(a[e]=r={}),t in r||(n=document.createElement(e),r[t]=n[t]),r[t]},injection:i};t.exports=u},{133:133}],11:[function(e,t,n){"use strict";function r(e,t){return null==t||o.hasBooleanValue[e]&&!t||o.hasNumericValue[e]&&isNaN(t)||o.hasPositiveNumericValue[e]&&1>t||o.hasOverloadedBooleanValue[e]&&t===!1}var o=e(10),i=e(1
 43),a=(e(150),{createMarkupForID:function(e){return o.ID_ATTRIBUTE_NAME+"="+i(e)},createMarkupForProperty:function(e,t){if(o.isStandardName.hasOwnProperty(e)&&o.isStandardName[e]){if(r(e,t))return"";var n=o.getAttributeName[e];return o.hasBooleanValue[e]||o.hasOverloadedBooleanValue[e]&&t===!0?n:n+"="+i(t)}return o.isCustomAttribute(e)?null==t?"":e+"="+i(t):null},setValueForProperty:function(e,t,n){if(o.isStandardName.hasOwnProperty(t)&&o.isStandardName[t]){var i=o.getMutationMethod[t];if(i)i(e,n);else if(r(t,n))this.deleteValueForProperty(e,t);else if(o.mustUseAttribute[t])e.setAttribute(o.getAttributeName[t],""+n);else{var a=o.getPropertyName[t];o.hasSideEffects[t]&&""+e[a]==""+n||(e[a]=n)}}else o.isCustomAttribute(t)&&(null==n?e.removeAttribute(t):e.setAttribute(t,""+n))},deleteValueForProperty:function(e,t){if(o.isStandardName.hasOwnProperty(t)&&o.isStandardName[t]){var n=o.getMutationMethod[t];if(n)n(e,void 0);else if(o.mustUseAttribute[t])e.removeAttribute(o.getAttributeName[t
 ]);else{var r=o.getPropertyName[t],i=o.getDefaultValueForProperty(e.nodeName,r);o.hasSideEffects[t]&&""+e[r]===i||(e[r]=i)}}else o.isCustomAttribute(t)&&e.removeAttribute(t)}});t.exports=a},{10:10,143:143,150:150}],12:[function(e,t,n){"use strict";function r(e){return e.substring(1,e.indexOf(" "))}var o=e(21),i=e(110),a=e(112),u=e(125),s=e(133),l=/^(<[^ \/>]+)/,c="data-danger-index",p={dangerouslyRenderMarkup:function(e){s(o.canUseDOM);for(var t,n={},p=0;p<e.length;p++)s(e[p]),t=r(e[p]),t=u(t)?t:"*",n[t]=n[t]||[],n[t][p]=e[p];var d=[],f=0;for(t in n)if(n.hasOwnProperty(t)){var h,m=n[t];for(h in m)if(m.hasOwnProperty(h)){var v=m[h];m[h]=v.replace(l,"$1 "+c+'="'+h+'" ')}for(var g=i(m.join(""),a),y=0;y<g.length;++y){var C=g[y];C.hasAttribute&&C.hasAttribute(c)&&(h=+C.getAttribute(c),C.removeAttribute(c),s(!d.hasOwnProperty(h)),d[h]=C,f+=1)}}return s(f===d.length),s(d.length===e.length),d},dangerouslyReplaceNodeWithMarkup:function(e,t){s(o.canUseDOM),s(t),s("html"!==e.tagName.toLowerCas
 e());var n=i(t,a)[0];e.parentNode.replaceChild(n,e)}};t.exports=p},{110:110,112:112,125:125,133:133,21:21}],13:[function(e,t,n){"use strict";var r=e(139),o=[r({ResponderEventPlugin:null}),r({SimpleEventPlugin:null}),r({TapEventPlugin:null}),r({EnterLeaveEventPlugin:null}),r({ChangeEventPlugin:null}),r({SelectEventPlugin:null}),r({BeforeInputEventPlugin:null}),r({AnalyticsEventPlugin:null}),r({MobileSafariClickEventPlugin:null})];t.exports=o},{139:139}],14:[function(e,t,n){"use strict";var r=e(15),o=e(20),i=e(97),a=e(68),u=e(139),s=r.topLevelTypes,l=a.getFirstReactDOM,c={mouseEnter:{registrationName:u({onMouseEnter:null}),dependencies:[s.topMouseOut,s.topMouseOver]},mouseLeave:{registrationName:u({onMouseLeave:null}),dependencies:[s.topMouseOut,s.topMouseOver]}},p=[null,null],d={eventTypes:c,extractEvents:function(e,t,n,r){if(e===s.topMouseOver&&(r.relatedTarget||r.fromElement))return null;if(e!==s.topMouseOut&&e!==s.topMouseOver)return null;var u;if(t.window===t)u=t;else{var d=t.own
 erDocument;u=d?d.defaultView||d.parentWindow:window}var f,h;if(e===s.topMouseOut?(f=t,h=l(r.relatedTarget||r.toElement)||u):(f=u,h=t),f===h)return null;var m=f?a.getID(f):"",v=h?a.getID(h):"",g=i.getPooled(c.mouseLeave,m,r);g.type="mouseleave",g.target=f,g.relatedTarget=h;var y=i.getPooled(c.mouseEnter,v,r);return y.type="mouseenter",y.target=h,y.relatedTarget=f,o.accumulateEnterLeaveDispatches(g,y,m,v),p[0]=g,p[1]=y,p}};t.exports=d},{139:139,15:15,20:20,68:68,97:97}],15:[function(e,t,n){"use strict";var r=e(138),o=r({bubbled:null,captured:null}),i=r({topBlur:null,topChange:null,topClick:null,topCompositionEnd:null,topCompositionStart:null,topCompositionUpdate:null,topContextMenu:null,topCopy:null,topCut:null,topDoubleClick:null,topDrag:null,topDragEnd:null,topDragEnter:null,topDragExit:null,topDragLeave:null,topDragOver:null,topDragStart:null,topDrop:null,topError:null,topFocus:null,topInput:null,topKeyDown:null,topKeyPress:null,topKeyUp:null,topLoad:null,topMouseDown:null,topMouse
 Move:null,topMouseOut:null,topMouseOver:null,topMouseUp:null,topPaste:null,topReset:null,topScroll:null,topSelectionChange:null,topSubmit:null,topTextInput:null,topTouchCancel:null,topTouchEnd:null,topTouchMove:null,topTouchStart:null,topWheel:null}),a={topLevelTypes:i,PropagationPhases:o};t.exports=a},{138:138}],16:[function(e,t,n){var r=e(112),o={listen:function(e,t,n){return e.addEventListener?(e.addEventListener(t,n,!1),{remove:function(){e.removeEventListener(t,n,!1)}}):e.attachEvent?(e.attachEvent("on"+t,n),{remove:function(){e.detachEvent("on"+t,n)}}):void 0},capture:function(e,t,n){return e.addEventListener?(e.addEventListener(t,n,!0),{remove:function(){e.removeEventListener(t,n,!0)}}):{remove:r}},registerDefault:function(){}};t.exports=o},{112:112}],17:[function(e,t,n){"use strict";var r=e(18),o=e(19),i=e(103),a=e(118),u=e(133),s={},l=null,c=function(e){if(e){var t=o.executeDispatch,n=r.getPluginModuleForEvent(e);n&&n.executeDispatch&&(t=n.executeDispatch),o.executeDispatch
 esInOrder(e,t),e.isPersistent()||e.constructor.release(e)}},p=null,d={injection:{injectMount:o.injection.injectMount,injectInstanceHandle:function(e){p=e},getInstanceHandle:function(){return p},injectEventPluginOrder:r.injectEventPluginOrder,injectEventPluginsByName:r.injectEventPluginsByName},eventNameDispatchConfigs:r.eventNameDispatchConfigs,registrationNameModules:r.registrationNameModules,putListener:function(e,t,n){u(!n||"function"==typeof n);var r=s[t]||(s[t]={});r[e]=n},getListener:function(e,t){var n=s[t];return n&&n[e]},deleteListener:function(e,t){var n=s[t];n&&delete n[e]},deleteAllListeners:function(e){for(var t in s)delete s[t][e]},extractEvents:function(e,t,n,o){for(var a,u=r.plugins,s=0,l=u.length;l>s;s++){var c=u[s];if(c){var p=c.extractEvents(e,t,n,o);p&&(a=i(a,p))}}return a},enqueueEvents:function(e){e&&(l=i(l,e))},processEventQueue:function(){var e=l;l=null,a(e,c),u(!l)},__purge:function(){s={}},__getListenerBank:function(){return s}};t.exports=d},{103:103,118:11
 8,133:133,18:18,19:19}],18:[function(e,t,n){"use strict";function r(){if(u)for(var e in s){var t=s[e],n=u.indexOf(e);if(a(n>-1),!l.plugins[n]){a(t.extractEvents),l.plugins[n]=t;var r=t.eventTypes;for(var i in r)a(o(r[i],t,i))}}}function o(e,t,n){a(!l.eventNameDispatchConfigs.hasOwnProperty(n)),l.eventNameDispatchConfigs[n]=e;var r=e.phasedRegistrationNames;if(r){for(var o in r)if(r.hasOwnProperty(o)){var u=r[o];i(u,t,n)}return!0}return e.registrationName?(i(e.registrationName,t,n),!0):!1}function i(e,t,n){a(!l.registrationNameModules[e]),l.registrationNameModules[e]=t,l.registrationNameDependencies[e]=t.eventTypes[n].dependencies}var a=e(133),u=null,s={},l={plugins:[],eventNameDispatchConfigs:{},registrationNameModules:{},registrationNameDependencies:{},injectEventPluginOrder:function(e){a(!u),u=Array.prototype.slice.call(e),r()},injectEventPluginsByName:function(e){var t=!1;for(var n in e)if(e.hasOwnProperty(n)){var o=e[n];s.hasOwnProperty(n)&&s[n]===o||(a(!s[n]),s[n]=o,t=!0)}t&&r(
 )},getPluginModuleForEvent:function(e){var t=e.dispatchConfig;if(t.registrationName)return l.registrationNameModules[t.registrationName]||null;for(var n in t.phasedRegistrationNames)if(t.phasedRegistrationNames.hasOwnProperty(n)){var r=l.registrationNameModules[t.phasedRegistrationNames[n]];if(r)return r}return null},_resetEventPlugins:function(){u=null;for(var e in s)s.hasOwnProperty(e)&&delete s[e];l.plugins.length=0;var t=l.eventNameDispatchConfigs;for(var n in t)t.hasOwnProperty(n)&&delete t[n];var r=l.registrationNameModules;for(var o in r)r.hasOwnProperty(o)&&delete r[o]}};t.exports=l},{133:133}],19:[function(e,t,n){"use strict";function r(e){return e===v.topMouseUp||e===v.topTouchEnd||e===v.topTouchCancel}function o(e){return e===v.topMouseMove||e===v.topTouchMove}function i(e){return e===v.topMouseDown||e===v.topTouchStart}function a(e,t){var n=e._dispatchListeners,r=e._dispatchIDs;if(Array.isArray(n))for(var o=0;o<n.length&&!e.isPropagationStopped();o++)t(e,n[o],r[o]);else 
 n&&t(e,n,r)}function u(e,t,n){e.currentTarget=m.Mount.getNode(n);var r=t(e,n);return e.currentTarget=null,r}function s(e,t){a(e,t),e._dispatchListeners=null,e._dispatchIDs=null}function l(e){var t=e._dispatchListeners,n=e._dispatchIDs;if(Array.isArray(t)){for(var r=0;r<t.length&&!e.isPropagationStopped();r++)if(t[r](e,n[r]))return n[r]}else if(t&&t(e,n))return n;return null}function c(e){var t=l(e);return e._dispatchIDs=null,e._dispatchListeners=null,t}function p(e){var t=e._dispatchListeners,n=e._dispatchIDs;h(!Array.isArray(t));var r=t?t(e,n):null;return e._dispatchListeners=null,e._dispatchIDs=null,r}function d(e){return!!e._dispatchListeners}var f=e(15),h=e(133),m={Mount:null,injectMount:function(e){m.Mount=e}},v=f.topLevelTypes,g={isEndish:r,isMoveish:o,isStartish:i,executeDirectDispatch:p,executeDispatch:u,executeDispatchesInOrder:s,executeDispatchesInOrderStopAtTrue:c,hasDispatches:d,injection:m,useTouchEvents:!1};t.exports=g},{133:133,15:15}],20:[function(e,t,n){"use strict"
 ;function r(e,t,n){var r=t.dispatchConfig.phasedRegistrationNames[n];return v(e,r)}function o(e,t,n){var o=t?m.bubbled:m.captured,i=r(e,n,o);i&&(n._dispatchListeners=f(n._dispatchListeners,i),n._dispatchIDs=f(n._dispatchIDs,e))}function i(e){e&&e.dispatchConfig.phasedRegistrationNames&&d.injection.getInstanceHandle().traverseTwoPhase(e.dispatchMarker,o,e)}function a(e,t,n){if(n&&n.dispatchConfig.registrationName){var r=n.dispatchConfig.registrationName,o=v(e,r);o&&(n._dispatchListeners=f(n._dispatchListeners,o),n._dispatchIDs=f(n._dispatchIDs,e))}}function u(e){e&&e.dispatchConfig.registrationName&&a(e.dispatchMarker,null,e)}function s(e){h(e,i)}function l(e,t,n,r){d.injection.getInstanceHandle().traverseEnterLeave(n,r,a,e,t)}function c(e){h(e,u)}var p=e(15),d=e(17),f=e(103),h=e(118),m=p.PropagationPhases,v=d.getListener,g={accumulateTwoPhaseDispatches:s,accumulateDirectDispatches:c,accumulateEnterLeaveDispatches:l};t.exports=g},{103:103,118:118,15:15,17:17}],21:[function(e,t,n){"us
 e strict";var r=!("undefined"==typeof window||!window.document||!window.document.createElement),o={canUseDOM:r,canUseWorkers:"undefined"!=typeof Worker,canUseEventListeners:r&&!(!window.addEventListener&&!window.attachEvent),canUseViewport:r&&!!window.screen,isInWorker:!r};t.exports=o},{}],22:[function(e,t,n){"use strict";function r(e){this._root=e,this._startText=this.getText(),this._fallbackText=null}var o=e(28),i=e(27),a=e(128);i(r.prototype,{getText:function(){return"value"in this._root?this._root.value:this._root[a()]},getData:function(){if(this._fallbackText)return this._fallbackText;var e,t,n=this._startText,r=n.length,o=this.getText(),i=o.length;for(e=0;r>e&&n[e]===o[e];e++);var a=r-e;for(t=1;a>=t&&n[r-t]===o[i-t];t++);var u=t>1?1-t:void 0;return this._fallbackText=o.slice(e,u),this._fallbackText}}),o.addPoolingTo(r),t.exports=r},{128:128,27:27,28:28}],23:[function(e,t,n){"use strict";var r,o=e(10),i=e(21),a=o.injection.MUST_USE_ATTRIBUTE,u=o.injection.MUST_USE_PROPERTY,s=o.
 injection.HAS_BOOLEAN_VALUE,l=o.injection.HAS_SIDE_EFFECTS,c=o.injection.HAS_NUMERIC_VALUE,p=o.injection.HAS_POSITIVE_NUMERIC_VALUE,d=o.injection.HAS_OVERLOADED_BOOLEAN_VALUE;if(i.canUseDOM){var f=document.implementation;r=f&&f.hasFeature&&f.hasFeature("http://www.w3.org/TR/SVG11/feature#BasicStructure","1.1")}var h={isCustomAttribute:RegExp.prototype.test.bind(/^(data|aria)-[a-z_][a-z\d_.\-]*$/),Properties:{accept:null,acceptCharset:null,accessKey:null,action:null,allowFullScreen:a|s,allowTransparency:a,alt:null,async:s,autoComplete:null,autoPlay:s,cellPadding:null,cellSpacing:null,charSet:a,checked:u|s,classID:a,className:r?a:u,cols:a|p,colSpan:null,content:null,contentEditable:null,contextMenu:a,controls:u|s,coords:null,crossOrigin:null,data:null,dateTime:a,defer:s,dir:null,disabled:a|s,download:d,draggable:null,encType:null,form:a,formAction:a,formEncType:a,formMethod:a,formNoValidate:s,formTarget:a,frameBorder:a,headers:null,height:a,hidden:a|s,high:null,href:null,hrefLang:null
 ,htmlFor:null,httpEquiv:null,icon:null,id:u,label:null,lang:null,list:a,loop:u|s,low:null,manifest:a,marginHeight:null,marginWidth:null,max:null,maxLength:a,media:a,mediaGroup:null,method:null,min:null,multiple:u|s,muted:u|s,name:null,noValidate:s,open:s,optimum:null,pattern:null,placeholder:null,poster:null,preload:null,radioGroup:null,readOnly:u|s,rel:null,required:s,role:a,rows:a|p,rowSpan:null,sandbox:null,scope:null,scoped:s,scrolling:null,seamless:a|s,selected:u|s,shape:null,size:a|p,sizes:a,span:p,spellCheck:null,src:null,srcDoc:u,srcSet:a,start:c,step:null,style:null,tabIndex:null,target:null,title:null,type:null,useMap:null,value:u|l,width:a,wmode:a,autoCapitalize:null,autoCorrect:null,itemProp:a,itemScope:a|s,itemType:a,itemID:a,itemRef:a,property:null,unselectable:a},DOMAttributeNames:{acceptCharset:"accept-charset",className:"class",htmlFor:"for",httpEquiv:"http-equiv"},DOMPropertyNames:{autoCapitalize:"autocapitalize",autoComplete:"autocomplete",autoCorrect:"autocorrect
 ",autoFocus:"autofocus",autoPlay:"autoplay",encType:"encoding",hrefLang:"hreflang",radioGroup:"radiogroup",spellCheck:"spellcheck",srcDoc:"srcdoc",srcSet:"srcset"}};t.exports=h},{10:10,21:21}],24:[function(e,t,n){"use strict";function r(e){l(null==e.props.checkedLink||null==e.props.valueLink)}function o(e){r(e),l(null==e.props.value&&null==e.props.onChange)}function i(e){r(e),l(null==e.props.checked&&null==e.props.onChange)}function a(e){this.props.valueLink.requestChange(e.target.value)}function u(e){this.props.checkedLink.requestChange(e.target.checked)}var s=e(76),l=e(133),c={button:!0,checkbox:!0,image:!0,hidden:!0,radio:!0,reset:!0,submit:!0},p={Mixin:{propTypes:{value:function(e,t,n){return!e[t]||c[e.type]||e.onChange||e.readOnly||e.disabled?null:new Error("You provided a `value` prop to a form field without an `onChange` handler. This will render a read-only field. If the field should be mutable use `defaultValue`. Otherwise, set either `onChange` or `readOnly`.")},checked:fu
 nction(e,t,n){return!e[t]||e.onChange||e.readOnly||e.disabled?null:new Error("You provided a `checked` prop to a form field without an `onChange` handler. This will render a read-only field. If the field should be mutable use `defaultChecked`. Otherwise, set either `onChange` or `readOnly`.")},onChange:s.func}},getValue:function(e){return e.props.valueLink?(o(e),e.props.valueLink.value):e.props.value},getChecked:function(e){return e.props.checkedLink?(i(e),e.props.checkedLink.value):e.props.checked},getOnChange:function(e){return e.props.valueLink?(o(e),a):e.props.checkedLink?(i(e),u):e.props.onChange}};t.exports=p},{133:133,76:76}],25:[function(e,t,n){"use strict";function r(e){e.remove()}var o=e(30),i=e(103),a=e(118),u=e(133),s={trapBubbledEvent:function(e,t){u(this.isMounted());var n=this.getDOMNode();u(n);var r=o.trapBubbledEvent(e,t,n);this._localEventListeners=i(this._localEventListeners,r)},componentWillUnmount:function(){this._localEventListeners&&a(this._localEventListeners
 ,r)}};t.exports=s},{103:103,118:118,133:133,30:30}],26:[function(e,t,n){"use strict";var r=e(15),o=e(112),i=r.topLevelTypes,a={eventTypes:null,extractEvents:function(e,t,n,r){if(e===i.topTouchStart){var a=r.target;a&&!a.onclick&&(a.onclick=o)}}};t.exports=a},{112:112,15:15}],27:[function(e,t,n){"use strict";function r(e,t){if(null==e)throw new TypeError("Object.assign target cannot be null or undefined");for(var n=Object(e),r=Object.prototype.hasOwnProperty,o=1;o<arguments.length;o++){var i=arguments[o];if(null!=i){var a=Object(i);for(var u in a)r.call(a,u)&&(n[u]=a[u])}}return n}t.exports=r},{}],28:[function(e,t,n){"use strict";var r=e(133),o=function(e){var t=this;if(t.instancePool.length){var n=t.instancePool.pop();return t.call(n,e),n}return new t(e)},i=function(e,t){var n=this;if(n.instancePool.length){var r=n.instancePool.pop();return n.call(r,e,t),r}return new n(e,t)},a=function(e,t,n){var r=this;if(r.instancePool.length){var o=r.instancePool.pop();return r.call(o,e,t,n),o}re
 turn new r(e,t,n)},u=function(e,t,n,r,o){var i=this;if(i.instancePool.length){var a=i.instancePool.pop();return i.call(a,e,t,n,r,o),a}return new i(e,t,n,r,o)},s=function(e){var t=this;r(e instanceof t),e.destructor&&e.destructor(),t.instancePool.length<t.poolSize&&t.instancePool.push(e)},l=10,c=o,p=function(e,t){var n=e;return n.instancePool=[],n.getPooled=t||c,n.poolSize||(n.poolSize=l),n.release=s,n},d={addPoolingTo:p,oneArgumentPooler:o,twoArgumentPooler:i,threeArgumentPooler:a,fiveArgumentPooler:u};t.exports=d},{133:133}],29:[function(e,t,n){"use strict";var r=e(115),o={getDOMNode:function(){return r(this)}};t.exports=o},{115:115}],30:[function(e,t,n){"use strict";function r(e){return Object.prototype.hasOwnProperty.call(e,m)||(e[m]=f++,p[e[m]]={}),p[e[m]]}var o=e(15),i=e(17),a=e(18),u=e(59),s=e(102),l=e(27),c=e(134),p={},d=!1,f=0,h={topBlur:"blur",topChange:"change",topClick:"click",topCompositionEnd:"compositionend",topCompositionStart:"compositionstart",topCompositionUpdate:"
 compositionupdate",topContextMenu:"contextmenu",topCopy:"copy",topCut:"cut",topDoubleClick:"dblclick",topDrag:"drag",topDragEnd:"dragend",topDragEnter:"dragenter",topDragExit:"dragexit",topDragLeave:"dragleave",topDragOver:"dragover",topDragStart:"dragstart",topDrop:"drop",topFocus:"focus",topInput:"input",topKeyDown:"keydown",topKeyPress:"keypress",topKeyUp:"keyup",topMouseDown:"mousedown",topMouseMove:"mousemove",topMouseOut:"mouseout",topMouseOver:"mouseover",topMouseUp:"mouseup",topPaste:"paste",topScroll:"scroll",topSelectionChange:"selectionchange",topTextInput:"textInput",topTouchCancel:"touchcancel",topTouchEnd:"touchend",topTouchMove:"touchmove",topTouchStart:"touchstart",topWheel:"wheel"},m="_reactListenersID"+String(Math.random()).slice(2),v=l({},u,{ReactEventListener:null,injection:{injectReactEventListener:function(e){e.setHandleTopLevel(v.handleTopLevel),v.ReactEventListener=e}},setEnabled:function(e){v.ReactEventListener&&v.ReactEventListener.setEnabled(e)},isEnabled:
 function(){return!(!v.ReactEventListener||!v.ReactEventListener.isEnabled())},listenTo:function(e,t){for(var n=t,i=r(n),u=a.registrationNameDependencies[e],s=o.topLevelTypes,l=0,p=u.length;p>l;l++){var d=u[l];i.hasOwnProperty(d)&&i[d]||(d===s.topWheel?c("wheel")?v.ReactEventListener.trapBubbledEvent(s.topWheel,"wheel",n):c("mousewheel")?v.ReactEventListener.trapBubbledEvent(s.topWheel,"mousewheel",n):v.ReactEventListener.trapBubbledEvent(s.topWheel,"DOMMouseScroll",n):d===s.topScroll?c("scroll",!0)?v.ReactEventListener.trapCapturedEvent(s.topScroll,"scroll",n):v.ReactEventListener.trapBubbledEvent(s.topScroll,"scroll",v.ReactEventListener.WINDOW_HANDLE):d===s.topFocus||d===s.topBlur?(c("focus",!0)?(v.ReactEventListener.trapCapturedEvent(s.topFocus,"focus",n),v.ReactEventListener.trapCapturedEvent(s.topBlur,"blur",n)):c("focusin")&&(v.ReactEventListener.trapBubbledEvent(s.topFocus,"focusin",n),v.ReactEventListener.trapBubbledEvent(s.topBlur,"focusout",n)),i[s.topBlur]=!0,i[s.topFocus
 ]=!0):h.hasOwnProperty(d)&&v.ReactEventListener.trapBubbledEvent(d,h[d],n),i[d]=!0)}},trapBubbledEvent:function(e,t,n){
+return v.ReactEventListener.trapBubbledEvent(e,t,n)},trapCapturedEvent:function(e,t,n){return v.ReactEventListener.trapCapturedEvent(e,t,n)},ensureScrollValueMonitoring:function(){if(!d){var e=s.refreshScrollValues;v.ReactEventListener.monitorScrollValue(e),d=!0}},eventNameDispatchConfigs:i.eventNameDispatchConfigs,registrationNameModules:i.registrationNameModules,putListener:i.putListener,getListener:i.getListener,deleteListener:i.deleteListener,deleteAllListeners:i.deleteAllListeners});t.exports=v},{102:102,134:134,15:15,17:17,18:18,27:27,59:59}],31:[function(e,t,n){"use strict";var r=e(79),o=e(116),i=e(132),a=e(147),u={instantiateChildren:function(e,t,n){var r=o(e);for(var a in r)if(r.hasOwnProperty(a)){var u=r[a],s=i(u,null);r[a]=s}return r},updateChildren:function(e,t,n,u){var s=o(t);if(!s&&!e)return null;var l;for(l in s)if(s.hasOwnProperty(l)){var c=e&&e[l],p=c&&c._currentElement,d=s[l];if(a(p,d))r.receiveComponent(c,d,n,u),s[l]=c;else{c&&r.unmountComponent(c,l);var f=i(d,nul
 l);s[l]=f}}for(l in e)!e.hasOwnProperty(l)||s&&s.hasOwnProperty(l)||r.unmountComponent(e[l]);return s},unmountChildren:function(e){for(var t in e){var n=e[t];r.unmountComponent(n)}}};t.exports=u},{116:116,132:132,147:147,79:79}],32:[function(e,t,n){"use strict";function r(e,t){this.forEachFunction=e,this.forEachContext=t}function o(e,t,n,r){var o=e;o.forEachFunction.call(o.forEachContext,t,r)}function i(e,t,n){if(null==e)return e;var i=r.getPooled(t,n);f(e,o,i),r.release(i)}function a(e,t,n){this.mapResult=e,this.mapFunction=t,this.mapContext=n}function u(e,t,n,r){var o=e,i=o.mapResult,a=!i.hasOwnProperty(n);if(a){var u=o.mapFunction.call(o.mapContext,t,r);i[n]=u}}function s(e,t,n){if(null==e)return e;var r={},o=a.getPooled(r,t,n);return f(e,u,o),a.release(o),d.create(r)}function l(e,t,n,r){return null}function c(e,t){return f(e,l,null)}var p=e(28),d=e(61),f=e(149),h=(e(150),p.twoArgumentPooler),m=p.threeArgumentPooler;p.addPoolingTo(r,h),p.addPoolingTo(a,m);var v={forEach:i,map:s,c
 ount:c};t.exports=v},{149:149,150:150,28:28,61:61}],33:[function(e,t,n){"use strict";function r(e,t){var n=D.hasOwnProperty(t)?D[t]:null;N.hasOwnProperty(t)&&y(n===_.OVERRIDE_BASE),e.hasOwnProperty(t)&&y(n===_.DEFINE_MANY||n===_.DEFINE_MANY_MERGED)}function o(e,t){if(t){y("function"!=typeof t),y(!d.isValidElement(t));var n=e.prototype;t.hasOwnProperty(b)&&M.mixins(e,t.mixins);for(var o in t)if(t.hasOwnProperty(o)&&o!==b){var i=t[o];if(r(n,o),M.hasOwnProperty(o))M[o](e,i);else{var a=D.hasOwnProperty(o),l=n.hasOwnProperty(o),c=i&&i.__reactDontBind,p="function"==typeof i,f=p&&!a&&!l&&!c;if(f)n.__reactAutoBindMap||(n.__reactAutoBindMap={}),n.__reactAutoBindMap[o]=i,n[o]=i;else if(l){var h=D[o];y(a&&(h===_.DEFINE_MANY_MERGED||h===_.DEFINE_MANY)),h===_.DEFINE_MANY_MERGED?n[o]=u(n[o],i):h===_.DEFINE_MANY&&(n[o]=s(n[o],i))}else n[o]=i}}}}function i(e,t){if(t)for(var n in t){var r=t[n];if(t.hasOwnProperty(n)){var o=n in M;y(!o);var i=n in e;y(!i),e[n]=r}}}function a(e,t){y(e&&t&&"object"==ty
 peof e&&"object"==typeof t);for(var n in t)t.hasOwnProperty(n)&&(y(void 0===e[n]),e[n]=t[n]);return e}function u(e,t){return function(){var n=e.apply(this,arguments),r=t.apply(this,arguments);if(null==n)return r;if(null==r)return n;var o={};return a(o,n),a(o,r),o}}function s(e,t){return function(){e.apply(this,arguments),t.apply(this,arguments)}}function l(e,t){var n=t.bind(e);return n}function c(e){for(var t in e.__reactAutoBindMap)if(e.__reactAutoBindMap.hasOwnProperty(t)){var n=e.__reactAutoBindMap[t];e[t]=l(e,f.guard(n,e.constructor.displayName+"."+t))}}var p=e(34),d=(e(39),e(55)),f=e(58),h=e(65),m=e(66),v=(e(75),e(74),e(84)),g=e(27),y=e(133),C=e(138),E=e(139),b=(e(150),E({mixins:null})),_=C({DEFINE_ONCE:null,DEFINE_MANY:null,OVERRIDE_BASE:null,DEFINE_MANY_MERGED:null}),x=[],D={mixins:_.DEFINE_MANY,statics:_.DEFINE_MANY,propTypes:_.DEFINE_MANY,contextTypes:_.DEFINE_MANY,childContextTypes:_.DEFINE_MANY,getDefaultProps:_.DEFINE_MANY_MERGED,getInitialState:_.DEFINE_MANY_MERGED,getC
 hildContext:_.DEFINE_MANY_MERGED,render:_.DEFINE_ONCE,componentWillMount:_.DEFINE_MANY,componentDidMount:_.DEFINE_MANY,componentWillReceiveProps:_.DEFINE_MANY,shouldComponentUpdate:_.DEFINE_ONCE,componentWillUpdate:_.DEFINE_MANY,componentDidUpdate:_.DEFINE_MANY,componentWillUnmount:_.DEFINE_MANY,updateComponent:_.OVERRIDE_BASE},M={displayName:function(e,t){e.displayName=t},mixins:function(e,t){if(t)for(var n=0;n<t.length;n++)o(e,t[n])},childContextTypes:function(e,t){e.childContextTypes=g({},e.childContextTypes,t)},contextTypes:function(e,t){e.contextTypes=g({},e.contextTypes,t)},getDefaultProps:function(e,t){e.getDefaultProps?e.getDefaultProps=u(e.getDefaultProps,t):e.getDefaultProps=t},propTypes:function(e,t){e.propTypes=g({},e.propTypes,t)},statics:function(e,t){i(e,t)}},N={replaceState:function(e,t){v.enqueueReplaceState(this,e),t&&v.enqueueCallback(this,t)},isMounted:function(){var e=h.get(this);return e&&e!==m.currentlyMountingInstance},setProps:function(e,t){v.enqueueSetProps
 (this,e),t&&v.enqueueCallback(this,t)},replaceProps:function(e,t){v.enqueueReplaceProps(this,e),t&&v.enqueueCallback(this,t)}},I=function(){};g(I.prototype,p.prototype,N);var T={createClass:function(e){var t=function(e,t){this.__reactAutoBindMap&&c(this),this.props=e,this.context=t,this.state=null;var n=this.getInitialState?this.getInitialState():null;y("object"==typeof n&&!Array.isArray(n)),this.state=n};t.prototype=new I,t.prototype.constructor=t,x.forEach(o.bind(null,t)),o(t,e),t.getDefaultProps&&(t.defaultProps=t.getDefaultProps()),y(t.prototype.render);for(var n in D)t.prototype[n]||(t.prototype[n]=null);return t.type=t,t},injection:{injectMixin:function(e){x.push(e)}}};t.exports=T},{133:133,138:138,139:139,150:150,27:27,34:34,39:39,55:55,58:58,65:65,66:66,74:74,75:75,84:84}],34:[function(e,t,n){"use strict";function r(e,t){this.props=e,this.context=t}{var o=e(84),i=e(133);e(150)}r.prototype.setState=function(e,t){i("object"==typeof e||"function"==typeof e||null==e),o.enqueueSe
 tState(this,e),t&&o.enqueueCallback(this,t)},r.prototype.forceUpdate=function(e){o.enqueueForceUpdate(this),e&&o.enqueueCallback(this,e)};t.exports=r},{133:133,150:150,84:84}],35:[function(e,t,n){"use strict";var r=e(44),o=e(68),i={processChildrenUpdates:r.dangerouslyProcessChildrenUpdates,replaceNodeWithMarkupByID:r.dangerouslyReplaceNodeWithMarkupByID,unmountIDFromEnvironment:function(e){o.purgeID(e)}};t.exports=i},{44:44,68:68}],36:[function(e,t,n){"use strict";var r=e(133),o=!1,i={unmountIDFromEnvironment:null,replaceNodeWithMarkupByID:null,processChildrenUpdates:null,injection:{injectEnvironment:function(e){r(!o),i.unmountIDFromEnvironment=e.unmountIDFromEnvironment,i.replaceNodeWithMarkupByID=e.replaceNodeWithMarkupByID,i.processChildrenUpdates=e.processChildrenUpdates,o=!0}}};t.exports=i},{133:133}],37:[function(e,t,n){"use strict";function r(e){var t=e._currentElement._owner||null;if(t){var n=t.getName();if(n)return" Check the render method of `"+n+"`."}return""}var o=e(36),
 i=e(38),a=e(39),u=e(55),s=(e(56),e(65)),l=e(66),c=e(71),p=e(73),d=e(75),f=(e(74),e(79)),h=e(85),m=e(27),v=e(113),g=e(133),y=e(147),C=(e(150),1),E={construct:function(e){this._currentElement=e,this._rootNodeID=null,this._instance=null,this._pendingElement=null,this._pendingStateQueue=null,this._pendingReplaceState=!1,this._pendingForceUpdate=!1,this._renderedComponent=null,this._context=null,this._mountOrder=0,this._isTopLevel=!1,this._pendingCallbacks=null},mountComponent:function(e,t,n){this._context=n,this._mountOrder=C++,this._rootNodeID=e;var r=this._processProps(this._currentElement.props),o=this._processContext(this._currentElement._context),i=c.getComponentClassForElement(this._currentElement),a=new i(r,o);a.props=r,a.context=o,a.refs=v,this._instance=a,s.set(a,this);var u=a.state;void 0===u&&(a.state=u=null),g("object"==typeof u&&!Array.isArray(u)),this._pendingStateQueue=null,this._pendingReplaceState=!1,this._pendingForceUpdate=!1;var p,d=l.currentlyMountingInstance;l.curr
 entlyMountingInstance=this;try{a.componentWillMount&&(a.componentWillMount(),this._pendingStateQueue&&(a.state=this._processPendingState(a.props,a.context))),p=this._renderValidatedComponent()}finally{l.currentlyMountingInstance=d}this._renderedComponent=this._instantiateReactComponent(p,this._currentElement.type);var h=f.mountComponent(this._renderedComponent,e,t,this._processChildContext(n));return a.componentDidMount&&t.getReactMountReady().enqueue(a.componentDidMount,a),h},unmountComponent:function(){var e=this._instance;if(e.componentWillUnmount){var t=l.currentlyUnmountingInstance;l.currentlyUnmountingInstance=this;try{e.componentWillUnmount()}finally{l.currentlyUnmountingInstance=t}}f.unmountComponent(this._renderedComponent),this._renderedComponent=null,this._pendingStateQueue=null,this._pendingReplaceState=!1,this._pendingForceUpdate=!1,this._pendingCallbacks=null,this._pendingElement=null,this._context=null,this._rootNodeID=null,s.remove(e)},_setPropsInternal:function(e,t)
 {var n=this._pendingElement||this._currentElement;this._pendingElement=u.cloneAndReplaceProps(n,m({},n.props,e)),h.enqueueUpdate(this,t)},_maskContext:function(e){var t=null;if("string"==typeof this._currentElement.type)return v;var n=this._currentElement.type.contextTypes;if(!n)return v;t={};for(var r in n)t[r]=e[r];return t},_processContext:function(e){var t=this._maskContext(e);return t},_processChildContext:function(e){var t=this._instance,n=t.getChildContext&&t.getChildContext();if(n){g("object"==typeof t.constructor.childContextTypes);for(var r in n)g(r in t.constructor.childContextTypes);return m({},e,n)}return e},_processProps:function(e){return e},_checkPropTypes:function(e,t,n){var o=this.getName();for(var i in e)if(e.hasOwnProperty(i)){var a;try{g("function"==typeof e[i]),a=e[i](t,i,o,n)}catch(u){a=u}a instanceof Error&&(r(this),n===d.prop)}},receiveComponent:function(e,t,n){var r=this._currentElement,o=this._context;this._pendingElement=null,this.updateComponent(t,r,e,o,
 n)},performUpdateIfNecessary:function(e){null!=this._pendingElement&&f.receiveComponent(this,this._pendingElement||this._currentElement,e,this._context),(null!==this._pendingStateQueue||this._pendingForceUpdate)&&this.updateComponent(e,this._currentElement,this._currentElement,this._context,this._context)},_warnIfContextsDiffer:function(e,t){e=this._maskContext(e),t=this._maskContext(t);for(var n=Object.keys(t).sort(),r=(this.getName()||"ReactCompositeComponent",0);r<n.length;r++)n[r]},updateComponent:function(e,t,n,r,o){var i=this._instance,a=i.context,u=i.props;t!==n&&(a=this._processContext(n._context),u=this._processProps(n.props),i.componentWillReceiveProps&&i.componentWillReceiveProps(u,a));var s=this._processPendingState(u,a),l=this._pendingForceUpdate||!i.shouldComponentUpdate||i.shouldComponentUpdate(u,s,a);l?(this._pendingForceUpdate=!1,this._performComponentUpdate(n,u,s,a,e,o)):(this._currentElement=n,this._context=o,i.props=u,i.state=s,i.context=a)},_processPendingState:
 function(e,t){var n=this._instance,r=this._pendingStateQueue,o=this._pendingReplaceState;if(this._pendingReplaceState=!1,this._pendingStateQueue=null,!r)return n.state;for(var i=m({},o?r[0]:n.state),a=o?1:0;a<r.length;a++){var u=r[a];m(i,"function"==typeof u?u.call(n,i,e,t):u)}return i},_performComponentUpdate:function(e,t,n,r,o,i){var a=this._instance,u=a.props,s=a.state,l=a.context;a.componentWillUpdate&&a.componentWillUpdate(t,n,r),this._currentElement=e,this._context=i,a.props=t,a.state=n,a.context=r,this._updateRenderedComponent(o,i),a.componentDidUpdate&&o.getReactMountReady().enqueue(a.componentDidUpdate.bind(a,u,s,l),a)},_updateRenderedComponent:function(e,t){var n=this._renderedComponent,r=n._currentElement,o=this._renderValidatedComponent();if(y(r,o))f.receiveComponent(n,o,e,this._processChildContext(t));else{var i=this._rootNodeID,a=n._rootNodeID;f.unmountComponent(n),this._renderedComponent=this._instantiateReactComponent(o,this._currentElement.type);var u=f.mountCompone
 nt(this._renderedComponent,i,e,this._processChildContext(t));this._replaceNodeWithMarkupByID(a,u)}},_replaceNodeWithMarkupByID:function(e,t){o.replaceNodeWithMarkupByID(e,t)},_renderValidatedComponentWithoutOwnerOrContext:function(){var e=this._instance,t=e.render();return t},_renderValidatedComponent:function(){var e,t=i.current;i.current=this._processChildContext(this._currentElement._context),a.current=this;try{e=this._renderValidatedComponentWithoutOwnerOrContext()}finally{i.current=t,a.current=null}return g(null===e||e===!1||u.isValidElement(e)),e},attachRef:function(e,t){var n=this.getPublicInstance(),r=n.refs===v?n.refs={}:n.refs;r[e]=t.getPublicInstance()},detachRef:function(e){var t=this.getPublicInstance().refs;delete t[e]},getName:function(){var e=this._currentElement.type,t=this._instance&&this._instance.constructor;return e.displayName||t&&t.displayName||e.name||t&&t.name||null},getPublicInstance:function(){return this._instance},_instantiateReactComponent:null};p.measu
 reMethods(E,"ReactCompositeComponent",{mountComponent:"mountComponent",updateComponent:"updateComponent",_renderValidatedComponent:"_renderValidatedComponent"});var b={Mixin:E};t.exports=b},{113:113,133:133,147:147,150:150,27:27,36:36,38:38,39:39,55:55,56:56,65:65,66:66,71:71,73:73,74:74,75:75,79:79,85:85}],38:[function(e,t,n){"use strict";var r=e(27),o=e(113),i=(e(150),{current:o,withContext:function(e,t){var n,o=i.current;i.current=r({},o,e);try{n=t()}finally{i.current=o}return n}});t.exports=i},{113:113,150:150,27:27}],39:[function(e,t,n){"use strict";var r={current:null};t.exports=r},{}],40:[function(e,t,n){"use strict";function r(e){return o.createFactory(e)}var o=e(55),i=(e(56),e(140)),a=i({a:"a",abbr:"abbr",address:"address",area:"area",article:"article",aside:"aside",audio:"audio",b:"b",base:"base",bdi:"bdi",bdo:"bdo",big:"big",blockquote:"blockquote",body:"body",br:"br",button:"button",canvas:"canvas",caption:"caption",cite:"cite",code:"code",col:"col",colgroup:"colgroup",d
 ata:"data",datalist:"datalist",dd:"dd",del:"del",details:"details",dfn:"dfn",dialog:"dialog",div:"div",dl:"dl",dt:"dt",em:"em",embed:"embed",fieldset:"fieldset",figcaption:"figcaption",figure:"figure",footer:"footer",form:"form",h1:"h1",h2:"h2",h3:"h3",h4:"h4",h5:"h5",h6:"h6",head:"head",header:"header",hr:"hr",html:"html",i:"i",iframe:"iframe",img:"img",input:"input",ins:"ins",kbd:"kbd",keygen:"keygen",label:"label",legend:"legend",li:"li",link:"link",main:"main",map:"map",mark:"mark",menu:"menu",menuitem:"menuitem",meta:"meta",meter:"meter",nav:"nav",noscript:"noscript",object:"object",ol:"ol",optgroup:"optgroup",option:"option",output:"output",p:"p",param:"param",picture:"picture",pre:"pre",progress:"progress",q:"q",rp:"rp",rt:"rt",ruby:"ruby",s:"s",samp:"samp",script:"script",section:"section",select:"select",small:"small",source:"source",span:"span",strong:"strong",style:"style",sub:"sub",summary:"summary",sup:"sup",table:"table",tbody:"tbody",td:"td",textarea:"textarea",tfoot:
 "tfoot",th:"th",thead:"thead",time:"time",title:"title",tr:"tr",track:"track",u:"u",ul:"ul","var":"var",video:"video",wbr:"wbr",circle:"circle",defs:"defs",ellipse:"ellipse",g:"g",line:"line",linearGradient:"linearGradient",mask:"mask",path:"path",pattern:"pattern",polygon:"polygon",polyline:"polyline",radialGradient:"radialGradient",rect:"rect",stop:"stop",svg:"svg",text:"text",tspan:"tspan"},r);t.exports=a},{140:140,55:55,56:56}],41:[function(e,t,n){"use strict";var r=e(2),o=e(29),i=e(33),a=e(55),u=e(138),s=a.createFactory("button"),l=u({onClick:!0,onDoubleClick:!0,onMouseDown:!0,onMouseMove:!0,onMouseUp:!0,onClickCapture:!0,onDoubleClickCapture:!0,onMouseDownCapture:!0,onMouseMoveCapture:!0,onMouseUpCapture:!0}),c=i.createClass({displayName:"ReactDOMButton",tagName:"BUTTON",mixins:[r,o],render:function(){var e={};for(var t in this.props)!this.props.hasOwnProperty(t)||this.props.disabled&&l[t]||(e[t]=this.props[t]);return s(e,this.props.children)}});t.exports=c},{138:138,2:2,29:29
 ,33:33,55:55}],42:[function(e,t,n){"use strict";function r(e){e&&(null!=e.dangerouslySetInnerHTML&&(g(null==e.children),g(null!=e.dangerouslySetInnerHTML.__html)),g(null==e.style||"object"==typeof e.style))}function o(e,t,n,r){var o=d.findReactContainerForID(e);if(o){var i=o.nodeType===D?o.ownerDocument:o;E(t,i)}r.getPutListenerQueue().enqueuePutListener(e,t,n)}function i(e){R.call(T,e)||(g(I.test(e)),T[e]=!0)}function a(e){i(e),this._tag=e,this._renderedChildren=null,this._previousStyleCopy=null,this._rootNodeID=null}var u=e(5),s=e(10),l=e(11),c=e(30),p=e(35),d=e(68),f=e(69),h=e(73),m=e(27),v=e(114),g=e(133),y=(e(134),e(139)),C=(e(150),c.deleteListener),E=c.listenTo,b=c.registrationNameModules,_={string:!0,number:!0},x=y({style:null}),D=1,M=null,N={area:!0,base:!0,br:!0,col:!0,embed:!0,hr:!0,img:!0,input:!0,keygen:!0,link:!0,meta:!0,param:!0,source:!0,track:!0,wbr:!0},I=/^[a-zA-Z][a-zA-Z:_\.\-\d]*$/,T={},R={}.hasOwnProperty;a.displayName="ReactDOMComponent",a.Mixin={construct:funct
 ion(e){this._currentElement=e},mountComponent:function(e,t,n){this._rootNodeID=e,r(this._currentElement.props);var o=N[this._tag]?"":"</"+this._tag+">";return this._createOpenTagMarkupAndPutListeners(t)+this._createContentMarkup(t,n)+o},_createOpenTagMarkupAndPutListeners:function(e){var t=this._currentElement.props,n="<"+this._tag;for(var r in t)if(t.hasOwnProperty(r)){var i=t[r];if(null!=i)if(b.hasOwnProperty(r))o(this._rootNodeID,r,i,e);else{r===x&&(i&&(i=this._previousStyleCopy=m({},t.style)),i=u.createMarkupForStyles(i));var a=l.createMarkupForProperty(r,i);a&&(n+=" "+a)}}if(e.renderToStaticMarkup)return n+">";var s=l.createMarkupForID(this._rootNodeID);return n+" "+s+">"},_createContentMarkup:function(e,t){var n="";("listing"===this._tag||"pre"===this._tag||"textarea"===this._tag)&&(n="\n");var r=this._currentElement.props,o=r.dangerouslySetInnerHTML;if(null!=o){if(null!=o.__html)return n+o.__html}else{var i=_[typeof r.children]?r.children:null,a=null!=i?null:r.children;if(nul
 l!=i)return n+v(i);if(null!=a){var u=this.mountChildren(a,e,t);return n+u.join("")}}return n},receiveComponent:function(e,t,n){var r=this._currentElement;this._currentElement=e,this.updateComponent(t,r,e,n)},updateComponent:function(e,t,n,o){r(this._currentElement.props),this._updateDOMProperties(t.props,e),this._updateDOMChildren(t.props,e,o)},_updateDOMProperties:function(e,t){var n,r,i,a=this._currentElement.props;for(n in e)if(!a.hasOwnProperty(n)&&e.hasOwnProperty(n))if(n===x){var u=this._previousStyleCopy;for(r in u)u.hasOwnProperty(r)&&(i=i||{},i[r]="");this._previousStyleCopy=null}else b.hasOwnProperty(n)?C(this._rootNodeID,n):(s.isStandardName[n]||s.isCustomAttribute(n))&&M.deletePropertyByID(this._rootNodeID,n);for(n in a){var l=a[n],c=n===x?this._previousStyleCopy:e[n];if(a.hasOwnProperty(n)&&l!==c)if(n===x)if(l?l=this._previousStyleCopy=m({},l):this._previousStyleCopy=null,c){for(r in c)!c.hasOwnProperty(r)||l&&l.hasOwnProperty(r)||(i=i||{},i[r]="");for(r in l)l.hasOwnPr
 operty(r)&&c[r]!==l[r]&&(i=i||{},i[r]=l[r])}else i=l;else b.hasOwnProperty(n)?o(this._rootNodeID,n,l,t):(s.isStandardName[n]||s.isCustomAttribute(n))&&M.updatePropertyByID(this._rootNodeID,n,l)}i&&M.updateStylesByID(this._rootNodeID,i)},_updateDOMChildren:function(e,t,n){var r=this._currentElement.props,o=_[typeof e.children]?e.children:null,i=_[typeof r.children]?r.children:null,a=e.dangerouslySetInnerHTML&&e.dangerouslySetInnerHTML.__html,u=r.dangerouslySetInnerHTML&&r.dangerouslySetInnerHTML.__html,s=null!=o?null:e.children,l=null!=i?null:r.children,c=null!=o||null!=a,p=null!=i||null!=u;null!=s&&null==l?this.updateChildren(null,t,n):c&&!p&&this.updateTextContent(""),null!=i?o!==i&&this.updateTextContent(""+i):null!=u?a!==u&&M.updateInnerHTMLByID(this._rootNodeID,u):null!=l&&this.updateChildren(l,t,n)},unmountComponent:function(){this.unmountChildren(),c.deleteAllListeners(this._rootNodeID),p.unmountIDFromEnvironment(this._rootNodeID),this._rootNodeID=null}},h.measureMethods(a,"Re
 actDOMComponent",{mountComponent:"mountComponent",updateComponent:"updateComponent"}),m(a.prototype,a.Mixin,f.Mixin),a.injection={injectIDOperations:function(e){a.BackendIDOperations=M=e}},t.exports=a},{10:10,11:11,114:114,133:133,134:134,139:139,150:150,27:27,30:30,35:35,5:5,68:68,69:69,73:73}],43:[function(e,t,n){"use strict";var r=e(15),o=e(25),i=e(29),a=e(33),u=e(55),s=u.createFactory("form"),l=a.createClass({displayName:"ReactDOMForm",tagName:"FORM",mixins:[i,o],render:function(){return s(this.props)},componentDidMount:function(){this.trapBubbledEvent(r.topLevelTypes.topReset,"reset"),this.trapBubbledEvent(r.topLevelTypes.topSubmit,"submit")}});t.exports=l},{15:15,25:25,29:29,33:33,55:55}],44:[function(e,t,n){"use strict";var r=e(5),o=e(9),i=e(11),a=e(68),u=e(73),s=e(133),l=e(144),c={dangerouslySetInnerHTML:"`dangerouslySetInnerHTML` must be set using `updateInnerHTMLByID()`.",style:"`style` must be set using `updateStylesByID()`."},p={updatePropertyByID:function(e,t,n){var r=a
 .getNode(e);s(!c.hasOwnProperty(t)),null!=n?i.setValueForProperty(r,t,n):i.deleteValueForProperty(r,t)},deletePropertyByID:function(e,t,n){var r=a.getNode(e);s(!c.hasOwnProperty(t)),i.deleteValueForProperty(r,t,n)},updateStylesByID:function(e,t){var n=a.getNode(e);r.setValueForStyles(n,t)},updateInnerHTMLByID:function(e,t){var n=a.getNode(e);l(n,t)},updateTextContentByID:function(e,t){var n=a.getNode(e);o.updateTextContent(n,t)},dangerouslyReplaceNodeWithMarkupByID:function(e,t){var n=a.getNode(e);o.dangerouslyReplaceNodeWithMarkup(n,t)},dangerouslyProcessChildrenUpdates:function(e,t){for(var n=0;n<e.length;n++)e[n].parentNode=a.getNode(e[n].parentID);o.processUpdates(e,t)}};u.measureMethods(p,"ReactDOMIDOperations",{updatePropertyByID:"updatePropertyByID",deletePropertyByID:"deletePropertyByID",updateStylesByID:"updateStylesByID",updateInnerHTMLByID:"updateInnerHTMLByID",updateTextContentByID:"updateTextContentByID",dangerouslyReplaceNodeWithMarkupByID:"dangerouslyReplaceNodeWithMa
 rkupByID",dangerouslyProcessChildrenUpdates:"dangerouslyProcessChildrenUpdates"}),t.exports=p},{11:11,133:133,144:144,5:5,68:68,73:73,9:9}],45:[function(e,t,n){"use strict";var r=e(15),o=e(25),i=e(29),a=e(33),u=e(55),s=u.createFactory("iframe"),l=a.createClass({displayName:"ReactDOMIframe",tagName:"IFRAME",mixins:[i,o],render:function(){return s(this.props)},componentDidMount:function(){this.trapBubbledEvent(r.topLevelTypes.topLoad,"load")}});t.exports=l},{15:15,25:25,29:29,33:33,55:55}],46:[function(e,t,n){"use strict";var r=e(15),o=e(25),i=e(29),a=e(33),u=e(55),s=u.createFactory("img"),l=a.createClass({displayName:"ReactDOMImg",tagName:"IMG",mixins:[i,o],render:function(){return s(this.props)},componentDidMount:function(){this.trapBubbledEvent(r.topLevelTypes.topLoad,"load"),this.trapBubbledEvent(r.topLevelTypes.topError,"error")}});t.exports=l},{15:15,25:25,29:29,33:33,55:55}],47:[function(e,t,n){"use strict";function r(){this.isMounted()&&this.forceUpdate()}var o=e(2),i=e(11),a=
 e(24),u=e(29),s=e(33),l=e(55),c=e(68),p=e(85),d=e(27),f=e(133),h=l.createFactory("input"),m={},v=s.createClass({displayName:"ReactDOMInput",tagName:"INPUT",mixins:[o,a.Mixin,u],getInitialState:function(){var e=this.props.defaultValue;return{initialChecked:this.props.defaultChecked||!1,initialValue:null!=e?e:null}},render:function(){var e=d({},this.props);e.defaultChecked=null,e.defaultValue=null;var t=a.getValue(this);e.value=null!=t?t:this.state.initialValue;var n=a.getChecked(this);return e.checked=null!=n?n:this.state.initialChecked,e.onChange=this._handleChange,h(e,this.props.children)},componentDidMount:function(){var e=c.getID(this.getDOMNode());m[e]=this},componentWillUnmount:function(){var e=this.getDOMNode(),t=c.getID(e);delete m[t]},componentDidUpdate:function(e,t,n){var r=this.getDOMNode();null!=this.props.checked&&i.setValueForProperty(r,"checked",this.props.checked||!1);var o=a.getValue(this);null!=o&&i.setValueForProperty(r,"value",""+o)},_handleChange:function(e){var 
 t,n=a.getOnChange(this);n&&(t=n.call(this,e)),p.asap(r,this);var o=this.props.name;if("radio"===this.props.type&&null!=o){for(var i=this.getDOMNode(),u=i;u.parentNode;)u=u.parentNode;for(var s=u.querySelectorAll("input[name="+JSON.stringify(""+o)+'][type="radio"]'),l=0,d=s.length;d>l;l++){var h=s[l];if(h!==i&&h.form===i.form){var v=c.getID(h);f(v);var g=m[v];f(g),p.asap(r,g)}}}return t}});t.exports=v},{11:11,133:133,2:2,24:24,27:27,29:29,33:33,55:55,68:68,85:85}],48:[function(e,t,n){"use strict";var r=e(29),o=e(33),i=e(55),a=(e(150),i.createFactory("option")),u=o.createClass({displayName:"ReactDOMOption",tagName:"OPTION",mixins:[r],componentWillMount:function(){},render:function(){return a(this.props,this.props.children)}});t.exports=u},{150:150,29:29,33:33,55:55}],49:[function(e,t,n){"use strict";function r(){if(this._pendingUpdate){this._pendingUpdate=!1;var e=u.getValue(this);null!=e&&this.isMounted()&&i(this,e)}}function o(e,t,n){if(null==e[t])return null;if(e.multiple){if(!Arra
 y.isArray(e[t]))return new Error("The `"+t+"` prop supplied to <select> must be an array if `multiple` is true.")}else if(Array.isArray(e[t]))return new Error("The `"+t+"` prop supplied to <select> must be a scalar value if `multiple` is false.")}function i(e,t){var n,r,o,i=e.getDOMNode().options;if(e.props.multiple){for(n={},r=0,o=t.length;o>r;r++)n[""+t[r]]=!0;for(r=0,o=i.length;o>r;r++){var a=n.hasOwnProperty(i[r].value);i[r].selected!==a&&(i[r].selected=a)}}else{for(n=""+t,r=0,o=i.length;o>r;r++)if(i[r].value===n)return void(i[r].selected=!0);i.length&&(i[0].selected=!0)}}var a=e(2),u=e(24),s=e(29),l=e(33),c=e(55),p=e(85),d=e(27),f=c.createFactory("select"),h=l.createClass({displayName:"ReactDOMSelect",tagName:"SELECT",mixins:[a,u.Mixin,s],propTypes:{defaultValue:o,value:o},render:function(){var e=d({},this.props);return e.onChange=this._handleChange,e.value=null,f(e,this.props.children)},componentWillMount:function(){this._pendingUpdate=!1},componentDidMount:function(){var e=u.
 getValue(this);null!=e?i(this,e):null!=this.props.defaultValue&&i(this,this.props.defaultValue)},componentDidUpdate:function(e){var t=u.getValue(this);null!=t?(this._pendingUpdate=!1,i(this,t)):!e.multiple!=!this.props.multiple&&(null!=this.props.defaultValue?i(this,this.props.defaultValue):i(this,this.props.multiple?[]:""))},_handleChange:function(e){var t,n=u.getOnChange(this);return n&&(t=n.call(this,e)),this._pendingUpdate=!0,p.asap(r,this),t}});t.exports=h},{2:2,24:24,27:27,29:29,33:33,55:55,85:85}],50:[function(e,t,n){"use strict";function r(e,t,n,r){return e===n&&t===r}function o(e){var t=document.selection,n=t.createRange(),r=n.text.length,o=n.duplicate();o.moveToElementText(e),o.setEndPoint("EndToStart",n);var i=o.text.length,a=i+r;return{start:i,end:a}}function i(e){var t=window.getSelection&&window.getSelection();if(!t||0===t.rangeCount)return null;var n=t.anchorNode,o=t.anchorOffset,i=t.focusNode,a=t.focusOffset,u=t.getRangeAt(0),s=r(t.anchorNode,t.anchorOffset,t.focusNo
 de,t.focusOffset),l=s?0:u.toString().length,c=u.cloneRange();c.selectNodeContents(e),c.setEnd(u.startContainer,u.startOffset);var p=r(c.startContainer,c.startOffset,c.endContainer,c.endOffset),d=p?0:c.toString().length,f=d+l,h=document.createRange();h.setStart(n,o),h.setEnd(i,a);var m=h.collapsed;return{start:m?f:d,end:m?d:f}}function a(e,t){var n,r,o=document.selection.createRange().duplicate();"undefined"==typeof t.end?(n=t.start,r=n):t.start>t.end?(n=t.end,r=t.start):(n=t.start,r=t.end),o.moveToElementText(e),o.moveStart("character",n),o.setEndPoint("EndToStart",o),o.moveEnd("character",r-n),o.select()}function u(e,t){if(window.getSelection){var n=window.getSelection(),r=e[c()].length,o=Math.min(t.start,r),i="undefined"==typeof t.end?o:Math.min(t.end,r);if(!n.extend&&o>i){var a=i;i=o,o=a}var u=l(e,o),s=l(e,i);if(u&&s){var p=document.createRange();p.setStart(u.node,u.offset),n.removeAllRanges(),o>i?(n.addRange(p),n.extend(s.node,s.offset)):(p.setEnd(s.node,s.offset),n.addRange(p))
 }}}var s=e(21),l=e(126),c=e(128),p=s.canUseDOM&&"selection"in document&&!("getSelection"in window),d={getOffsets:p?o:i,setOffsets:p?a:u};t.exports=d},{126:126,128:128,21:21}],51:[function(e,t,n){"use strict";var r=e(11),o=e(35),i=e(42),a=e(27),u=e(114),s=function(e){};a(s.prototype,{construct:function(e){this._currentElement=e,this._stringText=""+e,this._rootNodeID=null,this._mountIndex=0},mountComponent:function(e,t,n){this._rootNodeID=e;var o=u(this._stringText);return t.renderToStaticMarkup?o:"<span "+r.createMarkupForID(e)+">"+o+"</span>"},receiveComponent:function(e,t){if(e!==this._currentElement){this._currentElement=e;var n=""+e;n!==this._stringText&&(this._stringText=n,i.BackendIDOperations.updateTextContentByID(this._rootNodeID,n))}},unmountComponent:function(){o.unmountIDFromEnvironment(this._rootNodeID)}}),t.exports=s},{11:11,114:114,27:27,35:35,42:42}],52:[function(e,t,n){"use strict";function r(){this.isMounted()&&this.forceUpdate()}var o=e(2),i=e(11),a=e(24),u=e(29),s=
 e(33),l=e(55),c=e(85),p=e(27),d=e(133),f=(e(150),l.createFactory("textarea")),h=s.createClass({displayName:"ReactDOMTextarea",tagName:"TEXTAREA",mixins:[o,a.Mixin,u],getInitialState:function(){var e=this.props.defaultValue,t=this.props.children;null!=t&&(d(null==e),Array.isArray(t)&&(d(t.length<=1),t=t[0]),e=""+t),null==e&&(e="");var n=a.getValue(this);return{initialValue:""+(null!=n?n:e)}},render:function(){var e=p({},this.props);return d(null==e.dangerouslySetInnerHTML),e.defaultValue=null,e.value=null,e.onChange=this._handleChange,f(e,this.state.initialValue)},componentDidUpdate:function(e,t,n){var r=a.getValue(this);if(null!=r){var o=this.getDOMNode();i.setValueForProperty(o,"value",""+r)}},_handleChange:function(e){var t,n=a.getOnChange(this);return n&&(t=n.call(this,e)),c.asap(r,this),t}});t.exports=h},{11:11,133:133,150:150,2:2,24:24,27:27,29:29,33:33,55:55,85:85}],53:[function(e,t,n){"use strict";function r(){this.reinitializeTransaction()}var o=e(85),i=e(101),a=e(27),u=e(11
 2),s={initialize:u,close:function(){d.isBatchingUpdates=!1}},l={initialize:u,close:o.flushBatchedUpdates.bind(o)},c=[l,s];a(r.prototype,i.Mixin,{getTransactionWrappers:function(){return c}});var p=new r,d={isBatchingUpdates:!1,batchedUpdates:function(e,t,n,r,o){var i=d.isBatchingUpdates;d.isBatchingUpdates=!0,i?e(t,n,r,o):p.perform(e,null,t,n,r,o)}};t.exports=d},{101:101,112:112,27:27,85:85}],54:[function(e,t,n){"use strict";function r(e){return h.createClass({tagName:e.toUpperCase(),render:function(){return new T(e,null,null,null,null,this.props)}})}function o(){P.EventEmitter.injectReactEventListener(R),P.EventPluginHub.injectEventPluginOrder(s),P.EventPluginHub.injectInstanceHandle(w),P.EventPluginHub.injectMount(O),P.EventPluginHub.injectEventPluginsByName({SimpleEventPlugin:L,EnterLeaveEventPlugin:l,ChangeEventPlugin:a,MobileSafariClickEventPlugin:d,SelectEventPlugin:A,BeforeInputEventPlugin:i}),P.NativeComponent.injectGenericComponentClass(g),P.NativeComponent.injectTextCompon
 entClass(I),P.NativeComponent.injectAutoWrapper(r),P.Class.injectMixin(f),P.NativeComponent.injectComponentClasses({button:y,form:C,iframe:_,img:E,input:x,option:D,select:M,textarea:N,html:F("html"),head:F("head"),body:F("body")}),P.DOMProperty.injectDOMPropertyConfig(p),P.DOMProperty.injectDOMPropertyConfig(U),P.EmptyComponent.injectEmptyComponent("noscript"),P.Updates.injectReconcileTransaction(S),P.Updates.injectBatchingStrategy(v),P.RootIndex.injectCreateReactRootIndex(c.canUseDOM?u.createReactRootIndex:k.createReactRootIndex),P.Component.injectEnvironment(m),P.DOMComponent.injectIDOperations(b)}var i=e(3),a=e(7),u=e(8),s=e(13),l=e(14),c=e(21),p=e(23),d=e(26),f=e(29),h=e(33),m=e(35),v=e(53),g=e(42),y=e(41),C=e(43),E=e(46),b=e(44),_=e(45),x=e(47),D=e(48),M=e(49),N=e(52),I=e(51),T=e(55),R=e(60),P=e(62),w=e(64),O=e(68),S=e(78),A=e(87),k=e(88),L=e(89),U=e(86),F=e(109);t.exports={inject:o}},{109:109,13:13,14:14,21:21,23:23,26:26,29:29,3:3,33:33,35:35,41:41,42:42,43:43,44:44,45:45,46:
 46,47:47,48:48,49:49,51:51,52:52,53:53,55:55,60:60,62:62,64:64,68:68,7:7,78:78,8:8,86:86,87:87,88:88,
+89:89}],55:[function(e,t,n){"use strict";var r=e(38),o=e(39),i=e(27),a=(e(150),{key:!0,ref:!0}),u=function(e,t,n,r,o,i){this.type=e,this.key=t,this.ref=n,this._owner=r,this._context=o,this.props=i};u.prototype={_isReactElement:!0},u.createElement=function(e,t,n){var i,s={},l=null,c=null;if(null!=t){c=void 0===t.ref?null:t.ref,l=void 0===t.key?null:""+t.key;for(i in t)t.hasOwnProperty(i)&&!a.hasOwnProperty(i)&&(s[i]=t[i])}var p=arguments.length-2;if(1===p)s.children=n;else if(p>1){for(var d=Array(p),f=0;p>f;f++)d[f]=arguments[f+2];s.children=d}if(e&&e.defaultProps){var h=e.defaultProps;for(i in h)"undefined"==typeof s[i]&&(s[i]=h[i])}return new u(e,l,c,o.current,r.current,s)},u.createFactory=function(e){var t=u.createElement.bind(null,e);return t.type=e,t},u.cloneAndReplaceProps=function(e,t){var n=new u(e.type,e.key,e.ref,e._owner,e._context,t);return n},u.cloneElement=function(e,t,n){var r,s=i({},e.props),l=e.key,c=e.ref,p=e._owner;if(null!=t){void 0!==t.ref&&(c=t.ref,p=o.current),
 void 0!==t.key&&(l=""+t.key);for(r in t)t.hasOwnProperty(r)&&!a.hasOwnProperty(r)&&(s[r]=t[r])}var d=arguments.length-2;if(1===d)s.children=n;else if(d>1){for(var f=Array(d),h=0;d>h;h++)f[h]=arguments[h+2];s.children=f}return new u(e.type,l,c,p,e._context,s)},u.isValidElement=function(e){var t=!(!e||!e._isReactElement);return t},t.exports=u},{150:150,27:27,38:38,39:39}],56:[function(e,t,n){"use strict";function r(){if(y.current){var e=y.current.getName();if(e)return" Check the render method of `"+e+"`."}return""}function o(e){var t=e&&e.getPublicInstance();if(!t)return void 0;var n=t.constructor;return n?n.displayName||n.name||void 0:void 0}function i(){var e=y.current;return e&&o(e)||void 0}function a(e,t){e._store.validated||null!=e.key||(e._store.validated=!0,s('Each child in an array or iterator should have a unique "key" prop.',e,t))}function u(e,t,n){D.test(e)&&s("Child objects should have non-numeric keys so ordering is preserved.",t,n)}function s(e,t,n){var r=i(),a="string"=
 =typeof n?n:n.displayName||n.name,u=r||a,s=_[e]||(_[e]={});if(!s.hasOwnProperty(u)){s[u]=!0;var l="";if(t&&t._owner&&t._owner!==y.current){var c=o(t._owner);l=" It was passed a child from "+c+"."}}}function l(e,t){if(Array.isArray(e))for(var n=0;n<e.length;n++){var r=e[n];m.isValidElement(r)&&a(r,t)}else if(m.isValidElement(e))e._store.validated=!0;else if(e){var o=E(e);if(o){if(o!==e.entries)for(var i,s=o.call(e);!(i=s.next()).done;)m.isValidElement(i.value)&&a(i.value,t)}else if("object"==typeof e){var l=v.extractIfFragment(e);for(var c in l)l.hasOwnProperty(c)&&u(c,l[c],t)}}}function c(e,t,n,o){for(var i in t)if(t.hasOwnProperty(i)){var a;try{b("function"==typeof t[i]),a=t[i](n,i,e,o)}catch(u){a=u}a instanceof Error&&!(a.message in x)&&(x[a.message]=!0,r(this))}}function p(e,t){var n=t.type,r="string"==typeof n?n:n.displayName,o=t._owner?t._owner.getPublicInstance().constructor.displayName:null,i=e+"|"+r+"|"+o;if(!M.hasOwnProperty(i)){M[i]=!0;var a="";r&&(a=" <"+r+" />");var u=""
 ;o&&(u=" The element was created by "+o+".")}}function d(e,t){return e!==e?t!==t:0===e&&0===t?1/e===1/t:e===t}function f(e){if(e._store){var t=e._store.originalProps,n=e.props;for(var r in n)n.hasOwnProperty(r)&&(t.hasOwnProperty(r)&&d(t[r],n[r])||(p(r,e),t[r]=n[r]))}}function h(e){if(null!=e.type){var t=C.getComponentClassForElement(e),n=t.displayName||t.name;t.propTypes&&c(n,t.propTypes,e.props,g.prop),"function"==typeof t.getDefaultProps}}var m=e(55),v=e(61),g=e(75),y=(e(74),e(39)),C=e(71),E=e(124),b=e(133),_=(e(150),{}),x={},D=/^\d+$/,M={},N={checkAndWarnForMutatedProps:f,createElement:function(e,t,n){var r=m.createElement.apply(this,arguments);if(null==r)return r;for(var o=2;o<arguments.length;o++)l(arguments[o],e);return h(r),r},createFactory:function(e){var t=N.createElement.bind(null,e);return t.type=e,t},cloneElement:function(e,t,n){for(var r=m.cloneElement.apply(this,arguments),o=2;o<arguments.length;o++)l(arguments[o],r.type);return h(r),r}};t.exports=N},{124:124,133:133,
 150:150,39:39,55:55,61:61,71:71,74:74,75:75}],57:[function(e,t,n){"use strict";function r(e){c[e]=!0}function o(e){delete c[e]}function i(e){return!!c[e]}var a,u=e(55),s=e(65),l=e(133),c={},p={injectEmptyComponent:function(e){a=u.createFactory(e)}},d=function(){};d.prototype.componentDidMount=function(){var e=s.get(this);e&&r(e._rootNodeID)},d.prototype.componentWillUnmount=function(){var e=s.get(this);e&&o(e._rootNodeID)},d.prototype.render=function(){return l(a),a()};var f=u.createElement(d),h={emptyElement:f,injection:p,isNullComponentID:i};t.exports=h},{133:133,55:55,65:65}],58:[function(e,t,n){"use strict";var r={guard:function(e,t){return e}};t.exports=r},{}],59:[function(e,t,n){"use strict";function r(e){o.enqueueEvents(e),o.processEventQueue()}var o=e(17),i={handleTopLevel:function(e,t,n,i){var a=o.extractEvents(e,t,n,i);r(a)}};t.exports=i},{17:17}],60:[function(e,t,n){"use strict";function r(e){var t=p.getID(e),n=c.getReactRootIDFromNodeID(t),r=p.findReactContainerForID(n),
 o=p.getFirstReactDOM(r);return o}function o(e,t){this.topLevelType=e,this.nativeEvent=t,this.ancestors=[]}function i(e){for(var t=p.getFirstReactDOM(h(e.nativeEvent))||window,n=t;n;)e.ancestors.push(n),n=r(n);for(var o=0,i=e.ancestors.length;i>o;o++){t=e.ancestors[o];var a=p.getID(t)||"";v._handleTopLevel(e.topLevelType,t,a,e.nativeEvent)}}function a(e){var t=m(window);e(t)}var u=e(16),s=e(21),l=e(28),c=e(64),p=e(68),d=e(85),f=e(27),h=e(123),m=e(129);f(o.prototype,{destructor:function(){this.topLevelType=null,this.nativeEvent=null,this.ancestors.length=0}}),l.addPoolingTo(o,l.twoArgumentPooler);var v={_enabled:!0,_handleTopLevel:null,WINDOW_HANDLE:s.canUseDOM?window:null,setHandleTopLevel:function(e){v._handleTopLevel=e},setEnabled:function(e){v._enabled=!!e},isEnabled:function(){return v._enabled},trapBubbledEvent:function(e,t,n){var r=n;return r?u.listen(r,t,v.dispatchEvent.bind(null,e)):null},trapCapturedEvent:function(e,t,n){var r=n;return r?u.capture(r,t,v.dispatchEvent.bind(nu
 ll,e)):null},monitorScrollValue:function(e){var t=a.bind(null,e);u.listen(window,"scroll",t)},dispatchEvent:function(e,t){if(v._enabled){var n=o.getPooled(e,t);try{d.batchedUpdates(i,n)}finally{o.release(n)}}}};t.exports=v},{123:123,129:129,16:16,21:21,27:27,28:28,64:64,68:68,85:85}],61:[function(e,t,n){"use strict";var r=(e(55),e(150),{create:function(e){return e},extract:function(e){return e},extractIfFragment:function(e){return e}});t.exports=r},{150:150,55:55}],62:[function(e,t,n){"use strict";var r=e(10),o=e(17),i=e(36),a=e(33),u=e(57),s=e(30),l=e(71),c=e(42),p=e(73),d=e(81),f=e(85),h={Component:i.injection,Class:a.injection,DOMComponent:c.injection,DOMProperty:r.injection,EmptyComponent:u.injection,EventPluginHub:o.injection,EventEmitter:s.injection,NativeComponent:l.injection,Perf:p.injection,RootIndex:d.injection,Updates:f.injection};t.exports=h},{10:10,17:17,30:30,33:33,36:36,42:42,57:57,71:71,73:73,81:81,85:85}],63:[function(e,t,n){"use strict";function r(e){return i(docum
 ent.documentElement,e)}var o=e(50),i=e(107),a=e(117),u=e(119),s={hasSelectionCapabilities:function(e){return e&&("INPUT"===e.nodeName&&"text"===e.type||"TEXTAREA"===e.nodeName||"true"===e.contentEditable)},getSelectionInformation:function(){var e=u();return{focusedElem:e,selectionRange:s.hasSelectionCapabilities(e)?s.getSelection(e):null}},restoreSelection:function(e){var t=u(),n=e.focusedElem,o=e.selectionRange;t!==n&&r(n)&&(s.hasSelectionCapabilities(n)&&s.setSelection(n,o),a(n))},getSelection:function(e){var t;if("selectionStart"in e)t={start:e.selectionStart,end:e.selectionEnd};else if(document.selection&&"INPUT"===e.nodeName){var n=document.selection.createRange();n.parentElement()===e&&(t={start:-n.moveStart("character",-e.value.length),end:-n.moveEnd("character",-e.value.length)})}else t=o.getOffsets(e);return t||{start:0,end:0}},setSelection:function(e,t){var n=t.start,r=t.end;if("undefined"==typeof r&&(r=n),"selectionStart"in e)e.selectionStart=n,e.selectionEnd=Math.min(r,e
 .value.length);else if(document.selection&&"INPUT"===e.nodeName){var i=e.createTextRange();i.collapse(!0),i.moveStart("character",n),i.moveEnd("character",r-n),i.select()}else o.setOffsets(e,t)}};t.exports=s},{107:107,117:117,119:119,50:50}],64:[function(e,t,n){"use strict";function r(e){return f+e.toString(36)}function o(e,t){return e.charAt(t)===f||t===e.length}function i(e){return""===e||e.charAt(0)===f&&e.charAt(e.length-1)!==f}function a(e,t){return 0===t.indexOf(e)&&o(t,e.length)}function u(e){return e?e.substr(0,e.lastIndexOf(f)):""}function s(e,t){if(d(i(e)&&i(t)),d(a(e,t)),e===t)return e;var n,r=e.length+h;for(n=r;n<t.length&&!o(t,n);n++);return t.substr(0,n)}function l(e,t){var n=Math.min(e.length,t.length);if(0===n)return"";for(var r=0,a=0;n>=a;a++)if(o(e,a)&&o(t,a))r=a;else if(e.charAt(a)!==t.charAt(a))break;var u=e.substr(0,r);return d(i(u)),u}function c(e,t,n,r,o,i){e=e||"",t=t||"",d(e!==t);var l=a(t,e);d(l||a(e,t));for(var c=0,p=l?u:s,f=e;;f=p(f,t)){var h;if(o&&f===e|
 |i&&f===t||(h=n(f,l,r)),h===!1||f===t)break;d(c++<m)}}var p=e(81),d=e(133),f=".",h=f.length,m=100,v={createReactRootID:function(){return r(p.createReactRootIndex())},createReactID:function(e,t){return e+t},getReactRootIDFromNodeID:function(e){if(e&&e.charAt(0)===f&&e.length>1){var t=e.indexOf(f,1);return t>-1?e.substr(0,t):e}return null},traverseEnterLeave:function(e,t,n,r,o){var i=l(e,t);i!==e&&c(e,i,n,r,!1,!0),i!==t&&c(i,t,n,o,!0,!1)},traverseTwoPhase:function(e,t,n){e&&(c("",e,t,n,!0,!1),c(e,"",t,n,!1,!0))},traverseAncestors:function(e,t,n){c("",e,t,n,!0,!1)},_getFirstCommonAncestorID:l,_getNextDescendantID:s,isAncestorIDOf:a,SEPARATOR:f};t.exports=v},{133:133,81:81}],65:[function(e,t,n){"use strict";var r={remove:function(e){e._reactInternalInstance=void 0},get:function(e){return e._reactInternalInstance},has:function(e){return void 0!==e._reactInternalInstance},set:function(e,t){e._reactInternalInstance=t}};t.exports=r},{}],66:[function(e,t,n){"use strict";var r={currentlyMount
 ingInstance:null,currentlyUnmountingInstance:null};t.exports=r},{}],67:[function(e,t,n){"use strict";var r=e(104),o={CHECKSUM_ATTR_NAME:"data-react-checksum",addChecksumToMarkup:function(e){var t=r(e);return e.replace(">"," "+o.CHECKSUM_ATTR_NAME+'="'+t+'">')},canReuseMarkup:function(e,t){var n=t.getAttribute(o.CHECKSUM_ATTR_NAME);n=n&&parseInt(n,10);var i=r(e);return i===n}};t.exports=o},{104:104}],68:[function(e,t,n){"use strict";function r(e,t){for(var n=Math.min(e.length,t.length),r=0;n>r;r++)if(e.charAt(r)!==t.charAt(r))return r;return e.length===t.length?-1:n}function o(e){var t=R(e);return t&&K.getID(t)}function i(e){var t=a(e);if(t)if(L.hasOwnProperty(t)){var n=L[t];n!==e&&(w(!c(n,t)),L[t]=e)}else L[t]=e;return t}function a(e){return e&&e.getAttribute&&e.getAttribute(k)||""}function u(e,t){var n=a(e);n!==t&&delete L[n],e.setAttribute(k,t),L[t]=e}function s(e){return L.hasOwnProperty(e)&&c(L[e],e)||(L[e]=K.findReactNodeByID(e)),L[e]}function l(e){var t=b.get(e)._rootNodeID;re
 turn C.isNullComponentID(t)?null:(L.hasOwnProperty(t)&&c(L[t],t)||(L[t]=K.findReactNodeByID(t)),L[t])}function c(e,t){if(e){w(a(e)===t);var n=K.findReactContainerForID(t);if(n&&T(n,e))return!0}return!1}function p(e){delete L[e]}function d(e){var t=L[e];return t&&c(t,e)?void(W=t):!1}function f(e){W=null,E.traverseAncestors(e,d);var t=W;return W=null,t}function h(e,t,n,r,o){var i=D.mountComponent(e,t,r,I);e._isTopLevel=!0,K._mountImageIntoNode(i,n,o)}function m(e,t,n,r){var o=N.ReactReconcileTransaction.getPooled();o.perform(h,null,e,t,n,o,r),N.ReactReconcileTransaction.release(o)}var v=e(10),g=e(30),y=(e(39),e(55)),C=(e(56),e(57)),E=e(64),b=e(65),_=e(67),x=e(73),D=e(79),M=e(84),N=e(85),I=e(113),T=e(107),R=e(127),P=e(132),w=e(133),O=e(144),S=e(147),A=(e(150),E.SEPARATOR),k=v.ID_ATTRIBUTE_NAME,L={},U=1,F=9,B={},V={},j=[],W=null,K={_instancesByReactRootID:B,scrollMonitor:function(e,t){t()},_updateRootComponent:function(e,t,n,r){return K.scrollMonitor(n,function(){M.enqueueElementInterna
 l(e,t),r&&M.enqueueCallbackInternal(e,r)}),e},_registerComponent:function(e,t){w(t&&(t.nodeType===U||t.nodeType===F)),g.ensureScrollValueMonitoring();var n=K.registerContainer(t);return B[n]=e,n},_renderNewRootComponent:function(e,t,n){var r=P(e,null),o=K._registerComponent(r,t);return N.batchedUpdates(m,r,o,t,n),r},render:function(e,t,n){w(y.isValidElement(e));var r=B[o(t)];if(r){var i=r._currentElement;if(S(i,e))return K._updateRootComponent(r,e,t,n).getPublicInstance();K.unmountComponentAtNode(t)}var a=R(t),u=a&&K.isRenderedByReact(a),s=u&&!r,l=K._renderNewRootComponent(e,t,s).getPublicInstance();return n&&n.call(l),l},constructAndRenderComponent:function(e,t,n){var r=y.createElement(e,t);return K.render(r,n)},constructAndRenderComponentByID:function(e,t,n){var r=document.getElementById(n);return w(r),K.constructAndRenderComponent(e,t,r)},registerContainer:function(e){var t=o(e);return t&&(t=E.getReactRootIDFromNodeID(t)),t||(t=E.createReactRootID()),V[t]=e,t},unmountComponentAtN
 ode:function(e){w(e&&(e.nodeType===U||e.nodeType===F));var t=o(e),n=B[t];return n?(K.unmountComponentFromNode(n,e),delete B[t],delete V[t],!0):!1},unmountComponentFromNode:function(e,t){for(D.unmountComponent(e),t.nodeType===F&&(t=t.documentElement);t.lastChild;)t.removeChild(t.lastChild)},findReactContainerForID:function(e){var t=E.getReactRootIDFromNodeID(e),n=V[t];return n},findReactNodeByID:function(e){var t=K.findReactContainerForID(e);return K.findComponentRoot(t,e)},isRenderedByReact:function(e){if(1!==e.nodeType)return!1;var t=K.getID(e);return t?t.charAt(0)===A:!1},getFirstReactDOM:function(e){for(var t=e;t&&t.parentNode!==t;){if(K.isRenderedByReact(t))return t;t=t.parentNode}return null},findComponentRoot:function(e,t){var n=j,r=0,o=f(t)||e;for(n[0]=o.firstChild,n.length=1;r<n.length;){for(var i,a=n[r++];a;){var u=K.getID(a);u?t===u?i=a:E.isAncestorIDOf(u,t)&&(n.length=r=0,n.push(a.firstChild)):n.push(a.firstChild),a=a.nextSibling}if(i)return n.length=0,i}n.length=0,w(!1)}
 ,_mountImageIntoNode:function(e,t,n){if(w(t&&(t.nodeType===U||t.nodeType===F)),n){var o=R(t);if(_.canReuseMarkup(e,o))return;var i=o.getAttribute(_.CHECKSUM_ATTR_NAME);o.removeAttribute(_.CHECKSUM_ATTR_NAME);var a=o.outerHTML;o.setAttribute(_.CHECKSUM_ATTR_NAME,i);var u=r(e,a);" (client) "+e.substring(u-20,u+20)+"\n (server) "+a.substring(u-20,u+20),w(t.nodeType!==F)}w(t.nodeType!==F),O(t,e)},getReactRootID:o,getID:i,setID:u,getNode:s,getNodeFromInstance:l,purgeID:p};x.measureMethods(K,"ReactMount",{_renderNewRootComponent:"_renderNewRootComponent",_mountImageIntoNode:"_mountImageIntoNode"}),t.exports=K},{10:10,107:107,113:113,127:127,132:132,133:133,144:144,147:147,150:150,30:30,39:39,55:55,56:56,57:57,64:64,65:65,67:67,73:73,79:79,84:84,85:85}],69:[function(e,t,n){"use strict";function r(e,t,n){h.push({parentID:e,parentNode:null,type:c.INSERT_MARKUP,markupIndex:m.push(t)-1,textContent:null,fromIndex:null,toIndex:n})}function o(e,t,n){h.push({parentID:e,parentNode:null,type:c.MOVE_
 EXISTING,markupIndex:null,textContent:null,fromIndex:t,toIndex:n})}function i(e,t){h.push({parentID:e,parentNode:null,type:c.REMOVE_NODE,markupIndex:null,textContent:null,fromIndex:t,toIndex:null})}function a(e,t){h.push({parentID:e,parentNode:null,type:c.TEXT_CONTENT,markupIndex:null,textContent:t,fromIndex:null,toIndex:null})}function u(){h.length&&(l.processChildrenUpdates(h,m),s())}function s(){h.length=0,m.length=0}var l=e(36),c=e(70),p=e(79),d=e(31),f=0,h=[],m=[],v={Mixin:{mountChildren:function(e,t,n){var r=d.instantiateChildren(e,t,n);this._renderedChildren=r;var o=[],i=0;for(var a in r)if(r.hasOwnProperty(a)){var u=r[a],s=this._rootNodeID+a,l=p.mountComponent(u,s,t,n);u._mountIndex=i,o.push(l),i++}return o},updateTextContent:function(e){f++;var t=!0;try{var n=this._renderedChildren;d.unmountChildren(n);for(var r in n)n.hasOwnProperty(r)&&this._unmountChildByName(n[r],r);this.setTextContent(e),t=!1}finally{f--,f||(t?s():u())}},updateChildren:function(e,t,n){f++;var r=!0;try{
 this._updateChildren(e,t,n),r=!1}finally{f--,f||(r?s():u())}},_updateChildren:function(e,t,n){var r=this._renderedChildren,o=d.updateChildren(r,e,t,n);if(this._renderedChildren=o,o||r){var i,a=0,u=0;for(i in o)if(o.hasOwnProperty(i)){var s=r&&r[i],l=o[i];s===l?(this.moveChild(s,u,a),a=Math.max(s._mountIndex,a),s._mountIndex=u):(s&&(a=Math.max(s._mountIndex,a),this._unmountChildByName(s,i)),this._mountChildByNameAtIndex(l,i,u,t,n)),u++}for(i in r)!r.hasOwnProperty(i)||o&&o.hasOwnProperty(i)||this._unmountChildByName(r[i],i)}},unmountChildren:function(){var e=this._renderedChildren;d.unmountChildren(e),this._renderedChildren=null},moveChild:function(e,t,n){e._mountIndex<n&&o(this._rootNodeID,e._mountIndex,t)},createChild:function(e,t){r(this._rootNodeID,t,e._mountIndex)},removeChild:function(e){i(this._rootNodeID,e._mountIndex)},setTextContent:function(e){a(this._rootNodeID,e)},_mountChildByNameAtIndex:function(e,t,n,r,o){var i=this._rootNodeID+t,a=p.mountComponent(e,i,r,o);e._mountIn
 dex=n,this.createChild(e,a)},_unmountChildByName:function(e,t){this.removeChild(e),e._mountIndex=null}}};t.exports=v},{31:31,36:36,70:70,79:79}],70:[function(e,t,n){"use strict";var r=e(138),o=r({INSERT_MARKUP:null,MOVE_EXISTING:null,REMOVE_NODE:null,TEXT_CONTENT:null});t.exports=o},{138:138}],71:[function(e,t,n){"use strict";function r(e){if("function"==typeof e.type)return e.type;var t=e.type,n=p[t];return null==n&&(p[t]=n=l(t)),n}function o(e){return s(c),new c(e.type,e.props)}function i(e){return new d(e)}function a(e){return e instanceof d}var u=e(27),s=e(133),l=null,c=null,p={},d=null,f={injectGenericComponentClass:function(e){c=e},injectTextComponentClass:function(e){d=e},injectComponentClasses:function(e){u(p,e)},injectAutoWrapper:function(e){l=e}},h={getComponentClassForElement:r,createInternalComponent:o,createInstanceForText:i,isTextComponent:a,injection:f};t.exports=h},{133:133,27:27}],72:[function(e,t,n){"use strict";var r=e(133),o={isValidOwner:function(e){return!(!e||
 "function"!=typeof e.attachRef||"function"!=typeof e.detachRef)},addComponentAsRefTo:function(e,t,n){r(o.isValidOwner(n)),n.attachRef(t,e)},removeComponentAsRefFrom:function(e,t,n){r(o.isValidOwner(n)),n.getPublicInstance().refs[t]===e.getPublicInstance()&&n.detachRef(t)}};t.exports=o},{133:133}],73:[function(e,t,n){"use strict";function r(e,t,n){return n}var o={enableMeasure:!1,storedMeasure:r,measureMethods:function(e,t,n){},measure:function(e,t,n){return n},injection:{injectMeasure:function(e){o.storedMeasure=e}}};t.exports=o},{}],74:[function(e,t,n){"use strict";var r={};t.exports=r},{}],75:[function(e,t,n){"use strict";var r=e(138),o=r({prop:null,context:null,childContext:null});t.exports=o},{138:138}],76:[function(e,t,n){"use strict";function r(e){function t(t,n,r,o,i){if(o=o||b,null==n[r]){var a=C[i];return t?new Error("Required "+a+" `"+r+"` was not specified in "+("`"+o+"`.")):null}return e(n,r,o,i)}var n=t.bind(null,!1);return n.isRequired=t.bind(null,!0),n}function o(e){f
 unction t(t,n,r,o){var i=t[n],a=m(i);if(a!==e){var u=C[o],s=v(i);return new Error("Invalid "+u+" `"+n+"` of type `"+s+"` "+("supplied to `"+r+"`, expected `"+e+"`."))}return null}return r(t)}function i(){return r(E.thatReturns(null))}function a(e){function t(t,n,r,o){var i=t[n];if(!Array.isArray(i)){var a=C[o],u=m(i);return new Error("Invalid "+a+" `"+n+"` of type "+("`"+u+"` supplied to `"+r+"`, expected an array."))}for(var s=0;s<i.length;s++){var l=e(i,s,r,o);if(l instanceof Error)return l}return null}return r(t)}function u(){function e(e,t,n,r){if(!g.isValidElement(e[t])){var o=C[r];return new Error("Invalid "+o+" `"+t+"` supplied to "+("`"+n+"`, expected a ReactElement."))}return null}return r(e)}function s(e){function t(t,n,r,o){if(!(t[n]instanceof e)){var i=C[o],a=e.name||b;return new Error("Invalid "+i+" `"+n+"` supplied to "+("`"+r+"`, expected instance of `"+a+"`."))}return null}return r(t)}function l(e){function t(t,n,r,o){for(var i=t[n],a=0;a<e.length;a++)if(i===e[a])ret
 urn null;var u=C[o],s=JSON.stringify(e);return new Error("Invalid "+u+" `"+n+"` of value `"+i+"` "+("supplied to `"+r+"`, expected one of "+s+"."))}return r(t)}function c(e){function t(t,n,r,o){var i=t[n],a=m(i);if("object"!==a){var u=C[o];return new Error("Invalid "+u+" `"+n+"` of type "+("`"+a+"` supplied to `"+r+"`, expected an object."))}for(var s in i)if(i.hasOwnProperty(s)){var l=e(i,s,r,o);if(l instanceof Error)return l}return null}return r(t)}function p(e){function t(t,n,r,o){for(var i=0;i<e.length;i++){var a=e[i];if(null==a(t,n,r,o))return null}var u=C[o];return new Error("Invalid "+u+" `"+n+"` supplied to "+("`"+r+"`."))}return r(t)}function d(){function e(e,t,n,r){if(!h(e[t])){var o=C[r];return new Error("Invalid "+o+" `"+t+"` supplied to "+("`"+n+"`, expected a ReactNode."))}return null}return r(e)}function f(e){function t(t,n,r,o){var i=t[n],a=m(i);if("object"!==a){var u=C[o];return new Error("Invalid "+u+" `"+n+"` of type `"+a+"` "+("supplied to `"+r+"`, expected `obje
 ct`."))}for(var s in e){var l=e[s];if(l){var c=l(i,s,r,o);if(c)return c}}return null}return r(t)}function h(e){switch(typeof e){case"number":case"string":case"undefined":return!0;case"boolean":return!e;case"object":if(Array.isArray(e))return e.every(h);if(null===e||g.isValidElement(e))return!0;e=y.extractIfFragment(e);for(var t in e)if(!h(e[t]))return!1;return!0;default:return!1}}function m(e){var t=typeof e;return Array.isArray(e)?"array":e instanceof RegExp?"object":t}function v(e){var t=m(e);if("object"===t){if(e instanceof Date)return"date";if(e instanceof RegExp)return"regexp"}return t}var g=e(55),y=e(61),C=e(74),E=e(112),b="<<anonymous>>",_=u(),x=d(),D={array:o("array"),bool:o("boolean"),func:o("function"),number:o("number"),object:o("object"),string:o("string"),any:i(),arrayOf:a,element:_,instanceOf:s,node:x,objectOf:c,oneOf:l,oneOfType:p,shape:f};t.exports=D},{112:112,55:55,61:61,74:74}],77:[function(e,t,n){"use strict";function r(){this.listenersToPut=[]}var o=e(28),i=e(30)
 ,a=e(27);a(r.prototype,{enqueuePutListener:function(e,t,n){this.listenersToPut.push({rootNodeID:e,propKey:t,propValue:n})},putListeners:function(){for(var e=0;e<this.listenersToPut.length;e++){var t=this.listenersToPut[e];i.putListener(t.rootNodeID,t.propKey,t.propValue)}},reset:function(){this.listenersToPut.length=0},destructor:function(){this.reset()}}),o.addPoolingTo(r),t.exports=r},{27:27,28:28,30:30}],78:[function(e,t,n){"use strict";function r(){this.reinitializeTransaction(),this.renderToStaticMarkup=!1,this.reactMountReady=o.getPooled(null),this.putListenerQueue=s.getPooled()}var o=e(6),i=e(28),a=e(30),u=e(63),s=e(77),l=e(101),c=e(27),p={initialize:u.getSelectionInformation,close:u.restoreSelection},d={initialize:function(){var e=a.isEnabled();return a.setEnabled(!1),e},close:function(e){a.setEnabled(e)}},f={initialize:function(){this.reactMountReady.reset()},close:function(){this.reactMountReady.notifyAll()}},h={initialize:function(){this.putListenerQueue.reset()},close:fu
 nction(){this.putListenerQueue.putListeners()}},m=[h,p,d,f],v={getTransactionWrappers:function(){return m},getReactMountReady:function(){return this.reactMountReady},getPutListenerQueue:function(){return this.putListenerQueue},destructor:function(){o.release(this.reactMountReady),this.reactMountReady=null,s.release(this.putListenerQueue),this.putListenerQueue=null}};c(r.prototype,l.Mixin,v),i.addPoolingTo(r),t.exports=r},{101:101,27:27,28:28,30:30,6:6,63:63,77:77}],79:[function(e,t,n){"use strict";function r(){o.attachRefs(this,this._currentElement)}var o=e(80),i=(e(56),{mountComponent:function(e,t,n,o){var i=e.mountComponent(t,n,o);return n.getReactMountReady().enqueue(r,e),i},unmountComponent:function(e){o.detachRefs(e,e._currentElement),e.unmountComponent()},receiveComponent:function(e,t,n,i){var a=e._currentElement;if(t!==a||null==t._owner){var u=o.shouldUpdateRefs(a,t);u&&o.detachRefs(e,a),e.receiveComponent(t,n,i),u&&n.getReactMountReady().enqueue(r,e)}},performUpdateIfNecessa
 ry:function(e,t){e.performUpdateIfNecessary(t)}});t.exports=i},{56:56,80:80}],80:[function(e,t,n){"use strict";function r(e,t,n){"function"==typeof e?e(t.getPublicInstance()):i.addComponentAsRefTo(t,e,n)}function o(e,t,n){"function"==typeof e?e(null):i.removeComponentAsRefFrom(t,e,n)}var i=e(72),a={};a.attachRefs=function(e,t){var n=t.ref;null!=n&&r(n,e,t._owner)},a.shouldUpdateRefs=function(e,t){return t._owner!==e._owner||t.ref!==e.ref},a.detachRefs=function(e,t){var n=t.ref;null!=n&&o(n,e,t._owner)},t.exports=a},{72:72}],81:[function(e,t,n){"use strict";var r={injectCreateReactRootIndex:function(e){o.createReactRootIndex=e}},o={createReactRootIndex:null,injection:r};t.exports=o},{}],82:[function(e,t,n){"use strict";function r(e){p(i.isValidElement(e));var t;try{var n=a.createReactRootID();return t=s.getPooled(!1),t.perform(function(){var r=c(e,null),o=r.mountComponent(n,t,l);return u.addChecksumToMarkup(o)},null)}finally{s.release(t)}}function o(e){p(i.isValidElement(e));var t;tr
 y{var n=a.createReactRootID();return t=s.getPooled(!0),t.perform(function(){var r=c(e,null);return r.mountComponent(n,t,l)},null)}finally{s.release(t)}}var i=e(55),a=e(64),u=e(67),s=e(83),l=e(113),c=e(132),p=e(133);t.exports={renderToString:r,renderToStaticMarkup:o}},{113:113,132:132,133:133,55:55,64:64,67:67,83:83}],83:[function(e,t,n){"use strict";function r(e){this.reinitializeTransaction(),this.renderToStaticMarkup=e,this.reactMountReady=i.getPooled(null),this.putListenerQueue=a.getPooled()}var o=e(28),i=e(6),a=e(77),u=e(101),s=e(27),l=e(112),c={initialize:function(){this.reactMountReady.reset()},close:l},p={initialize:function(){this.putListenerQueue.reset()},close:l},d=[p,c],f={getTransactionWrappers:function(){return d},getReactMountReady:function(){return this.reactMountReady},getPutListenerQueue:function(){return this.putListenerQueue},destructor:function(){i.release(this.reactMountReady),this.reactMountReady=null,a.release(this.putListenerQueue),this.putListenerQueue=null}
 };s(r.prototype,u.Mixin,f),o.addPoolingTo(r),t.exports=r},{101:101,112:112,27:27,28:28,6:6,77:77}],84:[function(e,t,n){"use strict";function r(e){e!==i.currentlyMountingInstance&&l.enqueueUpdate(e)}function o(e,t){p(null==a.current);var n=s.get(e);return n?n===i.currentlyUnmountingInstance?null:n:null}var i=e(66),a=e(39),u=e(55),s=e(65),l=e(85),c=e(27),p=e(133),d=(e(150),{enqueueCallback:function(e,t){p("function"==typeof t);var n=o(e);return n&&n!==i.currentlyMountingInstance?(n._pendingCallbacks?n._pendingCallbacks.push(t):n._pendingCallbacks=[t],void r(n)):null},enqueueCallbackInternal:function(e,t){p("function"==typeof t),e._pendingCallbacks?e._pendingCallbacks.push(t):e._pendingCallbacks=[t],r(e)},enqueueForceUpdate:function(e){var t=o(e,"forceUpdate");t&&(t._pendingForceUpdate=!0,r(t))},enqueueReplaceState:function(e,t){var n=o(e,"replaceState");n&&(n._pendingStateQueue=[t],n._pendingReplaceState=!0,r(n))},enqueueSetState:function(e,t){var n=o(e,"setState");if(n){var i=n._pend
 ingStateQueue||(n._pendingStateQueue=[]);i.push(t),r(n)}},enqueueSetProps:function(e,t){var n=o(e,"setProps");if(n){p(n._isTopLevel);var i=n._pendingElement||n._currentElement,a=c({},i.props,t);n._pendingElement=u.cloneAndReplaceProps(i,a),r(n)}},enqueueReplaceProps:function(e,t){var n=o(e,"replaceProps");if(n){p(n._isTopLevel);var i=n._pendingElement||n._currentElement;n._pendingElement=u.cloneAndReplaceProps(i,t),r(n)}},enqueueElementInternal:function(e,t){e._pendingElement=t,r(e)}});t.exports=d},{133:133,150:150,27:27,39:39,55:55,65:65,66:66,85:85}],85:[function(e,t,n){"use strict";function r(){v(N.ReactReconcileTransaction&&E)}function o(){this.reinitializeTransaction(),this.dirtyComponentsLength=null,this.callbackQueue=c.getPooled(),this.reconcileTransaction=N.ReactReconcileTransaction.getPooled()}function i(e,t,n,o,i){r(),E.batchedUpdates(e,t,n,o,i)}function a(e,t){return e._mountOrder-t._mountOrder}function u(e){var t=e.dirtyComponentsLength;v(t===g.length),g.sort(a);for(var 
 n=0;t>n;n++){var r=g[n],o=r._pendingCallbacks;if(r._pendingCallbacks=null,f.performUpdateIfNecessary(r,e.reconcileTransaction),o)for(var i=0;i<o.length;i++)e.callbackQueue.enqueue(o[i],r.getPublicInstance())}}function s(e){return r(),E.isBatchingUpdates?void g.push(e):void E.batchedUpdates(s,e)}function l(e,t){v(E.isBatchingUpdates),y.enqueue(e,t),C=!0}var c=e(6),p=e(28),d=(e(39),e(73)),f=e(79),h=e(101),m=e(27),v=e(133),g=(e(150),[]),y=c.getPooled(),C=!1,E=null,b={initialize:function(){this.dirtyComponentsLength=g.length},close:function(){this.dirtyComponentsLength!==g.length?(g.splice(0,this.dirtyComponentsLength),D()):g.length=0}},_={initialize:function(){this.callbackQueue.reset()},close:function(){this.callbackQueue.notifyAll()}},x=[b,_];m(o.prototype,h.Mixin,{getTransactionWrappers:function(){return x},destructor:function(){this.dirtyComponentsLength=null,c.release(this.callbackQueue),this.callbackQueue=null,N.ReactReconcileTransaction.release(this.reconcileTransaction),this.re
 concileTransaction=null},perform:function(e,t,n){return h.Mixin.perform.call(this,this.reconcileTransaction.perform,this.reconcileTransaction,e,t,n)}}),p.addPoolingTo(o);var D=function(){for(;g.length||C;){if(g.length){var e=o.getPooled();e.perform(u,null,e),o.release(e)}if(C){C=!1;var t=y;y=c.getPooled(),t.notifyAll(),c.release(t)}}};D=d.measure("ReactUpdates","flushBatchedUpdates",D);var M={injectReconcileTransaction:function(e){v(e),N.ReactReconcileTransaction=e},injectBatchingStrategy:function(e){v(e),v("function"==typeof e.batchedUpdates),v("boolean"==typeof e.isBatchingUpdates),E=e}},N={ReactReconcileTransaction:null,batchedUpdates:i,enqueueUpdate:s,flushBatchedUpdates:D,injection:M,asap:l};t.exports=N},{101:101,133:133,150:150,27:27,28:28,39:39,6:6,73:73,79:79}],86:[function(e,t,n){"use strict";var r=e(10),o=r.injection.MUST_USE_ATTRIBUTE,i={Properties:{cx:o,cy:o,d:o,dx:o,dy:o,fill:o,fillOpacity:o,fontFamily:o,fontSize:o,fx:o,fy:o,gradientTransform:o,gradientUnits:o,markerEnd
 :o,markerMid:o,markerStart:o,offset:o,opacity:o,patternContentUnits:o,patternUnits:o,points:o,preserveAspectRatio:o,r:o,rx:o,ry:o,spreadMethod:o,stopColor:o,stopOpacity:o,stroke:o,strokeDasharray:o,strokeLinecap:o,strokeOpacity:o,strokeWidth:o,textAnchor:o,transform:o,version:o,viewBox:o,x1:o,x2:o,x:o,y1:o,y2:o,y:o},DOMAttributeNames:{fillOpacity:"fill-opacity",fontFamily:"font-family",fontSize:"font-size",gradientTransform:"gradientTransform",gradientUnits:"gradientUnits",markerEnd:"marker-end",markerMid:"marker-mid",markerStart:"marker-start",patternContentUnits:"patternContentUnits",patternUnits:"patternUnits",preserveAspectRatio:"preserveAspectRatio",spreadMethod:"spreadMethod",stopColor:"stop-color",stopOpacity:"stop-opacity",strokeDasharray:"stroke-dasharray",strokeLinecap:"stroke-linecap",strokeOpacity:"stroke-opacity",strokeWidth:"stroke-width",textAnchor:"text-anchor",viewBox:"viewBox"}};t.exports=i},{10:10}],87:[function(e,t,n){"use strict";function r(e){if("selectionStart
 "in e&&u.hasSelectionCapabilities(e))return{start:e.selectionStart,end:e.selectionEnd};if(window.getSelection){var t=window.getSelection();return{anchorNode:t.anchorNode,anchorOffset:t.anchorOffset,focusNode:t.focusNode,focusOffset:t.focusOffset}}if(document.selection){var n=document.selection.createRange();return{parentElement:n.parentElement(),text:n.text,top:n.boundingTop,left:n.boundingLeft}}}function o(e){if(y||null==m||m!==l())return null;var t=r(m);if(!g||!d(g,t)){g=t;var n=s.getPooled(h.select,v,e);return n.type="select",n.target=m,a.accumulateTwoPhaseDispatches(n),n}}var i=e(15),a=e(20),u=e(63),s=e(93),l=e(119),c=e(136),p=e(139),d=e(146),f=i.topLevelTypes,h={select:{phasedRegistrationNames:{bubbled:p({onSelect:null}),captured:p({onSelectCapture:null})},dependencies:[f.topBlur,f.topContextMenu,f.topFocus,f.topKeyDown,f.topMouseDown,f.topMouseUp,f.topSelectionChange]}},m=null,v=null,g=null,y=!1,C={eventTypes:h,extractEvents:function(e,t,n,r){switch(e){case f.topFocus:(c(t)||"
 true"===t.contentEditable)&&(m=t,v=n,g=null);break;case f.topBlur:m=null,v=null,g=null;break;case f.topMouseDown:
+y=!0;break;case f.topContextMenu:case f.topMouseUp:return y=!1,o(r);case f.topSelectionChange:case f.topKeyDown:case f.topKeyUp:return o(r)}}};t.exports=C},{119:119,136:136,139:139,146:146,15:15,20:20,63:63,93:93}],88:[function(e,t,n){"use strict";var r=Math.pow(2,53),o={createReactRootIndex:function(){return Math.ceil(Math.random()*r)}};t.exports=o},{}],89:[function(e,t,n){"use strict";var r=e(15),o=e(19),i=e(20),a=e(90),u=e(93),s=e(94),l=e(96),c=e(97),p=e(92),d=e(98),f=e(99),h=e(100),m=e(120),v=e(133),g=e(139),y=(e(150),r.topLevelTypes),C={blur:{phasedRegistrationNames:{bubbled:g({onBlur:!0}),captured:g({onBlurCapture:!0})}},click:{phasedRegistrationNames:{bubbled:g({onClick:!0}),captured:g({onClickCapture:!0})}},contextMenu:{phasedRegistrationNames:{bubbled:g({onContextMenu:!0}),captured:g({onContextMenuCapture:!0})}},copy:{phasedRegistrationNames:{bubbled:g({onCopy:!0}),captured:g({onCopyCapture:!0})}},cut:{phasedRegistrationNames:{bubbled:g({onCut:!0}),captured:g({onCutCapture:
 !0})}},doubleClick:{phasedRegistrationNames:{bubbled:g({onDoubleClick:!0}),captured:g({onDoubleClickCapture:!0})}},drag:{phasedRegistrationNames:{bubbled:g({onDrag:!0}),captured:g({onDragCapture:!0})}},dragEnd:{phasedRegistrationNames:{bubbled:g({onDragEnd:!0}),captured:g({onDragEndCapture:!0})}},dragEnter:{phasedRegistrationNames:{bubbled:g({onDragEnter:!0}),captured:g({onDragEnterCapture:!0})}},dragExit:{phasedRegistrationNames:{bubbled:g({onDragExit:!0}),captured:g({onDragExitCapture:!0})}},dragLeave:{phasedRegistrationNames:{bubbled:g({onDragLeave:!0}),captured:g({onDragLeaveCapture:!0})}},dragOver:{phasedRegistrationNames:{bubbled:g({onDragOver:!0}),captured:g({onDragOverCapture:!0})}},dragStart:{phasedRegistrationNames:{bubbled:g({onDragStart:!0}),captured:g({onDragStartCapture:!0})}},drop:{phasedRegistrationNames:{bubbled:g({onDrop:!0}),captured:g({onDropCapture:!0})}},focus:{phasedRegistrationNames:{bubbled:g({onFocus:!0}),captured:g({onFocusCapture:!0})}},input:{phasedRegis
 trationNames:{bubbled:g({onInput:!0}),captured:g({onInputCapture:!0})}},keyDown:{phasedRegistrationNames:{bubbled:g({onKeyDown:!0}),captured:g({onKeyDownCapture:!0})}},keyPress:{phasedRegistrationNames:{bubbled:g({onKeyPress:!0}),captured:g({onKeyPressCapture:!0})}},keyUp:{phasedRegistrationNames:{bubbled:g({onKeyUp:!0}),captured:g({onKeyUpCapture:!0})}},load:{phasedRegistrationNames:{bubbled:g({onLoad:!0}),captured:g({onLoadCapture:!0})}},error:{phasedRegistrationNames:{bubbled:g({onError:!0}),captured:g({onErrorCapture:!0})}},mouseDown:{phasedRegistrationNames:{bubbled:g({onMouseDown:!0}),captured:g({onMouseDownCapture:!0})}},mouseMove:{phasedRegistrationNames:{bubbled:g({onMouseMove:!0}),captured:g({onMouseMoveCapture:!0})}},mouseOut:{phasedRegistrationNames:{bubbled:g({onMouseOut:!0}),captured:g({onMouseOutCapture:!0})}},mouseOver:{phasedRegistrationNames:{bubbled:g({onMouseOver:!0}),captured:g({onMouseOverCapture:!0})}},mouseUp:{phasedRegistrationNames:{bubbled:g({onMouseUp:!0}
 ),captured:g({onMouseUpCapture:!0})}},paste:{phasedRegistrationNames:{bubbled:g({onPaste:!0}),captured:g({onPasteCapture:!0})}},reset:{phasedRegistrationNames:{bubbled:g({onReset:!0}),captured:g({onResetCapture:!0})}},scroll:{phasedRegistrationNames:{bubbled:g({onScroll:!0}),captured:g({onScrollCapture:!0})}},submit:{phasedRegistrationNames:{bubbled:g({onSubmit:!0}),captured:g({onSubmitCapture:!0})}},touchCancel:{phasedRegistrationNames:{bubbled:g({onTouchCancel:!0}),captured:g({onTouchCancelCapture:!0})}},touchEnd:{phasedRegistrationNames:{bubbled:g({onTouchEnd:!0}),captured:g({onTouchEndCapture:!0})}},touchMove:{phasedRegistrationNames:{bubbled:g({onTouchMove:!0}),captured:g({onTouchMoveCapture:!0})}},touchStart:{phasedRegistrationNames:{bubbled:g({onTouchStart:!0}),captured:g({onTouchStartCapture:!0})}},wheel:{phasedRegistrationNames:{bubbled:g({onWheel:!0}),captured:g({onWheelCapture:!0})}}},E={topBlur:C.blur,topClick:C.click,topContextMenu:C.contextMenu,topCopy:C.copy,topCut:C.
 cut,topDoubleClick:C.doubleClick,topDrag:C.drag,topDragEnd:C.dragEnd,topDragEnter:C.dragEnter,topDragExit:C.dragExit,topDragLeave:C.dragLeave,topDragOver:C.dragOver,topDragStart:C.dragStart,topDrop:C.drop,topError:C.error,topFocus:C.focus,topInput:C.input,topKeyDown:C.keyDown,topKeyPress:C.keyPress,topKeyUp:C.keyUp,topLoad:C.load,topMouseDown:C.mouseDown,topMouseMove:C.mouseMove,topMouseOut:C.mouseOut,topMouseOver:C.mouseOver,topMouseUp:C.mouseUp,topPaste:C.paste,topReset:C.reset,topScroll:C.scroll,topSubmit:C.submit,topTouchCancel:C.touchCancel,topTouchEnd:C.touchEnd,topTouchMove:C.touchMove,topTouchStart:C.touchStart,topWheel:C.wheel};for(var b in E)E[b].dependencies=[b];var _={eventTypes:C,executeDispatch:function(e,t,n){var r=o.executeDispatch(e,t,n);r===!1&&(e.stopPropagation(),e.preventDefault())},extractEvents:function(e,t,n,r){var o=E[e];if(!o)return null;var g;switch(e){case y.topInput:case y.topLoad:case y.topError:case y.topReset:case y.topSubmit:g=u;break;case y.topKeyPr
 ess:if(0===m(r))return null;case y.topKeyDown:case y.topKeyUp:g=l;break;case y.topBlur:case y.topFocus:g=s;break;case y.topClick:if(2===r.button)return null;case y.topContextMenu:case y.topDoubleClick:case y.topMouseDown:case y.topMouseMove:case y.topMouseOut:case y.topMouseOver:case y.topMouseUp:g=c;break;case y.topDrag:case y.topDragEnd:case y.topDragEnter:case y.topDragExit:case y.topDragLeave:case y.topDragOver:case y.topDragStart:case y.topDrop:g=p;break;case y.topTouchCancel:case y.topTouchEnd:case y.topTouchMove:case y.topTouchStart:g=d;break;case y.topScroll:g=f;break;case y.topWheel:g=h;break;case y.topCopy:case y.topCut:case y.topPaste:g=a}v(g);var C=g.getPooled(o,n,r);return i.accumulateTwoPhaseDispatches(C),C}};t.exports=_},{100:100,120:120,133:133,139:139,15:15,150:150,19:19,20:20,90:90,92:92,93:93,94:94,96:96,97:97,98:98,99:99}],90:[function(e,t,n){"use strict";function r(e,t,n){o.call(this,e,t,n)}var o=e(93),i={clipboardData:function(e){return"clipboardData"in e?e.cli
 pboardData:window.clipboardData}};o.augmentClass(r,i),t.exports=r},{93:93}],91:[function(e,t,n){"use strict";function r(e,t,n){o.call(this,e,t,n)}var o=e(93),i={data:null};o.augmentClass(r,i),t.exports=r},{93:93}],92:[function(e,t,n){"use strict";function r(e,t,n){o.call(this,e,t,n)}var o=e(97),i={dataTransfer:null};o.augmentClass(r,i),t.exports=r},{97:97}],93:[function(e,t,n){"use strict";function r(e,t,n){this.dispatchConfig=e,this.dispatchMarker=t,this.nativeEvent=n;var r=this.constructor.Interface;for(var o in r)if(r.hasOwnProperty(o)){var i=r[o];i?this[o]=i(n):this[o]=n[o]}var u=null!=n.defaultPrevented?n.defaultPrevented:n.returnValue===!1;u?this.isDefaultPrevented=a.thatReturnsTrue:this.isDefaultPrevented=a.thatReturnsFalse,this.isPropagationStopped=a.thatReturnsFalse}var o=e(28),i=e(27),a=e(112),u=e(123),s={type:null,target:u,currentTarget:a.thatReturnsNull,eventPhase:null,bubbles:null,cancelable:null,timeStamp:function(e){return e.timeStamp||Date.now()},defaultPrevented:nul
 l,isTrusted:null};i(r.prototype,{preventDefault:function(){this.defaultPrevented=!0;var e=this.nativeEvent;e.preventDefault?e.preventDefault():e.returnValue=!1,this.isDefaultPrevented=a.thatReturnsTrue},stopPropagation:function(){var e=this.nativeEvent;e.stopPropagation?e.stopPropagation():e.cancelBubble=!0,this.isPropagationStopped=a.thatReturnsTrue},persist:function(){this.isPersistent=a.thatReturnsTrue},isPersistent:a.thatReturnsFalse,destructor:function(){var e=this.constructor.Interface;for(var t in e)this[t]=null;this.dispatchConfig=null,this.dispatchMarker=null,this.nativeEvent=null}}),r.Interface=s,r.augmentClass=function(e,t){var n=this,r=Object.create(n.prototype);i(r,e.prototype),e.prototype=r,e.prototype.constructor=e,e.Interface=i({},n.Interface,t),e.augmentClass=n.augmentClass,o.addPoolingTo(e,o.threeArgumentPooler)},o.addPoolingTo(r,o.threeArgumentPooler),t.exports=r},{112:112,123:123,27:27,28:28}],94:[function(e,t,n){"use strict";function r(e,t,n){o.call(this,e,t,n)}
 var o=e(99),i={relatedTarget:null};o.augmentClass(r,i),t.exports=r},{99:99}],95:[function(e,t,n){"use strict";function r(e,t,n){o.call(this,e,t,n)}var o=e(93),i={data:null};o.augmentClass(r,i),t.exports=r},{93:93}],96:[function(e,t,n){"use strict";function r(e,t,n){o.call(this,e,t,n)}var o=e(99),i=e(120),a=e(121),u=e(122),s={key:a,location:null,ctrlKey:null,shiftKey:null,altKey:null,metaKey:null,repeat:null,locale:null,getModifierState:u,charCode:function(e){return"keypress"===e.type?i(e):0},keyCode:function(e){return"keydown"===e.type||"keyup"===e.type?e.keyCode:0},which:function(e){return"keypress"===e.type?i(e):"keydown"===e.type||"keyup"===e.type?e.keyCode:0}};o.augmentClass(r,s),t.exports=r},{120:120,121:121,122:122,99:99}],97:[function(e,t,n){"use strict";function r(e,t,n){o.call(this,e,t,n)}var o=e(99),i=e(102),a=e(122),u={screenX:null,screenY:null,clientX:null,clientY:null,ctrlKey:null,shiftKey:null,altKey:null,metaKey:null,getModifierState:a,button:function(e){var t=e.butto
 n;return"which"in e?t:2===t?2:4===t?1:0},buttons:null,relatedTarget:function(e){return e.relatedTarget||(e.fromElement===e.srcElement?e.toElement:e.fromElement)},pageX:function(e){return"pageX"in e?e.pageX:e.clientX+i.currentScrollLeft},pageY:function(e){return"pageY"in e?e.pageY:e.clientY+i.currentScrollTop}};o.augmentClass(r,u),t.exports=r},{102:102,122:122,99:99}],98:[function(e,t,n){"use strict";function r(e,t,n){o.call(this,e,t,n)}var o=e(99),i=e(122),a={touches:null,targetTouches:null,changedTouches:null,altKey:null,metaKey:null,ctrlKey:null,shiftKey:null,getModifierState:i};o.augmentClass(r,a),t.exports=r},{122:122,99:99}],99:[function(e,t,n){"use strict";function r(e,t,n){o.call(this,e,t,n)}var o=e(93),i=e(123),a={view:function(e){if(e.view)return e.view;var t=i(e);if(null!=t&&t.window===t)return t;var n=t.ownerDocument;return n?n.defaultView||n.parentWindow:window},detail:function(e){return e.detail||0}};o.augmentClass(r,a),t.exports=r},{123:123,93:93}],100:[function(e,t,n)
 {"use strict";function r(e,t,n){o.call(this,e,t,n)}var o=e(97),i={deltaX:function(e){return"deltaX"in e?e.deltaX:"wheelDeltaX"in e?-e.wheelDeltaX:0},deltaY:function(e){return"deltaY"in e?e.deltaY:"wheelDeltaY"in e?-e.wheelDeltaY:"wheelDelta"in e?-e.wheelDelta:0},deltaZ:null,deltaMode:null};o.augmentClass(r,i),t.exports=r},{97:97}],101:[function(e,t,n){"use strict";var r=e(133),o={reinitializeTransaction:function(){this.transactionWrappers=this.getTransactionWrappers(),this.wrapperInitData?this.wrapperInitData.length=0:this.wrapperInitData=[],this._isInTransaction=!1},_isInTransaction:!1,getTransactionWrappers:null,isInTransaction:function(){return!!this._isInTransaction},perform:function(e,t,n,o,i,a,u,s){r(!this.isInTransaction());var l,c;try{this._isInTransaction=!0,l=!0,this.initializeAll(0),c=e.call(t,n,o,i,a,u,s),l=!1}finally{try{if(l)try{this.closeAll(0)}catch(p){}else this.closeAll(0)}finally{this._isInTransaction=!1}}return c},initializeAll:function(e){for(var t=this.transact
 ionWrappers,n=e;n<t.length;n++){var r=t[n];try{this.wrapperInitData[n]=i.OBSERVED_ERROR,this.wrapperInitData[n]=r.initialize?r.initialize.call(this):null}finally{if(this.wrapperInitData[n]===i.OBSERVED_ERROR)try{this.initializeAll(n+1)}catch(o){}}}},closeAll:function(e){r(this.isInTransaction());for(var t=this.transactionWrappers,n=e;n<t.length;n++){var o,a=t[n],u=this.wrapperInitData[n];try{o=!0,u!==i.OBSERVED_ERROR&&a.close&&a.close.call(this,u),o=!1}finally{if(o)try{this.closeAll(n+1)}catch(s){}}}this.wrapperInitData.length=0}},i={Mixin:o,OBSERVED_ERROR:{}};t.exports=i},{133:133}],102:[function(e,t,n){"use strict";var r={currentScrollLeft:0,currentScrollTop:0,refreshScrollValues:function(e){r.currentScrollLeft=e.x,r.currentScrollTop=e.y}};t.exports=r},{}],103:[function(e,t,n){"use strict";function r(e,t){if(o(null!=t),null==e)return t;var n=Array.isArray(e),r=Array.isArray(t);return n&&r?(e.push.apply(e,t),e):n?(e.push(t),e):r?[e].concat(t):[e,t]}var o=e(133);t.exports=r},{133:13
 3}],104:[function(e,t,n){"use strict";function r(e){for(var t=1,n=0,r=0;r<e.length;r++)t=(t+e.charCodeAt(r))%o,n=(n+t)%o;return t|n<<16}var o=65521;t.exports=r},{}],105:[function(e,t,n){function r(e){return e.replace(o,function(e,t){return t.toUpperCase()})}var o=/-(.)/g;t.exports=r},{}],106:[function(e,t,n){"use strict";function r(e){return o(e.replace(i,"ms-"))}var o=e(105),i=/^-ms-/;t.exports=r},{105:105}],107:[function(e,t,n){function r(e,t){return e&&t?e===t?!0:o(e)?!1:o(t)?r(e,t.parentNode):e.contains?e.contains(t):e.compareDocumentPosition?!!(16&e.compareDocumentPosition(t)):!1:!1}var o=e(137);t.exports=r},{137:137}],108:[function(e,t,n){function r(e){return!!e&&("object"==typeof e||"function"==typeof e)&&"length"in e&&!("setInterval"in e)&&"number"!=typeof e.nodeType&&(Array.isArray(e)||"callee"in e||"item"in e)}function o(e){return r(e)?Array.isArray(e)?e.slice():i(e):[e]}var i=e(148);t.exports=o},{148:148}],109:[function(e,t,n){"use strict";function r(e){var t=i.createFact
 ory(e),n=o.createClass({tagName:e.toUpperCase(),displayName:"ReactFullPageComponent"+e,componentWillUnmount:function(){a(!1)},render:function(){return t(this.props)}});return n}var o=e(33),i=e(55),a=e(133);t.exports=r},{133:133,33:33,55:55}],110:[function(e,t,n){function r(e){var t=e.match(c);return t&&t[1].toLowerCase()}function o(e,t){var n=l;s(!!l);var o=r(e),i=o&&u(o);if(i){n.innerHTML=i[1]+e+i[2];for(var c=i[0];c--;)n=n.lastChild}else n.innerHTML=e;var p=n.getElementsByTagName("script");p.length&&(s(t),a(p).forEach(t));for(var d=a(n.childNodes);n.lastChild;)n.removeChild(n.lastChild);return d}var i=e(21),a=e(108),u=e(125),s=e(133),l=i.canUseDOM?document.createElement("div"):null,c=/^\s*<(\w+)/;t.exports=o},{108:108,125:125,133:133,21:21}],111:[function(e,t,n){"use strict";function r(e,t){var n=null==t||"boolean"==typeof t||""===t;if(n)return"";var r=isNaN(t);return r||0===t||i.hasOwnProperty(e)&&i[e]?""+t:("string"==typeof t&&(t=t.trim()),t+"px")}var o=e(4),i=o.isUnitlessNumber
 ;t.exports=r},{4:4}],112:[function(e,t,n){function r(e){return function(){return e}}function o(){}o.thatReturns=r,o.thatReturnsFalse=r(!1),o.thatReturnsTrue=r(!0),o.thatReturnsNull=r(null),o.thatReturnsThis=function(){return this},o.thatReturnsArgument=function(e){return e},t.exports=o},{}],113:[function(e,t,n){"use strict";var r={};t.exports=r},{}],114:[function(e,t,n){"use strict";function r(e){return i[e]}function o(e){return(""+e).replace(a,r)}var i={"&":"&amp;",">":"&gt;","<":"&lt;",'"':"&quot;","'":"&#x27;"},a=/[&><"']/g;t.exports=o},{}],115:[function(e,t,n){"use strict";function r(e){return null==e?null:u(e)?e:o.has(e)?i.getNodeFromInstance(e):(a(null==e.render||"function"!=typeof e.render),void a(!1))}{var o=(e(39),e(65)),i=e(68),a=e(133),u=e(135);e(150)}t.exports=r},{133:133,135:135,150:150,39:39,65:65,68:68}],116:[function(e,t,n){"use strict";function r(e,t,n){var r=e,o=!r.hasOwnProperty(n);o&&null!=t&&(r[n]=t)}function o(e){if(null==e)return e;var t={};return i(e,r,t),t}{
 var i=e(149);e(150)}t.exports=o},{149:149,150:150}],117:[function(e,t,n){"use strict";function r(e){try{e.focus()}catch(t){}}t.exports=r},{}],118:[function(e,t,n){"use strict";var r=function(e,t,n){Array.isArray(e)?e.forEach(t,n):e&&t.call(n,e)};t.exports=r},{}],119:[function(e,t,n){function r(){try{return document.activeElement||document.body}catch(e){return document.body}}t.exports=r},{}],120:[function(e,t,n){"use strict";function r(e){var t,n=e.keyCode;return"charCode"in e?(t=e.charCode,0===t&&13===n&&(t=13)):t=n,t>=32||13===t?t:0}t.exports=r},{}],121:[function(e,t,n){"use strict";function r(e){if(e.key){var t=i[e.key]||e.key;if("Unidentified"!==t)return t}if("keypress"===e.type){var n=o(e);return 13===n?"Enter":String.fromCharCode(n)}return"keydown"===e.type||"keyup"===e.type?a[e.keyCode]||"Unidentified":""}var o=e(120),i={Esc:"Escape",Spacebar:" ",Left:"ArrowLeft",Up:"ArrowUp",Right:"ArrowRight",Down:"ArrowDown",Del:"Delete",Win:"OS",Menu:"ContextMenu",Apps:"ContextMenu",Scroll
 :"ScrollLock",MozPrintableKey:"Unidentified"},a={8:"Backspace",9:"Tab",12:"Clear",13:"Enter",16:"Shift",17:"Control",18:"Alt",19:"Pause",20:"CapsLock",27:"Escape",32:" ",33:"PageUp",34:"PageDown",35:"End",36:"Home",37:"ArrowLeft",38:"ArrowUp",39:"ArrowRight",40:"ArrowDown",45:"Insert",46:"Delete",112:"F1",113:"F2",114:"F3",115:"F4",116:"F5",117:"F6",118:"F7",119:"F8",120:"F9",121:"F10",122:"F11",123:"F12",144:"NumLock",145:"ScrollLock",224:"Meta"};t.exports=r},{120:120}],122:[function(e,t,n){"use strict";function r(e){var t=this,n=t.nativeEvent;if(n.getModifierState)return n.getModifierState(e);var r=i[e];return r?!!n[r]:!1}function o(e){return r}var i={Alt:"altKey",Control:"ctrlKey",Meta:"metaKey",Shift:"shiftKey"};t.exports=o},{}],123:[function(e,t,n){"use strict";function r(e){var t=e.target||e.srcElement||window;return 3===t.nodeType?t.parentNode:t}t.exports=r},{}],124:[function(e,t,n){"use strict";function r(e){var t=e&&(o&&e[o]||e[i]);return"function"==typeof t?t:void 0}var o=
 "function"==typeof Symbol&&Symbol.iterator,i="@@iterator";t.exports=r},{}],125:[function(e,t,n){function r(e){return i(!!a),d.hasOwnProperty(e)||(e="*"),u.hasOwnProperty(e)||("*"===e?a.innerHTML="<link />":a.innerHTML="<"+e+"></"+e+">",u[e]=!a.firstChild),u[e]?d[e]:null}var o=e(21),i=e(133),a=o.canUseDOM?document.createElement("div"):null,u={circle:!0,defs:!0,ellipse:!0,g:!0,line:!0,linearGradient:!0,path:!0,polygon:!0,polyline:!0,radialGradient:!0,rect:!0,stop:!0,text:!0},s=[1,'<select multiple="true">',"</select>"],l=[1,"<table>","</table>"],c=[3,"<table><tbody><tr>","</tr></tbody></table>"],p=[1,"<svg>","</svg>"],d={"*":[1,"?<div>","</div>"],area:[1,"<map>","</map>"],col:[2,"<table><tbody></tbody><colgroup>","</colgroup></table>"],legend:[1,"<fieldset>","</fieldset>"],param:[1,"<object>","</object>"],tr:[2,"<table><tbody>","</tbody></table>"],optgroup:s,option:s,caption:l,colgroup:l,tbody:l,tfoot:l,thead:l,td:c,th:c,circle:p,defs:p,ellipse:p,g:p,line:p,linearGradient:p,path:p,pol
 ygon:p,polyline:p,radialGradient:p,rect:p,stop:p,text:p};t.exports=r},{133:133,21:21}],126:[function(e,t,n){"use strict";function r(e){for(;e&&e.firstChild;)e=e.firstChild;return e}function o(e){for(;e;){if(e.nextSibling)return e.nextSibling;e=e.parentNode}}function i(e,t){for(var n=r(e),i=0,a=0;n;){if(3===n.nodeType){if(a=i+n.textContent.length,t>=i&&a>=t)return{node:n,offset:t-i};i=a}n=r(o(n))}}t.exports=i},{}],127:[function(e,t,n){"use strict";function r(e){return e?e.nodeType===o?e.documentElement:e.firstChild:null}var o=9;t.exports=r},{}],128:[function(e,t,n){"use strict";function r(){return!i&&o.canUseDOM&&(i="textContent"in document.documentElement?"textContent":"innerText"),i}var o=e(21),i=null;t.exports=r},{21:21}],129:[function(e,t,n){"use strict";function r(e){return e===window?{x:window.pageXOffset||document.documentElement.scrollLeft,y:window.pageYOffset||document.documentElement.scrollTop}:{x:e.scrollLeft,y:e.scrollTop}}t.exports=r},{}],130:[function(e,t,n){function r(
 e){return e.replace(o,"-$1").toLowerCase()}var o=/([A-Z])/g;t.exports=r},{}],131:[function(e,t,n){"use strict";function r(e){return o(e).replace(i,"-ms-")}var o=e(130),i=/^ms-/;t.exports=r},{130:130}],132:[function(e,t,n){"use strict";function r(e){return"function"==typeof e&&"undefined"!=typeof e.prototype&&"function"==typeof e.prototype.mountComponent&&"function"==typeof e.prototype.receiveComponent}function o(e,t){var n;if((null===e||e===!1)&&(e=a.emptyElement),"object"==typeof e){var o=e;n=t===o.type&&"string"==typeof o.type?u.createInternalComponent(o):r(o.type)?new o.type(o):new c}else"string"==typeof e||"number"==typeof e?n=u.createInstanceForText(e):l(!1);return n.construct(e),n._mountIndex=0,n._mountImage=null,n}var i=e(37),a=e(57),u=e(71),s=e(27),l=e(133),c=(e(150),function(){});s(c.prototype,i.Mixin,{_instantiateReactComponent:o}),t.exports=o},{133:133,150:150,27:27,37:37,57:57,71:71}],133:[function(e,t,n){"use strict";var r=function(e,t,n,r,o,i,a,u){if(!e){var s;if(void 
 0===t)s=new Error("Minified exception occurred; use the non-minified dev environment for the full error message and additional helpful warnings.");else{var l=[n,r,o,i,a,u],c=0;s=new Error("Invariant Violation: "+t.replace(/%s/g,function(){return l[c++]}))}throw s.framesToPop=1,s}};t.exports=r},{}],134:[function(e,t,n){"use strict";function r(e,t){if(!i.canUseDOM||t&&!("addEventListener"in document))return!1;var n="on"+e,r=n in document;if(!r){var a=document.createElement("div");a.setAttribute(n,"return;"),r="function"==typeof a[n]}return!r&&o&&"wheel"===e&&(r=document.implementation.hasFeature("Events.wheel","3.0")),r}var o,i=e(21);i.canUseDOM&&(o=document.implementation&&document.implementation.hasFeature&&document.implementation.hasFeature("","")!==!0),t.exports=r},{21:21}],135:[function(e,t,n){function r(e){return!(!e||!("function"==typeof Node?e instanceof Node:"object"==typeof e&&"number"==typeof e.nodeType&&"string"==typeof e.nodeName))}t.exports=r},{}],136:[function(e,t,n){"u
 se strict";function r(e){return e&&("INPUT"===e.nodeName&&o[e.type]||"TEXTAREA"===e.nodeName)}var o={color:!0,date:!0,datetime:!0,"datetime-local":!0,email:!0,month:!0,number:!0,password:!0,range:!0,search:!0,tel:!0,text:!0,time:!0,url:!0,week:!0};t.exports=r},{}],137:[function(e,t,n){function r(e){return o(e)&&3==e.nodeType}var o=e(135);t.exports=r},{135:135}],138:[function(e,t,n){"use strict";var r=e(133),o=function(e){var t,n={};r(e instanceof Object&&!Array.isArray(e));for(t in e)e.hasOwnProperty(t)&&(n[t]=t);return n};t.exports=o},{133:133}],139:[function(e,t,n){var r=function(e){var t;for(t in e)if(e.hasOwnProperty(t))return t;return null};t.exports=r},{}],140:[function(e,t,n){"use strict";function r(e,t,n){if(!e)return null;var r={};for(var i in e)o.call(e,i)&&(r[i]=t.call(n,e[i],i,e));return r}var o=Object.prototype.hasOwnProperty;t.exports=r},{}],141:[function(e,t,n){"use strict";function r(e){var t={};return function(n){return t.hasOwnProperty(n)||(t[n]=e.call(this,n)),t[n
 ]}}t.exports=r},{}],142:[function(e,t,n){"use strict";function r(e){return i(o.isValidElement(e)),e}var o=e(55),i=e(133);t.exports=r},{133:133,55:55}],143:[function(e,t,n){"use strict";function r(e){return'"'+o(e)+'"'}var o=e(114);t.exports=r},{114:114}],144:[function(e,t,n){"use strict";var r=e(21),o=/^[ \r\n\t\f]/,i=/<(!--|link|noscript|meta|script|style)[ \r\n\t\f\/>]/,a=function(e,t){e.innerHTML=t};if("undefined"!=typeof MSApp&&MSApp.execUnsafeLocalFunction&&(a=function(e,t){MSApp.execUnsafeLocalFunction(function(){e.innerHTML=t})}),r.canUseDOM){var u=document.createElement("div");u.innerHTML=" ",""===u.innerHTML&&(a=function(e,t){if(e.parentNode&&e.parentNode.replaceChild(e,e),o.test(t)||"<"===t[0]&&i.test(t)){e.innerHTML="\ufeff"+t;var n=e.firstChild;1===n.data.length?e.removeChild(n):n.deleteData(0,1)}else e.innerHTML=t})}t.exports=a},{21:21}],145:[function(e,t,n){"use strict";var r=e(21),o=e(114),i=e(144),a=function(e,t){e.textContent=t};r.canUseDOM&&("textContent"in documen
 t.documentElement||(a=function(e,t){i(e,o(t))})),t.exports=a},{114:114,144:144,21:21}],146:[function(e,t,n){"use strict";function r(e,t){if(e===t)return!0;var n;for(n in e)if(e.hasOwnProperty(n)&&(!t.hasOwnProperty(n)||e[n]!==t[n]))return!1;for(n in t)if(t.hasOwnProperty(n)&&!e.hasOwnProperty(n))return!1;return!0}t.exports=r},{}],147:[function(e,t,n){"use strict";function r(e,t){if(null!=e&&null!=t){var n=typeof e,r=typeof t;if("string"===n||"number"===n)return"string"===r||"number"===r;if("object"===r&&e.type===t.type&&e.key===t.key){var o=e._owner===t._owner;return o}}return!1}e(150);t.exports=r},{150:150}],148:[function(e,t,n){function r(e){var t=e.length;if(o(!Array.isArray(e)&&("object"==typeof e||"function"==typeof e)),o("number"==typeof t),o(0===t||t-1 in e),e.hasOwnProperty)try{return Array.prototype.slice.call(e)}catch(n){}for(var r=Array(t),i=0;t>i;i++)r[i]=e[i];return r}var o=e(133);t.exports=r},{133:133}],149:[function(e,t,n){"use strict";function r(e){return v[e]}functi
 on o(e,t){return e&&null!=e.key?a(e.key):t.toString(36)}function i(e){return(""+e).replace(g,r)}function a(e){return"$"+i(e)}function u(e,t,n,r,i){var s=typeof e;if(("undefined"===s||"boolean"===s)&&(e=null),null===e||"string"===s||"number"===s||l.isValidElement(e))return r(i,e,""===t?h+o(e,0):t,n),1;var p,v,g,y=0;if(Array.isArray(e))for(var C=0;C<e.length;C++)p=e[C],v=(""!==t?t+m:h)+o(p,C),g=n+y,y+=u(p,v,g,r,i);else{var E=d(e);if(E){var b,_=E.call(e);if(E!==e.entries)for(var x=0;!(b=_.next()).done;)p=b.value,v=(""!==t?t+m:h)+o(p,x++),g=n+y,y+=u(p,v,g,r,i);else for(;!(b=_.next()).done;){var D=b.value;D&&(p=D[1],v=(""!==t?t+m:h)+a(D[0])+m+o(p,0),g=n+y,y+=u(p,v,g,r,i))}}else if("object"===s){f(1!==e.nodeType);var M=c.extract(e);for(var N in M)M.hasOwnProperty(N)&&(p=M[N],v=(""!==t?t+m:h)+a(N)+m+o(p,0),g=n+y,y+=u(p,v,g,r,i))}}return y}function s(e,t,n){return null==e?0:u(e,"",0,t,n)}var l=e(55),c=e(61),p=e(64),d=e(124),f=e(133),h=(e(150),p.SEPARATOR),m=":",v={"=":"=0",".":"=1",":":"=2"
 },g=/[=.:]/g;t.exports=s},{124:124,133:133,150:150,55:55,61:61,64:64}],150:[function(e,t,n){"use strict";var r=e(112),o=r;t.exports=o},{112:112}]},{},[1])(1)});
\ No newline at end of file
diff --git a/www/test/icla/public/css/icla.css b/www/test/icla/public/css/icla.css
new file mode 100644
index 0000000..beff1ef
--- /dev/null
+++ b/www/test/icla/public/css/icla.css
@@ -0,0 +1,19 @@
+main .form-control:invalid {
+  border-color: red !important
+}
+
+main .form-control:valid {
+  border-color: green
+}
+
+footer.bg-primary {
+  background-color: #303284
+}
+
+.modal-backdrop.in {
+  opacity: 0.5
+}
+
+pre.draft {
+  color: #000
+}
diff --git a/www/test/icla/views/actions/draft-icla.json.rb b/www/test/icla/views/actions/draft-icla.json.rb
new file mode 100644
index 0000000..946e21c
--- /dev/null
+++ b/www/test/icla/views/actions/draft-icla.json.rb
@@ -0,0 +1,159 @@
+if not @apacheid.empty? and ASF::Person.find(@apacheid).icla?
+  _error "Apache ID #{@apacheid} already in use"
+  _focus :apacheId
+  return
+end
+
+# capture (possibly forwarded) remote IP address
+_ipaddr env['HTTP_X_FORWARDED_FOR'] || env['REMOTE_ADDR']
+
+# get today's date
+require 'date'
+today = Date.today.iso8601
+
+# split address into lines, enforcing a minimum of two lines
+address = @address.strip.lines.to_a
+while address.length < 2
+  address.push ''
+end
+
+# produce draft
+_draft <<-EOF
+                    The Apache Software Foundation
+     Individual Contributor License Agreement ("Agreement") V2.0
+                   http://www.apache.org/licenses/
+
+Thank you for your interest in The Apache Software Foundation (the
+"Foundation"). In order to clarify the intellectual property license
+granted with Contributions from any person or entity, the Foundation
+must have a Contributor License Agreement ("CLA") on file that has
+been signed by each Contributor, indicating agreement to the license
+terms below. This license is for your protection as a Contributor as
+well as the protection of the Foundation and its users; it does not
+change your rights to use your own Contributions for any other purpose.
+If you have not already done so, please complete and sign, then scan
+and email a pdf file of this Agreement to secretary@apache.org.
+Alternatively, you may send it by facsimile to the Foundation at
++1-919-573-9199. If necessary, send an original signed Agreement to
+The Apache Software Foundation, Dept. 9660, Los Angeles,
+CA 90084-9660, U.S.A. Please read this document carefully before
+signing and keep a copy for your records.
+
+  Full name: #{@fullname.ljust(54, '_')}
+
+  (optional) Public name: #{@publicname.ljust(41, '_')}
+
+  Mailing Address: #{address.map {|line| line.strip.ljust(48, '_')}.
+    join("\n\n                   ")}
+
+  Country:   #{@country.ljust(54, '_')}
+
+  Telephone: #{@telephone.ljust(54, '_')}
+
+  E-Mail:    #{@email.ljust(54, '_')}
+
+  (optional) preferred Apache id(s): #{@apacheid.ljust(30, '_')}
+
+  (optional) notify project: #{@pmc.ljust(38, '_')}
+
+You accept and agree to the following terms and conditions for Your
+present and future Contributions submitted to the Foundation. In
+return, the Foundation shall not use Your Contributions in a way that
+is contrary to the public benefit or inconsistent with its nonprofit
+status and bylaws in effect at the time of the Contribution. Except
+for the license granted herein to the Foundation and recipients of
+software distributed by the Foundation, You reserve all right, title,
+and interest in and to Your Contributions.
+
+1. Definitions.
+
+   "You" (or "Your") shall mean the copyright owner or legal entity
+   authorized by the copyright owner that is making this Agreement
+   with the Foundation. For legal entities, the entity making a
+   Contribution and all other entities that control, are controlled
+   by, or are under common control with that entity are considered to
+   be a single Contributor. For the purposes of this definition,
+   "control" means (i) the power, direct or indirect, to cause the
+   direction or management of such entity, whether by contract or
+   otherwise, or (ii) ownership of fifty percent (50%) or more of the
+   outstanding shares, or (iii) beneficial ownership of such entity.
+
+   "Contribution" shall mean any original work of authorship,
+   including any modifications or additions to an existing work, that
+   is intentionally submitted by You to the Foundation for inclusion
+   in, or documentation of, any of the products owned or managed by
+   the Foundation (the "Work"). For the purposes of this definition,
+   "submitted" means any form of electronic, verbal, or written
+   communication sent to the Foundation or its representatives,
+   including but not limited to communication on electronic mailing
+   lists, source code control systems, and issue tracking systems that
+   are managed by, or on behalf of, the Foundation for the purpose of
+   discussing and improving the Work, but excluding communication that
+   is conspicuously marked or otherwise designated in writing by You
+   as "Not a Contribution."
+
+2. Grant of Copyright License. Subject to the terms and conditions of
+   this Agreement, You hereby grant to the Foundation and to
+   recipients of software distributed by the Foundation a perpetual,
+   worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+   copyright license to reproduce, prepare derivative works of,
+   publicly display, publicly perform, sublicense, and distribute Your
+   Contributions and such derivative works.
+
+3. Grant of Patent License. Subject to the terms and conditions of
+   this Agreement, You hereby grant to the Foundation and to
+   recipients of software distributed by the Foundation a perpetual,
+   worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+   (except as stated in this section) patent license to make, have
+   made, use, offer to sell, sell, import, and otherwise transfer the
+   Work, where such license applies only to those patent claims
+   licensable by You that are necessarily infringed by Your
+   Contribution(s) alone or by combination of Your Contribution(s)
+   with the Work to which such Contribution(s) was submitted. If any
+   entity institutes patent litigation against You or any other entity
+   (including a cross-claim or counterclaim in a lawsuit) alleging
+   that your Contribution, or the Work to which you have contributed,
+   constitutes direct or contributory patent infringement, then any
+   patent licenses granted to that entity under this Agreement for
+   that Contribution or Work shall terminate as of the date such
+   litigation is filed.
+
+4. You represent that you are legally entitled to grant the above
+   license. If your employer(s) has rights to intellectual property
+   that you create that includes your Contributions, you represent
+   that you have received permission to make Contributions on behalf
+   of that employer, that your employer has waived such rights for
+   your Contributions to the Foundation, or that your employer has
+   executed a separate Corporate CLA with the Foundation.
+
+5. You represent that each of Your Contributions is Your original
+   creation (see section 7 for submissions on behalf of others).  You
+   represent that Your Contribution submissions include complete
+   details of any third-party license or other restriction (including,
+   but not limited to, related patents and trademarks) of which you
+   are personally aware and which are associated with any part of Your
+   Contributions.
+
+6. You are not expected to provide support for Your Contributions,
+   except to the extent You desire to provide support. You may provide
+   support for free, for a fee, or not at all. Unless required by
+   applicable law or agreed to in writing, You provide Your
+   Contributions on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS
+   OF ANY KIND, either express or implied, including, without
+   limitation, any warranties or conditions of TITLE, NON-
+   INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE.
+
+7. Should You wish to submit work that is not Your original creation,
+   You may submit it to the Foundation separately from any
+   Contribution, identifying the complete details of its source and of
+   any license or other restriction (including, but not limited to,
+   related patents, trademarks, and license agreements) of which you
+   are personally aware, and conspicuously marking the work as
+   "Submitted on behalf of a third-party: [named here]".
+
+8. You agree to notify the Foundation of any facts or circumstances of
+   which you become aware that would make these representations
+   inaccurate in any respect.
+
+Please sign: #{@fullname.ljust(34, '_')} Date: #{today.ljust(16, '_')}
+EOF
diff --git a/www/test/icla/views/actions/validate.json.rb b/www/test/icla/views/actions/validate.json.rb
new file mode 100644
index 0000000..fef5d9d
--- /dev/null
+++ b/www/test/icla/views/actions/validate.json.rb
@@ -0,0 +1,73 @@
+require 'socket'
+require 'net/http'
+require 'pathname'
+
+# find pmc and user information
+pmc = ASF::Committee.find(@pmc)
+user = ASF::Person.find(env.user)
+
+# validate email address
+begin
+  Socket.getaddrinfo(@iclaemail[/@(.*)/, 1], 'smtp')
+
+  if ASF::Person.find_by_email(@iclaemail)
+    _error "ICLA already on file for #{@iclaemail}"
+  end
+rescue
+  _error 'Invalid domain name in email address'
+  _focus :iclaemail
+end
+
+# validate vote link
+if @votelink and not @votelink.empty?
+
+  # attempt to fetch the page
+  if @votelink =~ /^https?:/i
+    uri = URI.parse(@votelink)
+    http = Net::HTTP.new(uri.host, uri.port)
+    if uri.scheme == 'https'
+      http.use_ssl = true
+      http.verify_mode = OpenSSL::SSL::VERIFY_NONE 
+    end
+    request = Net::HTTP::Get.new(uri.request_uri)
+    response = http.request(request)
+    unless response.code.to_i < 400
+      _error "HTTP status #{response.code} for #{@votelink}"
+      _focus :votelink
+    end
+  else
+    _error 'Only http(s) links are accepted for vote links'
+    _focus :votelink
+  end
+
+  # verify that the user submitting the form is on the PMC in question
+  unless pmc and pmc.members.include? user
+    _error "You must be on the #@pmc PMC to submit a vote link"
+    _focus :pmc
+  end
+
+end
+
+# add user and pmc emails to the response
+_userEmail "#{user.public_name} <#{user.mail.first}>" if user
+_pmcEmail "private@#{pmc.mail_list}.apache.org" if pmc
+
+# generate an invitation token
+token = Digest::MD5.hexdigest(@iclaemail)[0..15]
+path = Pathname.new(env['REQUEST_URI']) + "../../form?token=#{token}"
+scheme = env['rack.url_scheme'] || 'https'
+link = "#{scheme}://#{env['HTTP_HOST']}#{path}"
+
+# add token and invitation to the response
+_token token
+_invitation %{Dear #{@iclaname},
+
+Based on your contributions, you are invited to submit an ICLA to The Apache
+Software Foundation, using the following form. Please see
+http://apache.org/licenses for details.
+
+#{link}
+
+Thanks,
+#{user.public_name if user}
+}
diff --git a/www/test/icla/views/app.html.rb b/www/test/icla/views/app.html.rb
new file mode 100755
index 0000000..99d03f8
--- /dev/null
+++ b/www/test/icla/views/app.html.rb
@@ -0,0 +1,383 @@
+#!/usr/bin/ruby1.9.1
+# encoding: utf-8
+require 'wunderbar'
+
+_html lang: 'en', _width: '80' do
+  _head_ do
+    _meta name: 'viewport', content: 'width=device-width, initial-scale=1'
+    _link rel: 'shortcut icon',
+      href: 'https://whimsy.apache.org/favicon.ico'
+    _title 'ASF ICLA demo'
+    _link href: 'http://fonts.googleapis.com/css?family=Source+Sans+Pro:400,700%7cDroid+Serif:400,700',
+      rel: 'stylesheet', type: 'text/css'
+    _link href: 'https://www.apache.org/css/min.bootstrap.css',
+      rel: 'stylesheet'
+    _link href: 'https://www.apache.org/css/styles.css', rel: 'stylesheet'
+    _link href: 'css/icla.css', rel: 'stylesheet'
+
+    _.comment! 'Licensed to the Apache Software Foundation (ASF) under one ' +
+      'or more contributor license agreements. See the NOTICE file ' +
+      'distributed with this work for additional information regarding ' +
+      'copyright ownership. The ASF licenses this file to you 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.'
+  end
+
+  _body_ do
+    _.comment! 'Navigation'
+
+    _header_ do
+      _nav_.navbar.navbar_default.navbar_fixed_top do
+        _div_.container do
+          _div_.navbar_header do
+            _button_.navbar_toggle type: 'button', data_toggle: 'collapse',
+              data_target: '#mainnav-collapse' do
+              _span.sr_only 'Toggle navigation'
+              _span.icon_bar
+              _span.icon_bar
+              _span.icon_bar
+            end
+
+            _a.navbar_brand href: 'https://www.apache.org/foundation/board/calendar.html#' do
+              _span.glyphicon.glyphicon_home
+            end
+          end
+
+          _div_.collapse.navbar_collapse.mainnav_collapse! do
+            _div_! style: 'line-height:20px; padding-top:5px; float:left' do
+              _a 'Home', href: 'https://www.apache.org/'
+              _ " » "
+              _a 'Legal', href: 'https://www.apache.org/legal/'
+              _ " » "
+              _a 'ICLA', href: 'https://whimsy.apache.org/test/icla/'
+            end
+
+            _ul_.nav.navbar_nav.navbar_right do
+              _li_.dropdown do
+                _a.dropdown_toggle href: 'https://www.apache.org/foundation/board/calendar.html#',
+                  data_toggle: 'dropdown' do
+                  _ 'About'
+                  _span.caret
+                end
+
+                _ul_.dropdown_menu role: 'menu' do
+                  _li do
+                    _a 'Overview', href: 'https://www.apache.org/foundation'
+                  end
+                  _li do
+                    _a 'Members',
+                      href: 'https://www.apache.org/foundation/members.html'
+                  end
+                  _li do
+                    _a 'Process',
+                      href: 'https://www.apache.org/foundation/how-it-works.html'
+                  end
+                  _li do
+                    _a 'Sponsorship',
+                      href: 'https://www.apache.org/foundation/sponsorship.html'
+                  end
+                  _li do
+                    _a 'Glossary',
+                      href: 'https://www.apache.org/foundation/glossary.html'
+                  end
+                  _li do
+                    _a 'FAQ',
+                      href: 'https://www.apache.org/foundation/preFAQ.html'
+                  end
+                  _li do
+                    _a 'Contact',
+                      href: 'https://www.apache.org/foundation/contact.html'
+                  end
+                end
+              end
+
+              _li do
+                _a 'Projects',
+                  href: 'https://www.apache.org/foundation/board/calendar.html#projects-list'
+              end
+
+              _li_.dropdown do
+                _a.dropdown_toggle href: 'https://www.apache.org/foundation/board/calendar.html#',
+                  data_toggle: 'dropdown' do
+                  _ 'People'
+                  _span.caret
+                end
+
+                _ul_.dropdown_menu role: 'menu' do
+                  _li { _a 'Overview', href: 'http://people.apache.org/' }
+                  _li do
+                    _a 'Committers',
+                      href: 'http://people.apache.org/committer-index.html'
+                  end
+                  _li do
+                    _a 'Meritocracy',
+                      href: 'https://www.apache.org/foundation/how-it-works.html#meritocracy'
+                  end
+                  _li do
+                    _a 'Roles',
+                      href: 'https://www.apache.org/foundation/how-it-works.html#roles'
+                  end
+                  _li { _a 'Planet Apache', href: 'http://planet.apache.org/' }
+                end
+              end
+
+              _li_.dropdown do
+                _a.dropdown_toggle href: 'https://www.apache.org/foundation/board/calendar.html#',
+                  data_toggle: 'dropdown' do
+                  _ 'Get Involved'
+                  _span.caret
+                end
+
+                _ul_.dropdown_menu role: 'menu' do
+                  _li do
+                    _a 'Overview',
+                      href: 'https://www.apache.org/foundation/getinvolved.html'
+                  end
+                  _li do
+                    _a 'Community Development',
+                      href: 'http://community.apache.org/'
+                  end
+                  _li { _a 'ApacheCon', href: 'http://www.apachecon.com/' }
+                end
+              end
+
+              _li do
+                _a 'Download', href: 'https://www.apache.org/dyn/closer.cgi'
+              end
+
+              _li_.dropdown do
+                _a.dropdown_toggle href: 'https://www.apache.org/foundation/board/calendar.html#',
+                  data_toggle: 'dropdown' do
+                  _ 'Support Apache'
+                  _span.caret
+                end
+
+                _ul_.dropdown_menu role: 'menu' do
+                  _li do
+                    _a 'Sponsorship',
+                      href: 'https://www.apache.org/foundation/sponsorship.html'
+                  end
+                  _li do
+                    _a 'Donations',
+                      href: 'https://www.apache.org/foundation/contributing.html'
+                  end
+                  _li do
+                    _a 'Buy Stuff',
+                      href: 'https://www.apache.org/foundation/buy_stuff.html'
+                  end
+                  _li do
+                    _a 'Thanks',
+                      href: 'https://www.apache.org/foundation/thanks.html'
+                  end
+                end
+              end
+            end
+          end
+        end
+      end
+    end
+
+    _.comment! '/ Navigation'
+
+    _div_.container do
+      _div_.row do
+        _div.col_md_9.col_sm_8.col_xs_12 do
+          _img src: 'https://id.apache.org/img/asf_logo_wide.png',
+            alt: 'Apache Logo', style: 'max-width: 77%;'
+          _img src: 'https://whimsy.apache.org/whimsy.svg',
+            alt: 'Whimsy Logo', style: 'max-width: 22%'
+        end
+
+        _div_.col_md_3.col_sm_4.col_xs_12 do
+          _div_.input_group style: 'margin-bottom: 5px;' do
+            _input.form_control.projectSearch! type: 'text',
+              placeholder: 'Search...'
+
+            _span_.input_group_btn do
+              _button.btn.btn_primary type: 'button' do
+                _span.glyphicon.glyphicon_search aria_hidden: 'true'
+                _span.sr_only 'Search'
+              end
+            end
+          end
+
+          _a.btn.btn_block.btn_default.btn_xs 'The Apache Way', role: 'button',
+            href: 'https://www.apache.org/foundation/governance/'
+          _a.btn.btn_block.btn_default.btn_xs 'Contribute', role: 'button',
+            href: 'https://community.apache.org/contributors/'
+          _a.btn.btn_block.btn_default.btn_xs 'ASF Sponsors', role: 'button',
+            href: 'https://www.apache.org/foundation/thanks.html'
+        end
+      end
+    end
+
+    _.comment! 'Main content'
+
+    _div_.container.main!
+
+    _.comment! 'Footer'
+
+    _footer_.bg_primary do
+      _div_.container do
+        _div_.row do
+          _br
+          _div.col_sm_1 ''
+
+          _div_.col_sm_2 do
+            _h5.white 'Community'
+
+            _ul_.list_unstyled.white role: 'menu' do
+              _li { _a 'Overview', href: 'http://community.apache.org/' }
+              _li do
+                _a 'Conferences',
+                  href: 'https://www.apache.org/foundation/conferences.html'
+              end
+              _li do
+                _a 'Summer of Code',
+                  href: 'http://community.apache.org/gsoc.html'
+              end
+              _li do
+                _a 'Getting Started',
+                  href: 'http://community.apache.org/newcomers/'
+              end
+              _li do
+                _a 'The Apache Way',
+                  href: 'https://www.apache.org/foundation/how-it-works.html'
+              end
+              _li do
+                _a 'Travel Assistance', href: 'https://www.apache.org/travel/'
+              end
+              _li do
+                _a 'Get Involved',
+                  href: 'https://www.apache.org/foundation/getinvolved.html'
+              end
+              _li do
+                _a 'Community FAQ',
+                  href: 'http://community.apache.org/newbiefaq.html'
+              end
+            end
+          end
+
+          _div_.col_sm_2 do
+            _h5.white 'Innovation'
+
+            _ul_.list_unstyled.white role: 'menu' do
+              _li { _a 'Incubator', href: 'http://incubator.apache.org/' }
+              _li { _a 'Labs', href: 'http://labs.apache.org/' }
+              _li { _a 'Licensing', href: 'https://www.apache.org/licenses/' }
+              _li do
+                _a 'Licensing FAQ',
+                  href: 'https://www.apache.org/foundation/license-faq.html'
+              end
+              _li do
+                _a 'Trademark Policy',
+                  href: 'https://www.apache.org/foundation/marks/'
+              end
+              _li do
+                _a 'Contacts', href: 'https://www.apache.org/contact.html'
+              end
+            end
+          end
+
+          _div_.col_sm_2 do
+            _h5.white 'Tech Operations'
+
+            _ul_.list_unstyled.white role: 'menu' do
+              _li do
+                _a 'Developer Information', href: 'https://www.apache.org/dev/'
+              end
+              _li do
+                _a 'Infrastructure',
+                  href: 'https://www.apache.org/dev/infrastructure.html'
+              end
+              _li { _a 'Security', href: 'https://www.apache.org/security/' }
+              _li { _a 'Status', href: 'http://status.apache.org' }
+              _li do
+                _a 'Contacts',
+                  href: 'https://www.apache.org/foundation/contact.html'
+              end
+            end
+          end
+
+          _div_.col_sm_2 do
+            _h5.white 'Press'
+
+            _ul_.list_unstyled.white role: 'menu' do
+              _li { _a 'Overview', href: 'https://www.apache.org/press/' }
+              _li { _a 'ASF News', href: 'https://blogs.apache.org/' }
+              _li do
+                _a 'Announcements',
+                  href: 'https://blogs.apache.org/foundation/'
+              end
+              _li { _a 'Twitter Feed', href: 'https://twitter.com/TheASF' }
+              _li do
+                _a 'Contacts', href: 'https://www.apache.org/press/#contact'
+              end
+            end
+          end
+
+          _div_.col_sm_2 do
+            _h5.white 'Legal'
+
+            _ul_.list_unstyled.white role: 'menu' do
+              _li { _a 'Legal Affairs', href: 'https://www.apache.org/legal/' }
+              _li { _a 'Licenses', href: 'https://www.apache.org/licenses/' }
+              _li do
+                _a 'Trademark Policy',
+                  href: 'https://www.apache.org/foundation/marks/'
+              end
+              _li do
+                _a 'Public Records',
+                  href: 'https://www.apache.org/foundation/records/'
+              end
+              _li do
+                _a 'Export Information',
+                  href: 'https://www.apache.org/licenses/exports/'
+              end
+              _li do
+                _a 'License/Distribution FAQ',
+                  href: 'https://www.apache.org/foundation/license-faq.html'
+              end
+              _li do
+                _a 'Contacts',
+                  href: 'https://www.apache.org/foundation/contact.html'
+              end
+            end
+          end
+
+          _div.col_sm_1 ''
+        end
+
+        _hr.col_lg_12.hr_white
+
+        _div_.row do
+          _div_.col_lg_12 do
+            _p_!.text_center do
+              _ "Copyright © 2015 The Apache Software Foundation, Licensed " +
+                "under the "
+              _a.white 'Apache License, Version 2.0',
+                href: 'http://www.apache.org/licenses/LICENSE-2.0'
+              _ '.'
+            end
+
+            _p.text_center 'Apache and the Apache feather logo are ' +
+              'trademarks of The Apache Software Foundation.'
+          end
+        end
+      end
+    end
+
+    _.comment! '/ Footer'
+    _script src: 'app.js'
+
+    _.render '#main' do
+      _Main data: {pmcs: @pmcs}, view: @view
+    end
+  end
+end
diff --git a/www/test/icla/views/app.js.rb b/www/test/icla/views/app.js.rb
new file mode 100644
index 0000000..1fa732d
--- /dev/null
+++ b/www/test/icla/views/app.js.rb
@@ -0,0 +1,43 @@
+require_relative 'main'
+require_relative 'pages'
+
+# A convenient place to stash server data
+Server = {}
+
+# Form data for demo purposes
+FormData = {
+  fullname: 'Joe Test',
+  email: 'joetest@example.com',
+  pmc: 'incubator'
+}
+
+# "AJAX" style post request to the server, with a callback
+def post(target, data, &block)
+  xhr = XMLHttpRequest.new()
+  xhr.open('POST', "actions/#{target}", true)
+  xhr.setRequestHeader('Content-Type', 'application/json;charset=utf-8')
+  xhr.responseType = 'text'
+
+  def xhr.onreadystatechange()
+    if xhr.readyState == 4
+      data = nil
+
+      begin
+        if xhr.status == 200
+          data = JSON.parse(xhr.responseText) 
+        elsif xhr.status == 404
+          alert "Not Found: actions/#{target}"
+        elsif xhr.status >= 400
+          console.log(xhr.responseText)
+          alert "Exception\n#{JSON.parse(xhr.responseText).exception}"
+        end
+      rescue => e
+        console.log(e)
+      end
+
+      block(data)
+    end
+  end
+
+  xhr.send(JSON.stringify(data))
+end
diff --git a/www/test/icla/views/main.js.rb b/www/test/icla/views/main.js.rb
new file mode 100644
index 0000000..44f25df
--- /dev/null
+++ b/www/test/icla/views/main.js.rb
@@ -0,0 +1,43 @@
+#
+# Main class, nearly all scaffolding for demo purposes
+#
+
+class Main < React
+  def initialize
+    @view = Invite
+  end
+
+  def render
+    _main do
+      _h1 'Demo: Invitation to Submit ICLA'
+
+      React.createElement(@view)
+    end
+  end
+
+  # save data on first load
+  def componentWillMount()
+    Server.data = @@data
+    self.componentWillReceiveProps()
+  end
+
+  # set view based on properties
+  def componentWillReceiveProps()
+    if @@view == 'interview'
+      @view = Interview
+    else
+      @view = Invite
+    end
+  end
+
+  # Another navigation means in support of the demo
+  def navigate(view)
+    @view = view
+    window.scrollTo(0, 0)
+  end
+
+  # export navigation method on the client
+  def componentDidMount()
+    Main.navigate = self.navigate
+  end
+end
diff --git a/www/test/icla/views/markdown.js.rb b/www/test/icla/views/markdown.js.rb
new file mode 100644
index 0000000..d48bcb6
--- /dev/null
+++ b/www/test/icla/views/markdown.js.rb
@@ -0,0 +1,37 @@
+#
+# Convert markdown to html
+#
+
+class Markdown < React
+  def componentWillMount()
+    self.componentWillReceiveProps()
+  end
+
+  def componentWillReceiveProps()
+
+    # trim leading and trailing spaces
+    text = @@text.sub(/^\s*\n/, '').sub(/\s+$/, '')
+
+    # normalize indentation
+    spaces = new RegExp('^ *\S', 'mg');
+    match = regexp.exec(text)
+    if match
+      indent = match[0].length - 1
+      while (match = regexp.exec(text))
+        indent = match[0].length - 1 if indent >= match[0].length
+      end
+
+      if indent > 0
+        spaces = Array.new(indent+1).join(' ')
+        text = text.replace("^#{spaces}", 'g'), '')
+      end
+    end
+
+    # convert markdown to text
+    @html = markd(text)
+  end
+
+  def render
+    _span dangerouslySetInnerHTML: { __html: @html }
+  end
+end
diff --git a/www/test/icla/views/pages.js.rb b/www/test/icla/views/pages.js.rb
new file mode 100644
index 0000000..2896506
--- /dev/null
+++ b/www/test/icla/views/pages.js.rb
@@ -0,0 +1,13 @@
+require_relative "pages/form"
+require_relative "pages/invite"
+require_relative "pages/complete"
+require_relative "pages/interview"
+require_relative "pages/preview"
+
+Pages = [
+  "Preview",
+  "Form",
+  "Interview",
+  "Invite",
+  "Complete"
+]
diff --git a/www/test/icla/views/pages/complete.js.rb b/www/test/icla/views/pages/complete.js.rb
new file mode 100644
index 0000000..ba5c3f5
--- /dev/null
+++ b/www/test/icla/views/pages/complete.js.rb
@@ -0,0 +1,22 @@
+class Complete < React
+  def render
+    _p %{
+      At this point, the demo is complete.  If this were a real application:
+    }
+
+    _ul do
+      _li {_p 'An file would have been committed to SVN.'}
+
+      _li do
+        _p 'Commit message would include the following IP address information:'
+        _pre FormData.ipaddr
+      end
+
+      _li {_p 'An email would have been sent to the PMC.'}
+
+      if FormData.apacheid
+        _li {_p 'An new account request would have been submitted.'}
+      end
+    end
+  end
+end
diff --git a/www/test/icla/views/pages/form.js.rb b/www/test/icla/views/pages/form.js.rb
new file mode 100644
index 0000000..070622a
--- /dev/null
+++ b/www/test/icla/views/pages/form.js.rb
@@ -0,0 +1,115 @@
+class Form < React
+  def initialize
+    @disabled = true
+    @alert = nil
+
+    @fullName = ''
+    @publicName = ''
+    @address = ''
+    @country = ''
+    @telephone = ''
+    @apacheId = ''
+  end
+
+  def render
+    # error messages / welcome
+    if @alert
+      _div.alert.alert_danger do
+        _b 'Error: '
+        _span @alert
+      end
+    else
+      _p %{
+        Thanks!  Now please take a moment to answer a few questions about
+        yourself.
+      }
+    end
+
+    #
+    # Form fields
+    #
+
+    _div.form_group do
+      _p 'Full Name:'
+      _input.form_control.fullname! value: @fullName, required: true,
+        onChange: self.setFullName
+    end
+
+    _div.form_group do
+      _p 'Public Name:'
+      _input.form_control value: @publicName
+    end
+
+    _div.form_group do
+      _p 'Mailing Address:'
+      _textarea.form_control value: @address, rows: 2
+    end
+
+    _div.form_group do
+      _p 'Country:'
+      _input.form_control value: @country
+    end
+
+    _div.form_group do
+      _p 'Telephone:'
+      _input.form_control value: @telephone
+    end
+
+    if FormData.votelink
+      _div.form_group do
+        _p 'Preferred Apache Id (format: ^[a-z][-a-z0-9_]+$):'
+        _input.form_control value: @apacheId, pattern: "^[a-z][-a-z0-9_]+$"
+      end
+    end
+
+    #
+    # Submit button
+    #
+
+    _p do
+      _button.btn.btn_primary 'Submit', disabled: @disabled,
+        onClick: self.submit
+    end
+  end
+
+  # initialize public name from invitation
+  def componentWillMount()
+    @publicName = FormData.fullname
+  end
+
+  # when the form is initially loaded, set the focus on the address field
+  def componentDidMount()
+    document.getElementById('fullname').focus()
+  end
+
+  # enable submit button when name is present
+  def setFullName(event)
+    @fullName = event.target.value
+    @disabled = (event.target.value == '')
+  end
+
+  # submit the form
+  def submit()
+    FormData.fullname = @fullName
+    FormData.publicname = @publicName
+    FormData.address = @address
+    FormData.country = @country
+    FormData.telephone = @telephone
+    FormData.apacheid = @apacheId
+
+    @disabled = true
+    @alert = nil
+    post 'draft-icla', FormData do |response|
+      @disabled = false
+
+      if response.error
+        @alert = response.error
+        document.getElementById(response.focus).focus() if response.focus
+      else
+        FormData.draft = response.draft
+        FormData.ipaddr = response.ipaddr
+        Main.navigate(Preview)
+      end
+    end
+  end
+end
diff --git a/www/test/icla/views/pages/interview.js.rb b/www/test/icla/views/pages/interview.js.rb
new file mode 100644
index 0000000..0e27e55
--- /dev/null
+++ b/www/test/icla/views/pages/interview.js.rb
@@ -0,0 +1,130 @@
+class Interview < React
+  def initialize
+    @showQuestion1 = true
+    @showQuestion2 = false
+    @showQuestion3 = false
+
+    @disableButton1 = false
+    @disableButton2 = false
+    @disableButton3 = false
+  end
+
+  def render
+    _p.alert.alert_info %{
+      For demo purposes, assume that you are now the invitee, you received the
+      email, and clicked on the link.  Below is what you would see.
+    }
+
+    _p %{
+      Welcome to the Apache Software Foundation Individual Contributor License
+      Agreement online submission tool! This tool will guide you through the
+      process of licensing to the ASF any copyright and patents that may apply
+      to your contributions
+    }
+      
+    _p %{
+      This process should only take a few minutes, and is entirely online.
+      First we will ask you three questions. Next, you will be asked to
+      provide some information about yourself. Finally, you will get a chance
+      to review and submit the completed form.
+    }
+
+    #
+    # Question 1
+    #
+
+    if @showQuestion1
+      _h2 'Question 1'
+
+      _p %{
+        Are you are legally entitled to grant the necessary copyright and
+        patent licenses?  If any employer has intellectual property rights to
+        any of your Contributions:
+      }
+
+      _ul do
+        _li "have you received permission to make Contributions on behalf
+             of that employer, or"
+        _li "has your employer waived such rights for your Contributions to
+             the Foundation, or"
+        _li "has your employer executed a separate Corporate CLA with the 
+             Foundation?"
+      end
+
+      _p do
+        _button.btn.btn_primary 'Yes', disabled: @disableButton1,
+          onClick: self.clickButton1
+      end
+    end
+
+    #
+    # Question 2
+    #
+
+    if @showQuestion2
+      _h2 'Question 2'
+      _p %{
+        Are each of your contributions is your original creation? Do each of
+        your contribution submissions include complete details of any
+        third-party license or other restriction (including, but not limited
+        to, related patents and trademarks) of which you are personally aware
+        and which are associated with any part of Your Contributions?
+      }
+
+      _p.alert.alert_success do
+        _b 'Note: '
+        _span %{
+          Should you wish to submit work that is not your original creation,
+          you may submit it to the Foundation separately from any other
+          contribution, identifying the complete details of its source and of
+          any license or other restriction (including, but not limited to,
+          related patents, trademarks, and license agreements) of which you
+          are personally aware, and conspicuously marking the work as
+          "Submitted on behalf of a third-party: [named here]".
+        }
+      end
+
+      _p do
+        _button.btn.btn_primary 'Yes', disabled: @disableButton2,
+          onClick: self.clickButton2
+      end
+    end
+
+    #
+    # Question 3
+    #
+
+    if @showQuestion3
+      _h2 'Question 3'
+      _p %{
+        Do you agree to notify the Foundation of any facts or circumstances of
+        which you become aware that would make these representations
+        inaccurate in any respect?
+      }
+
+      _p do
+        _button.btn.btn_primary 'Yes', disabled: @disableButton3,
+          onClick: self.clickButton3
+      end
+
+      _p %{
+        Once you agree to this, the tool will ask you some questions
+        about yourself.
+      }
+    end
+  end
+
+  def clickButton1()
+    @disableButton1 = true 
+    @showQuestion2 = true
+  end
+
+  def clickButton2()
+    @disableButton2 = true 
+    @showQuestion3 = true
+  end
+
+  def clickButton3()
+    Main.navigate(Form)
+  end
+end
diff --git a/www/test/icla/views/pages/invite.js.rb b/www/test/icla/views/pages/invite.js.rb
new file mode 100644
index 0000000..fc6294e
--- /dev/null
+++ b/www/test/icla/views/pages/invite.js.rb
@@ -0,0 +1,211 @@
+class Invite < React
+  def initialize
+    @disabled = true
+    @alert = nil
+
+    # initialize form fields
+    @iclaname = ''
+    @iclaemail = ''
+    @pmc = ''
+    @votelink = ''
+  end
+
+  def render
+    _p %{
+      You've come to this page because a contributor has has submitted
+      a large patch or because your PMC has voted in a new committer.
+      Invite them to fill out an Individual Contributor License Agreement
+      by filling out the following form.
+    }
+
+    # error messages
+    if @alert
+      _div.alert.alert_danger do
+        _b 'Error: '
+        _span @alert
+      end
+    end
+
+    #
+    # Form fields
+    #
+
+    _div.form_group do
+      _label "Contributor's Name:", for: 'iclaname'
+      _input.form_control.iclaname! placeholder: 'Firstname Lastname',
+        required: true, onChange: self.setIclaName, value: @iclaname
+    end
+
+    _div.form_group do
+      _label "Contributor's E-Mail address:", for: 'iclaemail'
+      _input.form_control.iclaemail! type: 'email', required: true,
+        placeholder: 'user@example.com', onChange: self.setIclaEmail,
+        value: @iclaemail
+    end
+
+    _div.form_group do
+      _label "PMC", for: 'pmc'
+      _select.form_control.pmc! required: true, onChange: self.setPMC, value: @pmc do
+        _option ''
+        Server.data.pmcs.each do |pmc|
+          _option pmc
+        end
+      end
+    end
+
+    _p %{
+      Fill out the following only if the person was voted by the PMC to become
+      a committer or the person is an initial committer on a new project
+      accepted for incubation.  For new incubator projects use the
+      http://wiki.apache.org/incubator/XXXProposal link; for existing projects
+      link to the [RESULT][VOTE] message in the mail archives.
+    }
+
+    _div.form_group do
+      _label "Vote link", for: 'votelink'
+      _input.form_control.votelink! type: 'url', onChange: self.setVoteLink,
+        value: @votelink
+    end
+
+    #
+    # Submission button
+    #
+
+    _p do
+      _button.btn.btn_primary 'Preview Invitation', disabled: @disabled,
+        onClick: self.previewInvitation
+    end
+
+    #
+    # Hidden form: preview invite email
+    #
+    _div.modal.fade.invitation_preview! do
+      _div.modal_dialog do
+        _div.modal_content do
+          _div.modal_header do
+            _button.close "\u00d7", type: 'button', data_dismiss: 'modal'
+            _h4 'Preview Invitation Email'
+          end
+
+          _div.modal_body do
+            # headers
+            _div do
+              _b 'From: '
+              _span @userEmail
+            end
+            _div do
+              _b 'To: '
+              _span "#{@iclaname} <#{@iclaemail}>"
+            end
+            _div do
+              _b 'cc: '
+              _span @pmcEmail
+            end
+
+            # draft invitation email
+            _div.form_group do
+              _label for: 'invitation'
+              _textarea.form_control.invitation! value: @invitation, rows: 12,
+                onChange: self.setInvitation
+            end
+          end
+
+          _div.modal_footer do
+            _button.btn.btn_default 'Cancel', data_dismiss: 'modal'
+            _button.btn.btn_primary 'Mock Send', onClick: self.mockSend
+          end
+        end
+      end
+    end
+
+
+  end
+
+  # when the form is initially loaded, set the focus on the iclaname field
+  def componentDidMount()
+    document.getElementById('iclaname').focus()
+  end
+
+  #
+  # field setters
+  #
+
+  def setIclaName(event)
+    @iclaname = event.target.value
+    self.checkValidity()
+  end
+
+  def setIclaEmail(event)
+    @iclaemail = event.target.value
+    self.checkValidity()
+  end
+
+  def setPMC(event)
+    @pmc = event.target.value
+    self.checkValidity()
+  end
+
+  def setVoteLink(event)
+    @votelink = event.target.value
+    self.checkValidity()
+  end
+
+  def setInvitation(event)
+    @invitation = event.target.value
+    self.checkValidity()
+  end
+
+  #
+  # validation and processing
+  #
+
+  # client side field validations
+  def checkValidity()
+    @disabled = !%w(iclaname iclaemail pmc votelink).all? do |id|
+      document.getElementById(id).checkValidity()
+    end
+  end
+
+  # server side field validations
+  def previewInvitation()
+    data = {
+      iclaname: @iclaname,
+      iclaemail: @iclaemail,
+      pmc: @pmc,
+      votelink: @votelink
+    }
+
+    @disabled = true
+    @alert = nil
+    post 'validate', data do |response|
+      @disabled = false
+      @alert = response.error
+      @userEmail = response.userEmail
+      @pmcEmail = response.pmcEmail
+      @invitation = response.invitation
+      @token = response.token
+      document.getElementById(response.focus).focus() if response.focus
+      jQuery('#invitation-preview').modal(:show) unless @alert
+    end
+  end
+
+  # pretend to send an invitation
+  def mockSend()
+    # dismiss modal dialog
+    jQuery('#invitation-preview').modal(:hide)
+
+    # save information for later use (for demo purposes, this is client only)
+    FormData.token = @token
+    FormData.fullname = @iclaname
+    FormData.email = @iclaemail
+    FormData.pmc = @pmc
+    FormData.votelink = @votelink
+
+    # for demo purposes advance to the interview.  Note: the below line
+    # updates the URL in a way that breaks the back button.
+    history.replaceState({}, nil, "form?token=#@token")
+
+    # change the view
+    Main.navigate(Interview)
+  end
+end
diff --git a/www/test/icla/views/pages/preview.js.rb b/www/test/icla/views/pages/preview.js.rb
new file mode 100644
index 0000000..162773f
--- /dev/null
+++ b/www/test/icla/views/pages/preview.js.rb
@@ -0,0 +1,25 @@
+class Preview < React
+  def initialize
+    @disabled = false
+  end
+
+  def render
+    _p 'You are almost done!'
+
+    _p %{
+      Please review the following for accuracy, and click submit when
+      complete.
+    }
+
+    _pre.draft FormData.draft
+
+    _p do
+      _button.btn.btn_primary 'Submit', disabled: @disabled,
+        onClick: self.submit
+    end
+  end
+
+  def submit()
+    Main.navigate(Complete)
+  end
+end
diff --git a/www/test/local_paths.rb b/www/test/local_paths.rb
new file mode 100644
index 0000000..3b2f549
--- /dev/null
+++ b/www/test/local_paths.rb
@@ -0,0 +1,31 @@
+require 'fileutils'
+require 'yaml'
+require 'mail'
+
+Dir.chdir File.absolute_path('..', __FILE__)
+
+# Create a 'received' repository in work/repositories
+FileUtils.rm_rf 'work'
+FileUtils.mkdir_p 'work/repositories'
+
+Dir.chdir 'work/repositories' do
+  system 'svnadmin create received'
+end
+
+svn = File.absolute_path('work/repositories')
+
+# Checkout 'received' repository into work/svn
+FileUtils.mkdir_p 'work/svn'
+
+Dir.chdir 'work/svn' do
+  `svn checkout file://#{svn}/received`
+end
+
+RECEIVED = File.absolute_path('work/svn/received')
+
+# define pending yaml files
+PENDING_YML = File.join(RECEIVED, 'pending.yml')
+COMPLETED_YML = File.join(RECEIVED, 'completed.yml')
+
+# define where the mail configuration can be found
+MAIL = File.absolute_path('secmail.rb')
diff --git a/www/test/roster/Gemfile b/www/test/roster/Gemfile
new file mode 100644
index 0000000..be25f34
--- /dev/null
+++ b/www/test/roster/Gemfile
@@ -0,0 +1,14 @@
+source 'https://rubygems.org'
+
+gem 'rake'
+gem 'wunderbar', '>= 1.0.0'
+gem 'ruby2js', '>= 2.0.0'
+gem 'sinatra'
+gem 'nokogumbo'
+gem 'execjs', ('<2.5.1' if RUBY_VERSION =~ /^1/)
+gem 'whimsy-asf', '>= 0.0.14'
+gem 'listen', ('~> 2.10' if RUBY_VERSION =~ /^1/)
+
+group :demo do
+  gem 'puma'
+end
diff --git a/www/test/roster/banner.rb b/www/test/roster/banner.rb
new file mode 100644
index 0000000..b961af7
--- /dev/null
+++ b/www/test/roster/banner.rb
@@ -0,0 +1,28 @@
+#
+# common banner
+#
+
+class Wunderbar::HtmlMarkup
+  def _banner(args)
+    # logo
+    _a href: 'http://whimsy.apache.org/' do
+      _img src: 'https://id.apache.org/img/asf_logo_wide.png',
+        alt: 'ASF Logo', title: 'ASF Logo'
+    end
+
+    # breadcrumbs
+    if args[:breadcrumbs]
+      _div.breadcrumbs do
+        _a href: 'http://www.apache.org' do
+          _span.glyphicon.glyphicon_home
+        end
+
+        _a 'whimsy', href: 'https://www.whimsy.org/'
+        args[:breadcrumbs].each do |name, link|
+          _span "\u00BB"
+          _a name.to_s, href: link
+        end
+      end
+    end
+  end
+end
diff --git a/www/test/roster/config.ru b/www/test/roster/config.ru
new file mode 100644
index 0000000..acc3d44
--- /dev/null
+++ b/www/test/roster/config.ru
@@ -0,0 +1,9 @@
+require File.expand_path('../main.rb', __FILE__)
+
+require 'whimsy/asf/rack'
+
+# https://svn.apache.org/repos/infra/infrastructure/trunk/projects/whimsy/asf/rack.rb
+use ASF::HTTPS_workarounds
+use Rack::Deflater
+
+run Sinatra::Application
diff --git a/www/test/roster/main.rb b/www/test/roster/main.rb
new file mode 100755
index 0000000..3a7fbd9
--- /dev/null
+++ b/www/test/roster/main.rb
@@ -0,0 +1,63 @@
+#!/usr/bin/ruby
+
+#
+# Server side router/controllers
+#
+
+require 'whimsy/asf'
+
+require 'wunderbar/sinatra'
+require 'wunderbar/bootstrap/theme'
+require 'wunderbar/react'
+require 'ruby2js/filter/functions'
+require 'ruby2js/filter/require'
+
+require_relative 'banner'
+require_relative 'models'
+
+get '/' do
+  @committers = ASF::Person.list
+  @committees = ASF::Committee.list
+  _html :index
+end
+
+get '/committer/' do
+  _html :committers
+end
+
+get '/committee/' do
+  @members = ASF::Member.list.keys
+  @committees = ASF::Committee.list
+  _html :committees
+end
+
+get '/committer/index.json' do
+  # bulk loading the mail information makes things go faster
+  mail = Hash[ASF::Mail.list.group_by(&:last).
+    map {|person, list| [person, list.map(&:first)]}]
+
+  # return a list of people, their public-names, and email addresses
+  ASF::Person.list.sort_by(&:id).map {|person|
+    result = {id: person.id, name: person.public_name, mail: mail[person]}
+    result[:member] = true if person.asf_member?
+    result
+  }.to_json
+end
+
+get '/committee/:name.json' do |name|
+  _json Committee.serialize(name)
+end
+
+get '/committee/:name' do |name|
+  @committee = Committee.serialize(name)
+  _html :committee
+end
+
+get '/committer/:name.json' do |name|
+  _json Committer.serialize(name)
+end
+
+get '/committer/:name' do |name|
+  @committer = Committer.serialize(name)
+  _html :committer
+end
diff --git a/www/test/roster/models.rb b/www/test/roster/models.rb
new file mode 100644
index 0000000..e4cd8bc
--- /dev/null
+++ b/www/test/roster/models.rb
@@ -0,0 +1,2 @@
+require_relative 'models/committer'
+require_relative 'models/committee'
diff --git a/www/test/roster/models/committee.rb b/www/test/roster/models/committee.rb
new file mode 100644
index 0000000..ed09d36
--- /dev/null
+++ b/www/test/roster/models/committee.rb
@@ -0,0 +1,27 @@
+ASF::Committee.load_committee_info
+
+class Committee
+  def self.serialize(id)
+    response = {}
+
+    pmc = ASF::Committee.find(id)
+    committers = ASF::Group.find(id).members
+
+    ASF::Person.preload('cn', (pmc.members + committers).uniq)
+
+    response = {
+      id: id,
+      display_name: pmc.display_name,
+      description: pmc.description,
+      schedule: pmc.schedule,
+      report: pmc.report,
+      site: pmc.site,
+      established: pmc.established,
+      ldap: Hash[pmc.members.map {|person| [person.id, person.cn]}],
+      committers: Hash[committers.map {|person| [person.id, person.cn]}],
+      roster: pmc.roster
+    }
+
+    response
+  end
+end
diff --git a/www/test/roster/models/committer.rb b/www/test/roster/models/committer.rb
new file mode 100644
index 0000000..6430991
--- /dev/null
+++ b/www/test/roster/models/committer.rb
@@ -0,0 +1,38 @@
+class Committer
+  def self.serialize(id)
+    response = {}
+
+    person = ASF::Person.find(id)
+
+    response[:id] = id
+
+    response[:member] = person.asf_member?
+
+    name = {}
+
+    if person.icla
+      name[:public_name] = person.public_name
+      name[:legal_name] = person.icla.legal_name
+    end
+
+    unless person.attrs['cn'].empty?
+      name[:ldap] = person.attrs['cn'].first.force_encoding('utf-8')
+    end
+
+    response[:name] = name
+
+    response[:mail] = person.all_mail
+
+    if person.pgp_key_fingerprints and not person.pgp_key_fingerprints.empty?
+      response[:pgp] = person.pgp_key_fingerprints 
+    end
+
+    response[:urls] = person.urls unless person.urls.empty?
+
+    response[:groups] = person.groups.map(&:name)
+
+    response[:committees] = person.committees.map(&:name)
+
+    response
+  end
+end
diff --git a/www/test/roster/package.json b/www/test/roster/package.json
new file mode 100644
index 0000000..d43c231
--- /dev/null
+++ b/www/test/roster/package.json
@@ -0,0 +1,15 @@
+{
+  "package": "whimsy-roster",
+  "version": "0.1.0",
+
+  "repository": {
+    "type": "svn", 
+    "url": "https://svn.apache.org/repos/infra/infrastructure/trunk/projects/whimsy/www/test/roster"
+  },
+
+  "devDependencies": {
+    "jsdom": "^5.4.3",
+    "jquery": "^2.1.4",
+    "react": "^0.13.3"
+  }
+}
diff --git a/www/test/roster/public/fonts/glyphicons-halflings-regular.eot b/www/test/roster/public/fonts/glyphicons-halflings-regular.eot
new file mode 100644
index 0000000..b93a495
Binary files /dev/null and b/www/test/roster/public/fonts/glyphicons-halflings-regular.eot differ
diff --git a/www/test/roster/public/fonts/glyphicons-halflings-regular.svg b/www/test/roster/public/fonts/glyphicons-halflings-regular.svg
new file mode 100644
index 0000000..94fb549
--- /dev/null
+++ b/www/test/roster/public/fonts/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 3
 00h200 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 200
 h800 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/www/test/roster/public/fonts/glyphicons-halflings-regular.ttf b/www/test/roster/public/fonts/glyphicons-halflings-regular.ttf
new file mode 100644
index 0000000..1413fc6
Binary files /dev/null and b/www/test/roster/public/fonts/glyphicons-halflings-regular.ttf differ
diff --git a/www/test/roster/public/fonts/glyphicons-halflings-regular.woff b/www/test/roster/public/fonts/glyphicons-halflings-regular.woff
new file mode 100644
index 0000000..9e61285
Binary files /dev/null and b/www/test/roster/public/fonts/glyphicons-halflings-regular.woff differ
diff --git a/www/test/roster/public/fonts/glyphicons-halflings-regular.woff2 b/www/test/roster/public/fonts/glyphicons-halflings-regular.woff2
new file mode 100644
index 0000000..64539b5
Binary files /dev/null and b/www/test/roster/public/fonts/glyphicons-halflings-regular.woff2 differ
diff --git a/www/test/roster/public/javascript/es6-promise.js b/www/test/roster/public/javascript/es6-promise.js
new file mode 100644
index 0000000..88144c9
--- /dev/null
+++ b/www/test/roster/public/javascript/es6-promise.js
@@ -0,0 +1,967 @@
+/*!
+ * @overview es6-promise - a tiny implementation of Promises/A+.
+ * @copyright Copyright (c) 2014 Yehuda Katz, Tom Dale, Stefan Penner and contributors (Conversion to ES6 API by Jake Archibald)
+ * @license   Licensed under MIT license
+ *            See https://raw.githubusercontent.com/jakearchibald/es6-promise/master/LICENSE
+ * @version   3.0.2
+ */
+
+(function() {
+    "use strict";
+    function lib$es6$promise$utils$$objectOrFunction(x) {
+      return typeof x === 'function' || (typeof x === 'object' && x !== null);
+    }
+
+    function lib$es6$promise$utils$$isFunction(x) {
+      return typeof x === 'function';
+    }
+
+    function lib$es6$promise$utils$$isMaybeThenable(x) {
+      return typeof x === 'object' && x !== null;
+    }
+
+    var lib$es6$promise$utils$$_isArray;
+    if (!Array.isArray) {
+      lib$es6$promise$utils$$_isArray = function (x) {
+        return Object.prototype.toString.call(x) === '[object Array]';
+      };
+    } else {
+      lib$es6$promise$utils$$_isArray = Array.isArray;
+    }
+
+    var lib$es6$promise$utils$$isArray = lib$es6$promise$utils$$_isArray;
+    var lib$es6$promise$asap$$len = 0;
+    var lib$es6$promise$asap$$toString = {}.toString;
+    var lib$es6$promise$asap$$vertxNext;
+    var lib$es6$promise$asap$$customSchedulerFn;
+
+    var lib$es6$promise$asap$$asap = function asap(callback, arg) {
+      lib$es6$promise$asap$$queue[lib$es6$promise$asap$$len] = callback;
+      lib$es6$promise$asap$$queue[lib$es6$promise$asap$$len + 1] = arg;
+      lib$es6$promise$asap$$len += 2;
+      if (lib$es6$promise$asap$$len === 2) {
+        // If len is 2, that means that we need to schedule an async flush.
+        // If additional callbacks are queued before the queue is flushed, they
+        // will be processed by this flush that we are scheduling.
+        if (lib$es6$promise$asap$$customSchedulerFn) {
+          lib$es6$promise$asap$$customSchedulerFn(lib$es6$promise$asap$$flush);
+        } else {
+          lib$es6$promise$asap$$scheduleFlush();
+        }
+      }
+    }
+
+    function lib$es6$promise$asap$$setScheduler(scheduleFn) {
+      lib$es6$promise$asap$$customSchedulerFn = scheduleFn;
+    }
+
+    function lib$es6$promise$asap$$setAsap(asapFn) {
+      lib$es6$promise$asap$$asap = asapFn;
+    }
+
+    var lib$es6$promise$asap$$browserWindow = (typeof window !== 'undefined') ? window : undefined;
+    var lib$es6$promise$asap$$browserGlobal = lib$es6$promise$asap$$browserWindow || {};
+    var lib$es6$promise$asap$$BrowserMutationObserver = lib$es6$promise$asap$$browserGlobal.MutationObserver || lib$es6$promise$asap$$browserGlobal.WebKitMutationObserver;
+    var lib$es6$promise$asap$$isNode = typeof process !== 'undefined' && {}.toString.call(process) === '[object process]';
+
+    // test for web worker but not in IE10
+    var lib$es6$promise$asap$$isWorker = typeof Uint8ClampedArray !== 'undefined' &&
+      typeof importScripts !== 'undefined' &&
+      typeof MessageChannel !== 'undefined';
+
+    // node
+    function lib$es6$promise$asap$$useNextTick() {
+      // node version 0.10.x displays a deprecation warning when nextTick is used recursively
+      // see https://github.com/cujojs/when/issues/410 for details
+      return function() {
+        process.nextTick(lib$es6$promise$asap$$flush);
+      };
+    }
+
+    // vertx
+    function lib$es6$promise$asap$$useVertxTimer() {
+      return function() {
+        lib$es6$promise$asap$$vertxNext(lib$es6$promise$asap$$flush);
+      };
+    }
+
+    function lib$es6$promise$asap$$useMutationObserver() {
+      var iterations = 0;
+      var observer = new lib$es6$promise$asap$$BrowserMutationObserver(lib$es6$promise$asap$$flush);
+      var node = document.createTextNode('');
+      observer.observe(node, { characterData: true });
+
+      return function() {
+        node.data = (iterations = ++iterations % 2);
+      };
+    }
+
+    // web worker
+    function lib$es6$promise$asap$$useMessageChannel() {
+      var channel = new MessageChannel();
+      channel.port1.onmessage = lib$es6$promise$asap$$flush;
+      return function () {
+        channel.port2.postMessage(0);
+      };
+    }
+
+    function lib$es6$promise$asap$$useSetTimeout() {
+      return function() {
+        setTimeout(lib$es6$promise$asap$$flush, 1);
+      };
+    }
+
+    var lib$es6$promise$asap$$queue = new Array(1000);
+    function lib$es6$promise$asap$$flush() {
+      for (var i = 0; i < lib$es6$promise$asap$$len; i+=2) {
+        var callback = lib$es6$promise$asap$$queue[i];
+        var arg = lib$es6$promise$asap$$queue[i+1];
+
+        callback(arg);
+
+        lib$es6$promise$asap$$queue[i] = undefined;
+        lib$es6$promise$asap$$queue[i+1] = undefined;
+      }
+
+      lib$es6$promise$asap$$len = 0;
+    }
+
+    function lib$es6$promise$asap$$attemptVertx() {
+      try {
+        var r = require;
+        var vertx = r('vertx');
+        lib$es6$promise$asap$$vertxNext = vertx.runOnLoop || vertx.runOnContext;
+        return lib$es6$promise$asap$$useVertxTimer();
+      } catch(e) {
+        return lib$es6$promise$asap$$useSetTimeout();
+      }
+    }
+
+    var lib$es6$promise$asap$$scheduleFlush;
+    // Decide what async method to use to triggering processing of queued callbacks:
+    if (lib$es6$promise$asap$$isNode) {
+      lib$es6$promise$asap$$scheduleFlush = lib$es6$promise$asap$$useNextTick();
+    } else if (lib$es6$promise$asap$$BrowserMutationObserver) {
+      lib$es6$promise$asap$$scheduleFlush = lib$es6$promise$asap$$useMutationObserver();
+    } else if (lib$es6$promise$asap$$isWorker) {
+      lib$es6$promise$asap$$scheduleFlush = lib$es6$promise$asap$$useMessageChannel();
+    } else if (lib$es6$promise$asap$$browserWindow === undefined && typeof require === 'function') {
+      lib$es6$promise$asap$$scheduleFlush = lib$es6$promise$asap$$attemptVertx();
+    } else {
+      lib$es6$promise$asap$$scheduleFlush = lib$es6$promise$asap$$useSetTimeout();
+    }
+
+    function lib$es6$promise$$internal$$noop() {}
+
+    var lib$es6$promise$$internal$$PENDING   = void 0;
+    var lib$es6$promise$$internal$$FULFILLED = 1;
+    var lib$es6$promise$$internal$$REJECTED  = 2;
+
+    var lib$es6$promise$$internal$$GET_THEN_ERROR = new lib$es6$promise$$internal$$ErrorObject();
+
+    function lib$es6$promise$$internal$$selfFulfillment() {
+      return new TypeError("You cannot resolve a promise with itself");
+    }
+
+    function lib$es6$promise$$internal$$cannotReturnOwn() {
+      return new TypeError('A promises callback cannot return that same promise.');
+    }
+
+    function lib$es6$promise$$internal$$getThen(promise) {
+      try {
+        return promise.then;
+      } catch(error) {
+        lib$es6$promise$$internal$$GET_THEN_ERROR.error = error;
+        return lib$es6$promise$$internal$$GET_THEN_ERROR;
+      }
+    }
+
+    function lib$es6$promise$$internal$$tryThen(then, value, fulfillmentHandler, rejectionHandler) {
+      try {
+        then.call(value, fulfillmentHandler, rejectionHandler);
+      } catch(e) {
+        return e;
+      }
+    }
+
+    function lib$es6$promise$$internal$$handleForeignThenable(promise, thenable, then) {
+       lib$es6$promise$asap$$asap(function(promise) {
+        var sealed = false;
+        var error = lib$es6$promise$$internal$$tryThen(then, thenable, function(value) {
+          if (sealed) { return; }
+          sealed = true;
+          if (thenable !== value) {
+            lib$es6$promise$$internal$$resolve(promise, value);
+          } else {
+            lib$es6$promise$$internal$$fulfill(promise, value);
+          }
+        }, function(reason) {
+          if (sealed) { return; }
+          sealed = true;
+
+          lib$es6$promise$$internal$$reject(promise, reason);
+        }, 'Settle: ' + (promise._label || ' unknown promise'));
+
+        if (!sealed && error) {
+          sealed = true;
+          lib$es6$promise$$internal$$reject(promise, error);
+        }
+      }, promise);
+    }
+
+    function lib$es6$promise$$internal$$handleOwnThenable(promise, thenable) {
+      if (thenable._state === lib$es6$promise$$internal$$FULFILLED) {
+        lib$es6$promise$$internal$$fulfill(promise, thenable._result);
+      } else if (thenable._state === lib$es6$promise$$internal$$REJECTED) {
+        lib$es6$promise$$internal$$reject(promise, thenable._result);
+      } else {
+        lib$es6$promise$$internal$$subscribe(thenable, undefined, function(value) {
+          lib$es6$promise$$internal$$resolve(promise, value);
+        }, function(reason) {
+          lib$es6$promise$$internal$$reject(promise, reason);
+        });
+      }
+    }
+
+    function lib$es6$promise$$internal$$handleMaybeThenable(promise, maybeThenable) {
+      if (maybeThenable.constructor === promise.constructor) {
+        lib$es6$promise$$internal$$handleOwnThenable(promise, maybeThenable);
+      } else {
+        var then = lib$es6$promise$$internal$$getThen(maybeThenable);
+
+        if (then === lib$es6$promise$$internal$$GET_THEN_ERROR) {
+          lib$es6$promise$$internal$$reject(promise, lib$es6$promise$$internal$$GET_THEN_ERROR.error);
+        } else if (then === undefined) {
+          lib$es6$promise$$internal$$fulfill(promise, maybeThenable);
+        } else if (lib$es6$promise$utils$$isFunction(then)) {
+          lib$es6$promise$$internal$$handleForeignThenable(promise, maybeThenable, then);
+        } else {
+          lib$es6$promise$$internal$$fulfill(promise, maybeThenable);
+        }
+      }
+    }
+
+    function lib$es6$promise$$internal$$resolve(promise, value) {
+      if (promise === value) {
+        lib$es6$promise$$internal$$reject(promise, lib$es6$promise$$internal$$selfFulfillment());
+      } else if (lib$es6$promise$utils$$objectOrFunction(value)) {
+        lib$es6$promise$$internal$$handleMaybeThenable(promise, value);
+      } else {
+        lib$es6$promise$$internal$$fulfill(promise, value);
+      }
+    }
+
+    function lib$es6$promise$$internal$$publishRejection(promise) {
+      if (promise._onerror) {
+        promise._onerror(promise._result);
+      }
+
+      lib$es6$promise$$internal$$publish(promise);
+    }
+
+    function lib$es6$promise$$internal$$fulfill(promise, value) {
+      if (promise._state !== lib$es6$promise$$internal$$PENDING) { return; }
+
+      promise._result = value;
+      promise._state = lib$es6$promise$$internal$$FULFILLED;
+
+      if (promise._subscribers.length !== 0) {
+        lib$es6$promise$asap$$asap(lib$es6$promise$$internal$$publish, promise);
+      }
+    }
+
+    function lib$es6$promise$$internal$$reject(promise, reason) {
+      if (promise._state !== lib$es6$promise$$internal$$PENDING) { return; }
+      promise._state = lib$es6$promise$$internal$$REJECTED;
+      promise._result = reason;
+
+      lib$es6$promise$asap$$asap(lib$es6$promise$$internal$$publishRejection, promise);
+    }
+
+    function lib$es6$promise$$internal$$subscribe(parent, child, onFulfillment, onRejection) {
+      var subscribers = parent._subscribers;
+      var length = subscribers.length;
+
+      parent._onerror = null;
+
+      subscribers[length] = child;
+      subscribers[length + lib$es6$promise$$internal$$FULFILLED] = onFulfillment;
+      subscribers[length + lib$es6$promise$$internal$$REJECTED]  = onRejection;
+
+      if (length === 0 && parent._state) {
+        lib$es6$promise$asap$$asap(lib$es6$promise$$internal$$publish, parent);
+      }
+    }
+
+    function lib$es6$promise$$internal$$publish(promise) {
+      var subscribers = promise._subscribers;
+      var settled = promise._state;
+
+      if (subscribers.length === 0) { return; }
+
+      var child, callback, detail = promise._result;
+
+      for (var i = 0; i < subscribers.length; i += 3) {
+        child = subscribers[i];
+        callback = subscribers[i + settled];
+
+        if (child) {
+          lib$es6$promise$$internal$$invokeCallback(settled, child, callback, detail);
+        } else {
+          callback(detail);
+        }
+      }
+
+      promise._subscribers.length = 0;
+    }
+
+    function lib$es6$promise$$internal$$ErrorObject() {
+      this.error = null;
+    }
+
+    var lib$es6$promise$$internal$$TRY_CATCH_ERROR = new lib$es6$promise$$internal$$ErrorObject();
+
+    function lib$es6$promise$$internal$$tryCatch(callback, detail) {
+      try {
+        return callback(detail);
+      } catch(e) {
+        lib$es6$promise$$internal$$TRY_CATCH_ERROR.error = e;
+        return lib$es6$promise$$internal$$TRY_CATCH_ERROR;
+      }
+    }
+
+    function lib$es6$promise$$internal$$invokeCallback(settled, promise, callback, detail) {
+      var hasCallback = lib$es6$promise$utils$$isFunction(callback),
+          value, error, succeeded, failed;
+
+      if (hasCallback) {
+        value = lib$es6$promise$$internal$$tryCatch(callback, detail);
+
+        if (value === lib$es6$promise$$internal$$TRY_CATCH_ERROR) {
+          failed = true;
+          error = value.error;
+          value = null;
+        } else {
+          succeeded = true;
+        }
+
+        if (promise === value) {
+          lib$es6$promise$$internal$$reject(promise, lib$es6$promise$$internal$$cannotReturnOwn());
+          return;
+        }
+
+      } else {
+        value = detail;
+        succeeded = true;
+      }
+
+      if (promise._state !== lib$es6$promise$$internal$$PENDING) {
+        // noop
+      } else if (hasCallback && succeeded) {
+        lib$es6$promise$$internal$$resolve(promise, value);
+      } else if (failed) {
+        lib$es6$promise$$internal$$reject(promise, error);
+      } else if (settled === lib$es6$promise$$internal$$FULFILLED) {
+        lib$es6$promise$$internal$$fulfill(promise, value);
+      } else if (settled === lib$es6$promise$$internal$$REJECTED) {
+        lib$es6$promise$$internal$$reject(promise, value);
+      }
+    }
+
+    function lib$es6$promise$$internal$$initializePromise(promise, resolver) {
+      try {
+        resolver(function resolvePromise(value){
+          lib$es6$promise$$internal$$resolve(promise, value);
+        }, function rejectPromise(reason) {
+          lib$es6$promise$$internal$$reject(promise, reason);
+        });
+      } catch(e) {
+        lib$es6$promise$$internal$$reject(promise, e);
+      }
+    }
+
+    function lib$es6$promise$enumerator$$Enumerator(Constructor, input) {
+      var enumerator = this;
+
+      enumerator._instanceConstructor = Constructor;
+      enumerator.promise = new Constructor(lib$es6$promise$$internal$$noop);
+
+      if (enumerator._validateInput(input)) {
+        enumerator._input     = input;
+        enumerator.length     = input.length;
+        enumerator._remaining = input.length;
+
+        enumerator._init();
+
+        if (enumerator.length === 0) {
+          lib$es6$promise$$internal$$fulfill(enumerator.promise, enumerator._result);
+        } else {
+          enumerator.length = enumerator.length || 0;
+          enumerator._enumerate();
+          if (enumerator._remaining === 0) {
+            lib$es6$promise$$internal$$fulfill(enumerator.promise, enumerator._result);
+          }
+        }
+      } else {
+        lib$es6$promise$$internal$$reject(enumerator.promise, enumerator._validationError());
+      }
+    }
+
+    lib$es6$promise$enumerator$$Enumerator.prototype._validateInput = function(input) {
+      return lib$es6$promise$utils$$isArray(input);
+    };
+
+    lib$es6$promise$enumerator$$Enumerator.prototype._validationError = function() {
+      return new Error('Array Methods must be provided an Array');
+    };
+
+    lib$es6$promise$enumerator$$Enumerator.prototype._init = function() {
+      this._result = new Array(this.length);
+    };
+
+    var lib$es6$promise$enumerator$$default = lib$es6$promise$enumerator$$Enumerator;
+
+    lib$es6$promise$enumerator$$Enumerator.prototype._enumerate = function() {
+      var enumerator = this;
+
+      var length  = enumerator.length;
+      var promise = enumerator.promise;
+      var input   = enumerator._input;
+
+      for (var i = 0; promise._state === lib$es6$promise$$internal$$PENDING && i < length; i++) {
+        enumerator._eachEntry(input[i], i);
+      }
+    };
+
+    lib$es6$promise$enumerator$$Enumerator.prototype._eachEntry = function(entry, i) {
+      var enumerator = this;
+      var c = enumerator._instanceConstructor;
+
+      if (lib$es6$promise$utils$$isMaybeThenable(entry)) {
+        if (entry.constructor === c && entry._state !== lib$es6$promise$$internal$$PENDING) {
+          entry._onerror = null;
+          enumerator._settledAt(entry._state, i, entry._result);
+        } else {
+          enumerator._willSettleAt(c.resolve(entry), i);
+        }
+      } else {
+        enumerator._remaining--;
+        enumerator._result[i] = entry;
+      }
+    };
+
+    lib$es6$promise$enumerator$$Enumerator.prototype._settledAt = function(state, i, value) {
+      var enumerator = this;
+      var promise = enumerator.promise;
+
+      if (promise._state === lib$es6$promise$$internal$$PENDING) {
+        enumerator._remaining--;
+
+        if (state === lib$es6$promise$$internal$$REJECTED) {
+          lib$es6$promise$$internal$$reject(promise, value);
+        } else {
+          enumerator._result[i] = value;
+        }
+      }
+
+      if (enumerator._remaining === 0) {
+        lib$es6$promise$$internal$$fulfill(promise, enumerator._result);
+      }
+    };
+
+    lib$es6$promise$enumerator$$Enumerator.prototype._willSettleAt = function(promise, i) {
+      var enumerator = this;
+
+      lib$es6$promise$$internal$$subscribe(promise, undefined, function(value) {
+        enumerator._settledAt(lib$es6$promise$$internal$$FULFILLED, i, value);
+      }, function(reason) {
+        enumerator._settledAt(lib$es6$promise$$internal$$REJECTED, i, reason);
+      });
+    };
+    function lib$es6$promise$promise$all$$all(entries) {
+      return new lib$es6$promise$enumerator$$default(this, entries).promise;
+    }
+    var lib$es6$promise$promise$all$$default = lib$es6$promise$promise$all$$all;
+    function lib$es6$promise$promise$race$$race(entries) {
+      /*jshint validthis:true */
+      var Constructor = this;
+
+      var promise = new Constructor(lib$es6$promise$$internal$$noop);
+
+      if (!lib$es6$promise$utils$$isArray(entries)) {
+        lib$es6$promise$$internal$$reject(promise, new TypeError('You must pass an array to race.'));
+        return promise;
+      }
+
+      var length = entries.length;
+
+      function onFulfillment(value) {
+        lib$es6$promise$$internal$$resolve(promise, value);
+      }
+
+      function onRejection(reason) {
+        lib$es6$promise$$internal$$reject(promise, reason);
+      }
+
+      for (var i = 0; promise._state === lib$es6$promise$$internal$$PENDING && i < length; i++) {
+        lib$es6$promise$$internal$$subscribe(Constructor.resolve(entries[i]), undefined, onFulfillment, onRejection);
+      }
+
+      return promise;
+    }
+    var lib$es6$promise$promise$race$$default = lib$es6$promise$promise$race$$race;
+    function lib$es6$promise$promise$resolve$$resolve(object) {
+      /*jshint validthis:true */
+      var Constructor = this;
+
+      if (object && typeof object === 'object' && object.constructor === Constructor) {
+        return object;
+      }
+
+      var promise = new Constructor(lib$es6$promise$$internal$$noop);
+      lib$es6$promise$$internal$$resolve(promise, object);
+      return promise;
+    }
+    var lib$es6$promise$promise$resolve$$default = lib$es6$promise$promise$resolve$$resolve;
+    function lib$es6$promise$promise$reject$$reject(reason) {
+      /*jshint validthis:true */
+      var Constructor = this;
+      var promise = new Constructor(lib$es6$promise$$internal$$noop);
+      lib$es6$promise$$internal$$reject(promise, reason);
+      return promise;
+    }
+    var lib$es6$promise$promise$reject$$default = lib$es6$promise$promise$reject$$reject;
+
+    var lib$es6$promise$promise$$counter = 0;
+
+    function lib$es6$promise$promise$$needsResolver() {
+      throw new TypeError('You must pass a resolver function as the first argument to the promise constructor');
+    }
+
+    function lib$es6$promise$promise$$needsNew() {
+      throw new TypeError("Failed to construct 'Promise': Please use the 'new' operator, this object constructor cannot be called as a function.");
+    }
+
+    var lib$es6$promise$promise$$default = lib$es6$promise$promise$$Promise;
+    /**
+      Promise objects represent the eventual result of an asynchronous operation. The
+      primary way of interacting with a promise is through its `then` method, which
+      registers callbacks to receive either a promise's eventual value or the reason
+      why the promise cannot be fulfilled.
+
+      Terminology
+      -----------
+
+      - `promise` is an object or function with a `then` method whose behavior conforms to this specification.
+      - `thenable` is an object or function that defines a `then` method.
+      - `value` is any legal JavaScript value (including undefined, a thenable, or a promise).
+      - `exception` is a value that is thrown using the throw statement.
+      - `reason` is a value that indicates why a promise was rejected.
+      - `settled` the final resting state of a promise, fulfilled or rejected.
+
+      A promise can be in one of three states: pending, fulfilled, or rejected.
+
+      Promises that are fulfilled have a fulfillment value and are in the fulfilled
+      state.  Promises that are rejected have a rejection reason and are in the
+      rejected state.  A fulfillment value is never a thenable.
+
+      Promises can also be said to *resolve* a value.  If this value is also a
+      promise, then the original promise's settled state will match the value's
+      settled state.  So a promise that *resolves* a promise that rejects will
+      itself reject, and a promise that *resolves* a promise that fulfills will
+      itself fulfill.
+
+
+      Basic Usage:
+      ------------
+
+      ```js
+      var promise = new Promise(function(resolve, reject) {
+        // on success
+        resolve(value);
+
+        // on failure
+        reject(reason);
+      });
+
+      promise.then(function(value) {
+        // on fulfillment
+      }, function(reason) {
+        // on rejection
+      });
+      ```
+
+      Advanced Usage:
+      ---------------
+
+      Promises shine when abstracting away asynchronous interactions such as
+      `XMLHttpRequest`s.
+
+      ```js
+      function getJSON(url) {
+        return new Promise(function(resolve, reject){
+          var xhr = new XMLHttpRequest();
+
+          xhr.open('GET', url);
+          xhr.onreadystatechange = handler;
+          xhr.responseType = 'json';
+          xhr.setRequestHeader('Accept', 'application/json');
+          xhr.send();
+
+          function handler() {
+            if (this.readyState === this.DONE) {
+              if (this.status === 200) {
+                resolve(this.response);
+              } else {
+                reject(new Error('getJSON: `' + url + '` failed with status: [' + this.status + ']'));
+              }
+            }
+          };
+        });
+      }
+
+      getJSON('/posts.json').then(function(json) {
+        // on fulfillment
+      }, function(reason) {
+        // on rejection
+      });
+      ```
+
+      Unlike callbacks, promises are great composable primitives.
+
+      ```js
+      Promise.all([
+        getJSON('/posts'),
+        getJSON('/comments')
+      ]).then(function(values){
+        values[0] // => postsJSON
+        values[1] // => commentsJSON
+
+        return values;
+      });
+      ```
+
+      @class Promise
+      @param {function} resolver
+      Useful for tooling.
+      @constructor
+    */
+    function lib$es6$promise$promise$$Promise(resolver) {
+      this._id = lib$es6$promise$promise$$counter++;
+      this._state = undefined;
+      this._result = undefined;
+      this._subscribers = [];
+
+      if (lib$es6$promise$$internal$$noop !== resolver) {
+        if (!lib$es6$promise$utils$$isFunction(resolver)) {
+          lib$es6$promise$promise$$needsResolver();
+        }
+
+        if (!(this instanceof lib$es6$promise$promise$$Promise)) {
+          lib$es6$promise$promise$$needsNew();
+        }
+
+        lib$es6$promise$$internal$$initializePromise(this, resolver);
+      }
+    }
+
+    lib$es6$promise$promise$$Promise.all = lib$es6$promise$promise$all$$default;
+    lib$es6$promise$promise$$Promise.race = lib$es6$promise$promise$race$$default;
+    lib$es6$promise$promise$$Promise.resolve = lib$es6$promise$promise$resolve$$default;
+    lib$es6$promise$promise$$Promise.reject = lib$es6$promise$promise$reject$$default;
+    lib$es6$promise$promise$$Promise._setScheduler = lib$es6$promise$asap$$setScheduler;
+    lib$es6$promise$promise$$Promise._setAsap = lib$es6$promise$asap$$setAsap;
+    lib$es6$promise$promise$$Promise._asap = lib$es6$promise$asap$$asap;
+
+    lib$es6$promise$promise$$Promise.prototype = {
+      constructor: lib$es6$promise$promise$$Promise,
+
+    /**
+      The primary way of interacting with a promise is through its `then` method,
+      which registers callbacks to receive either a promise's eventual value or the
+      reason why the promise cannot be fulfilled.
+
+      ```js
+      findUser().then(function(user){
+        // user is available
+      }, function(reason){
+        // user is unavailable, and you are given the reason why
+      });
+      ```
+
+      Chaining
+      --------
+
+      The return value of `then` is itself a promise.  This second, 'downstream'
+      promise is resolved with the return value of the first promise's fulfillment
+      or rejection handler, or rejected if the handler throws an exception.
+
+      ```js
+      findUser().then(function (user) {
+        return user.name;
+      }, function (reason) {
+        return 'default name';
+      }).then(function (userName) {
+        // If `findUser` fulfilled, `userName` will be the user's name, otherwise it
+        // will be `'default name'`
+      });
+
+      findUser().then(function (user) {
+        throw new Error('Found user, but still unhappy');
+      }, function (reason) {
+        throw new Error('`findUser` rejected and we're unhappy');
+      }).then(function (value) {
+        // never reached
+      }, function (reason) {
+        // if `findUser` fulfilled, `reason` will be 'Found user, but still unhappy'.
+        // If `findUser` rejected, `reason` will be '`findUser` rejected and we're unhappy'.
+      });
+      ```
+      If the downstream promise does not specify a rejection handler, rejection reasons will be propagated further downstream.
+
+      ```js
+      findUser().then(function (user) {
+        throw new PedagogicalException('Upstream error');
+      }).then(function (value) {
+        // never reached
+      }).then(function (value) {
+        // never reached
+      }, function (reason) {
+        // The `PedgagocialException` is propagated all the way down to here
+      });
+      ```
+
+      Assimilation
+      ------------
+
+      Sometimes the value you want to propagate to a downstream promise can only be
+      retrieved asynchronously. This can be achieved by returning a promise in the
+      fulfillment or rejection handler. The downstream promise will then be pending
+      until the returned promise is settled. This is called *assimilation*.
+
+      ```js
+      findUser().then(function (user) {
+        return findCommentsByAuthor(user);
+      }).then(function (comments) {
+        // The user's comments are now available
+      });
+      ```
+
+      If the assimliated promise rejects, then the downstream promise will also reject.
+
+      ```js
+      findUser().then(function (user) {
+        return findCommentsByAuthor(user);
+      }).then(function (comments) {
+        // If `findCommentsByAuthor` fulfills, we'll have the value here
+      }, function (reason) {
+        // If `findCommentsByAuthor` rejects, we'll have the reason here
+      });
+      ```
+
+      Simple Example
+      --------------
+
+      Synchronous Example
+
+      ```javascript
+      var result;
+
+      try {
+        result = findResult();
+        // success
+      } catch(reason) {
+        // failure
+      }
+      ```
+
+      Errback Example
+
+      ```js
+      findResult(function(result, err){
+        if (err) {
+          // failure
+        } else {
+          // success
+        }
+      });
+      ```
+
+      Promise Example;
+
+      ```javascript
+      findResult().then(function(result){
+        // success
+      }, function(reason){
+        // failure
+      });
+      ```
+
+      Advanced Example
+      --------------
+
+      Synchronous Example
+
+      ```javascript
+      var author, books;
+
+      try {
+        author = findAuthor();
+        books  = findBooksByAuthor(author);
+        // success
+      } catch(reason) {
+        // failure
+      }
+      ```
+
+      Errback Example
+
+      ```js
+
+      function foundBooks(books) {
+
+      }
+
+      function failure(reason) {
+
+      }
+
+      findAuthor(function(author, err){
+        if (err) {
+          failure(err);
+          // failure
+        } else {
+          try {
+            findBoooksByAuthor(author, function(books, err) {
+              if (err) {
+                failure(err);
+              } else {
+                try {
+                  foundBooks(books);
+                } catch(reason) {
+                  failure(reason);
+                }
+              }
+            });
+          } catch(error) {
+            failure(err);
+          }
+          // success
+        }
+      });
+      ```
+
+      Promise Example;
+
+      ```javascript
+      findAuthor().
+        then(findBooksByAuthor).
+        then(function(books){
+          // found books
+      }).catch(function(reason){
+        // something went wrong
+      });
+      ```
+
+      @method then
+      @param {Function} onFulfilled
+      @param {Function} onRejected
+      Useful for tooling.
+      @return {Promise}
+    */
+      then: function(onFulfillment, onRejection) {
+        var parent = this;
+        var state = parent._state;
+
+        if (state === lib$es6$promise$$internal$$FULFILLED && !onFulfillment || state === lib$es6$promise$$internal$$REJECTED && !onRejection) {
+          return this;
+        }
+
+        var child = new this.constructor(lib$es6$promise$$internal$$noop);
+        var result = parent._result;
+
+        if (state) {
+          var callback = arguments[state - 1];
+          lib$es6$promise$asap$$asap(function(){
+            lib$es6$promise$$internal$$invokeCallback(state, child, callback, result);
+          });
+        } else {
+          lib$es6$promise$$internal$$subscribe(parent, child, onFulfillment, onRejection);
+        }
+
+        return child;
+      },
+
+    /**
+      `catch` is simply sugar for `then(undefined, onRejection)` which makes it the same
+      as the catch block of a try/catch statement.
+
+      ```js
+      function findAuthor(){
+        throw new Error('couldn't find that author');
+      }
+
+      // synchronous
+      try {
+        findAuthor();
+      } catch(reason) {
+        // something went wrong
+      }
+
+      // async with promises
+      findAuthor().catch(function(reason){
+        // something went wrong
+      });
+      ```
+
+      @method catch
+      @param {Function} onRejection
+      Useful for tooling.
+      @return {Promise}
+    */
+      'catch': function(onRejection) {
+        return this.then(null, onRejection);
+      }
+    };
+    function lib$es6$promise$polyfill$$polyfill() {
+      var local;
+
+      if (typeof global !== 'undefined') {
+          local = global;
+      } else if (typeof self !== 'undefined') {
+          local = self;
+      } else {
+          try {
+              local = Function('return this')();
+          } catch (e) {
+              throw new Error('polyfill failed because global object is unavailable in this environment');
+          }
+      }
+
+      var P = local.Promise;
+
+      if (P && Object.prototype.toString.call(P.resolve()) === '[object Promise]' && !P.cast) {
+        return;
+      }
+
+      local.Promise = lib$es6$promise$promise$$default;
+    }
+    var lib$es6$promise$polyfill$$default = lib$es6$promise$polyfill$$polyfill;
+
+    var lib$es6$promise$umd$$ES6Promise = {
+      'Promise': lib$es6$promise$promise$$default,
+      'polyfill': lib$es6$promise$polyfill$$default
+    };
+
+    /* global define:true module:true window: true */
+    if (typeof define === 'function' && define['amd']) {
+      define(function() { return lib$es6$promise$umd$$ES6Promise; });
+    } else if (typeof module !== 'undefined' && module['exports']) {
+      module['exports'] = lib$es6$promise$umd$$ES6Promise;
+    } else if (typeof this !== 'undefined') {
+      this['ES6Promise'] = lib$es6$promise$umd$$ES6Promise;
+    }
+
+    lib$es6$promise$polyfill$$default();
+}).call(this);
+
diff --git a/www/test/roster/public/javascript/fetch.js b/www/test/roster/public/javascript/fetch.js
new file mode 100644
index 0000000..0beb144
--- /dev/null
+++ b/www/test/roster/public/javascript/fetch.js
@@ -0,0 +1,330 @@
+(function() {
+  'use strict';
+
+  if (self.fetch) {
+    return
+  }
+
+  function normalizeName(name) {
+    if (typeof name !== 'string') {
+      name = name.toString();
+    }
+    if (/[^a-z0-9\-#$%&'*+.\^_`|~]/i.test(name)) {
+      throw new TypeError('Invalid character in header field name')
+    }
+    return name.toLowerCase()
+  }
+
+  function normalizeValue(value) {
+    if (typeof value !== 'string') {
+      value = value.toString();
+    }
+    return value
+  }
+
+  function Headers(headers) {
+    this.map = {}
+
+    if (headers instanceof Headers) {
+      headers.forEach(function(value, name) {
+        this.append(name, value)
+      }, this)
+
+    } else if (headers) {
+      Object.getOwnPropertyNames(headers).forEach(function(name) {
+        this.append(name, headers[name])
+      }, this)
+    }
+  }
+
+  Headers.prototype.append = function(name, value) {
+    name = normalizeName(name)
+    value = normalizeValue(value)
+    var list = this.map[name]
+    if (!list) {
+      list = []
+      this.map[name] = list
+    }
+    list.push(value)
+  }
+
+  Headers.prototype['delete'] = function(name) {
+    delete this.map[normalizeName(name)]
+  }
+
+  Headers.prototype.get = function(name) {
+    var values = this.map[normalizeName(name)]
+    return values ? values[0] : null
+  }
+
+  Headers.prototype.getAll = function(name) {
+    return this.map[normalizeName(name)] || []
+  }
+
+  Headers.prototype.has = function(name) {
+    return this.map.hasOwnProperty(normalizeName(name))
+  }
+
+  Headers.prototype.set = function(name, value) {
+    this.map[normalizeName(name)] = [normalizeValue(value)]
+  }
+
+  Headers.prototype.forEach = function(callback, thisArg) {
+    Object.getOwnPropertyNames(this.map).forEach(function(name) {
+      this.map[name].forEach(function(value) {
+        callback.call(thisArg, value, name, this)
+      }, this)
+    }, this)
+  }
+
+  function consumed(body) {
+    if (body.bodyUsed) {
+      return Promise.reject(new TypeError('Already read'))
+    }
+    body.bodyUsed = true
+  }
+
+  function fileReaderReady(reader) {
+    return new Promise(function(resolve, reject) {
+      reader.onload = function() {
+        resolve(reader.result)
+      }
+      reader.onerror = function() {
+        reject(reader.error)
+      }
+    })
+  }
+
+  function readBlobAsArrayBuffer(blob) {
+    var reader = new FileReader()
+    reader.readAsArrayBuffer(blob)
+    return fileReaderReady(reader)
+  }
+
+  function readBlobAsText(blob) {
+    var reader = new FileReader()
+    reader.readAsText(blob)
+    return fileReaderReady(reader)
+  }
+
+  var support = {
+    blob: 'FileReader' in self && 'Blob' in self && (function() {
+      try {
+        new Blob();
+        return true
+      } catch(e) {
+        return false
+      }
+    })(),
+    formData: 'FormData' in self
+  }
+
+  function Body() {
+    this.bodyUsed = false
+
+
+    this._initBody = function(body) {
+      this._bodyInit = body
+      if (typeof body === 'string') {
+        this._bodyText = body
+      } else if (support.blob && Blob.prototype.isPrototypeOf(body)) {
+        this._bodyBlob = body
+      } else if (support.formData && FormData.prototype.isPrototypeOf(body)) {
+        this._bodyFormData = body
+      } else if (!body) {
+        this._bodyText = ''
+      } else {
+        throw new Error('unsupported BodyInit type')
+      }
+    }
+
+    if (support.blob) {
+      this.blob = function() {
+        var rejected = consumed(this)
+        if (rejected) {
+          return rejected
+        }
+
+        if (this._bodyBlob) {
+          return Promise.resolve(this._bodyBlob)
+        } else if (this._bodyFormData) {
+          throw new Error('could not read FormData body as blob')
+        } else {
+          return Promise.resolve(new Blob([this._bodyText]))
+        }
+      }
+
+      this.arrayBuffer = function() {
+        return this.blob().then(readBlobAsArrayBuffer)
+      }
+
+      this.text = function() {
+        var rejected = consumed(this)
+        if (rejected) {
+          return rejected
+        }
+
+        if (this._bodyBlob) {
+          return readBlobAsText(this._bodyBlob)
+        } else if (this._bodyFormData) {
+          throw new Error('could not read FormData body as text')
+        } else {
+          return Promise.resolve(this._bodyText)
+        }
+      }
+    } else {
+      this.text = function() {
+        var rejected = consumed(this)
+        return rejected ? rejected : Promise.resolve(this._bodyText)
+      }
+    }
+
+    if (support.formData) {
+      this.formData = function() {
+        return this.text().then(decode)
+      }
+    }
+
+    this.json = function() {
+      return this.text().then(JSON.parse)
+    }
+
+    return this
+  }
+
+  // HTTP methods whose capitalization should be normalized
+  var methods = ['DELETE', 'GET', 'HEAD', 'OPTIONS', 'POST', 'PUT']
+
+  function normalizeMethod(method) {
+    var upcased = method.toUpperCase()
+    return (methods.indexOf(upcased) > -1) ? upcased : method
+  }
+
+  function Request(url, options) {
+    options = options || {}
+    this.url = url
+
+    this.credentials = options.credentials || 'omit'
+    this.headers = new Headers(options.headers)
+    this.method = normalizeMethod(options.method || 'GET')
+    this.mode = options.mode || null
+    this.referrer = null
+
+    if ((this.method === 'GET' || this.method === 'HEAD') && options.body) {
+      throw new TypeError('Body not allowed for GET or HEAD requests')
+    }
+    this._initBody(options.body)
+  }
+
+  function decode(body) {
+    var form = new FormData()
+    body.trim().split('&').forEach(function(bytes) {
+      if (bytes) {
+        var split = bytes.split('=')
+        var name = split.shift().replace(/\+/g, ' ')
+        var value = split.join('=').replace(/\+/g, ' ')
+        form.append(decodeURIComponent(name), decodeURIComponent(value))
+      }
+    })
+    return form
+  }
+
+  function headers(xhr) {
+    var head = new Headers()
+    var pairs = xhr.getAllResponseHeaders().trim().split('\n')
+    pairs.forEach(function(header) {
+      var split = header.trim().split(':')
+      var key = split.shift().trim()
+      var value = split.join(':').trim()
+      head.append(key, value)
+    })
+    return head
+  }
+
+  Body.call(Request.prototype)
+
+  function Response(bodyInit, options) {
+    if (!options) {
+      options = {}
+    }
+
+    this._initBody(bodyInit)
+    this.type = 'default'
+    this.url = null
+    this.status = options.status
+    this.ok = this.status >= 200 && this.status < 300
+    this.statusText = options.statusText
+    this.headers = options.headers instanceof Headers ? options.headers : new Headers(options.headers)
+    this.url = options.url || ''
+  }
+
+  Body.call(Response.prototype)
+
+  self.Headers = Headers;
+  self.Request = Request;
+  self.Response = Response;
+
+  self.fetch = function(input, init) {
+    // TODO: Request constructor should accept input, init
+    var request
+    if (Request.prototype.isPrototypeOf(input) && !init) {
+      request = input
+    } else {
+      request = new Request(input, init)
+    }
+
+    return new Promise(function(resolve, reject) {
+      var xhr = new XMLHttpRequest()
+
+      function responseURL() {
+        if ('responseURL' in xhr) {
+          return xhr.responseURL
+        }
+
+        // Avoid security warnings on getResponseHeader when not allowed by CORS
+        if (/^X-Request-URL:/m.test(xhr.getAllResponseHeaders())) {
+          return xhr.getResponseHeader('X-Request-URL')
+        }
+
+        return;
+      }
+
+      xhr.onload = function() {
+        var status = (xhr.status === 1223) ? 204 : xhr.status
+        if (status < 100 || status > 599) {
+          reject(new TypeError('Network request failed'))
+          return
+        }
+        var options = {
+          status: status,
+          statusText: xhr.statusText,
+          headers: headers(xhr),
+          url: responseURL()
+        }
+        var body = 'response' in xhr ? xhr.response : xhr.responseText;
+        resolve(new Response(body, options))
+      }
+
+      xhr.onerror = function() {
+        reject(new TypeError('Network request failed'))
+      }
+
+      xhr.open(request.method, request.url, true)
+
+      if (request.credentials === 'include') {
+        xhr.withCredentials = true
+      }
+
+      if ('responseType' in xhr && support.blob) {
+        xhr.responseType = 'blob'
+      }
+
+      request.headers.forEach(function(value, name) {
+        xhr.setRequestHeader(name, value)
+      })
+
+      xhr.send(typeof request._bodyInit === 'undefined' ? null : request._bodyInit)
+    })
+  }
+  self.fetch.polyfill = true
+})();
diff --git a/www/test/roster/public/stylesheets/app.css b/www/test/roster/public/stylesheets/app.css
new file mode 100644
index 0000000..a54ff06
--- /dev/null
+++ b/www/test/roster/public/stylesheets/app.css
@@ -0,0 +1,25 @@
+h1 .note, h2 .note {font-size: small}
+h2 {margin-bottom: 0}
+h4 {margin-left: 1em}
+table ul {margin: 0; padding: 0; list-style: none}
+table {border-spacing: 0 1em}
+.wide td:first-child {text-align: right; padding: 0}
+.wide td:first-child:after {content: ' —'}
+.wide td:last-child {border-left: solid 1px #000; padding: 0 0.5em}
+table {margin-left: 1em; margin-top: 0.5em}
+td, th {padding-left: 0.5em; padding-right: 0.5em}
+table.wide {color: #000; border-collapse: separate; font-size: 100%}
+.issue:before, .chair:before {content: '\21d0  '}
+.issue, .not-found {color: red; font-weight:bold} 
+.chair {color: green; font-weight:bold} 
+.member {font-weight: bold}
+
+td .hint {display: none}
+td:hover .hint {
+  position: absolute; display: block; background-color: #FFF;
+  padding: 1em; border: 2px solid #0F0; border-radius: 1em;
+  color: black; font-weight: normal}
+
+.list-none {list-style-type: none; padding-left: 1.5em; margin-top: 0.5em}
+
+.breadcrumbs {padding: 10px 20px}
diff --git a/www/test/roster/views/app.js.rb b/www/test/roster/views/app.js.rb
new file mode 100644
index 0000000..1e0f4f3
--- /dev/null
+++ b/www/test/roster/views/app.js.rb
@@ -0,0 +1,5 @@
+require_relative 'polyfill'
+
+require_relative 'committee'
+require_relative 'committer'
+require_relative 'committerSearch'
diff --git a/www/test/roster/views/committee.html.rb b/www/test/roster/views/committee.html.rb
new file mode 100644
index 0000000..5483865
--- /dev/null
+++ b/www/test/roster/views/committee.html.rb
@@ -0,0 +1,23 @@
+#
+# A single committee
+#
+
+_html do
+  _base href: '..'
+  _title @committee[:display_name]
+  _link rel: 'stylesheet', href: '../stylesheets/app.css'
+
+  _banner breadcrumbs: {
+    roster: 'https://whimsy.apache.org/roster',
+    committee: 'https://whimsy.apache.org/roster/committee/',
+    @committee[:id] => 
+      "https://whimsy.apache.org/roster/committers/#{@committee[:id]}"
+  }
+
+  _div_.main!
+
+  _script src: '../app.js'
+  _.render '#main' do
+    _Committee committee: @committee
+  end
+end
diff --git a/www/test/roster/views/committee.js.rb b/www/test/roster/views/committee.js.rb
new file mode 100644
index 0000000..6cf2da6
--- /dev/null
+++ b/www/test/roster/views/committee.js.rb
@@ -0,0 +1,26 @@
+class Committee < React
+  def render
+    _h1 do
+      _a @@committee.display_name, href: @@committee.site
+      _span ' '
+      _small "established #{@@committee.established}"
+    end
+
+    _p @@committee.description
+
+    _h2 'PMC'
+    _table do
+
+      roster = @@committee.roster
+
+      for id in roster
+        person = roster[id]
+
+        _tr do
+          _td {_a id, href: "../committer/#{id}"}
+          _td person.name
+        end
+      end
+    end
+  end
+end
diff --git a/www/test/roster/views/committees.html.rb b/www/test/roster/views/committees.html.rb
new file mode 100644
index 0000000..9bb11c4
--- /dev/null
+++ b/www/test/roster/views/committees.html.rb
@@ -0,0 +1,37 @@
+#
+# List of committees
+#
+
+_html do
+  _base href: '..'
+  _title 'ASF Committee Roster'
+  _link rel: 'stylesheet', href: '../stylesheets/app.css'
+
+  _banner breadcrumbs: {
+    roster: 'https://whimsy.apache.org/roster',
+    committee: 'https://whimsy.apache.org/roster/committere'
+  }
+
+  _h1 'PMCs'
+
+  _table do
+    @committees.each do |pmc|
+      _tr_ do
+        _td do
+          _a pmc.display_name, href: pmc.name
+        end
+        _td do
+          pmc.chairs.each_with_index do |chair, index|
+            if @members.include? chair[:id]
+              _b! {_a chair[:name], href: "../committer/#{chair[:id]}"}
+            else
+              _a chair[:name], href: "../committer/#{chair[:id]}"
+            end
+
+            _span ', ' unless index == 0
+          end
+        end
+      end
+    end
+  end
+end
diff --git a/www/test/roster/views/committer.html.rb b/www/test/roster/views/committer.html.rb
new file mode 100644
index 0000000..b7a2378
--- /dev/null
+++ b/www/test/roster/views/committer.html.rb
@@ -0,0 +1,24 @@
+#
+# A single committer
+#
+
+_html do
+  _base href: '..'
+  _title @committer[:name][:public_name]
+  _link rel: 'stylesheet', href: '../stylesheets/app.css'
+
+  _banner breadcrumbs: {
+    roster: 'https://whimsy.apache.org/roster',
+    committer: 'https://whimsy.apache.org/roster/committers',
+    @committer[:id] => 
+      "https://whimsy.apache.org/roster/committers/#{@committer[:id]}"
+
+  }
+
+  _div_.main!
+
+  _script src: '../app.js'
+  _.render '#main' do
+    _Committer committer: @committer
+  end
+end
diff --git a/www/test/roster/views/committer.js.rb b/www/test/roster/views/committer.js.rb
new file mode 100644
index 0000000..b85fa6f
--- /dev/null
+++ b/www/test/roster/views/committer.js.rb
@@ -0,0 +1,51 @@
+class Committer < React
+  def render
+    _h2 "#{@@committer.id}@apache.org"
+
+    _table.wide do
+
+      _tr do
+        _td 'Name'
+        _td do
+          name = @@committer.name
+
+          if name.public_name==name.legal_name and name.public_name==name.ldap
+            _span @@committer.name.public_name
+          else
+            _ul do
+              _li "#{@@committer.name.public_name} (public name)"
+
+              if name.legal_name and name.legal_name != name.public_name
+                _li "#{@@committer.name.legal_name} (legal name)"
+              end
+
+              if name.ldap and name.ldap != name.public_name
+                _li "#{@@committer.name.ldap} (ldap)"
+              end
+            end
+          end
+        end
+      end
+
+      if @@committer.urls
+        _tr do
+          _td 'Personal URL'
+          _td do
+            _ul @@committer.urls do |url|
+              _a url, href: url
+            end
+          end
+        end
+      end
+
+      _tr do
+        _td 'Committees'
+        _td do
+          _ul @@committer.committees do |pmc|
+            _li {_a pmc, href: "../committee/#{pmc}"}
+          end
+        end
+      end
+    end
+  end
+end
diff --git a/www/test/roster/views/committerSearch.js.rb b/www/test/roster/views/committerSearch.js.rb
new file mode 100644
index 0000000..79be0f6
--- /dev/null
+++ b/www/test/roster/views/committerSearch.js.rb
@@ -0,0 +1,88 @@
+class CommitterSearch < React
+  def initialize
+    @list = []
+    @ready = false
+    @search = ''
+    @committers = []
+  end
+
+  def componentDidMount()
+    Polyfill.require(%w(Promise fetch)) do
+      fetch('committer/index.json').then do |response|
+        response.json().then do |committers|
+          @ready = true
+          @committers = committers
+          search = @search
+          self.change(target: {value: search}) unless search.empty?
+        end
+      end
+    end
+  end
+
+  def change(event)
+    @search = event.target.value
+
+    search = @search.downcase().split(' ')
+
+    list = []
+    @list = list
+    @committers.each do |person|
+      if 
+        search.all? {|part|
+          person.id.include? part or
+          person.name.downcase().include? part or
+          person.mail.any? {|mail| mail.include? part}
+        }
+      then
+        list << person
+      end
+    end
+  end
+
+  def render
+    _label 'Search:', for: 'search-text'
+    _input.search_text! autofocus: true, value: @search, onChange: self.change
+
+    if @search.length
+      if not @ready
+        _p 'loading...'
+
+      else
+        search = @search.downcase().split(' ')
+        list = @list
+
+        if list.length == 0
+          _p 'none found'
+        elsif list.length > 99
+          _p "#{list.length} entries match"
+        else
+          _table do
+            _thead do
+              _tr do
+                _th 'id'
+                _th 'name'
+                _th 'email'
+              end
+            end
+
+            _tbody do
+              list.each do |person|
+                _tr do
+                  _td {_a person.id, href: "committer/#{person.id}"}
+
+                  if person.member
+                    _td {_b person.name}
+                  else
+                    _td person.name
+                  end
+
+                  _td person.mail.first
+                end
+              end
+            end
+          end
+        end
+      end
+    end
+  end
+end
diff --git a/www/test/roster/views/committers.html.rb b/www/test/roster/views/committers.html.rb
new file mode 100644
index 0000000..c10ec87
--- /dev/null
+++ b/www/test/roster/views/committers.html.rb
@@ -0,0 +1,23 @@
+#
+# A single committer
+#
+
+_html do
+  _base href: '..'
+  _title 'ASF Committer Search'
+  _link rel: 'stylesheet', href: '../stylesheets/app.css'
+
+  _banner breadcrumbs: {
+    roster: 'https://whimsy.apache.org/roster',
+    committer: 'https://whimsy.apache.org/roster/committers'
+  }
+
+  _h1 'Committer - Search'
+
+  _div_.main!
+
+  _script src: 'app.js'
+  _.render '#main' do
+    _CommitterSearch
+  end
+end
diff --git a/www/test/roster/views/index.html.rb b/www/test/roster/views/index.html.rb
new file mode 100644
index 0000000..9890b9f
--- /dev/null
+++ b/www/test/roster/views/index.html.rb
@@ -0,0 +1,46 @@
+#
+# Landing page
+#
+
+_html do
+  _title 'ASF Roster'
+  _link rel: 'stylesheet', href: '../stylesheets/app.css'
+
+  _banner breadcrumbs: {
+    roster: 'https://www.whimsy.org/roster'
+  }
+
+  _h1_ 'Roster'
+
+  _table do
+
+    ### committers
+
+    _tr do
+      _td do
+        _a @committers.length, href: 'committer/'
+      end
+
+      _td do
+        _a 'Committers', href: 'committer/'
+      end
+
+      _td 'Search for committers by name, user id, or email address'
+    end
+
+    ### PMCs
+
+    _tr do
+      _td do
+        _a @committees.length, href: 'committee/'
+      end
+
+      _td do
+        _a 'PMCs', href: 'committee/'
+      end
+
+      _td 'Active projects at the ASF'
+    end
+
+  end
+end
diff --git a/www/test/roster/views/polyfill.js.rb b/www/test/roster/views/polyfill.js.rb
new file mode 100644
index 0000000..ae00cc8
--- /dev/null
+++ b/www/test/roster/views/polyfill.js.rb
@@ -0,0 +1,38 @@
+class Polyfill
+  def self.require(names, &block)
+    Polyfill.new(names, block)
+  end
+
+  def initialize(names, block)
+    @count = 0
+    @names = names
+    @block = block
+
+    if @names.include? 'Promise' and defined? Promise
+      self.complete()
+    else
+      script = document.createElement('script')
+      script.src = 'javascript/es6-promise.js'
+      script.onload = self.complete.bind(self)
+      first = document.getElementsByTagName('script')[0]
+      first.parentNode.insertBefore(script, first)
+    end
+  
+    if @names.include? 'fetch' and defined? fetch
+      self.complete()
+    else
+      script = document.createElement('script')
+      script.src = 'javascript/fetch.js'
+      script.onload = self.complete.bind(self)
+      first = document.getElementsByTagName('script')[0]
+      first.parentNode.insertBefore(script, first)
+    end
+  end
+
+  def complete()
+    @count += 1
+    if @count == @names.length
+      @block.call()
+    end
+  end
+end
diff --git a/www/test/secmail.rb b/www/test/secmail.rb
new file mode 100644
index 0000000..c458005
--- /dev/null
+++ b/www/test/secmail.rb
@@ -0,0 +1,11 @@
+require 'mail'
+
+Mail.defaults do
+  delivery_method :test
+
+  @from = 'Unit Test <un...@apache.org>'
+  @sig = %{
+    -- Unit Test
+    Secretary Workbench, Apache Software Foundation
+  }
+end
diff --git a/www/test/secretary/workbench/email.rb b/www/test/secretary/workbench/email.rb
new file mode 100644
index 0000000..8b8dacb
--- /dev/null
+++ b/www/test/secretary/workbench/email.rb
@@ -0,0 +1,53 @@
+require 'test/unit'
+
+class EmailTest < Test::Unit::TestCase
+  WWW_DIR =  File.absolute_path('../../../../www', __FILE__)
+
+  def setup
+    unless defined? @@queue
+      Dir.chdir File.absolute_path('../../..', __FILE__)
+      load '../www/secretary/workbench/file.cgi'
+      @@queue = Wunderbar.queue.dup
+      Wunderbar.queue.clear
+    end
+
+    Dir.chdir "#{WWW_DIR}/secretary/workbench"
+
+    Mail::TestMailer.deliveries.clear
+  end
+
+  def teardown
+  end
+
+  def make_pending(*requests)
+    # convert symbols into strings in each request
+    requests.each do |vars|
+      vars.keys.each {|key| vars[key.to_s] = vars.delete(key) if Symbol === key}
+    end
+
+    # output pending
+    File.open(PENDING_YML, 'w') do |file|
+      file.write YAML.dump(requests)
+    end
+  end
+
+  def test_notify_kafka
+    make_pending email: 'nobody@apache.org', podling: 'kafka', doctype: 'icla'
+
+    email('nobody@apache.org', 'message body')
+
+    mail = Mail::TestMailer.deliveries.first
+
+    assert_send [mail.cc, :include?, 'kafka-private@incubator.apache.org']
+  end
+
+  def test_notify_jcloud
+    make_pending email: 'nobody@apache.org', podling: 'jcloud', doctype: 'icla'
+
+    email('nobody@apache.org', 'message body')
+
+    mail = Mail::TestMailer.deliveries.first
+
+    assert_send [mail.cc, :include?, 'private@jcloud.incubator.apache.org']
+  end
+end
diff --git a/www/treasurer/bill-upload.cgi b/www/treasurer/bill-upload.cgi
new file mode 100755
index 0000000..0a259e8
--- /dev/null
+++ b/www/treasurer/bill-upload.cgi
@@ -0,0 +1,96 @@
+#!/usr/bin/ruby1.9.1
+
+require 'whimsy/asf'
+require 'wunderbar'
+
+user = ASF::Person.new($USER)
+unless user.asf_member? or ASF.pmc_chairs.include?  user or $USER=='ea'
+  print "Status: 401 Unauthorized\r\n"
+  print "WWW-Authenticate: Basic realm=\"ASF Members and Officers\"\r\n\r\n"
+  exit
+end
+
+_html do
+  _title 'ASF Bill upload'
+
+  _style %{
+    label {margin-top: 1em; display: block}
+    input, textarea {margin-top: 0.5em; margin-left: 4em; display: block}
+    input[type=radio] {display: inline}
+    input[type=submit] {margin-left: 0}
+    fieldset {display: inline-block}
+    legend {background-color: #141; color: #DFD; padding: 0.4em}
+    legend, fieldset {border-radius: 8px}
+  }
+  _style :system
+
+  _form enctype: 'multipart/form-data', method: 'post' do
+    _fieldset do
+      _legend 'ASF Bill upload'
+
+      _label 'Select a file to upload:'
+      _input type: 'file', name: 'file', required: true
+
+      _label 'Enter Commit Message:', for: 'message'
+      _textarea name: 'message', id: 'message', cols: 80, required: true
+
+      _label 'Select a destination:'
+      _div do
+        _input 'Bills/received', type: 'radio', name: 'dest', value: 'received',
+          checked: true
+      end
+      _div do
+        _input 'Bills/approved', type: 'radio', name: 'dest', value: 'approved'
+      end
+
+      _input type: 'submit', value: 'Upload'
+    end
+  end
+
+  if @file
+    # validate @file, @dest form parameters
+    name = @file.original_filename.gsub(/[^-.\w]/, '_').sub(/^\.+/, '_').untaint
+    @dest.untaint if @dest =~ /^\w+$/
+
+    if @file.respond_to? :empty? and @file.empty?
+      _pre 'File is required', class: '_stderr'
+    elsif not @message or @message.empty?
+      _pre 'Message is required', class: '_stderr'
+    elsif not @dest or @dest.empty?
+      _pre 'Destination is required', class: '_stderr'
+    else
+      Dir.chdir File.join(ASF::SVN['private/financials/Bills'], @dest) do
+        _h2 'Commit log'
+
+        # cleanup anything left over from previous runs
+        `svn cleanup`
+        status = `svn status`
+        unless status.empty?
+          status.scan(/^[?A]\s*\+?\s*(.*)/).flatten.each do |uncommitted|
+            _.system ['rm', '-rf', uncommitted]
+          end
+          if status =~ /^\w/
+            _.system ['svn', 'revert', '-R', file]
+          end
+        end
+
+        _.system 'svn up'
+
+        if File.exist? name
+          _pre "File #{name} already exists", class: '_stderr'
+        else
+          # write file out to disk
+          File.open(name, 'wb') {|file| file.write @file.read}
+          _.system ['svn', 'add', name]
+
+          # commit
+          _.system [
+            'svn', 'commit', '-m', @message, name,
+            ['--no-auth-cache', '--non-interactive'],
+            (['--username', $USER, '--password', $PASSWORD] if $PASSWORD)
+          ]
+        end
+      end
+    end
+  end
+end
diff --git a/www/treasurer/expenses.cgi b/www/treasurer/expenses.cgi
new file mode 100755
index 0000000..e2c8ad8
--- /dev/null
+++ b/www/treasurer/expenses.cgi
@@ -0,0 +1,409 @@
+#!/usr/bin/ruby1.9.1
+require 'wunderbar'
+require 'yaml'
+require 'whimsy/asf'
+
+user = ASF::Person.new($USER)
+unless user.asf_member? or ASF.pmc_chairs.include? user or $USER=='ea'
+  print "Status: 401 Unauthorized\r\n"
+  print "WWW-Authenticate: Basic realm=\"ASF Members and Officers\"\r\n\r\n"
+  exit
+end
+
+categories = [
+  'Concom',
+  'Infrastructure',
+  'Public Relations',
+  'Secretary',
+  'Treasurer',
+  'President',
+  'TAC',
+  'Chair',
+  'Branding',
+  'Infrastructure Contractors',
+  'Public Relations Contractors',
+  'Executive Assistant',
+  'Uncategorized/Multiple',
+]
+
+paid = 'https://svn.apache.org/repos/private/financials/Bills/paid/'
+
+statements = '/var/tools/statements'
+dates = Dir["#{statements}/*.pdf","#{statements}/*.yml"].
+  map {|name| File.basename(name).chomp('.pdf').chomp('.yml')}.uniq.sort
+
+class Numeric
+  def currency
+    ('%.2f' % self).gsub(/(\d)(?=(\d{3})+\.)/, '\1,')
+  end
+end
+
+_html do
+  _head_ do
+    _title 'Statement'
+    _script src: '/jquery-min.js'
+    _script src: '/jquery.tablesorter.js'
+    _style %{
+      a {text-decoration: none}
+      tr:hover a {text-decoration: underline}
+      thead th {border-bottom: solid black}
+      tfoot th, tfoot td {border-top: solid black}
+      table {border-spacing: 1em 0.2em; float: left }
+      tbody tr:hover {background-color: #FF8}
+      th span {float: right}
+      .headerSortUp span:after {content: " \u2198"}
+      .headerSortDown span:after {content: " \u2197"}
+      svg {width: 30%; margin-left: 10%}
+      h2 {clear: both}
+    }
+  end
+
+  _body? do
+    # common banner
+    _a href: 'https://whimsy.apache.org/' do
+      _img title: "Logo", alt: "Logo",
+        src: "https://id.apache.org/img/asf_logo_wide.png"
+    end
+
+    _h1_ 'Expenses'
+
+    @date ||= env['PATH_INFO'].to_s[/\/(\d{4}-\d\d)$/,1] || dates.last
+    @date = 'all' if env['PATH_INFO'] == '/all'
+    @date.untaint if @date =~ /^\d{4}-\d\d$/
+
+    if /expenses.*\/(?<category>.+)/ =~ env['REQUEST_URI']
+      @category = category unless category == 'all'
+      @date = 'all'
+    end
+
+    unless @category
+      request_uri = env['REQUEST_URI'].split('?').first
+      _form.month! method: 'post', action: request_uri.sub(/\d{4}-\d\d$/,'') do
+        _select name: 'date' do
+          dates.reverse.each do |date|
+            _option date, selected: (date == @date)
+          end
+          _option 'all', selected: (@date == 'all')
+        end
+        _input value: 'submit', type: 'submit'
+      end
+    end
+    
+    if @date == 'all'
+      debits = []
+      Dir["#{statements}/*.yml"].sort.each do |statement|
+        debits += YAML.load_file statement.untaint
+      end
+      if @category
+        debits.select! {|debit| debit['category'].gsub(/\W+/,'_') == @category}
+      end
+      statement = ''
+    elsif File.exist? "#{statements}/#{@date}.yml"
+      statement = ''
+      debits = YAML.load_file "#{statements}/#{@date}.yml"
+    else
+      statement = `pdftotext #{statements}/#{@date}.pdf -`
+      # credits = statement[/^Credits(.*)^Debits/m,1]
+      statement = statement[/^^Debits(.*)^Daily ledger/m,1].to_s
+      debits = []
+    end
+
+    if debits.empty? and not statement.empty?
+      dates = statement.scan(/^\d\d\/\d\d/)
+      amounts = statement.scan(/^[.,\d]+$/)
+      details = statement.
+	scan(/^(?:WT |Bill Pay|WF Bus|Client Anal|Safe Box|Online Transfer).*/)
+
+      _form_.debits! style: ('display: none' unless debits.empty?) do
+	_button 'File'
+	_select_.category! do
+	  _option ''
+	  categories.each do |category|
+	    _option category
+	  end
+	end
+	_select_.date! do
+	  dates.sort.each do |date|
+	    _option date, value: date
+	  end
+	end
+	_select_.amount! do
+	  amounts.each do |amount|
+	    _option amount, value: amount
+	  end
+	end
+	_select_.detail! do
+	  details.each do |detail|
+	    _option detail.strip, value: detail.strip
+	  end
+	end
+      end
+    end
+
+    subtotals = Hash.new(0)
+    debits.each do |transaction|
+      subtotals[transaction['category']] += transaction['amount'] 
+    end
+    total = subtotals.values.reduce(&:+) || 0
+
+    unless @category
+      _h2_ 'Summary'
+      colors = Hash.new('#000')
+
+      if total > 0
+        require 'color'
+        color = Color::RGB.from_html('#4488FF').to_hsl
+        step = 360.0 / ( PHI = (1 + Math.sqrt(5)) / 2 )
+
+        _svg_ viewBox: '-500 -500 1000 1000' do
+          _circle r: 480, stroke: '#000', fill: '#000'
+          theta = 0
+          subtotals.sort_by(&:last).reverse.each do |category, subtotal|
+            p1 = [Math.sin(theta)*475, -Math.cos(theta)*475].map(&:round)
+            theta += Math::PI*2 * subtotal/total
+            p2 = [Math.sin(theta)*475, -Math.cos(theta)*475].map(&:round)
+            arc = (subtotal*2 > total ? '1' : '0')
+            _path fill: color.html, title: category,
+              d: "M0,0 L#{p1.join(',')} A475,475 0 #{arc} 1 #{p2.join(',')} Z"
+            colors[category] = color.html
+            color.hue = (color.hue + step) % 360
+          end
+        end
+      end
+
+      _table do
+        _thead do
+          _tr do
+            _th 'Category'
+            _th 'Amount'
+          end
+        end
+        _tbody_ do
+          bullet = "\u25CF" unless total==0
+          (categories+subtotals.keys).sort.uniq.each do |category|
+            _tr_ style: ('display: none' if subtotals[category] == 0) do
+              _td!.category do
+                _a category, 
+                  href: "/treasurer/expenses/#{category.gsub(/\W+/,'_')}"
+              end
+              _td.subtotal subtotals[category].currency, align: 'right'
+              _td bullet, style: "color: #{colors[category]}"
+            end
+          end
+        end
+        _tfoot do
+          _tr do
+            _th 'Total'
+            _td.total! total.currency, align: 'right'
+          end
+        end
+      end
+    end
+
+    if @date =~ /\d{4}-\d\d/ or @category
+      _h2_ categories.find {|category| category.gsub(/\W+/,'_')==@category} ||
+         @category || 'Detail'
+      _table do
+        _thead_ do
+          _tr do
+            _th 'Date'
+            _th 'Amount' 
+            _th 'Category' unless @category
+            _th 'Detail'
+          end
+        end
+        _tbody.categorized! do
+          debits.each do |transaction|
+            _tr_ do
+              _td transaction['date']
+              _td transaction['amount'].currency, align: 'right'
+              _td transaction['category'] unless @category
+              if transaction['link']
+                _td! do
+                  _a transaction['detail'], href: paid + transaction['link'],
+                    title: transaction['notes']
+                end
+              else
+                _td transaction['detail'], title: transaction['notes']
+              end
+            end
+          end
+        end
+        if @category
+	  _tfoot do
+	    _tr do
+	      _th 'Total'
+	      _td.total! total.currency, align: 'right'
+	    end
+	  end
+        end
+      end
+    end
+
+    _script_ %q{
+      var year = null;
+      if (document.getElementById('month')) {
+        $('#month select').change(function() { 
+          location.href = "/treasurer/statements/" + $(this).val();
+          if ($(this).val()=='all') location.href = "/treasurer/expenses/all";
+        });
+        $('#month input').hide();
+        year = $('#month select').val().match(/(\d{4})-\d\d/);
+        if (year) year[1];
+      }
+
+      $('button').click(function() {
+        var tr = $('<tr></tr>');
+
+        var date = $('<td></td>').text($('#date').val());
+        $('#date option[value="'+date.text()+'"]:first').remove();
+        tr.append(date);
+
+        var category = $('<td></td>').text($('#category').val());
+        tr.append(category);
+
+        var amount = $('<td align="right"></td>').text($('#amount').val());
+        $('#amount option[value="'+amount.text()+'"]:first').remove();
+        tr.append(amount);
+
+        var detail = $('#detail').val();
+        $('#detail option[value="'+detail+'"]:first').remove();
+        detail = detail.replace(/WT \d+-\d+/,'WT');
+        detail = detail.replace(/WT Fed#\d+/,'WT Fed');
+        detail = detail.replace(/ Recurring.*/,'');
+        detail = detail.replace(/Auto Pay \d+ \d+/,'Auto Pay');
+        detail = detail.replace(/Srvc Chrg .*/,'Srvc Chrg');
+        detail = detail.replace(/on-Line [xX]\w* on .*/i,'');
+        detail = detail.replace(/on-Line No Account Number on .*/,'');
+        detail = detail.replace(/:Fee \d.*/,':Fee');
+        detail = $('<td></td>').text(detail);
+        tr.append(detail);
+        $('#detail').change();
+
+        $('.category').each(function() {
+          if ($(this).text() == category.text()) {
+            var tr = $(this).parent();
+            var td = $('td:last', tr);
+            var subtotal =
+              parseFloat(td.text().replace(/,/g,'')) +
+              parseFloat(amount.text().replace(/,/g,''));
+            subtotal = subtotal.toFixed(2);
+            subtotal = subtotal.replace(/(\d)(?=(\d{3})+\.)/g, '$1,');
+            td.text(subtotal);
+            tr.show();
+          }
+        });
+
+        var total = 0;
+        $('.subtotal').each(function() {
+          total += parseFloat($(this).text().replace(/,/g,''));
+        });
+        total = total.toFixed(2);
+        total = total.replace(/(\d)(?=(\d{3})+\.)/g, '$1,');
+        $('#total').text(total);
+        
+        $('#categorized').append(tr);
+
+        if (!$('#date').val() && !$('#detail').val() && !$('#amount').val()) {
+          var data = {month: $('#month select').val(), debits: []};
+          $('#categorized tr').each(function() {
+            var cols = $('td', $(this));
+            data.debits.push({
+              date:     year + '-' + cols[0].textContent.replace('/', '-'),
+              category: cols[1].textContent,
+              amount:   parseFloat(cols[2].textContent.replace(/,/g, '')),
+              detail:   cols[3].textContent
+            });
+          });
+          data.debits = JSON.stringify(data.debits)
+          $.post(location.href, data, function(_) {
+            $('#debits').replaceWith($('<p></p>').text(_.message));
+          }, 'json');
+        }
+
+        return false;
+      });
+
+      $('#date option:first').attr('selected', true);
+      $('#amount option:first').attr('selected', true);
+      $('#detail option:first').attr('selected', true);
+
+      var patterns = {
+        'Traci.Net':         'Infrastructure',
+        'Pctony':            'Infrastructure Contractors',
+        'Shahaf':            'Infrastructure Contractors',
+        '16 Degrees':        'Infrastructure Contractors',
+        'Sunstar':           'Infrastructure Contractors',
+        'Warnkin Recurring': 'Executive Assistant',
+        'Khudairi':          'Public Relations Contractors',
+        'PR Newswire':       'Public Relations',
+        'Globenewswire':     'Public Relations',
+        'Srvc Chrg':         'Treasurer',
+        'WF Bus Banking':    'Treasurer',
+        'Safe Box':          'Treasurer',
+        'The Company Corp':  'President',
+        'Nicholas Burch':    'Concom',
+      }
+
+      $('#category').change(function() {
+        $('button').attr('disabled', $('#category').val() == '');
+      });
+
+      $('#detail').change(function() {
+        var detail = $(this).val();
+        $('#category').val('').attr('selected', true);
+        if (detail) {
+          for (var pattern in patterns) {
+            if (detail.match(pattern)) {
+              $('#category').val(patterns[pattern]).attr('selected', true);
+            }
+          }
+        }
+
+        $('#category').change();
+      }).change();
+
+      $.tablesorter.addParser({ 
+        id: 'commafied', 
+        type: 'numeric',
+        is: function(s) { return s.match(/^[\d.,]+$/) }, 
+        format: function(s) { 
+          return jQuery.tablesorter.formatFloat(s.replace(/,/g, ""));
+        }
+      }); 
+
+      $('thead th').append('<span></span>');
+      $("table").tablesorter(
+        {sortList: [[0,0]], headers: {1: {sorter:'commafied'}}}
+      );
+
+      $('.category').each(function() {
+        var path = $('path[title="' + $('a', this).text() + '"]');
+        if (path.length == 0) return;
+
+        $(this).parents('tr').
+          mouseover(function() {
+            path.attr({'stroke-width': 35, stroke: path.attr('fill')});
+            path.parent().append(path);
+          }).
+          mouseout(function() {
+            path.removeAttr('stroke-width').removeAttr('stroke');
+          });
+      });
+
+      $('svg').attr('stroke-linejoin', 'round');
+      $(window).resize(function() {
+        $('svg').height($(window).width()/3);
+        $('svg').width($(window).width()/3);
+      }).trigger('resize');
+    }
+  end
+end
+
+_json do
+  @month.untaint if @month =~ /^\d{4}-\d\d$/
+  File.open("#{statements}/#{@month}.yml",'w') do |file|
+    file.write YAML.dump(JSON.parse(@debits))
+  end
+  _message "Categorization complete"
+end
diff --git a/www/treasurer/index.cgi b/www/treasurer/index.cgi
new file mode 100755
index 0000000..87f889e
--- /dev/null
+++ b/www/treasurer/index.cgi
@@ -0,0 +1,36 @@
+#!/usr/bin/ruby1.9.1
+require 'whimsy/asf'
+$SAFE = 1
+
+user = ASF::Person.new($USER)
+unless user.asf_member? or ASF.pmc_chairs.include? user or $USER=='ea'
+  print "Status: 401 Unauthorized\r\n"
+  print "WWW-Authenticate: Basic realm=\"ASF Members and Officers\"\r\n\r\n"
+  exit
+end
+
+request = ENV['REQUEST_URI'].sub(/^\/treasurer\/paypal\/?/, '')
+request.untaint if request =~ /^\d{4}-\d\d$/
+if request.tainted?
+  print "Status: 401 Forbidden\r\n"
+  print "Content-type: text/plain\r\n\r\n"
+  print "Forbidden"
+  exit
+end
+
+if File.exist?("/var/tools/treasurer/paypal/#{request}.html")
+  print "Content-type: text/html; charset=utf-8\r\n\r\n"
+  print File.read("/var/tools/treasurer/#{request}.html")
+  exit
+end
+
+if File.exist?("/var/tools/treasurer/paypal/#{request}.txt")
+  print "Content-type: text/plain; charset=utf-8\r\n\r\n"
+  print File.read("/var/tools/treasurer/#{request}.txt")
+  exit
+end
+
+print "Status: 404 Not-Found\r\n"
+print "Content-type: text/plain\r\n\r\n"
+print "Not here"
+exit
diff --git a/www/treasurer/paypal.cgi b/www/treasurer/paypal.cgi
new file mode 100755
index 0000000..c36a11d
--- /dev/null
+++ b/www/treasurer/paypal.cgi
@@ -0,0 +1,138 @@
+#!/usr/bin/ruby1.9.1
+require 'wunderbar'
+require 'csv'
+require 'whimsy/asf'
+
+user = ASF::Person.new($USER)
+unless user.asf_member? or ASF.pmc_chairs.include? user or $USER=='ea'
+  print "Status: 401 Unauthorized\r\n"
+  print "WWW-Authenticate: Basic realm=\"ASF Members and Officers\"\r\n\r\n"
+  exit
+end
+
+csv = []
+Dir['/var/tools/paypal/2*.csv'].sort.reverse.each do |month|
+  csv += CSV.open(month,'r').to_a[1..-1]
+end
+download = CSV.open('/var/tools/paypal/Download.csv','r')
+headers = download.take(1).flatten
+csv += download.to_a
+
+skip = [2,6,10,11,12,13,14,16]
+
+_html do
+  _head_ do
+    _title 'Paypal Donations'
+    _style %{
+      thead th {border-bottom: solid black}
+      tbody tr:hover {background-color: #FF8}
+      tfoot th {border-top: solid black}
+      table {border-spacing: 0.3em 0.2em }
+      .issue {background-color: yellow}
+      .large {background-color: #7FFF00}
+    }
+  end
+
+  _body? do
+    # common banner
+    _a href: 'https://whimsy.apache.org/' do
+      _img alt: "Logo", src: "https://id.apache.org/img/asf_logo_wide.png"
+    end
+
+    _h1_ 'Paypal donations'
+
+    if ENV['PATH_INFO'] == '/'
+      pattern = :index
+    elsif ENV['PATH_INFO'] =~ /(\d{4})-0?(\d\d?)/
+      pattern = Regexp.new("#{$2}/..?/#{$1}")
+    else
+      pattern = /^$/
+    end
+
+    _table do
+      _thead_ do
+        _tr do
+          if pattern == :index
+            _th 'Month'
+            _th 'Balance'
+            _th 'Transactions'
+          else
+            headers.each_with_index do |header, index|
+              next if skip.include? index
+              _th header
+            end
+          end
+        end
+      end
+
+      month = nil
+      entries = []
+      count = 0
+      old_balance = nil
+      _tbody do
+        csv.each do |transaction|
+          if pattern == :index
+            m,d,y = transaction[0].split('/')
+            if m != month
+              entries.last[-1] = count if not entries.empty?
+              entries << ["#{y}-#{m.rjust(2,'0')}", transaction[15], 0]
+              count = 0
+              month = m
+            end
+            count += 1
+          elsif pattern =~ transaction[0] 
+            new_balance = (transaction[15].gsub(',','').to_f*100).round
+            old_balance ||= new_balance
+            amount = (transaction[9].gsub(',','').to_f*100).round
+
+            color = nil
+            color = 'large' if amount >= 200_00
+            color = 'issue' if new_balance != old_balance
+
+            _tr_ class: color do
+              transaction.each_with_index do |col, index|
+                next if skip.include? index
+                if index > 6 or index == 0
+                  _td col, align: 'right'
+                else
+                  _td col
+                end
+              end
+            end
+
+            next if transaction[4] == 'Web Accept Payment Received' and
+              transaction[5] == 'Cleared'
+            next if transaction[4] == 'Web Accept Payment Received' and
+              transaction[5] == 'Canceled'
+            next if transaction[4] == 'Cancelled Fee' and
+              transaction[5] == 'Completed'
+            next if transaction[4] == 'Update to eCheck Received' and
+              transaction[5] == 'Canceled'
+  
+            old_balance = new_balance - amount
+          end
+        end
+
+        if pattern == :index
+          entries.last[-1] = count
+          entries.each do |month, balance, transactions|
+            _tr_ do
+              _td! {_a month, href: month}
+              _td balance, align: 'right'
+              _td transactions, align: 'right'
+            end
+          end
+        end
+      end
+
+      if pattern == :index
+        _tfoot_ do
+	  _tr do
+	    _th 'Total', colspan: 2, align: 'right'
+	    _th entries.map(&:last).reduce(&:+), align: 'right'
+	  end
+        end
+      end
+    end
+  end
+end
diff --git a/www/treasurer/statements.cgi b/www/treasurer/statements.cgi
new file mode 120000
index 0000000..51f2cb8
--- /dev/null
+++ b/www/treasurer/statements.cgi
@@ -0,0 +1 @@
+expenses.cgi
\ No newline at end of file
diff --git a/www/voter/jquery.min.js b/www/voter/jquery.min.js
new file mode 100644
index 0000000..198b3ff
--- /dev/null
+++ b/www/voter/jquery.min.js
@@ -0,0 +1,4 @@
+/*! jQuery v1.7.1 jquery.com | jquery.org/license */
+(function(a,b){function cy(a){return f.isWindow(a)?a:a.nodeType===9?a.defaultView||a.parentWindow:!1}function cv(a){if(!ck[a]){var b=c.body,d=f("<"+a+">").appendTo(b),e=d.css("display");d.remove();if(e==="none"||e===""){cl||(cl=c.createElement("iframe"),cl.frameBorder=cl.width=cl.height=0),b.appendChild(cl);if(!cm||!cl.createElement)cm=(cl.contentWindow||cl.contentDocument).document,cm.write((c.compatMode==="CSS1Compat"?"<!doctype html>":"")+"<html><body>"),cm.close();d=cm.createElement(a),cm.body.appendChild(d),e=f.css(d,"display"),b.removeChild(cl)}ck[a]=e}return ck[a]}function cu(a,b){var c={};f.each(cq.concat.apply([],cq.slice(0,b)),function(){c[this]=a});return c}function ct(){cr=b}function cs(){setTimeout(ct,0);return cr=f.now()}function cj(){try{return new a.ActiveXObject("Microsoft.XMLHTTP")}catch(b){}}function ci(){try{return new a.XMLHttpRequest}catch(b){}}function cc(a,c){a.dataFilter&&(c=a.dataFilter(c,a.dataType));var d=a.dataTypes,e={},g,h,i=d.length,j,k=d[0],l,m,n,o,p
 ;for(g=1;g<i;g++){if(g===1)for(h in a.converters)typeof h=="string"&&(e[h.toLowerCase()]=a.converters[h]);l=k,k=d[g];if(k==="*")k=l;else if(l!=="*"&&l!==k){m=l+" "+k,n=e[m]||e["* "+k];if(!n){p=b;for(o in e){j=o.split(" ");if(j[0]===l||j[0]==="*"){p=e[j[1]+" "+k];if(p){o=e[o],o===!0?n=p:p===!0&&(n=o);break}}}}!n&&!p&&f.error("No conversion from "+m.replace(" "," to ")),n!==!0&&(c=n?n(c):p(o(c)))}}return c}function cb(a,c,d){var e=a.contents,f=a.dataTypes,g=a.responseFields,h,i,j,k;for(i in g)i in d&&(c[g[i]]=d[i]);while(f[0]==="*")f.shift(),h===b&&(h=a.mimeType||c.getResponseHeader("content-type"));if(h)for(i in e)if(e[i]&&e[i].test(h)){f.unshift(i);break}if(f[0]in d)j=f[0];else{for(i in d){if(!f[0]||a.converters[i+" "+f[0]]){j=i;break}k||(k=i)}j=j||k}if(j){j!==f[0]&&f.unshift(j);return d[j]}}function ca(a,b,c,d){if(f.isArray(b))f.each(b,function(b,e){c||bE.test(a)?d(a,e):ca(a+"["+(typeof e=="object"||f.isArray(e)?b:"")+"]",e,c,d)});else if(!c&&b!=null&&typeof b=="object")for(var e i
 n b)ca(a+"["+e+"]",b[e],c,d);else d(a,b)}function b_(a,c){var d,e,g=f.ajaxSettings.flatOptions||{};for(d in c)c[d]!==b&&((g[d]?a:e||(e={}))[d]=c[d]);e&&f.extend(!0,a,e)}function b$(a,c,d,e,f,g){f=f||c.dataTypes[0],g=g||{},g[f]=!0;var h=a[f],i=0,j=h?h.length:0,k=a===bT,l;for(;i<j&&(k||!l);i++)l=h[i](c,d,e),typeof l=="string"&&(!k||g[l]?l=b:(c.dataTypes.unshift(l),l=b$(a,c,d,e,l,g)));(k||!l)&&!g["*"]&&(l=b$(a,c,d,e,"*",g));return l}function bZ(a){return function(b,c){typeof b!="string"&&(c=b,b="*");if(f.isFunction(c)){var d=b.toLowerCase().split(bP),e=0,g=d.length,h,i,j;for(;e<g;e++)h=d[e],j=/^\+/.test(h),j&&(h=h.substr(1)||"*"),i=a[h]=a[h]||[],i[j?"unshift":"push"](c)}}}function bC(a,b,c){var d=b==="width"?a.offsetWidth:a.offsetHeight,e=b==="width"?bx:by,g=0,h=e.length;if(d>0){if(c!=="border")for(;g<h;g++)c||(d-=parseFloat(f.css(a,"padding"+e[g]))||0),c==="margin"?d+=parseFloat(f.css(a,c+e[g]))||0:d-=parseFloat(f.css(a,"border"+e[g]+"Width"))||0;return d+"px"}d=bz(a,b,b);if(d<0||d==n
 ull)d=a.style[b]||0;d=parseFloat(d)||0;if(c)for(;g<h;g++)d+=parseFloat(f.css(a,"padding"+e[g]))||0,c!=="padding"&&(d+=parseFloat(f.css(a,"border"+e[g]+"Width"))||0),c==="margin"&&(d+=parseFloat(f.css(a,c+e[g]))||0);return d+"px"}function bp(a,b){b.src?f.ajax({url:b.src,async:!1,dataType:"script"}):f.globalEval((b.text||b.textContent||b.innerHTML||"").replace(bf,"/*$0*/")),b.parentNode&&b.parentNode.removeChild(b)}function bo(a){var b=c.createElement("div");bh.appendChild(b),b.innerHTML=a.outerHTML;return b.firstChild}function bn(a){var b=(a.nodeName||"").toLowerCase();b==="input"?bm(a):b!=="script"&&typeof a.getElementsByTagName!="undefined"&&f.grep(a.getElementsByTagName("input"),bm)}function bm(a){if(a.type==="checkbox"||a.type==="radio")a.defaultChecked=a.checked}function bl(a){return typeof a.getElementsByTagName!="undefined"?a.getElementsByTagName("*"):typeof a.querySelectorAll!="undefined"?a.querySelectorAll("*"):[]}function bk(a,b){var c;if(b.nodeType===1){b.clearAttributes&&
 b.clearAttributes(),b.mergeAttributes&&b.mergeAttributes(a),c=b.nodeName.toLowerCase();if(c==="object")b.outerHTML=a.outerHTML;else if(c!=="input"||a.type!=="checkbox"&&a.type!=="radio"){if(c==="option")b.selected=a.defaultSelected;else if(c==="input"||c==="textarea")b.defaultValue=a.defaultValue}else a.checked&&(b.defaultChecked=b.checked=a.checked),b.value!==a.value&&(b.value=a.value);b.removeAttribute(f.expando)}}function bj(a,b){if(b.nodeType===1&&!!f.hasData(a)){var c,d,e,g=f._data(a),h=f._data(b,g),i=g.events;if(i){delete h.handle,h.events={};for(c in i)for(d=0,e=i[c].length;d<e;d++)f.event.add(b,c+(i[c][d].namespace?".":"")+i[c][d].namespace,i[c][d],i[c][d].data)}h.data&&(h.data=f.extend({},h.data))}}function bi(a,b){return f.nodeName(a,"table")?a.getElementsByTagName("tbody")[0]||a.appendChild(a.ownerDocument.createElement("tbody")):a}function U(a){var b=V.split("|"),c=a.createDocumentFragment();if(c.createElement)while(b.length)c.createElement(b.pop());return c}function T(a
 ,b,c){b=b||0;if(f.isFunction(b))return f.grep(a,function(a,d){var e=!!b.call(a,d,a);return e===c});if(b.nodeType)return f.grep(a,function(a,d){return a===b===c});if(typeof b=="string"){var d=f.grep(a,function(a){return a.nodeType===1});if(O.test(b))return f.filter(b,d,!c);b=f.filter(b,d)}return f.grep(a,function(a,d){return f.inArray(a,b)>=0===c})}function S(a){return!a||!a.parentNode||a.parentNode.nodeType===11}function K(){return!0}function J(){return!1}function n(a,b,c){var d=b+"defer",e=b+"queue",g=b+"mark",h=f._data(a,d);h&&(c==="queue"||!f._data(a,e))&&(c==="mark"||!f._data(a,g))&&setTimeout(function(){!f._data(a,e)&&!f._data(a,g)&&(f.removeData(a,d,!0),h.fire())},0)}function m(a){for(var b in a){if(b==="data"&&f.isEmptyObject(a[b]))continue;if(b!=="toJSON")return!1}return!0}function l(a,c,d){if(d===b&&a.nodeType===1){var e="data-"+c.replace(k,"-$1").toLowerCase();d=a.getAttribute(e);if(typeof d=="string"){try{d=d==="true"?!0:d==="false"?!1:d==="null"?null:f.isNumeric(d)?parse
 Float(d):j.test(d)?f.parseJSON(d):d}catch(g){}f.data(a,c,d)}else d=b}return d}function h(a){var b=g[a]={},c,d;a=a.split(/\s+/);for(c=0,d=a.length;c<d;c++)b[a[c]]=!0;return b}var c=a.document,d=a.navigator,e=a.location,f=function(){function J(){if(!e.isReady){try{c.documentElement.doScroll("left")}catch(a){setTimeout(J,1);return}e.ready()}}var e=function(a,b){return new e.fn.init(a,b,h)},f=a.jQuery,g=a.$,h,i=/^(?:[^#<]*(<[\w\W]+>)[^>]*$|#([\w\-]*)$)/,j=/\S/,k=/^\s+/,l=/\s+$/,m=/^<(\w+)\s*\/?>(?:<\/\1>)?$/,n=/^[\],:{}\s]*$/,o=/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g,p=/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,q=/(?:^|:|,)(?:\s*\[)+/g,r=/(webkit)[ \/]([\w.]+)/,s=/(opera)(?:.*version)?[ \/]([\w.]+)/,t=/(msie) ([\w.]+)/,u=/(mozilla)(?:.*? rv:([\w.]+))?/,v=/-([a-z]|[0-9])/ig,w=/^-ms-/,x=function(a,b){return(b+"").toUpperCase()},y=d.userAgent,z,A,B,C=Object.prototype.toString,D=Object.prototype.hasOwnProperty,E=Array.prototype.push,F=Array.prototype.slice,G=String.pro
 totype.trim,H=Array.prototype.indexOf,I={};e.fn=e.prototype={constructor:e,init:function(a,d,f){var g,h,j,k;if(!a)return this;if(a.nodeType){this.context=this[0]=a,this.length=1;return this}if(a==="body"&&!d&&c.body){this.context=c,this[0]=c.body,this.selector=a,this.length=1;return this}if(typeof a=="string"){a.charAt(0)!=="<"||a.charAt(a.length-1)!==">"||a.length<3?g=i.exec(a):g=[null,a,null];if(g&&(g[1]||!d)){if(g[1]){d=d instanceof e?d[0]:d,k=d?d.ownerDocument||d:c,j=m.exec(a),j?e.isPlainObject(d)?(a=[c.createElement(j[1])],e.fn.attr.call(a,d,!0)):a=[k.createElement(j[1])]:(j=e.buildFragment([g[1]],[k]),a=(j.cacheable?e.clone(j.fragment):j.fragment).childNodes);return e.merge(this,a)}h=c.getElementById(g[2]);if(h&&h.parentNode){if(h.id!==g[2])return f.find(a);this.length=1,this[0]=h}this.context=c,this.selector=a;return this}return!d||d.jquery?(d||f).find(a):this.constructor(d).find(a)}if(e.isFunction(a))return f.ready(a);a.selector!==b&&(this.selector=a.selector,this.context=a.
 context);return e.makeArray(a,this)},selector:"",jquery:"1.7.1",length:0,size:function(){return this.length},toArray:function(){return F.call(this,0)},get:function(a){return a==null?this.toArray():a<0?this[this.length+a]:this[a]},pushStack:function(a,b,c){var d=this.constructor();e.isArray(a)?E.apply(d,a):e.merge(d,a),d.prevObject=this,d.context=this.context,b==="find"?d.selector=this.selector+(this.selector?" ":"")+c:b&&(d.selector=this.selector+"."+b+"("+c+")");return d},each:function(a,b){return e.each(this,a,b)},ready:function(a){e.bindReady(),A.add(a);return this},eq:function(a){a=+a;return a===-1?this.slice(a):this.slice(a,a+1)},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},slice:function(){return this.pushStack(F.apply(this,arguments),"slice",F.call(arguments).join(","))},map:function(a){return this.pushStack(e.map(this,function(b,c){return a.call(b,c,b)}))},end:function(){return this.prevObject||this.constructor(null)},push:E,sort:[].sort,splice:[].
 splice},e.fn.init.prototype=e.fn,e.extend=e.fn.extend=function(){var a,c,d,f,g,h,i=arguments[0]||{},j=1,k=arguments.length,l=!1;typeof i=="boolean"&&(l=i,i=arguments[1]||{},j=2),typeof i!="object"&&!e.isFunction(i)&&(i={}),k===j&&(i=this,--j);for(;j<k;j++)if((a=arguments[j])!=null)for(c in a){d=i[c],f=a[c];if(i===f)continue;l&&f&&(e.isPlainObject(f)||(g=e.isArray(f)))?(g?(g=!1,h=d&&e.isArray(d)?d:[]):h=d&&e.isPlainObject(d)?d:{},i[c]=e.extend(l,h,f)):f!==b&&(i[c]=f)}return i},e.extend({noConflict:function(b){a.$===e&&(a.$=g),b&&a.jQuery===e&&(a.jQuery=f);return e},isReady:!1,readyWait:1,holdReady:function(a){a?e.readyWait++:e.ready(!0)},ready:function(a){if(a===!0&&!--e.readyWait||a!==!0&&!e.isReady){if(!c.body)return setTimeout(e.ready,1);e.isReady=!0;if(a!==!0&&--e.readyWait>0)return;A.fireWith(c,[e]),e.fn.trigger&&e(c).trigger("ready").off("ready")}},bindReady:function(){if(!A){A=e.Callbacks("once memory");if(c.readyState==="complete")return setTimeout(e.ready,1);if(c.addEventLis
 tener)c.addEventListener("DOMContentLoaded",B,!1),a.addEventListener("load",e.ready,!1);else if(c.attachEvent){c.attachEvent("onreadystatechange",B),a.attachEvent("onload",e.ready);var b=!1;try{b=a.frameElement==null}catch(d){}c.documentElement.doScroll&&b&&J()}}},isFunction:function(a){return e.type(a)==="function"},isArray:Array.isArray||function(a){return e.type(a)==="array"},isWindow:function(a){return a&&typeof a=="object"&&"setInterval"in a},isNumeric:function(a){return!isNaN(parseFloat(a))&&isFinite(a)},type:function(a){return a==null?String(a):I[C.call(a)]||"object"},isPlainObject:function(a){if(!a||e.type(a)!=="object"||a.nodeType||e.isWindow(a))return!1;try{if(a.constructor&&!D.call(a,"constructor")&&!D.call(a.constructor.prototype,"isPrototypeOf"))return!1}catch(c){return!1}var d;for(d in a);return d===b||D.call(a,d)},isEmptyObject:function(a){for(var b in a)return!1;return!0},error:function(a){throw new Error(a)},parseJSON:function(b){if(typeof b!="string"||!b)return nul
 l;b=e.trim(b);if(a.JSON&&a.JSON.parse)return a.JSON.parse(b);if(n.test(b.replace(o,"@").replace(p,"]").replace(q,"")))return(new Function("return "+b))();e.error("Invalid JSON: "+b)},parseXML:function(c){var d,f;try{a.DOMParser?(f=new DOMParser,d=f.parseFromString(c,"text/xml")):(d=new ActiveXObject("Microsoft.XMLDOM"),d.async="false",d.loadXML(c))}catch(g){d=b}(!d||!d.documentElement||d.getElementsByTagName("parsererror").length)&&e.error("Invalid XML: "+c);return d},noop:function(){},globalEval:function(b){b&&j.test(b)&&(a.execScript||function(b){a.eval.call(a,b)})(b)},camelCase:function(a){return a.replace(w,"ms-").replace(v,x)},nodeName:function(a,b){return a.nodeName&&a.nodeName.toUpperCase()===b.toUpperCase()},each:function(a,c,d){var f,g=0,h=a.length,i=h===b||e.isFunction(a);if(d){if(i){for(f in a)if(c.apply(a[f],d)===!1)break}else for(;g<h;)if(c.apply(a[g++],d)===!1)break}else if(i){for(f in a)if(c.call(a[f],f,a[f])===!1)break}else for(;g<h;)if(c.call(a[g],g,a[g++])===!1)bre
 ak;return a},trim:G?function(a){return a==null?"":G.call(a)}:function(a){return a==null?"":(a+"").replace(k,"").replace(l,"")},makeArray:function(a,b){var c=b||[];if(a!=null){var d=e.type(a);a.length==null||d==="string"||d==="function"||d==="regexp"||e.isWindow(a)?E.call(c,a):e.merge(c,a)}return c},inArray:function(a,b,c){var d;if(b){if(H)return H.call(b,a,c);d=b.length,c=c?c<0?Math.max(0,d+c):c:0;for(;c<d;c++)if(c in b&&b[c]===a)return c}return-1},merge:function(a,c){var d=a.length,e=0;if(typeof c.length=="number")for(var f=c.length;e<f;e++)a[d++]=c[e];else while(c[e]!==b)a[d++]=c[e++];a.length=d;return a},grep:function(a,b,c){var d=[],e;c=!!c;for(var f=0,g=a.length;f<g;f++)e=!!b(a[f],f),c!==e&&d.push(a[f]);return d},map:function(a,c,d){var f,g,h=[],i=0,j=a.length,k=a instanceof e||j!==b&&typeof j=="number"&&(j>0&&a[0]&&a[j-1]||j===0||e.isArray(a));if(k)for(;i<j;i++)f=c(a[i],i,d),f!=null&&(h[h.length]=f);else for(g in a)f=c(a[g],g,d),f!=null&&(h[h.length]=f);return h.concat.apply([
 ],h)},guid:1,proxy:function(a,c){if(typeof c=="string"){var d=a[c];c=a,a=d}if(!e.isFunction(a))return b;var f=F.call(arguments,2),g=function(){return a.apply(c,f.concat(F.call(arguments)))};g.guid=a.guid=a.guid||g.guid||e.guid++;return g},access:function(a,c,d,f,g,h){var i=a.length;if(typeof c=="object"){for(var j in c)e.access(a,j,c[j],f,g,d);return a}if(d!==b){f=!h&&f&&e.isFunction(d);for(var k=0;k<i;k++)g(a[k],c,f?d.call(a[k],k,g(a[k],c)):d,h);return a}return i?g(a[0],c):b},now:function(){return(new Date).getTime()},uaMatch:function(a){a=a.toLowerCase();var b=r.exec(a)||s.exec(a)||t.exec(a)||a.indexOf("compatible")<0&&u.exec(a)||[];return{browser:b[1]||"",version:b[2]||"0"}},sub:function(){function a(b,c){return new a.fn.init(b,c)}e.extend(!0,a,this),a.superclass=this,a.fn=a.prototype=this(),a.fn.constructor=a,a.sub=this.sub,a.fn.init=function(d,f){f&&f instanceof e&&!(f instanceof a)&&(f=a(f));return e.fn.init.call(this,d,f,b)},a.fn.init.prototype=a.fn;var b=a(c);return a},brows
 er:{}}),e.each("Boolean Number String Function Array Date RegExp Object".split(" "),function(a,b){I["[object "+b+"]"]=b.toLowerCase()}),z=e.uaMatch(y),z.browser&&(e.browser[z.browser]=!0,e.browser.version=z.version),e.browser.webkit&&(e.browser.safari=!0),j.test(" ")&&(k=/^[\s\xA0]+/,l=/[\s\xA0]+$/),h=e(c),c.addEventListener?B=function(){c.removeEventListener("DOMContentLoaded",B,!1),e.ready()}:c.attachEvent&&(B=function(){c.readyState==="complete"&&(c.detachEvent("onreadystatechange",B),e.ready())});return e}(),g={};f.Callbacks=function(a){a=a?g[a]||h(a):{};var c=[],d=[],e,i,j,k,l,m=function(b){var d,e,g,h,i;for(d=0,e=b.length;d<e;d++)g=b[d],h=f.type(g),h==="array"?m(g):h==="function"&&(!a.unique||!o.has(g))&&c.push(g)},n=function(b,f){f=f||[],e=!a.memory||[b,f],i=!0,l=j||0,j=0,k=c.length;for(;c&&l<k;l++)if(c[l].apply(b,f)===!1&&a.stopOnFalse){e=!0;break}i=!1,c&&(a.once?e===!0?o.disable():c=[]:d&&d.length&&(e=d.shift(),o.fireWith(e[0],e[1])))},o={add:function(){if(c){var a=c.lengt
 h;m(arguments),i?k=c.length:e&&e!==!0&&(j=a,n(e[0],e[1]))}return this},remove:function(){if(c){var b=arguments,d=0,e=b.length;for(;d<e;d++)for(var f=0;f<c.length;f++)if(b[d]===c[f]){i&&f<=k&&(k--,f<=l&&l--),c.splice(f--,1);if(a.unique)break}}return this},has:function(a){if(c){var b=0,d=c.length;for(;b<d;b++)if(a===c[b])return!0}return!1},empty:function(){c=[];return this},disable:function(){c=d=e=b;return this},disabled:function(){return!c},lock:function(){d=b,(!e||e===!0)&&o.disable();return this},locked:function(){return!d},fireWith:function(b,c){d&&(i?a.once||d.push([b,c]):(!a.once||!e)&&n(b,c));return this},fire:function(){o.fireWith(this,arguments);return this},fired:function(){return!!e}};return o};var i=[].slice;f.extend({Deferred:function(a){var b=f.Callbacks("once memory"),c=f.Callbacks("once memory"),d=f.Callbacks("memory"),e="pending",g={resolve:b,reject:c,notify:d},h={done:b.add,fail:c.add,progress:d.add,state:function(){return e},isResolved:b.fired,isRejected:c.fired,th
 en:function(a,b,c){i.done(a).fail(b).progress(c);return this},always:function(){i.done.apply(i,arguments).fail.apply(i,arguments);return this},pipe:function(a,b,c){return f.Deferred(function(d){f.each({done:[a,"resolve"],fail:[b,"reject"],progress:[c,"notify"]},function(a,b){var c=b[0],e=b[1],g;f.isFunction(c)?i[a](function(){g=c.apply(this,arguments),g&&f.isFunction(g.promise)?g.promise().then(d.resolve,d.reject,d.notify):d[e+"With"](this===i?d:this,[g])}):i[a](d[e])})}).promise()},promise:function(a){if(a==null)a=h;else for(var b in h)a[b]=h[b];return a}},i=h.promise({}),j;for(j in g)i[j]=g[j].fire,i[j+"With"]=g[j].fireWith;i.done(function(){e="resolved"},c.disable,d.lock).fail(function(){e="rejected"},b.disable,d.lock),a&&a.call(i,i);return i},when:function(a){function m(a){return function(b){e[a]=arguments.length>1?i.call(arguments,0):b,j.notifyWith(k,e)}}function l(a){return function(c){b[a]=arguments.length>1?i.call(arguments,0):c,--g||j.resolveWith(j,b)}}var b=i.call(argument
 s,0),c=0,d=b.length,e=Array(d),g=d,h=d,j=d<=1&&a&&f.isFunction(a.promise)?a:f.Deferred(),k=j.promise();if(d>1){for(;c<d;c++)b[c]&&b[c].promise&&f.isFunction(b[c].promise)?b[c].promise().then(l(c),j.reject,m(c)):--g;g||j.resolveWith(j,b)}else j!==a&&j.resolveWith(j,d?[a]:[]);return k}}),f.support=function(){var b,d,e,g,h,i,j,k,l,m,n,o,p,q=c.createElement("div"),r=c.documentElement;q.setAttribute("className","t"),q.innerHTML="   <link/><table></table><a href='/a' style='top:1px;float:left;opacity:.55;'>a</a><input type='checkbox'/>",d=q.getElementsByTagName("*"),e=q.getElementsByTagName("a")[0];if(!d||!d.length||!e)return{};g=c.createElement("select"),h=g.appendChild(c.createElement("option")),i=q.getElementsByTagName("input")[0],b={leadingWhitespace:q.firstChild.nodeType===3,tbody:!q.getElementsByTagName("tbody").length,htmlSerialize:!!q.getElementsByTagName("link").length,style:/top/.test(e.getAttribute("style")),hrefNormalized:e.getAttribute("href")==="/a",opacity:/^0.55/.test(e.st
 yle.opacity),cssFloat:!!e.style.cssFloat,checkOn:i.value==="on",optSelected:h.selected,getSetAttribute:q.className!=="t",enctype:!!c.createElement("form").enctype,html5Clone:c.createElement("nav").cloneNode(!0).outerHTML!=="<:nav></:nav>",submitBubbles:!0,changeBubbles:!0,focusinBubbles:!1,deleteExpando:!0,noCloneEvent:!0,inlineBlockNeedsLayout:!1,shrinkWrapBlocks:!1,reliableMarginRight:!0},i.checked=!0,b.noCloneChecked=i.cloneNode(!0).checked,g.disabled=!0,b.optDisabled=!h.disabled;try{delete q.test}catch(s){b.deleteExpando=!1}!q.addEventListener&&q.attachEvent&&q.fireEvent&&(q.attachEvent("onclick",function(){b.noCloneEvent=!1}),q.cloneNode(!0).fireEvent("onclick")),i=c.createElement("input"),i.value="t",i.setAttribute("type","radio"),b.radioValue=i.value==="t",i.setAttribute("checked","checked"),q.appendChild(i),k=c.createDocumentFragment(),k.appendChild(q.lastChild),b.checkClone=k.cloneNode(!0).cloneNode(!0).lastChild.checked,b.appendChecked=i.checked,k.removeChild(i),k.appendCh
 ild(q),q.innerHTML="",a.getComputedStyle&&(j=c.createElement("div"),j.style.width="0",j.style.marginRight="0",q.style.width="2px",q.appendChild(j),b.reliableMarginRight=(parseInt((a.getComputedStyle(j,null)||{marginRight:0}).marginRight,10)||0)===0);if(q.attachEvent)for(o in{submit:1,change:1,focusin:1})n="on"+o,p=n in q,p||(q.setAttribute(n,"return;"),p=typeof q[n]=="function"),b[o+"Bubbles"]=p;k.removeChild(q),k=g=h=j=q=i=null,f(function(){var a,d,e,g,h,i,j,k,m,n,o,r=c.getElementsByTagName("body")[0];!r||(j=1,k="position:absolute;top:0;left:0;width:1px;height:1px;margin:0;",m="visibility:hidden;border:0;",n="style='"+k+"border:5px solid #000;padding:0;'",o="<div "+n+"><div></div></div>"+"<table "+n+" cellpadding='0' cellspacing='0'>"+"<tr><td></td></tr></table>",a=c.createElement("div"),a.style.cssText=m+"width:0;height:0;position:static;top:0;margin-top:"+j+"px",r.insertBefore(a,r.firstChild),q=c.createElement("div"),a.appendChild(q),q.innerHTML="<table><tr><td style='padding:0;b
 order:0;display:none'></td><td>t</td></tr></table>",l=q.getElementsByTagName("td"),p=l[0].offsetHeight===0,l[0].style.display="",l[1].style.display="none",b.reliableHiddenOffsets=p&&l[0].offsetHeight===0,q.innerHTML="",q.style.width=q.style.paddingLeft="1px",f.boxModel=b.boxModel=q.offsetWidth===2,typeof q.style.zoom!="undefined"&&(q.style.display="inline",q.style.zoom=1,b.inlineBlockNeedsLayout=q.offsetWidth===2,q.style.display="",q.innerHTML="<div style='width:4px;'></div>",b.shrinkWrapBlocks=q.offsetWidth!==2),q.style.cssText=k+m,q.innerHTML=o,d=q.firstChild,e=d.firstChild,h=d.nextSibling.firstChild.firstChild,i={doesNotAddBorder:e.offsetTop!==5,doesAddBorderForTableAndCells:h.offsetTop===5},e.style.position="fixed",e.style.top="20px",i.fixedPosition=e.offsetTop===20||e.offsetTop===15,e.style.position=e.style.top="",d.style.overflow="hidden",d.style.position="relative",i.subtractsBorderForOverflowNotVisible=e.offsetTop===-5,i.doesNotIncludeMarginInBodyOffset=r.offsetTop!==j,r.rem
 oveChild(a),q=a=null,f.extend(b,i))});return b}();var j=/^(?:\{.*\}|\[.*\])$/,k=/([A-Z])/g;f.extend({cache:{},uuid:0,expando:"jQuery"+(f.fn.jquery+Math.random()).replace(/\D/g,""),noData:{embed:!0,object:"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000",applet:!0},hasData:function(a){a=a.nodeType?f.cache[a[f.expando]]:a[f.expando];return!!a&&!m(a)},data:function(a,c,d,e){if(!!f.acceptData(a)){var g,h,i,j=f.expando,k=typeof c=="string",l=a.nodeType,m=l?f.cache:a,n=l?a[j]:a[j]&&j,o=c==="events";if((!n||!m[n]||!o&&!e&&!m[n].data)&&k&&d===b)return;n||(l?a[j]=n=++f.uuid:n=j),m[n]||(m[n]={},l||(m[n].toJSON=f.noop));if(typeof c=="object"||typeof c=="function")e?m[n]=f.extend(m[n],c):m[n].data=f.extend(m[n].data,c);g=h=m[n],e||(h.data||(h.data={}),h=h.data),d!==b&&(h[f.camelCase(c)]=d);if(o&&!h[c])return g.events;k?(i=h[c],i==null&&(i=h[f.camelCase(c)])):i=h;return i}},removeData:function(a,b,c){if(!!f.acceptData(a)){var d,e,g,h=f.expando,i=a.nodeType,j=i?f.cache:a,k=i?a[h]:h;if(!j[k])return;if(
 b){d=c?j[k]:j[k].data;if(d){f.isArray(b)||(b in d?b=[b]:(b=f.camelCase(b),b in d?b=[b]:b=b.split(" ")));for(e=0,g=b.length;e<g;e++)delete d[b[e]];if(!(c?m:f.isEmptyObject)(d))return}}if(!c){delete j[k].data;if(!m(j[k]))return}f.support.deleteExpando||!j.setInterval?delete j[k]:j[k]=null,i&&(f.support.deleteExpando?delete a[h]:a.removeAttribute?a.removeAttribute(h):a[h]=null)}},_data:function(a,b,c){return f.data(a,b,c,!0)},acceptData:function(a){if(a.nodeName){var b=f.noData[a.nodeName.toLowerCase()];if(b)return b!==!0&&a.getAttribute("classid")===b}return!0}}),f.fn.extend({data:function(a,c){var d,e,g,h=null;if(typeof a=="undefined"){if(this.length){h=f.data(this[0]);if(this[0].nodeType===1&&!f._data(this[0],"parsedAttrs")){e=this[0].attributes;for(var i=0,j=e.length;i<j;i++)g=e[i].name,g.indexOf("data-")===0&&(g=f.camelCase(g.substring(5)),l(this[0],g,h[g]));f._data(this[0],"parsedAttrs",!0)}}return h}if(typeof a=="object")return this.each(function(){f.data(this,a)});d=a.split("."
 ),d[1]=d[1]?"."+d[1]:"";if(c===b){h=this.triggerHandler("getData"+d[1]+"!",[d[0]]),h===b&&this.length&&(h=f.data(this[0],a),h=l(this[0],a,h));return h===b&&d[1]?this.data(d[0]):h}return this.each(function(){var b=f(this),e=[d[0],c];b.triggerHandler("setData"+d[1]+"!",e),f.data(this,a,c),b.triggerHandler("changeData"+d[1]+"!",e)})},removeData:function(a){return this.each(function(){f.removeData(this,a)})}}),f.extend({_mark:function(a,b){a&&(b=(b||"fx")+"mark",f._data(a,b,(f._data(a,b)||0)+1))},_unmark:function(a,b,c){a!==!0&&(c=b,b=a,a=!1);if(b){c=c||"fx";var d=c+"mark",e=a?0:(f._data(b,d)||1)-1;e?f._data(b,d,e):(f.removeData(b,d,!0),n(b,c,"mark"))}},queue:function(a,b,c){var d;if(a){b=(b||"fx")+"queue",d=f._data(a,b),c&&(!d||f.isArray(c)?d=f._data(a,b,f.makeArray(c)):d.push(c));return d||[]}},dequeue:function(a,b){b=b||"fx";var c=f.queue(a,b),d=c.shift(),e={};d==="inprogress"&&(d=c.shift()),d&&(b==="fx"&&c.unshift("inprogress"),f._data(a,b+".run",e),d.call(a,function(){f.dequeue(a,b
 )},e)),c.length||(f.removeData(a,b+"queue "+b+".run",!0),n(a,b,"queue"))}}),f.fn.extend({queue:function(a,c){typeof a!="string"&&(c=a,a="fx");if(c===b)return f.queue(this[0],a);return this.each(function(){var b=f.queue(this,a,c);a==="fx"&&b[0]!=="inprogress"&&f.dequeue(this,a)})},dequeue:function(a){return this.each(function(){f.dequeue(this,a)})},delay:function(a,b){a=f.fx?f.fx.speeds[a]||a:a,b=b||"fx";return this.queue(b,function(b,c){var d=setTimeout(b,a);c.stop=function(){clearTimeout(d)}})},clearQueue:function(a){return this.queue(a||"fx",[])},promise:function(a,c){function m(){--h||d.resolveWith(e,[e])}typeof a!="string"&&(c=a,a=b),a=a||"fx";var d=f.Deferred(),e=this,g=e.length,h=1,i=a+"defer",j=a+"queue",k=a+"mark",l;while(g--)if(l=f.data(e[g],i,b,!0)||(f.data(e[g],j,b,!0)||f.data(e[g],k,b,!0))&&f.data(e[g],i,f.Callbacks("once memory"),!0))h++,l.add(m);m();return d.promise()}});var o=/[\n\t\r]/g,p=/\s+/,q=/\r/g,r=/^(?:button|input)$/i,s=/^(?:button|input|object|select|textare
 a)$/i,t=/^a(?:rea)?$/i,u=/^(?:autofocus|autoplay|async|checked|controls|defer|disabled|hidden|loop|multiple|open|readonly|required|scoped|selected)$/i,v=f.support.getSetAttribute,w,x,y;f.fn.extend({attr:function(a,b){return f.access(this,a,b,!0,f.attr)},removeAttr:function(a){return this.each(function(){f.removeAttr(this,a)})},prop:function(a,b){return f.access(this,a,b,!0,f.prop)},removeProp:function(a){a=f.propFix[a]||a;return this.each(function(){try{this[a]=b,delete this[a]}catch(c){}})},addClass:function(a){var b,c,d,e,g,h,i;if(f.isFunction(a))return this.each(function(b){f(this).addClass(a.call(this,b,this.className))});if(a&&typeof a=="string"){b=a.split(p);for(c=0,d=this.length;c<d;c++){e=this[c];if(e.nodeType===1)if(!e.className&&b.length===1)e.className=a;else{g=" "+e.className+" ";for(h=0,i=b.length;h<i;h++)~g.indexOf(" "+b[h]+" ")||(g+=b[h]+" ");e.className=f.trim(g)}}}return this},removeClass:function(a){var c,d,e,g,h,i,j;if(f.isFunction(a))return this.each(function(b){
 f(this).removeClass(a.call(this,b,this.className))});if(a&&typeof a=="string"||a===b){c=(a||"").split(p);for(d=0,e=this.length;d<e;d++){g=this[d];if(g.nodeType===1&&g.className)if(a){h=(" "+g.className+" ").replace(o," ");for(i=0,j=c.length;i<j;i++)h=h.replace(" "+c[i]+" "," ");g.className=f.trim(h)}else g.className=""}}return this},toggleClass:function(a,b){var c=typeof a,d=typeof b=="boolean";if(f.isFunction(a))return this.each(function(c){f(this).toggleClass(a.call(this,c,this.className,b),b)});return this.each(function(){if(c==="string"){var e,g=0,h=f(this),i=b,j=a.split(p);while(e=j[g++])i=d?i:!h.hasClass(e),h[i?"addClass":"removeClass"](e)}else if(c==="undefined"||c==="boolean")this.className&&f._data(this,"__className__",this.className),this.className=this.className||a===!1?"":f._data(this,"__className__")||""})},hasClass:function(a){var b=" "+a+" ",c=0,d=this.length;for(;c<d;c++)if(this[c].nodeType===1&&(" "+this[c].className+" ").replace(o," ").indexOf(b)>-1)return!0;return
 !1},val:function(a){var c,d,e,g=this[0];{if(!!arguments.length){e=f.isFunction(a);return this.each(function(d){var g=f(this),h;if(this.nodeType===1){e?h=a.call(this,d,g.val()):h=a,h==null?h="":typeof h=="number"?h+="":f.isArray(h)&&(h=f.map(h,function(a){return a==null?"":a+""})),c=f.valHooks[this.nodeName.toLowerCase()]||f.valHooks[this.type];if(!c||!("set"in c)||c.set(this,h,"value")===b)this.value=h}})}if(g){c=f.valHooks[g.nodeName.toLowerCase()]||f.valHooks[g.type];if(c&&"get"in c&&(d=c.get(g,"value"))!==b)return d;d=g.value;return typeof d=="string"?d.replace(q,""):d==null?"":d}}}}),f.extend({valHooks:{option:{get:function(a){var b=a.attributes.value;return!b||b.specified?a.value:a.text}},select:{get:function(a){var b,c,d,e,g=a.selectedIndex,h=[],i=a.options,j=a.type==="select-one";if(g<0)return null;c=j?g:0,d=j?g+1:i.length;for(;c<d;c++){e=i[c];if(e.selected&&(f.support.optDisabled?!e.disabled:e.getAttribute("disabled")===null)&&(!e.parentNode.disabled||!f.nodeName(e.parentNod
 e,"optgroup"))){b=f(e).val();if(j)return b;h.push(b)}}if(j&&!h.length&&i.length)return f(i[g]).val();return h},set:function(a,b){var c=f.makeArray(b);f(a).find("option").each(function(){this.selected=f.inArray(f(this).val(),c)>=0}),c.length||(a.selectedIndex=-1);return c}}},attrFn:{val:!0,css:!0,html:!0,text:!0,data:!0,width:!0,height:!0,offset:!0},attr:function(a,c,d,e){var g,h,i,j=a.nodeType;if(!!a&&j!==3&&j!==8&&j!==2){if(e&&c in f.attrFn)return f(a)[c](d);if(typeof a.getAttribute=="undefined")return f.prop(a,c,d);i=j!==1||!f.isXMLDoc(a),i&&(c=c.toLowerCase(),h=f.attrHooks[c]||(u.test(c)?x:w));if(d!==b){if(d===null){f.removeAttr(a,c);return}if(h&&"set"in h&&i&&(g=h.set(a,d,c))!==b)return g;a.setAttribute(c,""+d);return d}if(h&&"get"in h&&i&&(g=h.get(a,c))!==null)return g;g=a.getAttribute(c);return g===null?b:g}},removeAttr:function(a,b){var c,d,e,g,h=0;if(b&&a.nodeType===1){d=b.toLowerCase().split(p),g=d.length;for(;h<g;h++)e=d[h],e&&(c=f.propFix[e]||e,f.attr(a,e,""),a.removeAttr
 ibute(v?e:c),u.test(e)&&c in a&&(a[c]=!1))}},attrHooks:{type:{set:function(a,b){if(r.test(a.nodeName)&&a.parentNode)f.error("type property can't be changed");else if(!f.support.radioValue&&b==="radio"&&f.nodeName(a,"input")){var c=a.value;a.setAttribute("type",b),c&&(a.value=c);return b}}},value:{get:function(a,b){if(w&&f.nodeName(a,"button"))return w.get(a,b);return b in a?a.value:null},set:function(a,b,c){if(w&&f.nodeName(a,"button"))return w.set(a,b,c);a.value=b}}},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(a,c,d){var e,g,h,i=a.nodeType;if(!!a&&i!==3&&i!==8&&i!==2){h=i!==1||!f.isXMLDoc(a),h&&(c=f.propFix[c]||c,g=f.propHooks[c]);return d!==b?g&&"set"in g&&(e=g.set(a,d,c))!==b?e:a[c]=d:g&&"get"in g&&(e=g.get(a,c))!==null?e:a[c]}},propHooks:{ta
 bIndex:{get:function(a){var c=a.getAttributeNode("tabindex");return c&&c.specified?parseInt(c.value,10):s.test(a.nodeName)||t.test(a.nodeName)&&a.href?0:b}}}}),f.attrHooks.tabindex=f.propHooks.tabIndex,x={get:function(a,c){var d,e=f.prop(a,c);return e===!0||typeof e!="boolean"&&(d=a.getAttributeNode(c))&&d.nodeValue!==!1?c.toLowerCase():b},set:function(a,b,c){var d;b===!1?f.removeAttr(a,c):(d=f.propFix[c]||c,d in a&&(a[d]=!0),a.setAttribute(c,c.toLowerCase()));return c}},v||(y={name:!0,id:!0},w=f.valHooks.button={get:function(a,c){var d;d=a.getAttributeNode(c);return d&&(y[c]?d.nodeValue!=="":d.specified)?d.nodeValue:b},set:function(a,b,d){var e=a.getAttributeNode(d);e||(e=c.createAttribute(d),a.setAttributeNode(e));return e.nodeValue=b+""}},f.attrHooks.tabindex.set=w.set,f.each(["width","height"],function(a,b){f.attrHooks[b]=f.extend(f.attrHooks[b],{set:function(a,c){if(c===""){a.setAttribute(b,"auto");return c}}})}),f.attrHooks.contenteditable={get:w.get,set:function(a,b,c){b===""
 &&(b="false"),w.set(a,b,c)}}),f.support.hrefNormalized||f.each(["href","src","width","height"],function(a,c){f.attrHooks[c]=f.extend(f.attrHooks[c],{get:function(a){var d=a.getAttribute(c,2);return d===null?b:d}})}),f.support.style||(f.attrHooks.style={get:function(a){return a.style.cssText.toLowerCase()||b},set:function(a,b){return a.style.cssText=""+b}}),f.support.optSelected||(f.propHooks.selected=f.extend(f.propHooks.selected,{get:function(a){var b=a.parentNode;b&&(b.selectedIndex,b.parentNode&&b.parentNode.selectedIndex);return null}})),f.support.enctype||(f.propFix.enctype="encoding"),f.support.checkOn||f.each(["radio","checkbox"],function(){f.valHooks[this]={get:function(a){return a.getAttribute("value")===null?"on":a.value}}}),f.each(["radio","checkbox"],function(){f.valHooks[this]=f.extend(f.valHooks[this],{set:function(a,b){if(f.isArray(b))return a.checked=f.inArray(f(a).val(),b)>=0}})});var z=/^(?:textarea|input|select)$/i,A=/^([^\.]*)?(?:\.(.+))?$/,B=/\bhover(\.\S+)?\b/,
 C=/^key/,D=/^(?:mouse|contextmenu)|click/,E=/^(?:focusinfocus|focusoutblur)$/,F=/^(\w*)(?:#([\w\-]+))?(?:\.([\w\-]+))?$/,G=function(a){var b=F.exec(a);b&&(b[1]=(b[1]||"").toLowerCase(),b[3]=b[3]&&new RegExp("(?:^|\\s)"+b[3]+"(?:\\s|$)"));return b},H=function(a,b){var c=a.attributes||{};return(!b[1]||a.nodeName.toLowerCase()===b[1])&&(!b[2]||(c.id||{}).value===b[2])&&(!b[3]||b[3].test((c["class"]||{}).value))},I=function(a){return f.event.special.hover?a:a.replace(B,"mouseenter$1 mouseleave$1")};
+f.event={add:function(a,c,d,e,g){var h,i,j,k,l,m,n,o,p,q,r,s;if(!(a.nodeType===3||a.nodeType===8||!c||!d||!(h=f._data(a)))){d.handler&&(p=d,d=p.handler),d.guid||(d.guid=f.guid++),j=h.events,j||(h.events=j={}),i=h.handle,i||(h.handle=i=function(a){return typeof f!="undefined"&&(!a||f.event.triggered!==a.type)?f.event.dispatch.apply(i.elem,arguments):b},i.elem=a),c=f.trim(I(c)).split(" ");for(k=0;k<c.length;k++){l=A.exec(c[k])||[],m=l[1],n=(l[2]||"").split(".").sort(),s=f.event.special[m]||{},m=(g?s.delegateType:s.bindType)||m,s=f.event.special[m]||{},o=f.extend({type:m,origType:l[1],data:e,handler:d,guid:d.guid,selector:g,quick:G(g),namespace:n.join(".")},p),r=j[m];if(!r){r=j[m]=[],r.delegateCount=0;if(!s.setup||s.setup.call(a,e,n,i)===!1)a.addEventListener?a.addEventListener(m,i,!1):a.attachEvent&&a.attachEvent("on"+m,i)}s.add&&(s.add.call(a,o),o.handler.guid||(o.handler.guid=d.guid)),g?r.splice(r.delegateCount++,0,o):r.push(o),f.event.global[m]=!0}a=null}},global:{},remove:function
 (a,b,c,d,e){var g=f.hasData(a)&&f._data(a),h,i,j,k,l,m,n,o,p,q,r,s;if(!!g&&!!(o=g.events)){b=f.trim(I(b||"")).split(" ");for(h=0;h<b.length;h++){i=A.exec(b[h])||[],j=k=i[1],l=i[2];if(!j){for(j in o)f.event.remove(a,j+b[h],c,d,!0);continue}p=f.event.special[j]||{},j=(d?p.delegateType:p.bindType)||j,r=o[j]||[],m=r.length,l=l?new RegExp("(^|\\.)"+l.split(".").sort().join("\\.(?:.*\\.)?")+"(\\.|$)"):null;for(n=0;n<r.length;n++)s=r[n],(e||k===s.origType)&&(!c||c.guid===s.guid)&&(!l||l.test(s.namespace))&&(!d||d===s.selector||d==="**"&&s.selector)&&(r.splice(n--,1),s.selector&&r.delegateCount--,p.remove&&p.remove.call(a,s));r.length===0&&m!==r.length&&((!p.teardown||p.teardown.call(a,l)===!1)&&f.removeEvent(a,j,g.handle),delete o[j])}f.isEmptyObject(o)&&(q=g.handle,q&&(q.elem=null),f.removeData(a,["events","handle"],!0))}},customEvent:{getData:!0,setData:!0,changeData:!0},trigger:function(c,d,e,g){if(!e||e.nodeType!==3&&e.nodeType!==8){var h=c.type||c,i=[],j,k,l,m,n,o,p,q,r,s;if(E.test(h+
 f.event.triggered))return;h.indexOf("!")>=0&&(h=h.slice(0,-1),k=!0),h.indexOf(".")>=0&&(i=h.split("."),h=i.shift(),i.sort());if((!e||f.event.customEvent[h])&&!f.event.global[h])return;c=typeof c=="object"?c[f.expando]?c:new f.Event(h,c):new f.Event(h),c.type=h,c.isTrigger=!0,c.exclusive=k,c.namespace=i.join("."),c.namespace_re=c.namespace?new RegExp("(^|\\.)"+i.join("\\.(?:.*\\.)?")+"(\\.|$)"):null,o=h.indexOf(":")<0?"on"+h:"";if(!e){j=f.cache;for(l in j)j[l].events&&j[l].events[h]&&f.event.trigger(c,d,j[l].handle.elem,!0);return}c.result=b,c.target||(c.target=e),d=d!=null?f.makeArray(d):[],d.unshift(c),p=f.event.special[h]||{};if(p.trigger&&p.trigger.apply(e,d)===!1)return;r=[[e,p.bindType||h]];if(!g&&!p.noBubble&&!f.isWindow(e)){s=p.delegateType||h,m=E.test(s+h)?e:e.parentNode,n=null;for(;m;m=m.parentNode)r.push([m,s]),n=m;n&&n===e.ownerDocument&&r.push([n.defaultView||n.parentWindow||a,s])}for(l=0;l<r.length&&!c.isPropagationStopped();l++)m=r[l][0],c.type=r[l][1],q=(f._data(m,"ev
 ents")||{})[c.type]&&f._data(m,"handle"),q&&q.apply(m,d),q=o&&m[o],q&&f.acceptData(m)&&q.apply(m,d)===!1&&c.preventDefault();c.type=h,!g&&!c.isDefaultPrevented()&&(!p._default||p._default.apply(e.ownerDocument,d)===!1)&&(h!=="click"||!f.nodeName(e,"a"))&&f.acceptData(e)&&o&&e[h]&&(h!=="focus"&&h!=="blur"||c.target.offsetWidth!==0)&&!f.isWindow(e)&&(n=e[o],n&&(e[o]=null),f.event.triggered=h,e[h](),f.event.triggered=b,n&&(e[o]=n));return c.result}},dispatch:function(c){c=f.event.fix(c||a.event);var d=(f._data(this,"events")||{})[c.type]||[],e=d.delegateCount,g=[].slice.call(arguments,0),h=!c.exclusive&&!c.namespace,i=[],j,k,l,m,n,o,p,q,r,s,t;g[0]=c,c.delegateTarget=this;if(e&&!c.target.disabled&&(!c.button||c.type!=="click")){m=f(this),m.context=this.ownerDocument||this;for(l=c.target;l!=this;l=l.parentNode||this){o={},q=[],m[0]=l;for(j=0;j<e;j++)r=d[j],s=r.selector,o[s]===b&&(o[s]=r.quick?H(l,r.quick):m.is(s)),o[s]&&q.push(r);q.length&&i.push({elem:l,matches:q})}}d.length>e&&i.push({
 elem:this,matches:d.slice(e)});for(j=0;j<i.length&&!c.isPropagationStopped();j++){p=i[j],c.currentTarget=p.elem;for(k=0;k<p.matches.length&&!c.isImmediatePropagationStopped();k++){r=p.matches[k];if(h||!c.namespace&&!r.namespace||c.namespace_re&&c.namespace_re.test(r.namespace))c.data=r.data,c.handleObj=r,n=((f.event.special[r.origType]||{}).handle||r.handler).apply(p.elem,g),n!==b&&(c.result=n,n===!1&&(c.preventDefault(),c.stopPropagation()))}}return c.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(a,b){a.which==null&&(a.which=b.charCode!=null?b.charCode:b.keyCode);return a}},mouseHooks:{props:"button buttons clientX clientY fromElement offsetX offsetY pageX pageY screenX screenY toElement".split(" "),filter:function(a,d){var e,f,g,h=d.button,i=d.fromElement;a.pa
 geX==null&&d.clientX!=null&&(e=a.target.ownerDocument||c,f=e.documentElement,g=e.body,a.pageX=d.clientX+(f&&f.scrollLeft||g&&g.scrollLeft||0)-(f&&f.clientLeft||g&&g.clientLeft||0),a.pageY=d.clientY+(f&&f.scrollTop||g&&g.scrollTop||0)-(f&&f.clientTop||g&&g.clientTop||0)),!a.relatedTarget&&i&&(a.relatedTarget=i===a.target?d.toElement:i),!a.which&&h!==b&&(a.which=h&1?1:h&2?3:h&4?2:0);return a}},fix:function(a){if(a[f.expando])return a;var d,e,g=a,h=f.event.fixHooks[a.type]||{},i=h.props?this.props.concat(h.props):this.props;a=f.Event(g);for(d=i.length;d;)e=i[--d],a[e]=g[e];a.target||(a.target=g.srcElement||c),a.target.nodeType===3&&(a.target=a.target.parentNode),a.metaKey===b&&(a.metaKey=a.ctrlKey);return h.filter?h.filter(a,g):a},special:{ready:{setup:f.bindReady},load:{noBubble:!0},focus:{delegateType:"focusin"},blur:{delegateType:"focusout"},beforeunload:{setup:function(a,b,c){f.isWindow(this)&&(this.onbeforeunload=c)},teardown:function(a,b){this.onbeforeunload===b&&(this.onbeforeun
 load=null)}}},simulate:function(a,b,c,d){var e=f.extend(new f.Event,c,{type:a,isSimulated:!0,originalEvent:{}});d?f.event.trigger(e,null,b):f.event.dispatch.call(b,e),e.isDefaultPrevented()&&c.preventDefault()}},f.event.handle=f.event.dispatch,f.removeEvent=c.removeEventListener?function(a,b,c){a.removeEventListener&&a.removeEventListener(b,c,!1)}:function(a,b,c){a.detachEvent&&a.detachEvent("on"+b,c)},f.Event=function(a,b){if(!(this instanceof f.Event))return new f.Event(a,b);a&&a.type?(this.originalEvent=a,this.type=a.type,this.isDefaultPrevented=a.defaultPrevented||a.returnValue===!1||a.getPreventDefault&&a.getPreventDefault()?K:J):this.type=a,b&&f.extend(this,b),this.timeStamp=a&&a.timeStamp||f.now(),this[f.expando]=!0},f.Event.prototype={preventDefault:function(){this.isDefaultPrevented=K;var a=this.originalEvent;!a||(a.preventDefault?a.preventDefault():a.returnValue=!1)},stopPropagation:function(){this.isPropagationStopped=K;var a=this.originalEvent;!a||(a.stopPropagation&&a.s
 topPropagation(),a.cancelBubble=!0)},stopImmediatePropagation:function(){this.isImmediatePropagationStopped=K,this.stopPropagation()},isDefaultPrevented:J,isPropagationStopped:J,isImmediatePropagationStopped:J},f.each({mouseenter:"mouseover",mouseleave:"mouseout"},function(a,b){f.event.special[a]={delegateType:b,bindType:b,handle:function(a){var c=this,d=a.relatedTarget,e=a.handleObj,g=e.selector,h;if(!d||d!==c&&!f.contains(c,d))a.type=e.origType,h=e.handler.apply(this,arguments),a.type=b;return h}}}),f.support.submitBubbles||(f.event.special.submit={setup:function(){if(f.nodeName(this,"form"))return!1;f.event.add(this,"click._submit keypress._submit",function(a){var c=a.target,d=f.nodeName(c,"input")||f.nodeName(c,"button")?c.form:b;d&&!d._submit_attached&&(f.event.add(d,"submit._submit",function(a){this.parentNode&&!a.isTrigger&&f.event.simulate("submit",this.parentNode,a,!0)}),d._submit_attached=!0)})},teardown:function(){if(f.nodeName(this,"form"))return!1;f.event.remove(this,".
 _submit")}}),f.support.changeBubbles||(f.event.special.change={setup:function(){if(z.test(this.nodeName)){if(this.type==="checkbox"||this.type==="radio")f.event.add(this,"propertychange._change",function(a){a.originalEvent.propertyName==="checked"&&(this._just_changed=!0)}),f.event.add(this,"click._change",function(a){this._just_changed&&!a.isTrigger&&(this._just_changed=!1,f.event.simulate("change",this,a,!0))});return!1}f.event.add(this,"beforeactivate._change",function(a){var b=a.target;z.test(b.nodeName)&&!b._change_attached&&(f.event.add(b,"change._change",function(a){this.parentNode&&!a.isSimulated&&!a.isTrigger&&f.event.simulate("change",this.parentNode,a,!0)}),b._change_attached=!0)})},handle:function(a){var b=a.target;if(this!==b||a.isSimulated||a.isTrigger||b.type!=="radio"&&b.type!=="checkbox")return a.handleObj.handler.apply(this,arguments)},teardown:function(){f.event.remove(this,"._change");return z.test(this.nodeName)}}),f.support.focusinBubbles||f.each({focus:"focusi
 n",blur:"focusout"},function(a,b){var d=0,e=function(a){f.event.simulate(b,a.target,f.event.fix(a),!0)};f.event.special[b]={setup:function(){d++===0&&c.addEventListener(a,e,!0)},teardown:function(){--d===0&&c.removeEventListener(a,e,!0)}}}),f.fn.extend({on:function(a,c,d,e,g){var h,i;if(typeof a=="object"){typeof c!="string"&&(d=c,c=b);for(i in a)this.on(i,c,d,a[i],g);return this}d==null&&e==null?(e=c,d=c=b):e==null&&(typeof c=="string"?(e=d,d=b):(e=d,d=c,c=b));if(e===!1)e=J;else if(!e)return this;g===1&&(h=e,e=function(a){f().off(a);return h.apply(this,arguments)},e.guid=h.guid||(h.guid=f.guid++));return this.each(function(){f.event.add(this,a,e,d,c)})},one:function(a,b,c,d){return this.on.call(this,a,b,c,d,1)},off:function(a,c,d){if(a&&a.preventDefault&&a.handleObj){var e=a.handleObj;f(a.delegateTarget).off(e.namespace?e.type+"."+e.namespace:e.type,e.selector,e.handler);return this}if(typeof a=="object"){for(var g in a)this.off(g,c,a[g]);return this}if(c===!1||typeof c=="function"
 )d=c,c=b;d===!1&&(d=J);return this.each(function(){f.event.remove(this,a,d,c)})},bind:function(a,b,c){return this.on(a,null,b,c)},unbind:function(a,b){return this.off(a,null,b)},live:function(a,b,c){f(this.context).on(a,this.selector,b,c);return this},die:function(a,b){f(this.context).off(a,this.selector||"**",b);return this},delegate:function(a,b,c,d){return this.on(b,a,c,d)},undelegate:function(a,b,c){return arguments.length==1?this.off(a,"**"):this.off(b,a,c)},trigger:function(a,b){return this.each(function(){f.event.trigger(a,b,this)})},triggerHandler:function(a,b){if(this[0])return f.event.trigger(a,b,this[0],!0)},toggle:function(a){var b=arguments,c=a.guid||f.guid++,d=0,e=function(c){var e=(f._data(this,"lastToggle"+a.guid)||0)%d;f._data(this,"lastToggle"+a.guid,e+1),c.preventDefault();return b[e].apply(this,arguments)||!1};e.guid=c;while(d<b.length)b[d++].guid=c;return this.click(e)},hover:function(a,b){return this.mouseenter(a).mouseleave(b||a)}}),f.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(a,b){f.fn[b]=function(a,c){c==null&&(c=a,a=null);return arguments.length>0?this.on(b,null,a,c):this.trigger(b)},f.attrFn&&(f.attrFn[b]=!0),C.test(b)&&(f.event.fixHooks[b]=f.event.keyHooks),D.test(b)&&(f.event.fixHooks[b]=f.event.mouseHooks)}),function(){function x(a,b,c,e,f,g){for(var h=0,i=e.length;h<i;h++){var j=e[h];if(j){var k=!1;j=j[a];while(j){if(j[d]===c){k=e[j.sizset];break}if(j.nodeType===1){g||(j[d]=c,j.sizset=h);if(typeof b!="string"){if(j===b){k=!0;break}}else if(m.filter(b,[j]).length>0){k=j;break}}j=j[a]}e[h]=k}}}function w(a,b,c,e,f,g){for(var h=0,i=e.length;h<i;h++){var j=e[h];if(j){var k=!1;j=j[a];while(j){if(j[d]===c){k=e[j.sizset];break}j.nodeType===1&&!g&&(j[d]=c,j.sizset=h);if(j.nodeName.toLowerCase()===b){k=j;break}j=j[a]}e[h]=k}}}var a=/((?:\((?:\([^()]+\)|[^()]
 +)+\)|\[(?:\[[^\[\]]*\]|['"][^'"]*['"]|[^\[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g,d="sizcache"+(Math.random()+"").replace(".",""),e=0,g=Object.prototype.toString,h=!1,i=!0,j=/\\/g,k=/\r\n/g,l=/\W/;[0,0].sort(function(){i=!1;return 0});var m=function(b,d,e,f){e=e||[],d=d||c;var h=d;if(d.nodeType!==1&&d.nodeType!==9)return[];if(!b||typeof b!="string")return e;var i,j,k,l,n,q,r,t,u=!0,v=m.isXML(d),w=[],x=b;do{a.exec(""),i=a.exec(x);if(i){x=i[3],w.push(i[1]);if(i[2]){l=i[3];break}}}while(i);if(w.length>1&&p.exec(b))if(w.length===2&&o.relative[w[0]])j=y(w[0]+w[1],d,f);else{j=o.relative[w[0]]?[d]:m(w.shift(),d);while(w.length)b=w.shift(),o.relative[b]&&(b+=w.shift()),j=y(b,j,f)}else{!f&&w.length>1&&d.nodeType===9&&!v&&o.match.ID.test(w[0])&&!o.match.ID.test(w[w.length-1])&&(n=m.find(w.shift(),d,v),d=n.expr?m.filter(n.expr,n.set)[0]:n.set[0]);if(d){n=f?{expr:w.pop(),set:s(f)}:m.find(w.pop(),w.length===1&&(w[0]==="~"||w[0]==="+")&&d.parentNode?d.parentNode:d,v),j=n
 .expr?m.filter(n.expr,n.set):n.set,w.length>0?k=s(j):u=!1;while(w.length)q=w.pop(),r=q,o.relative[q]?r=w.pop():q="",r==null&&(r=d),o.relative[q](k,r,v)}else k=w=[]}k||(k=j),k||m.error(q||b);if(g.call(k)==="[object Array]")if(!u)e.push.apply(e,k);else if(d&&d.nodeType===1)for(t=0;k[t]!=null;t++)k[t]&&(k[t]===!0||k[t].nodeType===1&&m.contains(d,k[t]))&&e.push(j[t]);else for(t=0;k[t]!=null;t++)k[t]&&k[t].nodeType===1&&e.push(j[t]);else s(k,e);l&&(m(l,h,e,f),m.uniqueSort(e));return e};m.uniqueSort=function(a){if(u){h=i,a.sort(u);if(h)for(var b=1;b<a.length;b++)a[b]===a[b-1]&&a.splice(b--,1)}return a},m.matches=function(a,b){return m(a,null,null,b)},m.matchesSelector=function(a,b){return m(b,null,null,[a]).length>0},m.find=function(a,b,c){var d,e,f,g,h,i;if(!a)return[];for(e=0,f=o.order.length;e<f;e++){h=o.order[e];if(g=o.leftMatch[h].exec(a)){i=g[1],g.splice(1,1);if(i.substr(i.length-1)!=="\\"){g[1]=(g[1]||"").replace(j,""),d=o.find[h](g,b,c);if(d!=null){a=a.replace(o.match[h],"");break
 }}}}d||(d=typeof b.getElementsByTagName!="undefined"?b.getElementsByTagName("*"):[]);return{set:d,expr:a}},m.filter=function(a,c,d,e){var f,g,h,i,j,k,l,n,p,q=a,r=[],s=c,t=c&&c[0]&&m.isXML(c[0]);while(a&&c.length){for(h in o.filter)if((f=o.leftMatch[h].exec(a))!=null&&f[2]){k=o.filter[h],l=f[1],g=!1,f.splice(1,1);if(l.substr(l.length-1)==="\\")continue;s===r&&(r=[]);if(o.preFilter[h]){f=o.preFilter[h](f,s,d,r,e,t);if(!f)g=i=!0;else if(f===!0)continue}if(f)for(n=0;(j=s[n])!=null;n++)j&&(i=k(j,f,n,s),p=e^i,d&&i!=null?p?g=!0:s[n]=!1:p&&(r.push(j),g=!0));if(i!==b){d||(s=r),a=a.replace(o.match[h],"");if(!g)return[];break}}if(a===q)if(g==null)m.error(a);else break;q=a}return s},m.error=function(a){throw new Error("Syntax error, unrecognized expression: "+a)};var n=m.getText=function(a){var b,c,d=a.nodeType,e="";if(d){if(d===1||d===9){if(typeof a.textContent=="string")return a.textContent;if(typeof a.innerText=="string")return a.innerText.replace(k,"");for(a=a.firstChild;a;a=a.nextSibling)e
 +=n(a)}else if(d===3||d===4)return a.nodeValue}else for(b=0;c=a[b];b++)c.nodeType!==8&&(e+=n(c));return e},o=m.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(a){return a.getAttribute("href")},type:function(a){return a.getAttribute("type")}},relative:{"+":function(a,b){var c=typeof b=="string",d=c&&!l.test(b),e=c&&!d;d&&(b=b.toLowerCase());for(var f=0,g=a.len
 gth,h;f<g;f++)if(h=a[f]){while((h=h.previousSibling)&&h.nodeType!==1);a[f]=e||h&&h.nodeName.toLowerCase()===b?h||!1:h===b}e&&m.filter(b,a,!0)},">":function(a,b){var c,d=typeof b=="string",e=0,f=a.length;if(d&&!l.test(b)){b=b.toLowerCase();for(;e<f;e++){c=a[e];if(c){var g=c.parentNode;a[e]=g.nodeName.toLowerCase()===b?g:!1}}}else{for(;e<f;e++)c=a[e],c&&(a[e]=d?c.parentNode:c.parentNode===b);d&&m.filter(b,a,!0)}},"":function(a,b,c){var d,f=e++,g=x;typeof b=="string"&&!l.test(b)&&(b=b.toLowerCase(),d=b,g=w),g("parentNode",b,f,a,d,c)},"~":function(a,b,c){var d,f=e++,g=x;typeof b=="string"&&!l.test(b)&&(b=b.toLowerCase(),d=b,g=w),g("previousSibling",b,f,a,d,c)}},find:{ID:function(a,b,c){if(typeof b.getElementById!="undefined"&&!c){var d=b.getElementById(a[1]);return d&&d.parentNode?[d]:[]}},NAME:function(a,b){if(typeof b.getElementsByName!="undefined"){var c=[],d=b.getElementsByName(a[1]);for(var e=0,f=d.length;e<f;e++)d[e].getAttribute("name")===a[1]&&c.push(d[e]);return c.length===0?nu
 ll:c}},TAG:function(a,b){if(typeof b.getElementsByTagName!="undefined")return b.getElementsByTagName(a[1])}},preFilter:{CLASS:function(a,b,c,d,e,f){a=" "+a[1].replace(j,"")+" ";if(f)return a;for(var g=0,h;(h=b[g])!=null;g++)h&&(e^(h.className&&(" "+h.className+" ").replace(/[\t\n\r]/g," ").indexOf(a)>=0)?c||d.push(h):c&&(b[g]=!1));return!1},ID:function(a){return a[1].replace(j,"")},TAG:function(a,b){return a[1].replace(j,"").toLowerCase()},CHILD:function(a){if(a[1]==="nth"){a[2]||m.error(a[0]),a[2]=a[2].replace(/^\+|\s*/g,"");var b=/(-?)(\d*)(?:n([+\-]?\d*))?/.exec(a[2]==="even"&&"2n"||a[2]==="odd"&&"2n+1"||!/\D/.test(a[2])&&"0n+"+a[2]||a[2]);a[2]=b[1]+(b[2]||1)-0,a[3]=b[3]-0}else a[2]&&m.error(a[0]);a[0]=e++;return a},ATTR:function(a,b,c,d,e,f){var g=a[1]=a[1].replace(j,"");!f&&o.attrMap[g]&&(a[1]=o.attrMap[g]),a[4]=(a[4]||a[5]||"").replace(j,""),a[2]==="~="&&(a[4]=" "+a[4]+" ");return a},PSEUDO:function(b,c,d,e,f){if(b[1]==="not")if((a.exec(b[3])||"").length>1||/^\w/.test(b[3]))b[
 3]=m(b[3],null,null,c);else{var g=m.filter(b[3],c,d,!0^f);d||e.push.apply(e,g);return!1}else if(o.match.POS.test(b[0])||o.match.CHILD.test(b[0]))return!0;return b},POS:function(a){a.unshift(!0);return a}},filters:{enabled:function(a){return a.disabled===!1&&a.type!=="hidden"},disabled:function(a){return a.disabled===!0},checked:function(a){return a.checked===!0},selected:function(a){a.parentNode&&a.parentNode.selectedIndex;return a.selected===!0},parent:function(a){return!!a.firstChild},empty:function(a){return!a.firstChild},has:function(a,b,c){return!!m(c[3],a).length},header:function(a){return/h\d/i.test(a.nodeName)},text:function(a){var b=a.getAttribute("type"),c=a.type;return a.nodeName.toLowerCase()==="input"&&"text"===c&&(b===c||b===null)},radio:function(a){return a.nodeName.toLowerCase()==="input"&&"radio"===a.type},checkbox:function(a){return a.nodeName.toLowerCase()==="input"&&"checkbox"===a.type},file:function(a){return a.nodeName.toLowerCase()==="input"&&"file"===a.type},
 password:function(a){return a.nodeName.toLowerCase()==="input"&&"password"===a.type},submit:function(a){var b=a.nodeName.toLowerCase();return(b==="input"||b==="button")&&"submit"===a.type},image:function(a){return a.nodeName.toLowerCase()==="input"&&"image"===a.type},reset:function(a){var b=a.nodeName.toLowerCase();return(b==="input"||b==="button")&&"reset"===a.type},button:function(a){var b=a.nodeName.toLowerCase();return b==="input"&&"button"===a.type||b==="button"},input:function(a){return/input|select|textarea|button/i.test(a.nodeName)},focus:function(a){return a===a.ownerDocument.activeElement}},setFilters:{first:function(a,b){return b===0},last:function(a,b,c,d){return b===d.length-1},even:function(a,b){return b%2===0},odd:function(a,b){return b%2===1},lt:function(a,b,c){return b<c[3]-0},gt:function(a,b,c){return b>c[3]-0},nth:function(a,b,c){return c[3]-0===b},eq:function(a,b,c){return c[3]-0===b}},filter:{PSEUDO:function(a,b,c,d){var e=b[1],f=o.filters[e];if(f)return f(a,c,b
 ,d);if(e==="contains")return(a.textContent||a.innerText||n([a])||"").indexOf(b[3])>=0;if(e==="not"){var g=b[3];for(var h=0,i=g.length;h<i;h++)if(g[h]===a)return!1;return!0}m.error(e)},CHILD:function(a,b){var c,e,f,g,h,i,j,k=b[1],l=a;switch(k){case"only":case"first":while(l=l.previousSibling)if(l.nodeType===1)return!1;if(k==="first")return!0;l=a;case"last":while(l=l.nextSibling)if(l.nodeType===1)return!1;return!0;case"nth":c=b[2],e=b[3];if(c===1&&e===0)return!0;f=b[0],g=a.parentNode;if(g&&(g[d]!==f||!a.nodeIndex)){i=0;for(l=g.firstChild;l;l=l.nextSibling)l.nodeType===1&&(l.nodeIndex=++i);g[d]=f}j=a.nodeIndex-e;return c===0?j===0:j%c===0&&j/c>=0}},ID:function(a,b){return a.nodeType===1&&a.getAttribute("id")===b},TAG:function(a,b){return b==="*"&&a.nodeType===1||!!a.nodeName&&a.nodeName.toLowerCase()===b},CLASS:function(a,b){return(" "+(a.className||a.getAttribute("class"))+" ").indexOf(b)>-1},ATTR:function(a,b){var c=b[1],d=m.attr?m.attr(a,c):o.attrHandle[c]?o.attrHandle[c](a):a[c]!=n
 ull?a[c]:a.getAttribute(c),e=d+"",f=b[2],g=b[4];return d==null?f==="!=":!f&&m.attr?d!=null:f==="="?e===g:f==="*="?e.indexOf(g)>=0:f==="~="?(" "+e+" ").indexOf(g)>=0:g?f==="!="?e!==g:f==="^="?e.indexOf(g)===0:f==="$="?e.substr(e.length-g.length)===g:f==="|="?e===g||e.substr(0,g.length+1)===g+"-":!1:e&&d!==!1},POS:function(a,b,c,d){var e=b[2],f=o.setFilters[e];if(f)return f(a,c,b,d)}}},p=o.match.POS,q=function(a,b){return"\\"+(b-0+1)};for(var r in o.match)o.match[r]=new RegExp(o.match[r].source+/(?![^\[]*\])(?![^\(]*\))/.source),o.leftMatch[r]=new RegExp(/(^(?:.|\r|\n)*?)/.source+o.match[r].source.replace(/\\(\d+)/g,q));var s=function(a,b){a=Array.prototype.slice.call(a,0);if(b){b.push.apply(b,a);return b}return a};try{Array.prototype.slice.call(c.documentElement.childNodes,0)[0].nodeType}catch(t){s=function(a,b){var c=0,d=b||[];if(g.call(a)==="[object Array]")Array.prototype.push.apply(d,a);else if(typeof a.length=="number")for(var e=a.length;c<e;c++)d.push(a[c]);else for(;a[c];c++)d
 .push(a[c]);return d}}var u,v;c.documentElement.compareDocumentPosition?u=function(a,b){if(a===b){h=!0;return 0}if(!a.compareDocumentPosition||!b.compareDocumentPosition)return a.compareDocumentPosition?-1:1;return a.compareDocumentPosition(b)&4?-1:1}:(u=function(a,b){if(a===b){h=!0;return 0}if(a.sourceIndex&&b.sourceIndex)return a.sourceIndex-b.sourceIndex;var c,d,e=[],f=[],g=a.parentNode,i=b.parentNode,j=g;if(g===i)return v(a,b);if(!g)return-1;if(!i)return 1;while(j)e.unshift(j),j=j.parentNode;j=i;while(j)f.unshift(j),j=j.parentNode;c=e.length,d=f.length;for(var k=0;k<c&&k<d;k++)if(e[k]!==f[k])return v(e[k],f[k]);return k===c?v(a,f[k],-1):v(e[k],b,1)},v=function(a,b,c){if(a===b)return c;var d=a.nextSibling;while(d){if(d===b)return-1;d=d.nextSibling}return 1}),function(){var a=c.createElement("div"),d="script"+(new Date).getTime(),e=c.documentElement;a.innerHTML="<a name='"+d+"'/>",e.insertBefore(a,e.firstChild),c.getElementById(d)&&(o.find.ID=function(a,c,d){if(typeof c.getElement
 ById!="undefined"&&!d){var e=c.getElementById(a[1]);return e?e.id===a[1]||typeof e.getAttributeNode!="undefined"&&e.getAttributeNode("id").nodeValue===a[1]?[e]:b:[]}},o.filter.ID=function(a,b){var c=typeof a.getAttributeNode!="undefined"&&a.getAttributeNode("id");return a.nodeType===1&&c&&c.nodeValue===b}),e.removeChild(a),e=a=null}(),function(){var a=c.createElement("div");a.appendChild(c.createComment("")),a.getElementsByTagName("*").length>0&&(o.find.TAG=function(a,b){var c=b.getElementsByTagName(a[1]);if(a[1]==="*"){var d=[];for(var e=0;c[e];e++)c[e].nodeType===1&&d.push(c[e]);c=d}return c}),a.innerHTML="<a href='#'></a>",a.firstChild&&typeof a.firstChild.getAttribute!="undefined"&&a.firstChild.getAttribute("href")!=="#"&&(o.attrHandle.href=function(a){return a.getAttribute("href",2)}),a=null}(),c.querySelectorAll&&function(){var a=m,b=c.createElement("div"),d="__sizzle__";b.innerHTML="<p class='TEST'></p>";if(!b.querySelectorAll||b.querySelectorAll(".TEST").length!==0){m=functi
 on(b,e,f,g){e=e||c;if(!g&&!m.isXML(e)){var h=/^(\w+$)|^\.([\w\-]+$)|^#([\w\-]+$)/.exec(b);if(h&&(e.nodeType===1||e.nodeType===9)){if(h[1])return s(e.getElementsByTagName(b),f);if(h[2]&&o.find.CLASS&&e.getElementsByClassName)return s(e.getElementsByClassName(h[2]),f)}if(e.nodeType===9){if(b==="body"&&e.body)return s([e.body],f);if(h&&h[3]){var i=e.getElementById(h[3]);if(!i||!i.parentNode)return s([],f);if(i.id===h[3])return s([i],f)}try{return s(e.querySelectorAll(b),f)}catch(j){}}else if(e.nodeType===1&&e.nodeName.toLowerCase()!=="object"){var k=e,l=e.getAttribute("id"),n=l||d,p=e.parentNode,q=/^\s*[+~]/.test(b);l?n=n.replace(/'/g,"\\$&"):e.setAttribute("id",n),q&&p&&(e=e.parentNode);try{if(!q||p)return s(e.querySelectorAll("[id='"+n+"'] "+b),f)}catch(r){}finally{l||k.removeAttribute("id")}}}return a(b,e,f,g)};for(var e in a)m[e]=a[e];b=null}}(),function(){var a=c.documentElement,b=a.matchesSelector||a.mozMatchesSelector||a.webkitMatchesSelector||a.msMatchesSelector;if(b){var d=!b.
 call(c.createElement("div"),"div"),e=!1;try{b.call(c.documentElement,"[test!='']:sizzle")}catch(f){e=!0}m.matchesSelector=function(a,c){c=c.replace(/\=\s*([^'"\]]*)\s*\]/g,"='$1']");if(!m.isXML(a))try{if(e||!o.match.PSEUDO.test(c)&&!/!=/.test(c)){var f=b.call(a,c);if(f||!d||a.document&&a.document.nodeType!==11)return f}}catch(g){}return m(c,null,null,[a]).length>0}}}(),function(){var a=c.createElement("div");a.innerHTML="<div class='test e'></div><div class='test'></div>";if(!!a.getElementsByClassName&&a.getElementsByClassName("e").length!==0){a.lastChild.className="e";if(a.getElementsByClassName("e").length===1)return;o.order.splice(1,0,"CLASS"),o.find.CLASS=function(a,b,c){if(typeof b.getElementsByClassName!="undefined"&&!c)return b.getElementsByClassName(a[1])},a=null}}(),c.documentElement.contains?m.contains=function(a,b){return a!==b&&(a.contains?a.contains(b):!0)}:c.documentElement.compareDocumentPosition?m.contains=function(a,b){return!!(a.compareDocumentPosition(b)&16)}:m.co
 ntains=function(){return!1},m.isXML=function(a){var b=(a?a.ownerDocument||a:0).documentElement;return b?b.nodeName!=="HTML":!1};var y=function(a,b,c){var d,e=[],f="",g=b.nodeType?[b]:b;while(d=o.match.PSEUDO.exec(a))f+=d[0],a=a.replace(o.match.PSEUDO,"");a=o.relative[a]?a+"*":a;for(var h=0,i=g.length;h<i;h++)m(a,g[h],e,c);return m.filter(f,e)};m.attr=f.attr,m.selectors.attrMap={},f.find=m,f.expr=m.selectors,f.expr[":"]=f.expr.filters,f.unique=m.uniqueSort,f.text=m.getText,f.isXMLDoc=m.isXML,f.contains=m.contains}();var L=/Until$/,M=/^(?:parents|prevUntil|prevAll)/,N=/,/,O=/^.[^:#\[\.,]*$/,P=Array.prototype.slice,Q=f.expr.match.POS,R={children:!0,contents:!0,next:!0,prev:!0};f.fn.extend({find:function(a){var b=this,c,d;if(typeof a!="string")return f(a).filter(function(){for(c=0,d=b.length;c<d;c++)if(f.contains(b[c],this))return!0});var e=this.pushStack("","find",a),g,h,i;for(c=0,d=this.length;c<d;c++){g=e.length,f.find(a,this[c],e);if(c>0)for(h=g;h<e.length;h++)for(i=0;i<g;i++)if(e[i
 ]===e[h]){e.splice(h--,1);break}}return e},has:function(a){var b=f(a);return this.filter(function(){for(var a=0,c=b.length;a<c;a++)if(f.contains(this,b[a]))return!0})},not:function(a){return this.pushStack(T(this,a,!1),"not",a)},filter:function(a){return this.pushStack(T(this,a,!0),"filter",a)},is:function(a){return!!a&&(typeof a=="string"?Q.test(a)?f(a,this.context).index(this[0])>=0:f.filter(a,this).length>0:this.filter(a).length>0)},closest:function(a,b){var c=[],d,e,g=this[0];if(f.isArray(a)){var h=1;while(g&&g.ownerDocument&&g!==b){for(d=0;d<a.length;d++)f(g).is(a[d])&&c.push({selector:a[d],elem:g,level:h});g=g.parentNode,h++}return c}var i=Q.test(a)||typeof a!="string"?f(a,b||this.context):0;for(d=0,e=this.length;d<e;d++){g=this[d];while(g){if(i?i.index(g)>-1:f.find.matchesSelector(g,a)){c.push(g);break}g=g.parentNode;if(!g||!g.ownerDocument||g===b||g.nodeType===11)break}}c=c.length>1?f.unique(c):c;return this.pushStack(c,"closest",a)},index:function(a){if(!a)return this[0]&&t
 his[0].parentNode?this.prevAll().length:-1;if(typeof a=="string")return f.inArray(this[0],f(a));return f.inArray(a.jquery?a[0]:a,this)},add:function(a,b){var c=typeof a=="string"?f(a,b):f.makeArray(a&&a.nodeType?[a]:a),d=f.merge(this.get(),c);return this.pushStack(S(c[0])||S(d[0])?d:f.unique(d))},andSelf:function(){return this.add(this.prevObject)}}),f.each({parent:function(a){var b=a.parentNode;return b&&b.nodeType!==11?b:null},parents:function(a){return f.dir(a,"parentNode")},parentsUntil:function(a,b,c){return f.dir(a,"parentNode",c)},next:function(a){return f.nth(a,2,"nextSibling")},prev:function(a){return f.nth(a,2,"previousSibling")},nextAll:function(a){return f.dir(a,"nextSibling")},prevAll:function(a){return f.dir(a,"previousSibling")},nextUntil:function(a,b,c){return f.dir(a,"nextSibling",c)},prevUntil:function(a,b,c){return f.dir(a,"previousSibling",c)},siblings:function(a){return f.sibling(a.parentNode.firstChild,a)},children:function(a){return f.sibling(a.firstChild)},co
 ntents:function(a){return f.nodeName(a,"iframe")?a.contentDocument||a.contentWindow.document:f.makeArray(a.childNodes)}},function(a,b){f.fn[a]=function(c,d){var e=f.map(this,b,c);L.test(a)||(d=c),d&&typeof d=="string"&&(e=f.filter(d,e)),e=this.length>1&&!R[a]?f.unique(e):e,(this.length>1||N.test(d))&&M.test(a)&&(e=e.reverse());return this.pushStack(e,a,P.call(arguments).join(","))}}),f.extend({filter:function(a,b,c){c&&(a=":not("+a+")");return b.length===1?f.find.matchesSelector(b[0],a)?[b[0]]:[]:f.find.matches(a,b)},dir:function(a,c,d){var e=[],g=a[c];while(g&&g.nodeType!==9&&(d===b||g.nodeType!==1||!f(g).is(d)))g.nodeType===1&&e.push(g),g=g[c];return e},nth:function(a,b,c,d){b=b||1;var e=0;for(;a;a=a[c])if(a.nodeType===1&&++e===b)break;return a},sibling:function(a,b){var c=[];for(;a;a=a.nextSibling)a.nodeType===1&&a!==b&&c.push(a);return c}});var V="abbr|article|aside|audio|canvas|datalist|details|figcaption|figure|footer|header|hgroup|mark|meter|nav|output|progress|section|summar
 y|time|video",W=/ jQuery\d+="(?:\d+|null)"/g,X=/^\s+/,Y=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/ig,Z=/<([\w:]+)/,$=/<tbody/i,_=/<|&#?\w+;/,ba=/<(?:script|style)/i,bb=/<(?:script|object|embed|option|style)/i,bc=new RegExp("<(?:"+V+")","i"),bd=/checked\s*(?:[^=]|=\s*.checked.)/i,be=/\/(java|ecma)script/i,bf=/^\s*<!(?:\[CDATA\[|\-\-)/,bg={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,"",""]},bh=U(c);bg.optgroup=bg.option,bg.tbody=bg.tfoot=bg.colgroup=bg.caption=bg.thead,bg.th=bg.td,f.support.htmlSerialize||(bg._default=[1,"div<div>","</div>"]),f.fn.extend({text:function(a){if(f.isFunction(a))return this.each(function(b){var c=f(this);c.text(a.call(this,b,c.text()))});if(typeof a!="obje
 ct"&&a!==b)return this.empty().append((this[0]&&this[0].ownerDocument||c).createTextNode(a));return f.text(this)},wrapAll:function(a){if(f.isFunction(a))return this.each(function(b){f(this).wrapAll(a.call(this,b))});if(this[0]){var b=f(a,this[0].ownerDocument).eq(0).clone(!0);this[0].parentNode&&b.insertBefore(this[0]),b.map(function(){var a=this;while(a.firstChild&&a.firstChild.nodeType===1)a=a.firstChild;return a}).append(this)}return this},wrapInner:function(a){if(f.isFunction(a))return this.each(function(b){f(this).wrapInner(a.call(this,b))});return this.each(function(){var b=f(this),c=b.contents();c.length?c.wrapAll(a):b.append(a)})},wrap:function(a){var b=f.isFunction(a);return this.each(function(c){f(this).wrapAll(b?a.call(this,c):a)})},unwrap:function(){return this.parent().each(function(){f.nodeName(this,"body")||f(this).replaceWith(this.childNodes)}).end()},append:function(){return this.domManip(arguments,!0,function(a){this.nodeType===1&&this.appendChild(a)})},prepend:fun
 ction(){return this.domManip(arguments,!0,function(a){this.nodeType===1&&this.insertBefore(a,this.firstChild)})},before:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,!1,function(a){this.parentNode.insertBefore(a,this)});if(arguments.length){var a=f.clean(arguments);a.push.apply(a,this.toArray());return this.pushStack(a,"before",arguments)}},after:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,!1,function(a){this.parentNode.insertBefore(a,this.nextSibling)});if(arguments.length){var a=this.pushStack(this,"after",arguments);a.push.apply(a,f.clean(arguments));return a}},remove:function(a,b){for(var c=0,d;(d=this[c])!=null;c++)if(!a||f.filter(a,[d]).length)!b&&d.nodeType===1&&(f.cleanData(d.getElementsByTagName("*")),f.cleanData([d])),d.parentNode&&d.parentNode.removeChild(d);return this},empty:function()
+{for(var a=0,b;(b=this[a])!=null;a++){b.nodeType===1&&f.cleanData(b.getElementsByTagName("*"));while(b.firstChild)b.removeChild(b.firstChild)}return this},clone:function(a,b){a=a==null?!1:a,b=b==null?a:b;return this.map(function(){return f.clone(this,a,b)})},html:function(a){if(a===b)return this[0]&&this[0].nodeType===1?this[0].innerHTML.replace(W,""):null;if(typeof a=="string"&&!ba.test(a)&&(f.support.leadingWhitespace||!X.test(a))&&!bg[(Z.exec(a)||["",""])[1].toLowerCase()]){a=a.replace(Y,"<$1></$2>");try{for(var c=0,d=this.length;c<d;c++)this[c].nodeType===1&&(f.cleanData(this[c].getElementsByTagName("*")),this[c].innerHTML=a)}catch(e){this.empty().append(a)}}else f.isFunction(a)?this.each(function(b){var c=f(this);c.html(a.call(this,b,c.html()))}):this.empty().append(a);return this},replaceWith:function(a){if(this[0]&&this[0].parentNode){if(f.isFunction(a))return this.each(function(b){var c=f(this),d=c.html();c.replaceWith(a.call(this,b,d))});typeof a!="string"&&(a=f(a).detach()
 );return this.each(function(){var b=this.nextSibling,c=this.parentNode;f(this).remove(),b?f(b).before(a):f(c).append(a)})}return this.length?this.pushStack(f(f.isFunction(a)?a():a),"replaceWith",a):this},detach:function(a){return this.remove(a,!0)},domManip:function(a,c,d){var e,g,h,i,j=a[0],k=[];if(!f.support.checkClone&&arguments.length===3&&typeof j=="string"&&bd.test(j))return this.each(function(){f(this).domManip(a,c,d,!0)});if(f.isFunction(j))return this.each(function(e){var g=f(this);a[0]=j.call(this,e,c?g.html():b),g.domManip(a,c,d)});if(this[0]){i=j&&j.parentNode,f.support.parentNode&&i&&i.nodeType===11&&i.childNodes.length===this.length?e={fragment:i}:e=f.buildFragment(a,this,k),h=e.fragment,h.childNodes.length===1?g=h=h.firstChild:g=h.firstChild;if(g){c=c&&f.nodeName(g,"tr");for(var l=0,m=this.length,n=m-1;l<m;l++)d.call(c?bi(this[l],g):this[l],e.cacheable||m>1&&l<n?f.clone(h,!0,!0):h)}k.length&&f.each(k,bp)}return this}}),f.buildFragment=function(a,b,d){var e,g,h,i,j=a[0
 ];b&&b[0]&&(i=b[0].ownerDocument||b[0]),i.createDocumentFragment||(i=c),a.length===1&&typeof j=="string"&&j.length<512&&i===c&&j.charAt(0)==="<"&&!bb.test(j)&&(f.support.checkClone||!bd.test(j))&&(f.support.html5Clone||!bc.test(j))&&(g=!0,h=f.fragments[j],h&&h!==1&&(e=h)),e||(e=i.createDocumentFragment(),f.clean(a,i,e,d)),g&&(f.fragments[j]=h?e:1);return{fragment:e,cacheable:g}},f.fragments={},f.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(a,b){f.fn[a]=function(c){var d=[],e=f(c),g=this.length===1&&this[0].parentNode;if(g&&g.nodeType===11&&g.childNodes.length===1&&e.length===1){e[b](this[0]);return this}for(var h=0,i=e.length;h<i;h++){var j=(h>0?this.clone(!0):this).get();f(e[h])[b](j),d=d.concat(j)}return this.pushStack(d,a,e.selector)}}),f.extend({clone:function(a,b,c){var d,e,g,h=f.support.html5Clone||!bc.test("<"+a.nodeName)?a.cloneNode(!0):bo(a);if((!f.support.noCloneEvent||!f.support.noCloneChecked)&&(
 a.nodeType===1||a.nodeType===11)&&!f.isXMLDoc(a)){bk(a,h),d=bl(a),e=bl(h);for(g=0;d[g];++g)e[g]&&bk(d[g],e[g])}if(b){bj(a,h);if(c){d=bl(a),e=bl(h);for(g=0;d[g];++g)bj(d[g],e[g])}}d=e=null;return h},clean:function(a,b,d,e){var g;b=b||c,typeof b.createElement=="undefined"&&(b=b.ownerDocument||b[0]&&b[0].ownerDocument||c);var h=[],i;for(var j=0,k;(k=a[j])!=null;j++){typeof k=="number"&&(k+="");if(!k)continue;if(typeof k=="string")if(!_.test(k))k=b.createTextNode(k);else{k=k.replace(Y,"<$1></$2>");var l=(Z.exec(k)||["",""])[1].toLowerCase(),m=bg[l]||bg._default,n=m[0],o=b.createElement("div");b===c?bh.appendChild(o):U(b).appendChild(o),o.innerHTML=m[1]+k+m[2];while(n--)o=o.lastChild;if(!f.support.tbody){var p=$.test(k),q=l==="table"&&!p?o.firstChild&&o.firstChild.childNodes:m[1]==="<table>"&&!p?o.childNodes:[];for(i=q.length-1;i>=0;--i)f.nodeName(q[i],"tbody")&&!q[i].childNodes.length&&q[i].parentNode.removeChild(q[i])}!f.support.leadingWhitespace&&X.test(k)&&o.insertBefore(b.createText
 Node(X.exec(k)[0]),o.firstChild),k=o.childNodes}var r;if(!f.support.appendChecked)if(k[0]&&typeof (r=k.length)=="number")for(i=0;i<r;i++)bn(k[i]);else bn(k);k.nodeType?h.push(k):h=f.merge(h,k)}if(d){g=function(a){return!a.type||be.test(a.type)};for(j=0;h[j];j++)if(e&&f.nodeName(h[j],"script")&&(!h[j].type||h[j].type.toLowerCase()==="text/javascript"))e.push(h[j].parentNode?h[j].parentNode.removeChild(h[j]):h[j]);else{if(h[j].nodeType===1){var s=f.grep(h[j].getElementsByTagName("script"),g);h.splice.apply(h,[j+1,0].concat(s))}d.appendChild(h[j])}}return h},cleanData:function(a){var b,c,d=f.cache,e=f.event.special,g=f.support.deleteExpando;for(var h=0,i;(i=a[h])!=null;h++){if(i.nodeName&&f.noData[i.nodeName.toLowerCase()])continue;c=i[f.expando];if(c){b=d[c];if(b&&b.events){for(var j in b.events)e[j]?f.event.remove(i,j):f.removeEvent(i,j,b.handle);b.handle&&(b.handle.elem=null)}g?delete i[f.expando]:i.removeAttribute&&i.removeAttribute(f.expando),delete d[c]}}}});var bq=/alpha\([^)]*\
 )/i,br=/opacity=([^)]*)/,bs=/([A-Z]|^ms)/g,bt=/^-?\d+(?:px)?$/i,bu=/^-?\d/,bv=/^([\-+])=([\-+.\de]+)/,bw={position:"absolute",visibility:"hidden",display:"block"},bx=["Left","Right"],by=["Top","Bottom"],bz,bA,bB;f.fn.css=function(a,c){if(arguments.length===2&&c===b)return this;return f.access(this,a,c,!0,function(a,c,d){return d!==b?f.style(a,c,d):f.css(a,c)})},f.extend({cssHooks:{opacity:{get:function(a,b){if(b){var c=bz(a,"opacity","opacity");return c===""?"1":c}return a.style.opacity}}},cssNumber:{fillOpacity:!0,fontWeight:!0,lineHeight:!0,opacity:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{"float":f.support.cssFloat?"cssFloat":"styleFloat"},style:function(a,c,d,e){if(!!a&&a.nodeType!==3&&a.nodeType!==8&&!!a.style){var g,h,i=f.camelCase(c),j=a.style,k=f.cssHooks[i];c=f.cssProps[i]||i;if(d===b){if(k&&"get"in k&&(g=k.get(a,!1,e))!==b)return g;return j[c]}h=typeof d,h==="string"&&(g=bv.exec(d))&&(d=+(g[1]+1)*+g[2]+parseFloat(f.css(a,c)),h="number");if(d==null||h==="number"&
 &isNaN(d))return;h==="number"&&!f.cssNumber[i]&&(d+="px");if(!k||!("set"in k)||(d=k.set(a,d))!==b)try{j[c]=d}catch(l){}}},css:function(a,c,d){var e,g;c=f.camelCase(c),g=f.cssHooks[c],c=f.cssProps[c]||c,c==="cssFloat"&&(c="float");if(g&&"get"in g&&(e=g.get(a,!0,d))!==b)return e;if(bz)return bz(a,c)},swap:function(a,b,c){var d={};for(var e in b)d[e]=a.style[e],a.style[e]=b[e];c.call(a);for(e in b)a.style[e]=d[e]}}),f.curCSS=f.css,f.each(["height","width"],function(a,b){f.cssHooks[b]={get:function(a,c,d){var e;if(c){if(a.offsetWidth!==0)return bC(a,b,d);f.swap(a,bw,function(){e=bC(a,b,d)});return e}},set:function(a,b){if(!bt.test(b))return b;b=parseFloat(b);if(b>=0)return b+"px"}}}),f.support.opacity||(f.cssHooks.opacity={get:function(a,b){return br.test((b&&a.currentStyle?a.currentStyle.filter:a.style.filter)||"")?parseFloat(RegExp.$1)/100+"":b?"1":""},set:function(a,b){var c=a.style,d=a.currentStyle,e=f.isNumeric(b)?"alpha(opacity="+b*100+")":"",g=d&&d.filter||c.filter||"";c.zoom=1;i
 f(b>=1&&f.trim(g.replace(bq,""))===""){c.removeAttribute("filter");if(d&&!d.filter)return}c.filter=bq.test(g)?g.replace(bq,e):g+" "+e}}),f(function(){f.support.reliableMarginRight||(f.cssHooks.marginRight={get:function(a,b){var c;f.swap(a,{display:"inline-block"},function(){b?c=bz(a,"margin-right","marginRight"):c=a.style.marginRight});return c}})}),c.defaultView&&c.defaultView.getComputedStyle&&(bA=function(a,b){var c,d,e;b=b.replace(bs,"-$1").toLowerCase(),(d=a.ownerDocument.defaultView)&&(e=d.getComputedStyle(a,null))&&(c=e.getPropertyValue(b),c===""&&!f.contains(a.ownerDocument.documentElement,a)&&(c=f.style(a,b)));return c}),c.documentElement.currentStyle&&(bB=function(a,b){var c,d,e,f=a.currentStyle&&a.currentStyle[b],g=a.style;f===null&&g&&(e=g[b])&&(f=e),!bt.test(f)&&bu.test(f)&&(c=g.left,d=a.runtimeStyle&&a.runtimeStyle.left,d&&(a.runtimeStyle.left=a.currentStyle.left),g.left=b==="fontSize"?"1em":f||0,f=g.pixelLeft+"px",g.left=c,d&&(a.runtimeStyle.left=d));return f===""?"au
 to":f}),bz=bA||bB,f.expr&&f.expr.filters&&(f.expr.filters.hidden=function(a){var b=a.offsetWidth,c=a.offsetHeight;return b===0&&c===0||!f.support.reliableHiddenOffsets&&(a.style&&a.style.display||f.css(a,"display"))==="none"},f.expr.filters.visible=function(a){return!f.expr.filters.hidden(a)});var bD=/%20/g,bE=/\[\]$/,bF=/\r?\n/g,bG=/#.*$/,bH=/^(.*?):[ \t]*([^\r\n]*)\r?$/mg,bI=/^(?:color|date|datetime|datetime-local|email|hidden|month|number|password|range|search|tel|text|time|url|week)$/i,bJ=/^(?:about|app|app\-storage|.+\-extension|file|res|widget):$/,bK=/^(?:GET|HEAD)$/,bL=/^\/\//,bM=/\?/,bN=/<script\b[^<]*(?:(?!<\/script>)<[^<]*)*<\/script>/gi,bO=/^(?:select|textarea)/i,bP=/\s+/,bQ=/([?&])_=[^&]*/,bR=/^([\w\+\.\-]+:)(?:\/\/([^\/?#:]*)(?::(\d+))?)?/,bS=f.fn.load,bT={},bU={},bV,bW,bX=["*/"]+["*"];try{bV=e.href}catch(bY){bV=c.createElement("a"),bV.href="",bV=bV.href}bW=bR.exec(bV.toLowerCase())||[],f.fn.extend({load:function(a,c,d){if(typeof a!="string"&&bS)return bS.apply(this,arg
 uments);if(!this.length)return this;var e=a.indexOf(" ");if(e>=0){var g=a.slice(e,a.length);a=a.slice(0,e)}var h="GET";c&&(f.isFunction(c)?(d=c,c=b):typeof c=="object"&&(c=f.param(c,f.ajaxSettings.traditional),h="POST"));var i=this;f.ajax({url:a,type:h,dataType:"html",data:c,complete:function(a,b,c){c=a.responseText,a.isResolved()&&(a.done(function(a){c=a}),i.html(g?f("<div>").append(c.replace(bN,"")).find(g):c)),d&&i.each(d,[c,b,a])}});return this},serialize:function(){return f.param(this.serializeArray())},serializeArray:function(){return this.map(function(){return this.elements?f.makeArray(this.elements):this}).filter(function(){return this.name&&!this.disabled&&(this.checked||bO.test(this.nodeName)||bI.test(this.type))}).map(function(a,b){var c=f(this).val();return c==null?null:f.isArray(c)?f.map(c,function(a,c){return{name:b.name,value:a.replace(bF,"\r\n")}}):{name:b.name,value:c.replace(bF,"\r\n")}}).get()}}),f.each("ajaxStart ajaxStop ajaxComplete ajaxError ajaxSuccess ajaxSe
 nd".split(" "),function(a,b){f.fn[b]=function(a){return this.on(b,a)}}),f.each(["get","post"],function(a,c){f[c]=function(a,d,e,g){f.isFunction(d)&&(g=g||e,e=d,d=b);return f.ajax({type:c,url:a,data:d,success:e,dataType:g})}}),f.extend({getScript:function(a,c){return f.get(a,b,c,"script")},getJSON:function(a,b,c){return f.get(a,b,c,"json")},ajaxSetup:function(a,b){b?b_(a,f.ajaxSettings):(b=a,a=f.ajaxSettings),b_(a,b);return a},ajaxSettings:{url:bV,isLocal:bJ.test(bW[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","*":bX},contents:{xml:/xml/,html:/html/,json:/json/},responseFields:{xml:"responseXML",text:"responseText"},converters:{"* text":a.String,"text html":!0,"text json":f.parseJSON,"text xml":f.parseXML},flatOptions:{context:!0,url:!0}},ajaxPrefilter:bZ(bT),ajaxTransport:bZ(bU),ajax:function(a,c){function w(a,c,l,m)
 {if(s!==2){s=2,q&&clearTimeout(q),p=b,n=m||"",v.readyState=a>0?4:0;var o,r,u,w=c,x=l?cb(d,v,l):b,y,z;if(a>=200&&a<300||a===304){if(d.ifModified){if(y=v.getResponseHeader("Last-Modified"))f.lastModified[k]=y;if(z=v.getResponseHeader("Etag"))f.etag[k]=z}if(a===304)w="notmodified",o=!0;else try{r=cc(d,x),w="success",o=!0}catch(A){w="parsererror",u=A}}else{u=w;if(!w||a)w="error",a<0&&(a=0)}v.status=a,v.statusText=""+(c||w),o?h.resolveWith(e,[r,w,v]):h.rejectWith(e,[v,w,u]),v.statusCode(j),j=b,t&&g.trigger("ajax"+(o?"Success":"Error"),[v,d,o?r:u]),i.fireWith(e,[v,w]),t&&(g.trigger("ajaxComplete",[v,d]),--f.active||f.event.trigger("ajaxStop"))}}typeof a=="object"&&(c=a,a=b),c=c||{};var d=f.ajaxSetup({},c),e=d.context||d,g=e!==d&&(e.nodeType||e instanceof f)?f(e):f.event,h=f.Deferred(),i=f.Callbacks("once memory"),j=d.statusCode||{},k,l={},m={},n,o,p,q,r,s=0,t,u,v={readyState:0,setRequestHeader:function(a,b){if(!s){var c=a.toLowerCase();a=m[c]=m[c]||a,l[a]=b}return this},getAllResponseHead
 ers:function(){return s===2?n:null},getResponseHeader:function(a){var c;if(s===2){if(!o){o={};while(c=bH.exec(n))o[c[1].toLowerCase()]=c[2]}c=o[a.toLowerCase()]}return c===b?null:c},overrideMimeType:function(a){s||(d.mimeType=a);return this},abort:function(a){a=a||"abort",p&&p.abort(a),w(0,a);return this}};h.promise(v),v.success=v.done,v.error=v.fail,v.complete=i.add,v.statusCode=function(a){if(a){var b;if(s<2)for(b in a)j[b]=[j[b],a[b]];else b=a[v.status],v.then(b,b)}return this},d.url=((a||d.url)+"").replace(bG,"").replace(bL,bW[1]+"//"),d.dataTypes=f.trim(d.dataType||"*").toLowerCase().split(bP),d.crossDomain==null&&(r=bR.exec(d.url.toLowerCase()),d.crossDomain=!(!r||r[1]==bW[1]&&r[2]==bW[2]&&(r[3]||(r[1]==="http:"?80:443))==(bW[3]||(bW[1]==="http:"?80:443)))),d.data&&d.processData&&typeof d.data!="string"&&(d.data=f.param(d.data,d.traditional)),b$(bT,d,c,v);if(s===2)return!1;t=d.global,d.type=d.type.toUpperCase(),d.hasContent=!bK.test(d.type),t&&f.active++===0&&f.event.trigger("
 ajaxStart");if(!d.hasContent){d.data&&(d.url+=(bM.test(d.url)?"&":"?")+d.data,delete d.data),k=d.url;if(d.cache===!1){var x=f.now(),y=d.url.replace(bQ,"$1_="+x);d.url=y+(y===d.url?(bM.test(d.url)?"&":"?")+"_="+x:"")}}(d.data&&d.hasContent&&d.contentType!==!1||c.contentType)&&v.setRequestHeader("Content-Type",d.contentType),d.ifModified&&(k=k||d.url,f.lastModified[k]&&v.setRequestHeader("If-Modified-Since",f.lastModified[k]),f.etag[k]&&v.setRequestHeader("If-None-Match",f.etag[k])),v.setRequestHeader("Accept",d.dataTypes[0]&&d.accepts[d.dataTypes[0]]?d.accepts[d.dataTypes[0]]+(d.dataTypes[0]!=="*"?", "+bX+"; q=0.01":""):d.accepts["*"]);for(u in d.headers)v.setRequestHeader(u,d.headers[u]);if(d.beforeSend&&(d.beforeSend.call(e,v,d)===!1||s===2)){v.abort();return!1}for(u in{success:1,error:1,complete:1})v[u](d[u]);p=b$(bU,d,c,v);if(!p)w(-1,"No Transport");else{v.readyState=1,t&&g.trigger("ajaxSend",[v,d]),d.async&&d.timeout>0&&(q=setTimeout(function(){v.abort("timeout")},d.timeout));tr
 y{s=1,p.send(l,w)}catch(z){if(s<2)w(-1,z);else throw z}}return v},param:function(a,c){var d=[],e=function(a,b){b=f.isFunction(b)?b():b,d[d.length]=encodeURIComponent(a)+"="+encodeURIComponent(b)};c===b&&(c=f.ajaxSettings.traditional);if(f.isArray(a)||a.jquery&&!f.isPlainObject(a))f.each(a,function(){e(this.name,this.value)});else for(var g in a)ca(g,a[g],c,e);return d.join("&").replace(bD,"+")}}),f.extend({active:0,lastModified:{},etag:{}});var cd=f.now(),ce=/(\=)\?(&|$)|\?\?/i;f.ajaxSetup({jsonp:"callback",jsonpCallback:function(){return f.expando+"_"+cd++}}),f.ajaxPrefilter("json jsonp",function(b,c,d){var e=b.contentType==="application/x-www-form-urlencoded"&&typeof b.data=="string";if(b.dataTypes[0]==="jsonp"||b.jsonp!==!1&&(ce.test(b.url)||e&&ce.test(b.data))){var g,h=b.jsonpCallback=f.isFunction(b.jsonpCallback)?b.jsonpCallback():b.jsonpCallback,i=a[h],j=b.url,k=b.data,l="$1"+h+"$2";b.jsonp!==!1&&(j=j.replace(ce,l),b.url===j&&(e&&(k=k.replace(ce,l)),b.data===k&&(j+=(/\?/.test(
 j)?"&":"?")+b.jsonp+"="+h))),b.url=j,b.data=k,a[h]=function(a){g=[a]},d.always(function(){a[h]=i,g&&f.isFunction(i)&&a[h](g[0])}),b.converters["script json"]=function(){g||f.error(h+" was not called");return g[0]},b.dataTypes[0]="json";return"script"}}),f.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/javascript|ecmascript/},converters:{"text script":function(a){f.globalEval(a);return a}}}),f.ajaxPrefilter("script",function(a){a.cache===b&&(a.cache=!1),a.crossDomain&&(a.type="GET",a.global=!1)}),f.ajaxTransport("script",function(a){if(a.crossDomain){var d,e=c.head||c.getElementsByTagName("head")[0]||c.documentElement;return{send:function(f,g){d=c.createElement("script"),d.async="async",a.scriptCharset&&(d.charset=a.scriptCharset),d.src=a.url,d.onload=d.onreadystatechange=function(a,c){if(c||!d.readyState||/loaded|complete/.test(d.readyState))d.onload=d.onreadystatechange=null,e&&d.parentNode&&
 e.removeChild(d),d=b,c||g(200,"success")},e.insertBefore(d,e.firstChild)},abort:function(){d&&d.onload(0,1)}}}});var cf=a.ActiveXObject?function(){for(var a in ch)ch[a](0,1)}:!1,cg=0,ch;f.ajaxSettings.xhr=a.ActiveXObject?function(){return!this.isLocal&&ci()||cj()}:ci,function(a){f.extend(f.support,{ajax:!!a,cors:!!a&&"withCredentials"in a})}(f.ajaxSettings.xhr()),f.support.ajax&&f.ajaxTransport(function(c){if(!c.crossDomain||f.support.cors){var d;return{send:function(e,g){var h=c.xhr(),i,j;c.username?h.open(c.type,c.url,c.async,c.username,c.password):h.open(c.type,c.url,c.async);if(c.xhrFields)for(j in c.xhrFields)h[j]=c.xhrFields[j];c.mimeType&&h.overrideMimeType&&h.overrideMimeType(c.mimeType),!c.crossDomain&&!e["X-Requested-With"]&&(e["X-Requested-With"]="XMLHttpRequest");try{for(j in e)h.setRequestHeader(j,e[j])}catch(k){}h.send(c.hasContent&&c.data||null),d=function(a,e){var j,k,l,m,n;try{if(d&&(e||h.readyState===4)){d=b,i&&(h.onreadystatechange=f.noop,cf&&delete ch[i]);if(e)h.
 readyState!==4&&h.abort();else{j=h.status,l=h.getAllResponseHeaders(),m={},n=h.responseXML,n&&n.documentElement&&(m.xml=n),m.text=h.responseText;try{k=h.statusText}catch(o){k=""}!j&&c.isLocal&&!c.crossDomain?j=m.text?200:404:j===1223&&(j=204)}}}catch(p){e||g(-1,p)}m&&g(j,k,m,l)},!c.async||h.readyState===4?d():(i=++cg,cf&&(ch||(ch={},f(a).unload(cf)),ch[i]=d),h.onreadystatechange=d)},abort:function(){d&&d(0,1)}}}});var ck={},cl,cm,cn=/^(?:toggle|show|hide)$/,co=/^([+\-]=)?([\d+.\-]+)([a-z%]*)$/i,cp,cq=[["height","marginTop","marginBottom","paddingTop","paddingBottom"],["width","marginLeft","marginRight","paddingLeft","paddingRight"],["opacity"]],cr;f.fn.extend({show:function(a,b,c){var d,e;if(a||a===0)return this.animate(cu("show",3),a,b,c);for(var g=0,h=this.length;g<h;g++)d=this[g],d.style&&(e=d.style.display,!f._data(d,"olddisplay")&&e==="none"&&(e=d.style.display=""),e===""&&f.css(d,"display")==="none"&&f._data(d,"olddisplay",cv(d.nodeName)));for(g=0;g<h;g++){d=this[g];if(d.style
 ){e=d.style.display;if(e===""||e==="none")d.style.display=f._data(d,"olddisplay")||""}}return this},hide:function(a,b,c){if(a||a===0)return this.animate(cu("hide",3),a,b,c);var d,e,g=0,h=this.length;for(;g<h;g++)d=this[g],d.style&&(e=f.css(d,"display"),e!=="none"&&!f._data(d,"olddisplay")&&f._data(d,"olddisplay",e));for(g=0;g<h;g++)this[g].style&&(this[g].style.display="none");return this},_toggle:f.fn.toggle,toggle:function(a,b,c){var d=typeof a=="boolean";f.isFunction(a)&&f.isFunction(b)?this._toggle.apply(this,arguments):a==null||d?this.each(function(){var b=d?a:f(this).is(":hidden");f(this)[b?"show":"hide"]()}):this.animate(cu("toggle",3),a,b,c);return this},fadeTo:function(a,b,c,d){return this.filter(":hidden").css("opacity",0).show().end().animate({opacity:b},a,c,d)},animate:function(a,b,c,d){function g(){e.queue===!1&&f._mark(this);var b=f.extend({},e),c=this.nodeType===1,d=c&&f(this).is(":hidden"),g,h,i,j,k,l,m,n,o;b.animatedProperties={};for(i in a){g=f.camelCase(i),i!==g&&
 (a[g]=a[i],delete a[i]),h=a[g],f.isArray(h)?(b.animatedProperties[g]=h[1],h=a[g]=h[0]):b.animatedProperties[g]=b.specialEasing&&b.specialEasing[g]||b.easing||"swing";if(h==="hide"&&d||h==="show"&&!d)return b.complete.call(this);c&&(g==="height"||g==="width")&&(b.overflow=[this.style.overflow,this.style.overflowX,this.style.overflowY],f.css(this,"display")==="inline"&&f.css(this,"float")==="none"&&(!f.support.inlineBlockNeedsLayout||cv(this.nodeName)==="inline"?this.style.display="inline-block":this.style.zoom=1))}b.overflow!=null&&(this.style.overflow="hidden");for(i in a)j=new f.fx(this,b,i),h=a[i],cn.test(h)?(o=f._data(this,"toggle"+i)||(h==="toggle"?d?"show":"hide":0),o?(f._data(this,"toggle"+i,o==="show"?"hide":"show"),j[o]()):j[h]()):(k=co.exec(h),l=j.cur(),k?(m=parseFloat(k[2]),n=k[3]||(f.cssNumber[i]?"":"px"),n!=="px"&&(f.style(this,i,(m||1)+n),l=(m||1)/j.cur()*l,f.style(this,i,l+n)),k[1]&&(m=(k[1]==="-="?-1:1)*m+l),j.custom(l,m,n)):j.custom(l,h,""));return!0}var e=f.speed(b,
 c,d);if(f.isEmptyObject(a))return this.each(e.complete,[!1]);a=f.extend({},a);return e.queue===!1?this.each(g):this.queue(e.queue,g)},stop:function(a,c,d){typeof a!="string"&&(d=c,c=a,a=b),c&&a!==!1&&this.queue(a||"fx",[]);return this.each(function(){function h(a,b,c){var e=b[c];f.removeData(a,c,!0),e.stop(d)}var b,c=!1,e=f.timers,g=f._data(this);d||f._unmark(!0,this);if(a==null)for(b in g)g[b]&&g[b].stop&&b.indexOf(".run")===b.length-4&&h(this,g,b);else g[b=a+".run"]&&g[b].stop&&h(this,g,b);for(b=e.length;b--;)e[b].elem===this&&(a==null||e[b].queue===a)&&(d?e[b](!0):e[b].saveState(),c=!0,e.splice(b,1));(!d||!c)&&f.dequeue(this,a)})}}),f.each({slideDown:cu("show",1),slideUp:cu("hide",1),slideToggle:cu("toggle",1),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"},fadeToggle:{opacity:"toggle"}},function(a,b){f.fn[a]=function(a,c,d){return this.animate(b,a,c,d)}}),f.extend({speed:function(a,b,c){var d=a&&typeof a=="object"?f.extend({},a):{complete:c||!c&&b||f.isFunction(a)&&a,duration:a
 ,easing:c&&b||b&&!f.isFunction(b)&&b};d.duration=f.fx.off?0:typeof d.duration=="number"?d.duration:d.duration in f.fx.speeds?f.fx.speeds[d.duration]:f.fx.speeds._default;if(d.queue==null||d.queue===!0)d.queue="fx";d.old=d.complete,d.complete=function(a){f.isFunction(d.old)&&d.old.call(this),d.queue?f.dequeue(this,d.queue):a!==!1&&f._unmark(this)};return d},easing:{linear:function(a,b,c,d){return c+d*a},swing:function(a,b,c,d){return(-Math.cos(a*Math.PI)/2+.5)*d+c}},timers:[],fx:function(a,b,c){this.options=b,this.elem=a,this.prop=c,b.orig=b.orig||{}}}),f.fx.prototype={update:function(){this.options.step&&this.options.step.call(this.elem,this.now,this),(f.fx.step[this.prop]||f.fx.step._default)(this)},cur:function(){if(this.elem[this.prop]!=null&&(!this.elem.style||this.elem.style[this.prop]==null))return this.elem[this.prop];var a,b=f.css(this.elem,this.prop);return isNaN(a=parseFloat(b))?!b||b==="auto"?0:b:a},custom:function(a,c,d){function h(a){return e.step(a)}var e=this,g=f.fx;t
 his.startTime=cr||cs(),this.end=c,this.now=this.start=a,this.pos=this.state=0,this.unit=d||this.unit||(f.cssNumber[this.prop]?"":"px"),h.queue=this.options.queue,h.elem=this.elem,h.saveState=function(){e.options.hide&&f._data(e.elem,"fxshow"+e.prop)===b&&f._data(e.elem,"fxshow"+e.prop,e.start)},h()&&f.timers.push(h)&&!cp&&(cp=setInterval(g.tick,g.interval))},show:function(){var a=f._data(this.elem,"fxshow"+this.prop);this.options.orig[this.prop]=a||f.style(this.elem,this.prop),this.options.show=!0,a!==b?this.custom(this.cur(),a):this.custom(this.prop==="width"||this.prop==="height"?1:0,this.cur()),f(this.elem).show()},hide:function(){this.options.orig[this.prop]=f._data(this.elem,"fxshow"+this.prop)||f.style(this.elem,this.prop),this.options.hide=!0,this.custom(this.cur(),0)},step:function(a){var b,c,d,e=cr||cs(),g=!0,h=this.elem,i=this.options;if(a||e>=i.duration+this.startTime){this.now=this.end,this.pos=this.state=1,this.update(),i.animatedProperties[this.prop]=!0;for(b in i.anim
 atedProperties)i.animatedProperties[b]!==!0&&(g=!1);if(g){i.overflow!=null&&!f.support.shrinkWrapBlocks&&f.each(["","X","Y"],function(a,b){h.style["overflow"+b]=i.overflow[a]}),i.hide&&f(h).hide();if(i.hide||i.show)for(b in i.animatedProperties)f.style(h,b,i.orig[b]),f.removeData(h,"fxshow"+b,!0),f.removeData(h,"toggle"+b,!0);d=i.complete,d&&(i.complete=!1,d.call(h))}return!1}i.duration==Infinity?this.now=e:(c=e-this.startTime,this.state=c/i.duration,this.pos=f.easing[i.animatedProperties[this.prop]](this.state,c,0,1,i.duration),this.now=this.start+(this.end-this.start)*this.pos),this.update();return!0}},f.extend(f.fx,{tick:function(){var a,b=f.timers,c=0;for(;c<b.length;c++)a=b[c],!a()&&b[c]===a&&b.splice(c--,1);b.length||f.fx.stop()},interval:13,stop:function(){clearInterval(cp),cp=null},speeds:{slow:600,fast:200,_default:400},step:{opacity:function(a){f.style(a.elem,"opacity",a.now)},_default:function(a){a.elem.style&&a.elem.style[a.prop]!=null?a.elem.style[a.prop]=a.now+a.unit:a
 .elem[a.prop]=a.now}}}),f.each(["width","height"],function(a,b){f.fx.step[b]=function(a){f.style(a.elem,b,Math.max(0,a.now)+a.unit)}}),f.expr&&f.expr.filters&&(f.expr.filters.animated=function(a){return f.grep(f.timers,function(b){return a===b.elem}).length});var cw=/^t(?:able|d|h)$/i,cx=/^(?:body|html)$/i;"getBoundingClientRect"in c.documentElement?f.fn.offset=function(a){var b=this[0],c;if(a)return this.each(function(b){f.offset.setOffset(this,a,b)});if(!b||!b.ownerDocument)return null;if(b===b.ownerDocument.body)return f.offset.bodyOffset(b);try{c=b.getBoundingClientRect()}catch(d){}var e=b.ownerDocument,g=e.documentElement;if(!c||!f.contains(g,b))return c?{top:c.top,left:c.left}:{top:0,left:0};var h=e.body,i=cy(e),j=g.clientTop||h.clientTop||0,k=g.clientLeft||h.clientLeft||0,l=i.pageYOffset||f.support.boxModel&&g.scrollTop||h.scrollTop,m=i.pageXOffset||f.support.boxModel&&g.scrollLeft||h.scrollLeft,n=c.top+l-j,o=c.left+m-k;return{top:n,left:o}}:f.fn.offset=function(a){var b=this
 [0];if(a)return this.each(function(b){f.offset.setOffset(this,a,b)});if(!b||!b.ownerDocument)return null;if(b===b.ownerDocument.body)return f.offset.bodyOffset(b);var c,d=b.offsetParent,e=b,g=b.ownerDocument,h=g.documentElement,i=g.body,j=g.defaultView,k=j?j.getComputedStyle(b,null):b.currentStyle,l=b.offsetTop,m=b.offsetLeft;while((b=b.parentNode)&&b!==i&&b!==h){if(f.support.fixedPosition&&k.position==="fixed")break;c=j?j.getComputedStyle(b,null):b.currentStyle,l-=b.scrollTop,m-=b.scrollLeft,b===d&&(l+=b.offsetTop,m+=b.offsetLeft,f.support.doesNotAddBorder&&(!f.support.doesAddBorderForTableAndCells||!cw.test(b.nodeName))&&(l+=parseFloat(c.borderTopWidth)||0,m+=parseFloat(c.borderLeftWidth)||0),e=d,d=b.offsetParent),f.support.subtractsBorderForOverflowNotVisible&&c.overflow!=="visible"&&(l+=parseFloat(c.borderTopWidth)||0,m+=parseFloat(c.borderLeftWidth)||0),k=c}if(k.position==="relative"||k.position==="static")l+=i.offsetTop,m+=i.offsetLeft;f.support.fixedPosition&&k.position==="fi
 xed"&&(l+=Math.max(h.scrollTop,i.scrollTop),m+=Math.max(h.scrollLeft,i.scrollLeft));return{top:l,left:m}},f.offset={bodyOffset:function(a){var b=a.offsetTop,c=a.offsetLeft;f.support.doesNotIncludeMarginInBodyOffset&&(b+=parseFloat(f.css(a,"marginTop"))||0,c+=parseFloat(f.css(a,"marginLeft"))||0);return{top:b,left:c}},setOffset:function(a,b,c){var d=f.css(a,"position");d==="static"&&(a.style.position="relative");var e=f(a),g=e.offset(),h=f.css(a,"top"),i=f.css(a,"left"),j=(d==="absolute"||d==="fixed")&&f.inArray("auto",[h,i])>-1,k={},l={},m,n;j?(l=e.position(),m=l.top,n=l.left):(m=parseFloat(h)||0,n=parseFloat(i)||0),f.isFunction(b)&&(b=b.call(a,c,g)),b.top!=null&&(k.top=b.top-g.top+m),b.left!=null&&(k.left=b.left-g.left+n),"using"in b?b.using.call(a,k):e.css(k)}},f.fn.extend({position:function(){if(!this[0])return null;var a=this[0],b=this.offsetParent(),c=this.offset(),d=cx.test(b[0].nodeName)?{top:0,left:0}:b.offset();c.top-=parseFloat(f.css(a,"marginTop"))||0,c.left-=parseFloat(f
 .css(a,"marginLeft"))||0,d.top+=parseFloat(f.css(b[0],"borderTopWidth"))||0,d.left+=parseFloat(f.css(b[0],"borderLeftWidth"))||0;return{top:c.top-d.top,left:c.left-d.left}},offsetParent:function(){return this.map(function(){var a=this.offsetParent||c.body;while(a&&!cx.test(a.nodeName)&&f.css(a,"position")==="static")a=a.offsetParent;return a})}}),f.each(["Left","Top"],function(a,c){var d="scroll"+c;f.fn[d]=function(c){var e,g;if(c===b){e=this[0];if(!e)return null;g=cy(e);return g?"pageXOffset"in g?g[a?"pageYOffset":"pageXOffset"]:f.support.boxModel&&g.document.documentElement[d]||g.document.body[d]:e[d]}return this.each(function(){g=cy(this),g?g.scrollTo(a?f(g).scrollLeft():c,a?c:f(g).scrollTop()):this[d]=c})}}),f.each(["Height","Width"],function(a,c){var d=c.toLowerCase();f.fn["inner"+c]=function(){var a=this[0];return a?a.style?parseFloat(f.css(a,d,"padding")):this[d]():null},f.fn["outer"+c]=function(a){var b=this[0];return b?b.style?parseFloat(f.css(b,d,a?"margin":"border")):this
 [d]():null},f.fn[d]=function(a){var e=this[0];if(!e)return a==null?null:this;if(f.isFunction(a))return this.each(function(b){var c=f(this);c[d](a.call(this,b,c[d]()))});if(f.isWindow(e)){var g=e.document.documentElement["client"+c],h=e.document.body;return e.document.compatMode==="CSS1Compat"&&g||h&&h["client"+c]||g}if(e.nodeType===9)return Math.max(e.documentElement["client"+c],e.body["scroll"+c],e.documentElement["scroll"+c],e.body["offset"+c],e.documentElement["offset"+c]);if(a===b){var i=f.css(e,d),j=parseFloat(i);return f.isNumeric(j)?j:i}return this.css(d,typeof a=="string"?a:a+"px")}}),a.jQuery=a.$=f,typeof define=="function"&&define.amd&&define.amd.jQuery&&define("jquery",[],function(){return f})})(window);
\ No newline at end of file
diff --git a/www/whimsy.svg b/www/whimsy.svg
new file mode 100644
index 0000000..af808b9
--- /dev/null
+++ b/www/whimsy.svg
@@ -0,0 +1,15 @@
+<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 120 84'>
+  <path fill='#0F0' d='M38,59c-2-86,73-42,73-42c0,0-35,3-36,13c-4,20-2,27-2,27z'/>
+  <path fill='#B7B' d='M38,59c-2-86,73-42,73-42c0,0-48-12-52,19c-3,21,0,21,0,21z'/>
+
+  <path fill='#F00' d='M57,54c-2-20-20-22-28-21c-14,2-22,38-19,44c-1,0,6-11,17-18c9-6,10,0,10,0z'/>
+
+  <path fill='#00F' d='M62,55c7-17,7-19,22-22c25-4,30,47,28,43c-24-29-32-17-32-16z'/>
+  <path fill='#B7B' d='M48,59c-18-37-38,18-38,18c-1,0,6-11,17-18c9-6,10,0,10,0zM71,61c16-42,40,15,41,15c-24-29-32-17-32-16z'/>
+
+  <path fill='#FA0' d='M27,75l-5-31l17,15l16-18l6,16l5-18l11,20l14-15l-6,15l1,15z'/>
+  <path fill='#B7B' d='M25,64h60l1,8h-59z'/>
+  <circle r='7' cx='10' cy='70' fill="#FF0" stroke="#FA0"/>
+  <circle r='7' cx='110' cy='74' fill="#FF0" stroke="#FA0"/>
+  <circle r='7' cx='110' cy='17' fill="#FF0" stroke="#FA0"/>
+</svg>