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={"&":"&",">":">","<":"<",'"':""","'":"'"},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 = {'&' => '&', '<' => '<', '>' => '>'}
+
+ private_sections =
+ Regexp.new('^([ \t]*)(<private>(?:\n|.)*?</private>)(\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! /(\(|<)(#{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||" ",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||" "))}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…</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?
" ":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?" ":""));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?" ":"")+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 "gpg --verify icla.txt.asc". 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 "gpg --recv-keys <pub-key>". 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 "svn status"
+ command. [The directory will not appear in the Work List if it is
+ empty.] If not, remove it manually using the "svn rm"
+ 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 "Full Name" 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 "notify PMC" 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 "file" 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 "-"
+ for "_", "0" for "o". 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 "<A HREF="mailto:wrong.email@company.com">wrong.email@company.com</A>"
+ to "Bounced Email< <A HREF="mailto:wrong.email@company.com">wrong.email@company.com</A>>".</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
+ "other" "junk" 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 "New Account" from the menu. The last ICLA should
+ appear in the "ASF New Account Request" form. In
+ "Comments" indicate "original committer" 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 "svn add". 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={"&":"&",">":">","<":"<",'"':""","'":"'"},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=" " />
+<glyph unicode="¥" 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=" " horiz-adv-x="650" />
+<glyph unicode=" " horiz-adv-x="1300" />
+<glyph unicode=" " horiz-adv-x="650" />
+<glyph unicode=" " horiz-adv-x="1300" />
+<glyph unicode=" " horiz-adv-x="433" />
+<glyph unicode=" " horiz-adv-x="325" />
+<glyph unicode=" " horiz-adv-x="216" />
+<glyph unicode=" " horiz-adv-x="216" />
+<glyph unicode=" " horiz-adv-x="162" />
+<glyph unicode=" " horiz-adv-x="260" />
+<glyph unicode=" " horiz-adv-x="72" />
+<glyph unicode=" " horiz-adv-x="260" />
+<glyph unicode=" " horiz-adv-x="325" />
+<glyph unicode="€" 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="₽" 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="−" 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="⌛" 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="◼" horiz-adv-x="500" d="M0 0z" />
+<glyph unicode="☁" 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="⛺" 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="✉" 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="✏" 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="" 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="" 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="" 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="" 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="" 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="" 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="" 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="" 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="" 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="" 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="" 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="" 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="" 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="" 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="" 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="" 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="" 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="" 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="" 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="" 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="" 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="" 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="" d="M1300 0h-538l-41 400h-242l-41 -400h-538l431 1200h209l-21 -300h162l-20 300h208zM515 800l-27 -300h224l-27 300h-170z" />
+<glyph unicode="" 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="" 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="" 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="" 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="" 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="" 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="" 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="" 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="" 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="" 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="" 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="" 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="" 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="" 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="" 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="" 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="" 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="" 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="" 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="" 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="" 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="" 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="" 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="" 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="" 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="" 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="" 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="" 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="" 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="" 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="" 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="" 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="" 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="" 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="" 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="" 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="" 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="" 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="" 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="" 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="" 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="" 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="" 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="" 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="" 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="" 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="" 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="" 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="" 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="" 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="" 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="" 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="" 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="" d="M885 900l-352 -353l352 -353l-197 -198l-552 552l552 550z" />
+<glyph unicode="" d="M1064 547l-551 -551l-198 198l353 353l-353 353l198 198z" />
+<glyph unicode="" 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="" 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="" 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="" 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="" 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="" 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="" 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="" 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="" 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="" 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="" 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="" 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="" 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="" 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="" 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="" 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="" 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="" 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="" 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="" 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="" 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="" 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="" 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="" 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="" 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="" 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="" 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="" 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="" 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="" d="M1100 411l-198 -199l-353 353l-353 -353l-197 199l551 551z" />
+<glyph unicode="" d="M1101 789l-550 -551l-551 551l198 199l353 -353l353 353z" />
+<glyph unicode="" 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="" 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="" 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="" 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="" 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="" 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="" 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="" 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="" 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="" 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="" 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="" 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="" 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="" 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="" 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="" 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="" 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="" 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="" 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="" 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="" 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="" 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="" 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="" 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="" 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="" 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="" 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="" 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="" 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="" 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="" 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="" 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="" 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="" 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="" 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="" 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="" 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="" 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="" 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="" 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="" 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="" 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="" 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="" 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="" 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="" 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="" 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="" 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="" 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="" 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="" 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="" 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="" 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="" 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="" 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="" d="M1200 103l-483 276l-314 -399v423h-399l1196 796v-1096zM483 424v-230l683 953z" />
+<glyph unicode="" 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="" 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="" 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="" 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="" 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="" 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="" 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="" 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="" 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="" 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="" 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="" 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="" 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="" 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="" 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="" 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="" 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="" 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="" 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="" 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="" 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="" 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="" 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="" 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="" 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="" 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="" 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="" 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="" 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="" 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="" 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="" 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="" 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="" 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="" 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="" 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="" 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="" 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="" 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="" 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="" 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="" 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="" 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="" 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="" 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="" 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="" 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="" 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="" 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="" 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="" 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="" 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="" 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="" 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="" 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="" 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="" 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="" 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="" 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="" 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="" 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="" 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="" 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="" 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="" 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="" 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="" 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="" 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="" 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="" 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="" 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="" 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="" 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="" 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="" d="M700 741v-182l-692 -323v221l413 193l-413 193v221zM1200 0h-800v200h800v-200z" />
+<glyph unicode="" 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="" 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="" 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="" 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="" 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="" 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="" 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="🔑" 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="🚪" 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>