diff --git a/.idea/.rakeTasks b/.idea/.rakeTasks new file mode 100644 index 000000000..6be95750b --- /dev/null +++ b/.idea/.rakeTasks @@ -0,0 +1,7 @@ + + diff --git a/.idea/484_P7_1-GUI.iml b/.idea/484_P7_1-GUI.iml new file mode 100644 index 000000000..8a1309f7c --- /dev/null +++ b/.idea/484_P7_1-GUI.iml @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/codeStyleSettings.xml b/.idea/codeStyleSettings.xml new file mode 100644 index 000000000..5555dd266 --- /dev/null +++ b/.idea/codeStyleSettings.xml @@ -0,0 +1,9 @@ + + + + + + \ No newline at end of file diff --git a/.idea/codeStyles/codeStyleConfig.xml b/.idea/codeStyles/codeStyleConfig.xml new file mode 100644 index 000000000..a55e7a179 --- /dev/null +++ b/.idea/codeStyles/codeStyleConfig.xml @@ -0,0 +1,5 @@ + + + + \ No newline at end of file diff --git a/.idea/compiler.xml b/.idea/compiler.xml new file mode 100644 index 000000000..8a013b99f --- /dev/null +++ b/.idea/compiler.xml @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/inspectionProfiles/Project_Default.xml b/.idea/inspectionProfiles/Project_Default.xml new file mode 100644 index 000000000..0bf1a782d --- /dev/null +++ b/.idea/inspectionProfiles/Project_Default.xml @@ -0,0 +1,10 @@ + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__com_google_code_findbugs_jsr305_1_3_9.xml b/.idea/libraries/Maven__com_google_code_findbugs_jsr305_1_3_9.xml new file mode 100644 index 000000000..0e668241f --- /dev/null +++ b/.idea/libraries/Maven__com_google_code_findbugs_jsr305_1_3_9.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__com_google_code_gson_gson_2_8_2.xml b/.idea/libraries/Maven__com_google_code_gson_gson_2_8_2.xml new file mode 100644 index 000000000..49c91bead --- /dev/null +++ b/.idea/libraries/Maven__com_google_code_gson_gson_2_8_2.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__com_google_errorprone_error_prone_annotations_2_1_3.xml b/.idea/libraries/Maven__com_google_errorprone_error_prone_annotations_2_1_3.xml new file mode 100644 index 000000000..2343a7f43 --- /dev/null +++ b/.idea/libraries/Maven__com_google_errorprone_error_prone_annotations_2_1_3.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__com_google_guava_guava_23_6_jre.xml b/.idea/libraries/Maven__com_google_guava_guava_23_6_jre.xml new file mode 100644 index 000000000..ed4424fc2 --- /dev/null +++ b/.idea/libraries/Maven__com_google_guava_guava_23_6_jre.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__com_google_j2objc_j2objc_annotations_1_1.xml b/.idea/libraries/Maven__com_google_j2objc_j2objc_annotations_1_1.xml new file mode 100644 index 000000000..c06f9997b --- /dev/null +++ b/.idea/libraries/Maven__com_google_j2objc_j2objc_annotations_1_1.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__com_squareup_okhttp3_okhttp_3_9_1.xml b/.idea/libraries/Maven__com_squareup_okhttp3_okhttp_3_9_1.xml new file mode 100644 index 000000000..ba9cb8111 --- /dev/null +++ b/.idea/libraries/Maven__com_squareup_okhttp3_okhttp_3_9_1.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__com_squareup_okio_okio_1_13_0.xml b/.idea/libraries/Maven__com_squareup_okio_okio_1_13_0.xml new file mode 100644 index 000000000..cb99e2fa4 --- /dev/null +++ b/.idea/libraries/Maven__com_squareup_okio_okio_1_13_0.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__commons_codec_commons_codec_1_10.xml b/.idea/libraries/Maven__commons_codec_commons_codec_1_10.xml new file mode 100644 index 000000000..27424a179 --- /dev/null +++ b/.idea/libraries/Maven__commons_codec_commons_codec_1_10.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__commons_logging_commons_logging_1_2.xml b/.idea/libraries/Maven__commons_logging_commons_logging_1_2.xml new file mode 100644 index 000000000..eab40b329 --- /dev/null +++ b/.idea/libraries/Maven__commons_logging_commons_logging_1_2.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__junit_junit_4_12.xml b/.idea/libraries/Maven__junit_junit_4_12.xml new file mode 100644 index 000000000..d41104174 --- /dev/null +++ b/.idea/libraries/Maven__junit_junit_4_12.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__net_bytebuddy_byte_buddy_1_7_9.xml b/.idea/libraries/Maven__net_bytebuddy_byte_buddy_1_7_9.xml new file mode 100644 index 000000000..22f4f7405 --- /dev/null +++ b/.idea/libraries/Maven__net_bytebuddy_byte_buddy_1_7_9.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__org_apache_commons_commons_exec_1_3.xml b/.idea/libraries/Maven__org_apache_commons_commons_exec_1_3.xml new file mode 100644 index 000000000..e064a8225 --- /dev/null +++ b/.idea/libraries/Maven__org_apache_commons_commons_exec_1_3.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__org_apache_httpcomponents_httpclient_4_5_3.xml b/.idea/libraries/Maven__org_apache_httpcomponents_httpclient_4_5_3.xml new file mode 100644 index 000000000..c82bb7c34 --- /dev/null +++ b/.idea/libraries/Maven__org_apache_httpcomponents_httpclient_4_5_3.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__org_apache_httpcomponents_httpcore_4_4_6.xml b/.idea/libraries/Maven__org_apache_httpcomponents_httpcore_4_4_6.xml new file mode 100644 index 000000000..a9f6e19ac --- /dev/null +++ b/.idea/libraries/Maven__org_apache_httpcomponents_httpcore_4_4_6.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__org_apache_pdfbox_fontbox_2_0_1.xml b/.idea/libraries/Maven__org_apache_pdfbox_fontbox_2_0_1.xml new file mode 100644 index 000000000..4f09d7c1b --- /dev/null +++ b/.idea/libraries/Maven__org_apache_pdfbox_fontbox_2_0_1.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__org_apache_pdfbox_pdfbox_2_0_1.xml b/.idea/libraries/Maven__org_apache_pdfbox_pdfbox_2_0_1.xml new file mode 100644 index 000000000..6900333f1 --- /dev/null +++ b/.idea/libraries/Maven__org_apache_pdfbox_pdfbox_2_0_1.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__org_apiguardian_apiguardian_api_1_0_0.xml b/.idea/libraries/Maven__org_apiguardian_apiguardian_api_1_0_0.xml new file mode 100644 index 000000000..a82457d51 --- /dev/null +++ b/.idea/libraries/Maven__org_apiguardian_apiguardian_api_1_0_0.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__org_checkerframework_checker_compat_qual_2_0_0.xml b/.idea/libraries/Maven__org_checkerframework_checker_compat_qual_2_0_0.xml new file mode 100644 index 000000000..29defe67c --- /dev/null +++ b/.idea/libraries/Maven__org_checkerframework_checker_compat_qual_2_0_0.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__org_codehaus_mojo_animal_sniffer_annotations_1_14.xml b/.idea/libraries/Maven__org_codehaus_mojo_animal_sniffer_annotations_1_14.xml new file mode 100644 index 000000000..1af11e48b --- /dev/null +++ b/.idea/libraries/Maven__org_codehaus_mojo_animal_sniffer_annotations_1_14.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__org_hamcrest_hamcrest_core_1_3.xml b/.idea/libraries/Maven__org_hamcrest_hamcrest_core_1_3.xml new file mode 100644 index 000000000..f58bbc112 --- /dev/null +++ b/.idea/libraries/Maven__org_hamcrest_hamcrest_core_1_3.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__org_junit_jupiter_junit_jupiter_api_5_1_0.xml b/.idea/libraries/Maven__org_junit_jupiter_junit_jupiter_api_5_1_0.xml new file mode 100644 index 000000000..fc43f3376 --- /dev/null +++ b/.idea/libraries/Maven__org_junit_jupiter_junit_jupiter_api_5_1_0.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__org_junit_platform_junit_platform_commons_1_1_0.xml b/.idea/libraries/Maven__org_junit_platform_junit_platform_commons_1_1_0.xml new file mode 100644 index 000000000..ac71c5f85 --- /dev/null +++ b/.idea/libraries/Maven__org_junit_platform_junit_platform_commons_1_1_0.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__org_opentest4j_opentest4j_1_0_0.xml b/.idea/libraries/Maven__org_opentest4j_opentest4j_1_0_0.xml new file mode 100644 index 000000000..ef0157253 --- /dev/null +++ b/.idea/libraries/Maven__org_opentest4j_opentest4j_1_0_0.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__org_seleniumhq_selenium_selenium_api_3_11_0.xml b/.idea/libraries/Maven__org_seleniumhq_selenium_selenium_api_3_11_0.xml new file mode 100644 index 000000000..8debb67e0 --- /dev/null +++ b/.idea/libraries/Maven__org_seleniumhq_selenium_selenium_api_3_11_0.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__org_seleniumhq_selenium_selenium_chrome_driver_3_11_0.xml b/.idea/libraries/Maven__org_seleniumhq_selenium_selenium_chrome_driver_3_11_0.xml new file mode 100644 index 000000000..e59e1308d --- /dev/null +++ b/.idea/libraries/Maven__org_seleniumhq_selenium_selenium_chrome_driver_3_11_0.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__org_seleniumhq_selenium_selenium_edge_driver_3_11_0.xml b/.idea/libraries/Maven__org_seleniumhq_selenium_selenium_edge_driver_3_11_0.xml new file mode 100644 index 000000000..84d0d74d5 --- /dev/null +++ b/.idea/libraries/Maven__org_seleniumhq_selenium_selenium_edge_driver_3_11_0.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__org_seleniumhq_selenium_selenium_firefox_driver_3_11_0.xml b/.idea/libraries/Maven__org_seleniumhq_selenium_selenium_firefox_driver_3_11_0.xml new file mode 100644 index 000000000..2a361de2d --- /dev/null +++ b/.idea/libraries/Maven__org_seleniumhq_selenium_selenium_firefox_driver_3_11_0.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__org_seleniumhq_selenium_selenium_ie_driver_3_11_0.xml b/.idea/libraries/Maven__org_seleniumhq_selenium_selenium_ie_driver_3_11_0.xml new file mode 100644 index 000000000..82492f898 --- /dev/null +++ b/.idea/libraries/Maven__org_seleniumhq_selenium_selenium_ie_driver_3_11_0.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__org_seleniumhq_selenium_selenium_java_3_11_0.xml b/.idea/libraries/Maven__org_seleniumhq_selenium_selenium_java_3_11_0.xml new file mode 100644 index 000000000..414df510e --- /dev/null +++ b/.idea/libraries/Maven__org_seleniumhq_selenium_selenium_java_3_11_0.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__org_seleniumhq_selenium_selenium_opera_driver_3_11_0.xml b/.idea/libraries/Maven__org_seleniumhq_selenium_selenium_opera_driver_3_11_0.xml new file mode 100644 index 000000000..80021314d --- /dev/null +++ b/.idea/libraries/Maven__org_seleniumhq_selenium_selenium_opera_driver_3_11_0.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__org_seleniumhq_selenium_selenium_remote_driver_3_11_0.xml b/.idea/libraries/Maven__org_seleniumhq_selenium_selenium_remote_driver_3_11_0.xml new file mode 100644 index 000000000..ae1ad36f5 --- /dev/null +++ b/.idea/libraries/Maven__org_seleniumhq_selenium_selenium_remote_driver_3_11_0.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__org_seleniumhq_selenium_selenium_safari_driver_3_11_0.xml b/.idea/libraries/Maven__org_seleniumhq_selenium_selenium_safari_driver_3_11_0.xml new file mode 100644 index 000000000..0e7aa1239 --- /dev/null +++ b/.idea/libraries/Maven__org_seleniumhq_selenium_selenium_safari_driver_3_11_0.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__org_seleniumhq_selenium_selenium_support_3_11_0.xml b/.idea/libraries/Maven__org_seleniumhq_selenium_selenium_support_3_11_0.xml new file mode 100644 index 000000000..49d9ce8a1 --- /dev/null +++ b/.idea/libraries/Maven__org_seleniumhq_selenium_selenium_support_3_11_0.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/appbundler_1_0.xml b/.idea/libraries/appbundler_1_0.xml new file mode 100644 index 000000000..0b0a5e224 --- /dev/null +++ b/.idea/libraries/appbundler_1_0.xml @@ -0,0 +1,9 @@ + + + + + + + + + \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml new file mode 100644 index 000000000..d30d09e20 --- /dev/null +++ b/.idea/misc.xml @@ -0,0 +1,13 @@ + + + + + + + + + \ No newline at end of file diff --git a/.idea/modules.xml b/.idea/modules.xml new file mode 100644 index 000000000..76456331f --- /dev/null +++ b/.idea/modules.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/.idea/uiDesigner.xml b/.idea/uiDesigner.xml new file mode 100644 index 000000000..e96534fb2 --- /dev/null +++ b/.idea/uiDesigner.xml @@ -0,0 +1,124 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml new file mode 100644 index 000000000..35eb1ddfb --- /dev/null +++ b/.idea/vcs.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/.idea/workspace.xml b/.idea/workspace.xml new file mode 100644 index 000000000..ad6724898 --- /dev/null +++ b/.idea/workspace.xml @@ -0,0 +1,1252 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + multipl + auto + actions + inclusivebut + webelement + overlap + pagere + accept + FilteredArea + getDims + reset_for_new_doc + regex-re + lis + replace + regex-result + renderSelection: + system. + + system.o + overl + throws + clickr + multi + preview + previewan + click + previ + clickreg + previewand + clickre + + + $PROJECT_DIR$/src/test/java + + + + + + + + + + + + + + + + true + DEFINITION_ORDER + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 1517886949024 + + + 1523340044592 + + + 1523340301864 + + + 1523340730875 + + + 1523341448023 + + + 1523363739431 + + + 1523364548164 + + + 1523365150425 + + + 1523365193165 + + + 1523370916563 + + + 1523371195281 + + + 1523372303398 + + + 1523374721389 + + + 1523375046324 + + + 1523376290785 + + + 1523377212191 + + + 1523378440231 + + + 1523379936028 + + + 1523380957142 + + + 1523415838350 + + + 1523417840660 + + + 1523655120728 + + + 1523656715897 + + + 1523658490839 + + + 1523659068089 + + + 1523659972450 + + + 1523683529835 + + + 1523743178928 + + + 1523743946102 + + + 1523755258669 + + + 1523766986932 + + + 1523773837500 + + + 1523827610954 + + + 1523982233839 + + + 1524357104740 + + + 1524522486683 + + + 1524581528734 + + + 1524582777036 + + + 1524586098431 + + + 1524598474923 + + + 1524636573566 + + + 1524764869361 + + + 1524896917884 + + + 1524965974263 + + + 1524970427635 + + + 1524971531385 + + + 1524972979894 + + + 1524975672255 + + + 1524978104447 + + + 1524978863047 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + No facets are configured + + + + + + + + + + + + + + + 1.8 + + + + + + + + 484_P7_1-GUI + + + + + + + + Maven: com.google.code.findbugs:jsr305:1.3.9 + + + + + + + + \ No newline at end of file diff --git a/.project b/.project new file mode 100644 index 000000000..2e96e69f4 --- /dev/null +++ b/.project @@ -0,0 +1,11 @@ + + + 484_P7_1-GUI + + + + + + + + diff --git a/.travis.yml b/.travis.yml index 86bd9cc76..cd47082a5 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,14 +1,31 @@ sudo: false -language: ruby +language: java +addons: + chrome: stable before_install: - - gem update --system - - gem install bundler - - gem install jbundler -rvm: - - jruby-9.1.9.0 + # GUI + # "export DISPLAY=:99.0" + - "sh -e /etc/init.d/xvfb start" + - sleep 5 + - bash run.sh & + - sleep 100 + - bash waitForServerLoad.sh + - google-chrome-stable --headless --disable-gpu --remote-debugging-port=9222 http://localhost & + # google chrome standalone driver + - wget http://chromedriver.storage.googleapis.com/2.36/chromedriver_linux64.zip + - unzip chromedriver_linux64.zip + - sudo mv chromedriver /usr/local/bin + - sudo chmod a+x /usr/local/bin/chromedriver + +install: +# - mvn install -DskipTests=true -Dmaven.javadoc.skip=true -Dgpg.skip=true -B -V + + jdk: + - openjdk8 - oraclejdk8 - - openjdk7 -script: bundle exec jbundle install && bundle exec rake war && bundle exec rake jardist +script: + - mvn test -Dgpg.skip=true notifications: email: false + diff --git a/484_P7_1-GUI.iml b/484_P7_1-GUI.iml new file mode 100644 index 000000000..433e1aaba --- /dev/null +++ b/484_P7_1-GUI.iml @@ -0,0 +1,91 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Gemfile b/Gemfile index d4ad4e0f1..c13961590 100644 --- a/Gemfile +++ b/Gemfile @@ -16,5 +16,9 @@ platform :jruby do gem "jruby-jars", "9.1.15.0" gem "bootstrap-sass", "~> 3.2.0" gem "compass" + gem "ruby-maven" end + + end + diff --git a/Gemfile.lock b/Gemfile.lock index 6a3c3f9cf..dd6532247 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -35,12 +35,12 @@ GEM jar-dependencies (~> 0.3) maven-tools (~> 1.1) ruby-maven (~> 3.3, >= 3.3.8) - jruby-jars (9.1.15.0) + jruby-jars (9.1.12.0) jruby-rack (1.1.21) maven-tools (1.1.6) virtus (~> 1.0) multi_json (1.12.2) - rack (2.0.4) + rack (2.0.3) rake (12.3.0) rb-fsevent (0.10.2) rb-inotify (0.9.10) @@ -65,18 +65,20 @@ GEM PLATFORMS java + x86-mingw32 DEPENDENCIES bootstrap-sass (~> 3.2.0) compass - cuba (~> 3.9.2) + cuba (~> 3.8.1) jar-dependencies (= 0.3.12) jbundler (~> 0.9.3) jruby-jars (= 9.1.15.0) rack (~> 2.0.4) rake - tilt (~> 2.0.8) - warbler (~> 2.0.4) + ruby-maven + tilt (~> 2.0.7) + warbler (~> 2.0.3) BUNDLED WITH - 1.16.0 + 1.16.1 diff --git a/Jarfile b/Jarfile index 0a0cc2616..e72159779 100644 --- a/Jarfile +++ b/Jarfile @@ -1 +1,2 @@ -jar 'technology.tabula:tabula', '1.0.2' \ No newline at end of file +snapshot_repository :snapshots, "https://oss.sonatype.org/content/repositories/snapshots" +jar 'technology.tabula:tabula', '1.0.2-SNAPSHOT' diff --git a/Jarfile.lock b/Jarfile.lock index e83e7bf4e..806c7556f 100644 --- a/Jarfile.lock +++ b/Jarfile.lock @@ -1,18 +1,36 @@ --- :runtime: -- org.apache.pdfbox:fontbox:jar:2.0.9 -- org.apache.commons:commons-csv:jar:1.4 -- commons-cli:commons-cli:jar:1.4 -- org.bouncycastle:bcprov-jdk15on:jar:1.56 -- org.locationtech.jts:jts-core:jar:1.15.0 -- org.slf4j:slf4j-simple:jar:1.7.25 -- org.bouncycastle:bcmail-jdk15on:jar:1.56 -- org.bouncycastle:bcpkix-jdk15on:jar:1.56 -- org.apache.pdfbox:pdfbox:jar:2.0.9 -- org.slf4j:slf4j-api:jar:1.7.25 +- com.squareup.okhttp3:okhttp:jar:3.9.1 +- com.squareup.okio:okio:jar:1.13.0 +- org.apache.httpcomponents:httpclient:jar:4.5.3 +- org.junit.platform:junit-platform-commons:jar:1.1.0 +- com.google.code.findbugs:jsr305:jar:1.3.9 +- org.checkerframework:checker-compat-qual:jar:2.0.0 +- org.apache.pdfbox:fontbox:jar:2.0.1 +- org.seleniumhq.selenium:selenium-opera-driver:jar:3.11.0 +- org.seleniumhq.selenium:selenium-remote-driver:jar:3.11.0 +- com.google.j2objc:j2objc-annotations:jar:1.1 +- org.codehaus.mojo:animal-sniffer-annotations:jar:1.14 +- org.junit.jupiter:junit-jupiter-api:jar:5.1.0 +- net.bytebuddy:byte-buddy:jar:1.7.9 +- org.seleniumhq.selenium:selenium-safari-driver:jar:3.11.0 +- org.seleniumhq.selenium:selenium-firefox-driver:jar:3.11.0 +- org.apache.pdfbox:pdfbox:jar:2.0.1 +- org.apache.commons:commons-exec:jar:1.3 +- com.google.code.gson:gson:jar:2.8.2 +- commons-codec:commons-codec:jar:1.10 +- com.google.errorprone:error_prone_annotations:jar:2.1.3 +- technology.tabula:tabula:jar:1.0.2-SNAPSHOT +- org.opentest4j:opentest4j:jar:1.0.0 +- jline:jline:jar:2.11 +- org.apache.httpcomponents:httpcore:jar:4.4.6 +- org.seleniumhq.selenium:selenium-edge-driver:jar:3.11.0 - commons-logging:commons-logging:jar:1.2 -- com.google.code.gson:gson:jar:2.8.0 -- com.github.jai-imageio:jai-imageio-core:jar:1.3.1 -- technology.tabula:tabula:jar:1.0.2 -- com.github.jai-imageio:jai-imageio-jpeg2000:jar:1.3.0 -- com.levigo.jbig2:levigo-jbig2-imageio:jar:2.0 +- org.seleniumhq.selenium:selenium-api:jar:3.11.0 +- org.seleniumhq.selenium:selenium-java:jar:3.11.0 +- org.seleniumhq.selenium:selenium-chrome-driver:jar:3.11.0 +- org.seleniumhq.selenium:selenium-ie-driver:jar:3.11.0 +- org.yaml:snakeyaml:jar:1.18 +- org.seleniumhq.selenium:selenium-support:jar:3.11.0 +- com.google.guava:guava:jar:23.6-jre +- org.apiguardian:apiguardian-api:jar:1.0.0 diff --git a/Rakefile b/Rakefile index bb55d847b..3257319d3 100644 --- a/Rakefile +++ b/Rakefile @@ -83,7 +83,7 @@ task :jardist => [:create_version_file, :war] do |t| File.delete(output) end - IO.popen("zip -r9 #{output} tabula") { |f| + IO.popen("7z -r9 #{output} tabula") { |f| f.each { |line| puts line } } FileUtils.rm_rf(dist_dir) @@ -141,7 +141,7 @@ task :macosx => [:create_version_file, :war] do |t| File.delete(output) end - IO.popen("zip -r9 #{output} tabula") { |f| + IO.popen("7z -r9 #{output} tabula") { |f| f.each { |line| puts line } } FileUtils.rm_rf(dist_dir) @@ -212,7 +212,7 @@ task :windows => [:create_version_file, :war] do |t| File.delete(output) end - IO.popen("zip -r9 #{output} tabula") { |f| + IO.popen("7z -r9 #{output} tabula") { |f| f.each { |line| puts line } } FileUtils.rm_rf(dist_dir) diff --git a/SeleniumChrome/chromedriver b/SeleniumChrome/chromedriver new file mode 100755 index 000000000..6adfdc19b Binary files /dev/null and b/SeleniumChrome/chromedriver differ diff --git a/classes/test/484_P7_1-GUI/TestOneStopVotingSiteListNov2012.class b/classes/test/484_P7_1-GUI/TestOneStopVotingSiteListNov2012.class new file mode 100644 index 000000000..709772fba Binary files /dev/null and b/classes/test/484_P7_1-GUI/TestOneStopVotingSiteListNov2012.class differ diff --git a/launch4j-3.1.0-beta1-linux.tgz b/launch4j-3.1.0-beta1-linux.tgz new file mode 100644 index 000000000..2f33ba095 Binary files /dev/null and b/launch4j-3.1.0-beta1-linux.tgz differ diff --git a/lib/tabula_java_wrapper.rb b/lib/tabula_java_wrapper.rb index 368c6c6d9..5ce7380e2 100644 --- a/lib/tabula_java_wrapper.rb +++ b/lib/tabula_java_wrapper.rb @@ -1,6 +1,14 @@ java_import org.apache.pdfbox.pdmodel.PDDocument java_import org.apache.pdfbox.pdmodel.encryption.StandardDecryptionMaterial +module JavaIO + include_package "java.io" +end + +module Gson + include_package "com.google.gson" +end + class Java::TechnologyTabula::Table attr_accessor :spec_index def to_csv @@ -25,11 +33,14 @@ def to_json(*a) module Tabula def Tabula.extract_tables(pdf_path, specs, options={}) + puts 'In extract_tables' + puts 'Options:' + puts options options = { :password => '', :detect_ruling_lines => true, :vertical_rulings => [], - :extraction_method => "guess", + :extraction_method => '',#"guess", Commenting out guess because of its variable behavior (GUI vs CLI)... }.merge(options) specs.each_with_index{|spec, i| spec["spec_index"] = i } @@ -56,7 +67,7 @@ def Tabula.extract_tables(pdf_path, specs, options={}) table_extractor = use_spreadsheet_extraction_method ? sea : bea table_extractor.extract(area).each { |table| table.spec_index = spec["spec_index"]; y.yield table } end - end; + end extractor.close! end @@ -108,3 +119,4 @@ def pages end end end + diff --git a/lib/tabula_workspace.rb b/lib/tabula_workspace.rb index 2ef123f32..9d4f0072a 100644 --- a/lib/tabula_workspace.rb +++ b/lib/tabula_workspace.rb @@ -75,7 +75,7 @@ def add_file(contents, document_id, filename) end def move_file(path, document_id, filename) - FileUtils.mv(path, File.join(get_document_dir(document_id), filename)) + FileUtils.mv(path, File.join(get_document_dir(document_id), filename),:noop=> false, :verbose=> true, :force=> true) end def copy_file(path, document_id, filename) @@ -101,10 +101,10 @@ def add_template(template_metadata) # write template metadata to workspace @workspace["templates"].insert(0,{ - "name" => template_metadata["name"].gsub(".tabula-template.json", ""), + "name" => template_metadata["name"].gsub(".tabula-template.json", ""), "selection_count" => template_metadata["selection_count"], - "page_count" => template_metadata["page_count"], - "time" => template_metadata["time"], + "page_count" => template_metadata["page_count"], + "time" => template_metadata["time"], "id" => template_metadata["id"] }) # write template file to disk diff --git a/pdfbox-0.8.0-incubating.jar b/pdfbox-0.8.0-incubating.jar new file mode 100644 index 000000000..df1ca619e --- /dev/null +++ b/pdfbox-0.8.0-incubating.jar @@ -0,0 +1,889 @@ + +Index of /maven2/ + +

Index of /maven2/


../
+HTTPClient/                                        01-Nov-2005 05:03                   -
+abbot/                                             28-Sep-2015 06:18                   -
+acegisecurity/                                     23-Dec-2005 12:20                   -
+activation/                                        21-Dec-2005 15:37                   -
+activecluster/                                     01-Nov-2005 05:09                   -
+activeio/                                          01-Nov-2005 05:10                   -
+activemq/                                          01-Nov-2005 05:13                   -
+activemq-jaxb/                                     01-Nov-2005 05:11                   -
+activesoap/                                        01-Nov-2005 05:20                   -
+activespace/                                       01-Nov-2005 05:04                   -
+adarwin/                                           01-Nov-2005 05:03                   -
+ae/                                                06-Apr-2015 06:14                   -
+aelfred/                                           01-Nov-2005 05:03                   -
+aero/                                              01-Aug-2014 14:03                   -
+ai/                                                28-Nov-2016 07:10                   -
+aislib/                                            01-Nov-2005 05:14                   -
+al/                                                21-Nov-2016 13:18                   -
+altrmi/                                            01-Nov-2005 05:14                   -
+am/                                                21-Nov-2016 13:19                   -
+andromda/                                          01-Nov-2005 05:19                   -
+annogen/                                           01-Nov-2005 05:19                   -
+ant/                                               01-Nov-2005 05:17                   -
+ant-contrib/                                       08-Aug-2008 22:17                   -
+ant-doxygen/                                       01-Nov-2005 05:04                   -
+ant4eclipse/                                       21-Aug-2011 11:53                   -
+antlr/                                             01-Nov-2005 05:12                   -
+anttex/                                            01-Nov-2005 05:19                   -
+aopalliance/                                       28-Oct-2005 01:26                   -
+apache-jaxme/                                      01-Nov-2005 05:10                   -
+aptconvert/                                        01-Nov-2005 05:07                   -
+ar/                                                06-Mar-2008 17:19                   -
+args4j/                                            16-Mar-2013 07:01                   -
+as/                                                25-May-2015 06:15                   -
+ashkay/                                            01-Nov-2005 05:13                   -
+ashkelon/                                          01-Nov-2005 05:20                   -
+asia/                                              23-Feb-2013 08:01                   -
+asm/                                               07-Jul-2009 04:08                   -
+aspectj/                                           21-Dec-2005 12:23                   -
+aspectwerkz/                                       01-Nov-2005 05:09                   -
+at/                                                28-Nov-2016 07:12                   -
+au/                                                12-Oct-2015 07:37                   -
+avalon/                                            19-Oct-2006 19:23                   -
+avalon-activation/                                 01-Nov-2005 05:20                   -
+avalon-apps/                                       01-Nov-2005 05:14                   -
+avalon-composition/                                01-Nov-2005 05:13                   -
+avalon-cornerstone/                                01-Nov-2005 05:02                   -
+avalon-extension/                                  01-Nov-2005 05:09                   -
+avalon-framework/                                  01-Nov-2005 05:15                   -
+avalon-http/                                       18-Jul-2006 18:10                   -
+avalon-logging/                                    01-Nov-2005 05:19                   -
+avalon-logkit/                                     01-Nov-2005 05:11                   -
+avalon-meta/                                       01-Nov-2005 05:05                   -
+avalon-phoenix/                                    01-Nov-2005 05:10                   -
+avalon-repository/                                 01-Nov-2005 05:10                   -
+avalon-util/                                       01-Nov-2005 05:12                   -
+axion/                                             01-Nov-2005 05:20                   -
+axis/                                              19-Oct-2006 19:23                   -
+axis2/                                             04-May-2006 20:31                   -
+azote/                                             01-Nov-2005 05:14                   -
+ba/                                                29-Jun-2015 06:17                   -
+backport-util-concurrent/                          20-Feb-2008 05:30                   -
+backport175/                                       01-Nov-2005 05:07                   -
+band/                                              21-Nov-2016 13:41                   -
+barsuift/                                          21-Aug-2011 11:54                   -
+batik/                                             01-Nov-2005 05:09                   -
+bcel/                                              28-Oct-2005 01:26                   -
+be/                                                21-Nov-2016 13:41                   -
+beehive/                                           01-Nov-2005 05:10                   -
+berkano/                                           01-Nov-2005 05:14                   -
+berkeleydb/                                        01-Nov-2005 05:06                   -
+binky/                                             26-Feb-2010 19:31                   -
+biz/                                               14-Mar-2016 06:15                   -
+black/                                             01-Jun-2015 06:20                   -
+blissed/                                           01-Nov-2005 05:04                   -
+boo/                                               06-Nov-2006 01:04                   -
+bouncycastle/                                      03-Sep-2009 13:30                   -
+boxstuff/                                          01-Nov-2005 05:12                   -
+br/                                                21-Nov-2016 13:45                   -
+bsf/                                               01-Nov-2005 05:03                   -
+bsh/                                               01-Nov-2005 05:03                   -
+burlap/                                            01-Nov-2005 05:03                   -
+by/                                                12-Jan-2015 07:18                   -
+bz/                                                01-Aug-2014 14:08                   -
+c10n/                                              09-Mar-2013 08:02                   -
+c3p0/                                              01-Nov-2005 05:06                   -
+ca/                                                21-Nov-2016 13:53                   -
+cactus/                                            11-Apr-2008 19:59                   -
+cargo/                                             01-Nov-2005 05:07                   -
+cas/                                               22-Jun-2006 17:05                   -
+castor/                                            06-Dec-2007 02:46                   -
+cat/                                               21-Nov-2016 14:02                   -
+cc/                                                21-Nov-2016 14:02                   -
+cd/                                                05-Jan-2015 07:18                   -
+cewolf/                                            01-Nov-2005 05:04                   -
+cf/                                                01-Aug-2014 14:11                   -
+cglib/                                             29-Feb-2016 07:17                   -
+ch/                                                21-Nov-2016 14:07                   -
+charlotte/                                         01-Nov-2005 05:04                   -
+checkstyle/                                        28-Oct-2005 01:27                   -
+cl/                                                06-Jul-2015 06:24                   -
+classworlds/                                       01-Nov-2005 05:10                   -
+clickstream/                                       24-Nov-2005 06:03                   -
+clirr/                                             01-Nov-2005 05:04                   -
+cloud/                                             21-Nov-2016 14:20                   -
+clover/                                            01-Nov-2005 05:11                   -
+cm/                                                21-Nov-2016 14:20                   -
+cmsdeploy/                                         06-Dec-2005 20:10                   -
+cn/                                                28-Nov-2016 07:25                   -
+co/                                                21-Nov-2016 14:24                   -
+cobertura/                                         06-Feb-2006 21:04                   -
+coconut/                                           01-Nov-2005 05:21                   -
+cocoon/                                            09-Jun-2008 20:01                   -
+code/                                              21-Aug-2011 11:56                   -
+code316/                                           01-Nov-2005 05:03                   -
+codehaus/                                          16-Jul-2008 22:44                   -
+codes/                                             01-Jun-2015 06:28                   -
+colt/                                              01-Nov-2005 05:03                   -
+com/                                               28-Nov-2016 07:29                   -
+commons-attributes/                                03-Jul-2006 21:30                   -
+commons-beanutils/                                 01-Dec-2012 08:50                   -
+commons-betwixt/                                   01-Nov-2005 05:13                   -
+commons-chain/                                     01-Jun-2008 18:20                   -
+commons-cli/                                       19-Mar-2009 20:08                   -
+commons-codec/                                     09-Aug-2009 21:14                   -
+commons-collections/                               15-Apr-2008 01:05                   -
+commons-compress/                                  01-Nov-2005 05:21                   -
+commons-configuration/                             11-Jan-2009 14:01                   -
+commons-daemon/                                    01-Nov-2005 05:12                   -
+commons-dbcp/                                      28-Oct-2005 01:26                   -
+commons-dbutils/                                   26-Apr-2009 04:30                   -
+commons-digester/                                  03-Jan-2009 21:44                   -
+commons-discovery/                                 01-Nov-2005 05:03                   -
+commons-el/                                        28-Oct-2005 01:27                   -
+commons-email/                                     28-Sep-2007 19:29                   -
+commons-fileupload/                                20-Feb-2007 11:31                   -
+commons-grafolia/                                  01-Nov-2005 05:03                   -
+commons-grant/                                     01-Nov-2005 05:16                   -
+commons-graph/                                     01-Nov-2005 05:19                   -
+commons-http/                                      01-Nov-2005 05:21                   -
+commons-httpclient/                                01-Nov-2005 05:19                   -
+commons-i18n/                                      01-Nov-2005 05:19                   -
+commons-io/                                        01-Jan-2008 21:00                   -
+commons-jdbc2pool/                                 01-Nov-2005 05:11                   -
+commons-jelly/                                     01-Nov-2005 05:12                   -
+commons-jexl/                                      01-Nov-2005 05:08                   -
+commons-jux/                                       01-Nov-2005 05:05                   -
+commons-jxpath/                                    13-Aug-2008 22:13                   -
+commons-lang/                                      19-Mar-2008 05:42                   -
+commons-latka/                                     01-Nov-2005 05:19                   -
+commons-launcher/                                  03-Jul-2006 21:30                   -
+commons-logging/                                   26-Nov-2007 19:24                   -
+commons-math/                                      25-Feb-2008 00:30                   -
+commons-messenger/                                 01-Nov-2005 05:14                   -
+commons-modeler/                                   01-Nov-2005 05:03                   -
+commons-naming/                                    01-Nov-2005 05:13                   -
+commons-net/                                       30-Oct-2008 20:28                   -
+commons-pool/                                      21-Dec-2008 00:14                   -
+commons-primitives/                                01-Nov-2005 05:08                   -
+commons-resources/                                 01-Nov-2005 05:09                   -
+commons-scxml/                                     19-May-2008 19:41                   -
+commons-services/                                  28-Oct-2005 01:27                   -
+commons-sql/                                       01-Nov-2005 05:14                   -
+commons-test/                                      08-Nov-2005 09:49                   -
+commons-threadpool/                                01-Nov-2005 05:14                   -
+commons-transaction/                               01-Nov-2005 05:14                   -
+commons-util/                                      01-Nov-2005 05:19                   -
+commons-validator/                                 28-Oct-2005 01:27                   -
+commons-vfs/                                       01-Nov-2005 05:10                   -
+commons-xo/                                        01-Nov-2005 05:08                   -
+concurrent/                                        28-Oct-2005 01:26                   -
+consulting/                                        10-Aug-2015 10:55                   -
+continuum/                                         01-Nov-2005 05:04                   -
+controlhaus/                                       01-Nov-2005 05:19                   -
+cool/                                              29-Nov-2016 23:08                   -
+coop/                                              20-Oct-2014 09:33                   -
+cornerstone-connection/                            01-Nov-2005 05:20                   -
+cornerstone-datasources/                           01-Nov-2005 05:21                   -
+cornerstone-scheduler/                             01-Nov-2005 05:12                   -
+cornerstone-sockets/                               01-Nov-2005 05:13                   -
+cornerstone-store/                                 01-Nov-2005 05:03                   -
+cornerstone-threads/                               01-Nov-2005 05:07                   -
+cos/                                               06-Dec-2005 20:11                   -
+crimson/                                           01-Nov-2005 05:03                   -
+cryptix/                                           01-Nov-2005 05:07                   -
+cssparser/                                         21-Aug-2011 14:29                   -
+cz/                                                29-Nov-2016 23:08                   -
+d-haven-event/                                     01-Nov-2005 05:14                   -
+d-haven-eventbus/                                  01-Nov-2005 05:09                   -
+d-haven-mpool/                                     01-Nov-2005 05:16                   -
+dalma/                                             21-Aug-2011 14:29                   -
+dalms/                                             21-Aug-2011 14:29                   -
+damagecontrol/                                     01-Nov-2005 05:10                   -
+dataforge/                                         01-Nov-2005 05:11                   -
+datasift/                                          01-Nov-2005 05:14                   -
+dbunit/                                            01-Nov-2005 05:13                   -
+de/                                                29-Nov-2016 23:10                   -
+decorutils/                                        01-Nov-2005 05:04                   -
+dentaku/                                           01-Nov-2005 05:07                   -
+directory/                                         24-Dec-2005 17:47                   -
+directory-asn1/                                    01-Nov-2005 05:19                   -
+directory-authx/                                   01-Nov-2005 05:21                   -
+directory-clients/                                 01-Nov-2005 05:05                   -
+directory-naming/                                  01-Nov-2005 05:03                   -
+directory-network/                                 01-Nov-2005 05:07                   -
+directory-protocols/                               01-Nov-2005 05:09                   -
+directory-shared/                                  01-Nov-2005 05:19                   -
+displaytag/                                        12-Aug-2008 07:35                   -
+ditchnet/                                          24-Nov-2005 06:03                   -
+dk/                                                30-Nov-2016 00:31                   -
+dna/                                               01-Nov-2005 05:21                   -
+dnsjava/                                           01-Nov-2005 05:14                   -
+docbook/                                           16-Jun-2006 18:32                   -
+doccheck/                                          01-Nov-2005 05:10                   -
+dom4j/                                             01-Nov-2005 05:16                   -
+domify/                                            21-Aug-2011 14:31                   -
+dot-index/                                         15-Jul-2012 10:55                   -
+doxia/                                             28-Oct-2005 01:27                   -
+drone/                                             01-Nov-2005 05:03                   -
+drools/                                            31-Jan-2007 18:40                   -
+drools-examples/                                   01-Nov-2005 05:10                   -
+dsh-vocabulary/                                    01-Nov-2005 05:09                   -
+dtdparser/                                         01-Nov-2005 05:15                   -
+dumbster/                                          01-Nov-2005 05:03                   -
+dwr/                                               24-Nov-2005 06:03                   -
+dynaop/                                            01-Nov-2005 05:04                   -
+easyconf/                                          01-Nov-2005 05:19                   -
+easymock/                                          28-Oct-2005 01:27                   -
+ec/                                                26-Jan-2015 11:42                   -
+echo/                                              01-Nov-2005 05:07                   -
+echo3/                                             21-Aug-2011 14:32                   -
+echo3extras/                                       21-Aug-2011 14:32                   -
+eclipse/                                           01-Nov-2005 05:03                   -
+ecs/                                               01-Nov-2005 05:14                   -
+edenlib/                                           01-Nov-2005 05:05                   -
+edtftp/                                            01-Nov-2005 05:16                   -
+edu/                                               30-Nov-2016 00:32                   -
+ee/                                                30-Nov-2016 01:01                   -
+ehcache/                                           28-Oct-2005 01:26                   -
+ejb/                                               06-Dec-2005 20:11                   -
+el-impl/                                           21-Aug-2011 14:32                   -
+emberio/                                           01-Nov-2005 05:17                   -
+emma/                                              01-Nov-2005 05:03                   -
+enterprises/                                       07-Dec-2015 10:38                   -
+ervacon/                                           01-Nov-2005 05:21                   -
+es/                                                30-Nov-2016 01:01                   -
+esper/                                             29-Jan-2008 02:43                   -
+eu/                                                30-Nov-2016 01:03                   -
+eus/                                               27-Apr-2015 10:40                   -
+excalibur/                                         01-Nov-2005 05:06                   -
+excalibur-altrmi/                                  01-Nov-2005 05:05                   -
+excalibur-cli/                                     01-Nov-2005 05:07                   -
+excalibur-collections/                             01-Nov-2005 05:10                   -
+excalibur-component/                               01-Nov-2005 05:10                   -
+excalibur-component-examples/                      01-Nov-2005 05:04                   -
+excalibur-component-tests/                         01-Nov-2005 05:15                   -
+excalibur-concurrent/                              01-Nov-2005 05:07                   -
+excalibur-configuration/                           01-Nov-2005 05:09                   -
+excalibur-containerkit/                            01-Nov-2005 05:03                   -
+excalibur-datasource/                              01-Nov-2005 05:03                   -
+excalibur-event/                                   01-Nov-2005 05:03                   -
+excalibur-extension/                               01-Nov-2005 05:04                   -
+excalibur-fortress/                                01-Nov-2005 05:04                   -
+excalibur-i18n/                                    01-Nov-2005 05:15                   -
+excalibur-instrument/                              01-Nov-2005 05:10                   -
+excalibur-instrument-manager/                      01-Nov-2005 05:08                   -
+excalibur-instrument-manager-interfaces/           01-Nov-2005 05:07                   -
+excalibur-io/                                      01-Nov-2005 05:11                   -
+excalibur-lifecycle/                               01-Nov-2005 05:15                   -
+excalibur-logger/                                  01-Nov-2005 05:04                   -
+excalibur-monitor/                                 01-Nov-2005 05:15                   -
+excalibur-mpool/                                   01-Nov-2005 05:05                   -
+excalibur-naming/                                  01-Nov-2005 05:14                   -
+excalibur-pool/                                    01-Nov-2005 05:03                   -
+excalibur-sourceresolve/                           01-Nov-2005 05:14                   -
+excalibur-store/                                   01-Nov-2005 05:09                   -
+excalibur-thread/                                  01-Nov-2005 05:07                   -
+excalibur-util/                                    01-Nov-2005 05:15                   -
+excalibur-xmlutil/                                 01-Nov-2005 05:04                   -
+exist/                                             01-Nov-2005 05:12                   -
+exml/                                              01-Nov-2005 05:16                   -
+exo/                                               01-Nov-2005 00:35                   -
+exolabcore/                                        01-Nov-2005 00:35                   -
+exteca/                                            01-Nov-2005 00:35                   -
+external/                                          01-Aug-2014 20:15                   -
+farm/                                              26-Oct-2015 11:01                   -
+fastutil/                                          01-Nov-2005 00:35                   -
+fesi/                                              01-Nov-2005 00:35                   -
+fi/                                                30-Nov-2016 01:13                   -
+findbugs/                                          06-Nov-2006 01:05                   -
+fish/                                              18-May-2015 10:45                   -
+flox/                                              01-Nov-2005 00:35                   -
+flux/                                              21-Aug-2011 14:32                   -
+fm/                                                22-Feb-2016 09:57                   -
+foo/                                               30-Nov-2016 01:49                   -
+foo3/                                              21-Nov-2016 12:45                   -
+fop/                                               01-Nov-2005 00:35                   -
+forehead/                                          01-Nov-2005 00:35                   -
+formproc/                                          01-Nov-2005 00:34                   -
+foundation/                                        30-Nov-2016 01:49                   -
+foxtrot/                                           12-Nov-2011 11:19                   -
+fr/                                                30-Nov-2016 01:49                   -
+freebxml/                                          01-Nov-2005 00:34                   -
+freemarker/                                        01-Nov-2005 00:35                   -
+frl/                                               14-Sep-2015 11:30                   -
+fulcrum/                                           01-Nov-2005 00:35                   -
+ga/                                                30-Nov-2016 02:02                   -
+gabriel/                                           01-Nov-2005 00:35                   -
+gbean/                                             01-Nov-2005 00:35                   -
+generama/                                          17-Jul-2008 20:56                   -
+genjar/                                            01-Nov-2005 00:34                   -
+genjava/                                           01-Nov-2005 00:35                   -
+geronimo/                                          08-Jan-2007 15:55                   -
+geronimo-spec/                                     01-Nov-2005 00:35                   -
+gg/                                                12-May-2012 09:05                   -
+github/                                            30-Nov-2016 02:04                   -
+glassfish/                                         21-Aug-2011 14:33                   -
+global/                                            30-Nov-2016 02:04                   -
+gnu/                                               21-Aug-2011 14:33                   -
+gnu-regexp/                                        01-Nov-2005 00:35                   -
+gov/                                               30-Nov-2016 02:04                   -
+gr/                                                30-Nov-2016 02:18                   -
+graphlayout/                                       01-Nov-2005 00:35                   -
+grizzly/                                           21-Aug-2011 14:33                   -
+grizzly-cachetest/                                 21-Aug-2011 14:33                   -
+groovy/                                            30-Apr-2007 21:29                   -
+groovy-xmlrpc/                                     26-May-2006 21:50                   -
+gs/                                                08-Sep-2012 07:49                   -
+gsbase/                                            01-Nov-2005 00:35                   -
+guru/                                              26-Jan-2015 11:51                   -
+hessian/                                           01-Nov-2005 00:34                   -
+hibernate/                                         26-Dec-2008 14:12                   -
+hivemind/                                          01-Nov-2005 00:34                   -
+hm/                                                01-Aug-2014 20:22                   -
+howl/                                              01-Nov-2005 00:35                   -
+hr/                                                30-Nov-2016 02:20                   -
+hsqldb/                                            28-Oct-2005 01:27                   -
+htmlunit/                                          01-Nov-2005 00:34                   -
+httpcomponents-httpcore/                           02-Jul-2007 18:15                   -
+httpunit/                                          28-Oct-2005 01:26                   -
+hu/                                                30-Nov-2016 02:20                   -
+hudson/                                            21-Aug-2011 14:34                   -
+ical4j/                                            01-Nov-2005 00:34                   -
+icu/                                               03-Nov-2005 01:12                   -
+icu4j/                                             03-Nov-2005 21:39                   -
+id/                                                30-Nov-2016 02:21                   -
+idb/                                               01-Nov-2005 00:35                   -
+ie/                                                21-Dec-2015 09:56                   -
+iirekm/                                            21-Aug-2011 14:34                   -
+il/                                                30-Nov-2016 02:21                   -
+im/                                                30-Nov-2016 02:21                   -
+in/                                                30-Nov-2016 02:50                   -
+info/                                              30-Nov-2016 02:51                   -
+informa/                                           01-Nov-2005 00:34                   -
+innig/                                             01-Nov-2005 00:35                   -
+int/                                               24-Aug-2014 05:19                   -
+io/                                                30-Nov-2016 03:02                   -
+ir/                                                30-Nov-2016 13:35                   -
+is/                                                03-Nov-2014 11:18                   -
+isorelax/                                          01-Nov-2005 00:35                   -
+it/                                                30-Nov-2016 13:37                   -
+itext/                                             01-Nov-2005 00:35                   -
+ivory/                                             01-Nov-2005 00:35                   -
+izpack/                                            01-Nov-2005 00:35                   -
+jaas/                                              01-Nov-2005 00:35                   -
+jackcess/                                          01-Nov-2005 00:35                   -
+jackson/                                           06-Sep-2008 07:58                   -
+jacl/                                              01-Nov-2005 00:35                   -
+jaf/                                               28-Oct-2005 01:27                   -
+jaimbot/                                           01-Nov-2005 00:35                   -
+jakarta-regexp/                                    01-Nov-2005 00:34                   -
+jalopy/                                            01-Nov-2005 00:35                   -
+james/                                             01-Nov-2005 00:35                   -
+janino/                                            01-Nov-2005 00:35                   -
+jardiff/                                           14-Feb-2006 01:31                   -
+jarjar/                                            01-Nov-2005 00:35                   -
+jarsync/                                           01-Nov-2005 00:35                   -
+jasper-jsr199/                                     21-Aug-2011 14:37                   -
+jasperreports/                                     01-Nov-2005 00:35                   -
+java2html/                                         01-Nov-2005 00:34                   -
+java3d/                                            01-Nov-2005 00:35                   -
+java_cup/                                          01-Aug-2014 21:21                   -
+javacc/                                            01-Nov-2005 00:34                   -
+javaconfig/                                        01-Nov-2005 00:35                   -
+javadb/                                            21-Aug-2011 14:37                   -
+javadoc/                                           31-Oct-2005 19:40                   -
+javaee/                                            21-Aug-2011 14:37                   -
+javagroups/                                        01-Nov-2005 05:14                   -
+javainetlocator/                                   01-Nov-2005 05:03                   -
+javamail/                                          01-Nov-2005 05:07                   -
+javancss/                                          01-Nov-2005 05:19                   -
+javanettasks/                                      21-Aug-2011 14:37                   -
+javassist/                                         01-Apr-2008 07:08                   -
+javassist /                                        04-Apr-2008 17:18                   -
+javatar/                                           01-Nov-2005 05:19                   -
+javax/                                             20-Jul-2015 11:38                   -
+javazoom/                                          10-Nov-2012 09:25                   -
+javolution/                                        21-Aug-2011 17:05                   -
+jawin/                                             24-Nov-2005 06:03                   -
+jaxb/                                              21-Aug-2011 14:37                   -
+jaxen/                                             19-Oct-2006 19:23                   -
+jaxme/                                             06-Nov-2006 01:06                   -
+jaxr-ra/                                           21-Aug-2011 14:37                   -
+jblanket/                                          01-Nov-2005 05:11                   -
+jboss/                                             27-Apr-2013 08:15                   -
+jca/                                               01-Nov-2005 05:03                   -
+jcache/                                            01-Nov-2005 05:03                   -
+jcharts/                                           06-Dec-2007 02:46                   -
+jcifs/                                             29-Apr-2008 16:16                   -
+jcom/                                              24-Nov-2005 06:03                   -
+jcommon/                                           28-Oct-2005 01:27                   -
+jcoverage/                                         01-Nov-2005 05:20                   -
+jcs/                                               01-Nov-2005 05:03                   -
+jcs-javagroups/                                    01-Nov-2005 05:18                   -
+jcvsii/                                            01-Nov-2005 05:03                   -
+jdbc/                                              28-Oct-2005 01:26                   -
+jdbm/                                              01-Nov-2005 05:13                   -
+jdepend/                                           01-Nov-2005 05:03                   -
+jdiff/                                             01-Nov-2005 05:19                   -
+jdo/                                               01-Nov-2005 05:03                   -
+jdom/                                              28-Oct-2005 01:27                   -
+jdring/                                            01-Nov-2005 05:09                   -
+jdsl/                                              01-Nov-2005 05:04                   -
+jen/                                               21-Aug-2011 14:38                   -
+jencks/                                            01-Nov-2005 05:13                   -
+jep/                                               01-Nov-2005 05:03                   -
+jepi/                                              21-Aug-2011 14:38                   -
+jersey/                                            21-Aug-2011 14:38                   -
+jetty/                                             20-Oct-2006 15:24                   -
+jexcelapi/                                         06-Nov-2006 01:07                   -
+jface/                                             01-Nov-2005 05:09                   -
+jfree/                                             13-Dec-2006 19:51                   -
+jfreechart/                                        01-Nov-2005 05:15                   -
+jgen/                                              01-Nov-2005 05:20                   -
+jgoodies/                                          01-Nov-2005 05:13                   -
+jgraph/                                            01-Nov-2005 05:07                   -
+jgrapht/                                           01-Nov-2005 05:07                   -
+jgroups/                                           01-Nov-2005 05:04                   -
+jhunlang/                                          01-Nov-2005 05:04                   -
+jini/                                              10-Dec-2005 02:18                   -
+jintention/                                        21-Aug-2011 14:38                   -
+jisp/                                              01-Nov-2005 05:10                   -
+jivesoftware/                                      01-Nov-2005 05:03                   -
+jlibdiff/                                          01-Nov-2005 05:03                   -
+jline/                                             19-Oct-2006 19:23                   -
+jmagick/                                           21-Aug-2011 14:38                   -
+jmaki/                                             21-Aug-2011 14:38                   -
+jmdns/                                             01-Nov-2005 05:14                   -
+jmimemagic/                                        01-Nov-2005 05:14                   -
+jmml/                                              01-Nov-2005 05:12                   -
+jmock/                                             28-Oct-2005 01:26                   -
+jms/                                               28-Oct-2005 01:27                   -
+jmscts/                                            01-Nov-2005 05:09                   -
+jmsn/                                              01-Nov-2005 05:16                   -
+joda-time/                                         15-Nov-2009 14:12                   -
+john-test/                                         29-May-2008 08:01                   -
+jotm/                                              01-Nov-2005 05:20                   -
+jp/                                                30-Nov-2016 13:53                   -
+jparsec/                                           26-Aug-2006 17:55                   -
+jpl/                                               10-Nov-2012 09:26                   -
+jpox/                                              21-Jan-2008 06:44                   -
+jpox-dbcp/                                         13-Mar-2007 21:30                   -
+jpox-enhancer/                                     13-Mar-2007 21:30                   -
+jpox-java5/                                        13-Mar-2007 21:30                   -
+jrexx/                                             01-Nov-2005 05:11                   -
+jrms/                                              01-Nov-2005 05:19                   -
+jrobin/                                            01-Nov-2005 05:06                   -
+jruby/                                             21-Aug-2007 18:14                   -
+jsch/                                              28-Oct-2005 01:26                   -
+jsf-extensions/                                    21-Aug-2011 14:38                   -
+jspapi/                                            28-Oct-2005 01:26                   -
+jsptags/                                           01-Nov-2005 05:15                   -
+jstl/                                              28-Oct-2005 01:26                   -
+jstyle/                                            01-Nov-2005 05:09                   -
+jta/                                               28-Oct-2005 01:26                   -
+jtds/                                              20-Jan-2006 12:18                   -
+jtidy/                                             28-Oct-2005 01:27                   -
+juddi/                                             01-Nov-2005 05:03                   -
+jug/                                               01-Nov-2005 05:12                   -
+jung/                                              01-Nov-2005 05:03                   -
+junit/                                             10-May-2009 13:17                   -
+junit-addons/                                      28-Oct-2005 01:27                   -
+junit-doclet/                                      01-Nov-2005 05:19                   -
+junitperf/                                         01-Nov-2005 05:21                   -
+juno/                                              21-Aug-2011 14:38                   -
+jwebunit/                                          01-Nov-2005 05:10                   -
+jxta/                                              01-Nov-2005 05:10                   -
+jython/                                            01-Nov-2005 05:04                   -
+kawa/                                              01-Nov-2005 05:04                   -
+kg/                                                23-Feb-2013 09:19                   -
+kohsuke/                                           21-Aug-2011 14:38                   -
+kr/                                                30-Nov-2016 13:56                   -
+kxml/                                              01-Nov-2005 05:09                   -
+kxml2/                                             01-Nov-2005 05:07                   -
+kz/                                                04-Jan-2016 09:50                   -
+la/                                                20-Apr-2015 11:09                   -
+ldapd-common/                                      01-Nov-2005 05:21                   -
+ldapsdk/                                           01-Nov-2005 05:11                   -
+li/                                                30-Nov-2016 14:03                   -
+life/                                              30-Nov-2016 14:04                   -
+lingo/                                             01-Nov-2005 05:21                   -
+link/                                              07-Dec-2015 11:24                   -
+locc/                                              01-Nov-2005 05:11                   -
+log4j/                                             28-Nov-2007 21:22                   -
+log4unit/                                          01-Nov-2005 05:20                   -
+logkit/                                            02-Nov-2005 09:29                   -
+loom/                                              01-Nov-2005 05:21                   -
+lpg/                                               16-Nov-2013 10:06                   -
+lt/                                                19-Jan-2013 09:12                   -
+lucene/                                            01-Nov-2005 05:04                   -
+lv/                                                22-Feb-2016 10:49                   -
+ly/                                                29-Sep-2014 10:35                   -
+ma/                                                30-Nov-2016 14:08                   -
+magicGball/                                        01-Nov-2005 05:03                   -
+maps/                                              21-Aug-2011 14:38                   -
+market/                                            12-Oct-2015 22:45                   -
+marmalade/                                         21-Jul-2006 17:02                   -
+math/                                              23-Nov-2013 10:01                   -
+maven/                                             06-Nov-2006 01:08                   -
+maven-integration-test-helper/                     11-Jun-2011 11:01                   -
+maven-javanet-plugin/                              21-Aug-2011 14:39                   -
+maven-new/                                         01-Nov-2005 05:06                   -
+maven-plugins/                                     06-Nov-2006 01:07                   -
+maven-proxy/                                       01-Nov-2005 05:03                   -
+maven-taglib/                                      01-Nov-2005 05:19                   -
+maven-torque-plugin/                               01-Nov-2005 05:03                   -
+maven-validator/                                   01-Nov-2005 05:07                   -
+maven-xdoclet2-plugin/                             01-Nov-2005 05:19                   -
+maxq/                                              01-Nov-2005 05:09                   -
+mckoi/                                             01-Nov-2005 05:12                   -
+md/                                                30-Nov-2016 14:09                   -
+me/                                                30-Nov-2016 14:09                   -
+merlin/                                            01-Nov-2005 05:02                   -
+merlin-developer/                                  01-Nov-2005 05:19                   -
+merlin-tutorial/                                   01-Nov-2005 05:15                   -
+messenger/                                         01-Nov-2005 05:08                   -
+metaclass/                                         01-Nov-2005 05:08                   -
+mevenide/                                          01-Nov-2005 05:14                   -
+microcontainer/                                    01-Nov-2005 05:16                   -
+middlegen/                                         01-Nov-2005 05:03                   -
+mil/                                               30-Nov-2016 14:19                   -
+milyn/                                             16-May-2007 17:40                   -
+ml/                                                30-Nov-2016 14:20                   -
+mm/                                                01-Nov-2005 05:12                   -
+mm-mysql/                                          01-Nov-2005 05:16                   -
+mobi/                                              30-Nov-2016 14:22                   -
+mockcreator/                                       01-Nov-2005 05:09                   -
+mockit/                                            21-Aug-2011 14:39                   -
+mockmaker/                                         01-Nov-2005 05:07                   -
+mockobjects/                                       01-Nov-2005 05:05                   -
+mockrunner/                                        24-Nov-2005 06:03                   -
+modello/                                           01-Nov-2005 05:12                   -
+mrj/                                               01-Nov-2005 05:14                   -
+ms/                                                01-Aug-2014 21:28                   -
+mstor/                                             01-Nov-2005 05:14                   -
+msv/                                               01-Nov-2005 05:15                   -
+mule/                                              10-Apr-2007 13:34                   -
+muse/                                              01-Nov-2005 05:11                   -
+mx/                                                22-Feb-2016 10:54                   -
+mx4j/                                              01-Nov-2005 05:14                   -
+myfaces/                                           21-Nov-2005 13:21                   -
+mysql/                                             15-Oct-2011 10:12                   -
+name/                                              30-Nov-2016 14:22                   -
+nanning/                                           01-Nov-2005 05:11                   -
+nanocontainer/                                     14-Jun-2006 10:28                   -
+nekohtml/                                          01-Jun-2008 16:25                   -
+neo/                                               01-Nov-2005 05:08                   -
+net/                                               30-Nov-2016 14:23                   -
+netbeans/                                          01-Nov-2005 05:04                   -
+new/                                               21-Aug-2011 15:09                   -
+nf/                                                02-Mar-2013 10:13                   -
+ng/                                                30-Nov-2016 16:55                   -
+ninja/                                             16-Nov-2015 14:52                   -
+nl/                                                30-Nov-2016 16:55                   -
+no/                                                30-Nov-2016 17:07                   -
+norbert/                                           01-Nov-2005 05:03                   -
+np/                                                17-Nov-2014 12:32                   -
+nsuml/                                             01-Nov-2005 05:16                   -
+nu/                                                30-Nov-2016 17:15                   -
+nz/                                                30-Nov-2016 17:15                   -
+oauth/                                             26-Feb-2010 19:44                   -
+odmg/                                              28-Oct-2005 01:27                   -
+ognl/                                              20-Jun-2007 20:09                   -
+ojb/                                               01-Nov-2005 05:11                   -
+ojdbc/                                             28-Oct-2005 01:26                   -
+old/                                               01-Nov-2005 05:13                   -
+one/                                               30-Nov-2015 14:42                   -
+oness/                                             01-Nov-2005 05:13                   -
+online/                                            30-Nov-2016 17:23                   -
+open/                                              21-Aug-2011 15:33                   -
+open-esb/                                          21-Aug-2011 15:33                   -
+opencypher/                                        30-Nov-2016 17:23                   -
+openejb/                                           07-May-2006 00:35                   -
+openim/                                            01-Nov-2005 05:12                   -
+openjms/                                           01-Nov-2005 05:03                   -
+opennms/                                           01-Nov-2005 05:06                   -
+opensymphony/                                      19-Feb-2009 14:07                   -
+oracle/                                            21-Aug-2011 15:33                   -
+org/                                               30-Nov-2016 17:23                   -
+org.elasticsearch/                                 30-Nov-2016 17:23                   -
+org.elasticsearch.client/                          30-Nov-2016 17:23                   -
+org.elasticsearch.distribution.integ-test-zip/     30-Nov-2016 17:23                   -
+org.elasticsearch.distribution.zip/                30-Nov-2016 17:23                   -
+org.elasticsearch.gradle/                          30-Nov-2016 17:23                   -
+org.elasticsearch.plugin/                          30-Nov-2016 17:23                   -
+org.elasticsearch.test/                            30-Nov-2016 17:23                   -
+oro/                                               28-Oct-2005 01:27                   -
+oscube/                                            01-Nov-2005 05:02                   -
+p2psockets/                                        01-Nov-2005 05:15                   -
+p6spy/                                             01-Nov-2005 05:05                   -
+patterntesting/                                    01-Nov-2005 05:05                   -
+payload/                                           01-Nov-2005 05:03                   -
+pcj/                                               01-Nov-2005 05:09                   -
+pdfbox/                                            01-Nov-2005 05:16                   -
+pe/                                                21-Nov-2016 12:45                   -
+penguin/                                           01-Nov-2005 05:10                   -
+petridish/                                         01-Nov-2005 05:06                   -
+ph/                                                30-Jun-2012 17:32                   -
+piccolo/                                           01-Nov-2005 05:03                   -
+picocontainer/                                     14-Jun-2006 10:25                   -
+picounit/                                          01-Nov-2005 05:10                   -
+pircbot/                                           01-Nov-2005 05:06                   -
+pitt/                                              07-Dec-2013 15:12                   -
+pl/                                                25-Jan-2016 18:00                   -
+plexus/                                            04-Jan-2007 19:16                   -
+plj/                                               01-Nov-2005 05:14                   -
+plugin/                                            01-Nov-2005 05:07                   -
+pluto-container/                                   01-Nov-2005 05:07                   -
+pmd/                                               10-Aug-2008 09:08                   -
+pnuts/                                             22-Aug-2011 09:13                   -
+poi/                                               28-Oct-2005 23:26                   -
+poolman/                                           01-Nov-2005 05:20                   -
+portlet-api/                                       01-Nov-2005 05:10                   -
+postgresql/                                        01-Nov-2005 05:15                   -
+prevayler/                                         01-Nov-2005 05:13                   -
+pro/                                               03-Nov-2015 02:37                   -
+proctor/                                           22-Aug-2011 09:13                   -
+profiler/                                          01-Nov-2005 05:11                   -
+proxool/                                           28-Oct-2005 01:27                   -
+proxytoys/                                         01-Nov-2005 05:04                   -
+pt/                                                15-Dec-2015 03:32                   -
+pubscribe/                                         01-Nov-2005 05:11                   -
+pull-parser/                                       28-Oct-2005 01:27                   -
+pw/                                                26-Oct-2013 13:30                   -
+qdox/                                              28-Oct-2005 01:27                   -
+qfork/                                             01-Nov-2005 05:14                   -
+quartz/                                            01-Nov-2005 05:16                   -
+quartz-jboss/                                      26-Feb-2010 21:25                   -
+quartz-oracle/                                     26-Feb-2010 21:25                   -
+quartz-weblogic/                                   26-Feb-2010 21:25                   -
+quilt/                                             01-Nov-2005 05:12                   -
+radeox/                                            01-Nov-2005 05:14                   -
+re/                                                17-Aug-2014 12:17                   -
+readline/                                          01-Nov-2005 05:10                   -
+red/                                               21-Nov-2016 12:45                   -
+redhill/                                           01-Nov-2005 05:03                   -
+redis/                                             09-Oct-2010 07:48                   -
+redmine/                                           22-Aug-2011 09:13                   -
+regexp/                                            19-Oct-2006 19:23                   -
+relaxngDatatype/                                   01-Nov-2005 05:15                   -
+ren/                                               19-Oct-2015 23:59                   -
+reportrunner/                                      01-Nov-2005 05:15                   -
+rest/                                              21-Nov-2016 12:45                   -
+rhino/                                             01-Nov-2005 05:11                   -
+ro/                                                21-Dec-2015 16:56                   -
+robo-guice/                                        22-Aug-2011 09:13                   -
+roboguice/                                         22-Aug-2011 09:13                   -
+rocks/                                             20-Oct-2014 18:43                   -
+roller/                                            22-Aug-2011 09:13                   -
+rome/                                              22-Aug-2011 09:13                   -
+rs/                                                01-Dec-2014 19:54                   -
+rss4j/                                             01-Nov-2005 05:08                   -
+rsslibj/                                           01-Nov-2005 05:04                   -
+ru/                                                14-Mar-2016 15:50                   -
+rubygems/                                          27-Oct-2015 00:40                   -
+run/                                               21-Nov-2016 12:45                   -
+sablecc/                                           01-Nov-2005 05:04                   -
+sax/                                               01-Nov-2005 05:11                   -
+saxon/                                             19-Oct-2006 19:23                   -
+saxpath/                                           28-Oct-2005 01:26                   -
+sc/                                                15-Jun-2015 21:26                   -
+science/                                           21-Nov-2016 12:45                   -
+scout/                                             29-Oct-2005 08:00                   -
+scraping-engine/                                   01-Nov-2005 05:07                   -
+se/                                                11-Jan-2016 15:55                   -
+securityfilter/                                    01-Nov-2005 05:13                   -
+servicemix/                                        25-Mar-2006 00:55                   -
+servicemix-ws/                                     01-Nov-2005 05:15                   -
+servletapi/                                        28-Oct-2005 23:26                   -
+servlets/                                          01-Nov-2005 05:12                   -
+setpoint/                                          06-Nov-2006 01:09                   -
+sfx4j/                                             22-Aug-2011 09:14                   -
+sg/                                                21-Nov-2016 12:45                   -
+sh/                                                10-Nov-2015 04:31                   -
+shellix/                                           22-Aug-2011 09:14                   -
+shocks/                                            01-Nov-2005 05:11                   -
+si/                                                15-Feb-2016 16:33                   -
+sillyexceptions/                                   01-Nov-2005 05:04                   -
+simple-jms/                                        09-Dec-2005 01:32                   -
+simple-jndi/                                       01-Nov-2005 05:19                   -
+sk/                                                15-Feb-2016 16:33                   -
+skaringa/                                          01-Nov-2005 05:09                   -
+skinlf/                                            01-Nov-2005 05:03                   -
+slide/                                             01-Nov-2005 05:14                   -
+smartrics/                                         15-Dec-2012 12:57                   -
+soap/                                              01-Nov-2005 05:04                   -
+software/                                          14-Mar-2016 15:54                   -
+soimp/                                             22-Aug-2011 09:14                   -
+solarisrealm/                                      22-Aug-2011 09:14                   -
+solutions/                                         20-Oct-2015 00:09                   -
+space/                                             21-Nov-2016 12:45                   -
+speexx/                                            01-Nov-2005 05:04                   -
+spice/                                             01-Nov-2005 05:03                   -
+spring/                                            01-Nov-2005 05:07                   -
+springframework/                                   01-Nov-2005 05:11                   -
+springmodules/                                     19-Jun-2006 22:22                   -
+sqlline/                                           09-Mar-2015 21:41                   -
+sshtools/                                          01-Nov-2005 05:03                   -
+sslext/                                            01-Nov-2005 05:04                   -
+st/                                                10-Aug-2015 22:33                   -
+stapler/                                           22-Aug-2011 09:15                   -
+statcvs/                                           01-Nov-2005 05:07                   -
+stax/                                              06-Nov-2006 01:09                   -
+stax-utils/                                        01-Nov-2005 05:11                   -
+stratum/                                           01-Nov-2005 05:14                   -
+stream/                                            21-Nov-2016 12:45                   -
+struts/                                            01-Nov-2005 05:15                   -
+struts-menu/                                       01-Nov-2005 05:03                   -
+strutstestcase/                                    01-Nov-2005 05:12                   -
+studio/                                            21-Nov-2016 12:45                   -
+stxx/                                              01-Nov-2005 05:05                   -
+su/                                                10-Aug-2014 15:19                   -
+subpersistence/                                    01-Nov-2005 05:09                   -
+subshell/                                          01-Nov-2005 05:03                   -
+suiterunner/                                       01-Nov-2005 05:09                   -
+surefire/                                          28-Oct-2005 01:26                   -
+swarmcache/                                        28-Oct-2005 01:26                   -
+swt/                                               01-Nov-2005 05:05                   -
+systems/                                           18-Jan-2016 16:33                   -
+sysunit/                                           01-Nov-2005 05:15                   -
+tablelayout/                                       01-Nov-2005 05:14                   -
+tagalog/                                           01-Nov-2005 05:16                   -
+tagishauth/                                        01-Nov-2005 05:03                   -
+taglibrarydoc/                                     01-Nov-2005 05:07                   -
+taglibs/                                           01-Nov-2005 05:06                   -
+tagsoup/                                           05-Nov-2005 01:42                   -
+tambora/                                           01-Nov-2005 05:20                   -
+tanukisoft/                                        07-Mar-2008 02:07                   -
+tapestry/                                          01-Nov-2005 05:04                   -
+tclib/                                             01-Nov-2005 05:07                   -
+tec/                                               23-Mar-2015 21:07                   -
+tech/                                              22-Feb-2016 17:58                   -
+technology/                                        15-Dec-2015 03:41                   -
+textarea/                                          01-Nov-2005 05:16                   -
+th/                                                13-Oct-2015 11:58                   -
+thaiopensource/                                    19-Oct-2006 19:23                   -
+tiffrenderer/                                      01-Nov-2005 05:09                   -
+tjdo/                                              01-Nov-2005 05:03                   -
+tk/                                                11-Jan-2016 15:58                   -
+tl/                                                13-Jul-2013 12:50                   -
+tmporb/                                            01-Nov-2005 05:09                   -
+to/                                                25-Jan-2016 18:06                   -
+tokyo/                                             21-Nov-2016 12:45                   -
+tomcat/                                            24-Jan-2008 04:19                   -
+tomcat-util/                                       01-Nov-2005 05:20                   -
+tonic/                                             08-Nov-2005 05:35                   -
+tools/                                             29-Feb-2016 17:11                   -
+top/                                               08-Feb-2016 18:28                   -
+toplink/                                           22-Aug-2011 09:16                   -
+torque/                                            11-Jan-2008 22:47                   -
+torque-gen/                                        01-Nov-2005 05:04                   -
+touchstone/                                        01-Nov-2005 05:10                   -
+tr/                                                15-Dec-2015 03:41                   -
+traer/                                             07-Apr-2012 17:18                   -
+trail-taglib/                                      01-Nov-2005 05:04                   -
+tranql/                                            01-Nov-2005 05:10                   -
+travel/                                            04-May-2015 22:09                   -
+trove/                                             01-Nov-2005 05:08                   -
+turbine/                                           01-Nov-2005 05:04                   -
+tv/                                                18-Jan-2016 16:34                   -
+tw/                                                18-May-2015 21:53                   -
+tyrex/                                             01-Nov-2005 05:14                   -
+ua/                                                29-Feb-2016 17:11                   -
+uaihebert/                                         23-Feb-2013 13:20                   -
+ubique/                                            01-Nov-2005 05:15                   -
+ug/                                                25-Jan-2016 18:07                   -
+uispec4j/                                          01-Nov-2005 05:07                   -
+uk/                                                10-Aug-2015 22:35                   -
+uno/                                               01-Dec-2015 04:36                   -
+urbanophile/                                       01-Nov-2005 05:03                   -
+urlrewrite/                                        24-Nov-2005 06:03                   -
+us/                                                18-Jan-2016 16:35                   -
+uy/                                                24-Aug-2015 23:36                   -
+vc/                                                28-Dec-2015 15:38                   -
+vdoclet/                                           01-Nov-2005 05:11                   -
+velocity/                                          29-Apr-2007 21:29                   -
+velocity-anakia/                                   29-Apr-2007 21:29                   -
+velocity-dvsl/                                     01-Nov-2005 05:12                   -
+velocity-tools/                                    01-Nov-2005 05:10                   -
+village/                                           01-Nov-2005 05:04                   -
+vn/                                                02-Dec-2016 00:09                   -
+vu/                                                20-Jul-2013 12:57                   -
+wadi/                                              01-Nov-2005 05:15                   -
+wang/                                              10-Aug-2015 22:36                   -
+webmacro/                                          01-Nov-2005 05:12                   -
+website/                                           22-Feb-2016 18:03                   -
+webtest/                                           01-Nov-2005 05:19                   -
+werken-xpath/                                      28-Oct-2005 01:26                   -
+werkflow/                                          01-Nov-2005 05:16                   -
+werkz/                                             01-Nov-2005 05:08                   -
+westhawk/                                          01-Nov-2005 05:18                   -
+wf/                                                10-Nov-2014 19:54                   -
+which/                                             01-Nov-2005 05:16                   -
+wicket/                                            11-Aug-2008 15:44                   -
+wiki/                                              22-Feb-2016 18:03                   -
+win/                                               21-Nov-2016 12:45                   -
+woodstox/                                          21-Nov-2007 04:35                   -
+work/                                              18-Jan-2016 16:37                   -
+works/                                             22-Feb-2016 18:03                   -
+wrapper/                                           01-Nov-2005 05:14                   -
+ws/                                                25-Jan-2016 18:11                   -
+ws-commons/                                        19-Sep-2006 14:21                   -
+ws-commons-java5/                                  01-Nov-2005 05:03                   -
+ws-commons-util/                                   01-Nov-2005 05:16                   -
+ws-scout/                                          18-Feb-2006 13:32                   -
+wsdl4j/                                            01-Nov-2005 05:07                   -
+wsrf/                                              01-Nov-2005 05:08                   -
+wss4j/                                             02-May-2006 20:32                   -
+wstx/                                              01-Nov-2005 05:09                   -
+wurfl/                                             01-Nov-2005 05:14                   -
+wutka/                                             01-Nov-2005 05:21                   -
+xajile/                                            03-Aug-2009 09:25                   -
+xalan/                                             30-Sep-2008 08:02                   -
+xbean/                                             04-Jan-2006 17:31                   -
+xdoclet/                                           17-Jul-2008 21:29                   -
+xdoclet-plugins/                                   02-Jul-2006 21:14                   -
+xerces/                                            19-Oct-2006 19:23                   -
+xercesjarv/                                        01-Nov-2005 05:06                   -
+xfire/                                             06-Nov-2006 01:09                   -
+xfire-root/                                        01-Nov-2005 05:03                   -
+xin/                                               21-Nov-2016 12:45                   -
+xjavadoc/                                          01-Nov-2005 05:14                   -
+xml-apis/                                          22-Dec-2006 13:37                   -
+xml-resolver/                                      01-Nov-2005 05:11                   -
+xml-security/                                      19-Oct-2006 19:23                   -
+xmlbeans/                                          03-Jul-2007 16:43                   -
+xmldb/                                             01-Nov-2005 05:12                   -
+xmlenc/                                            01-Nov-2005 05:19                   -
+xmlmind/                                           01-Nov-2005 05:21                   -
+xmlpull/                                           01-Nov-2005 05:21                   -
+xmlrpc/                                            25-Jun-2006 02:41                   -
+xmlrpc-helma/                                      01-Nov-2005 05:03                   -
+xmlunit/                                           15-Sep-2008 23:50                   -
+xmlwise/                                           27-Oct-2012 10:59                   -
+xmlwriter/                                         01-Nov-2005 05:04                   -
+xom/                                               19-Oct-2006 19:23                   -
+xpp3/                                              28-Oct-2005 01:26                   -
+xsddoc/                                            01-Nov-2005 05:19                   -
+xsdlib/                                            01-Nov-2005 05:04                   -
+xstream/                                           27-Nov-2006 21:45                   -
+xtc/                                               07-Apr-2012 17:20                   -
+xtiff-jai/                                         01-Nov-2005 05:10                   -
+xxl/                                               01-Nov-2005 05:12                   -
+xyz/                                               08-Feb-2016 18:33                   -
+yan/                                               13-Jan-2006 21:31                   -
+ymsg/                                              01-Nov-2005 05:04                   -
+yom/                                               01-Nov-2005 05:08                   -
+za/                                                25-May-2013 12:39                   -
+zone/                                              26-Jan-2015 23:05                   -
+94a8262a403880.properties                          03-Feb-2015 07:36                 301
+94a8262a403880.properties.md5                      20-May-2015 05:24                  32
+94a8262a403880.properties.sha1                     20-May-2015 05:24                  40
+9e9bbc30f020cf.properties                          03-Oct-2014 19:03                 310
+9e9bbc30f020cf.properties.md5                      02-Nov-2014 16:27                  32
+9e9bbc30f020cf.properties.sha1                     02-Nov-2014 16:27                  40
+archetype-catalog.xml                              27-Nov-2016 13:20             5385400
+archetype-catalog.xml.md5                          27-Nov-2016 13:20                  32
+archetype-catalog.xml.sha1                         27-Nov-2016 13:20                  40
+fb69c44c24b38.properties                           17-Apr-2014 13:29                 307
+fb69c44c24b38.properties.md5                       02-Nov-2014 14:37                  32
+fb69c44c24b38.properties.sha1                      02-Nov-2014 14:37                  40
+last_updated.txt                                   28-Nov-2016 06:55                  29
+robots.txt                                         10-Nov-2009 12:12                  26
+server.txt                                         08-Nov-2014 19:04                 207
+

+ diff --git a/pdfbox-0.8.0-incubating_2.jar b/pdfbox-0.8.0-incubating_2.jar new file mode 100644 index 000000000..df1ca619e --- /dev/null +++ b/pdfbox-0.8.0-incubating_2.jar @@ -0,0 +1,889 @@ + +Index of /maven2/ + +

Index of /maven2/


../
+HTTPClient/                                        01-Nov-2005 05:03                   -
+abbot/                                             28-Sep-2015 06:18                   -
+acegisecurity/                                     23-Dec-2005 12:20                   -
+activation/                                        21-Dec-2005 15:37                   -
+activecluster/                                     01-Nov-2005 05:09                   -
+activeio/                                          01-Nov-2005 05:10                   -
+activemq/                                          01-Nov-2005 05:13                   -
+activemq-jaxb/                                     01-Nov-2005 05:11                   -
+activesoap/                                        01-Nov-2005 05:20                   -
+activespace/                                       01-Nov-2005 05:04                   -
+adarwin/                                           01-Nov-2005 05:03                   -
+ae/                                                06-Apr-2015 06:14                   -
+aelfred/                                           01-Nov-2005 05:03                   -
+aero/                                              01-Aug-2014 14:03                   -
+ai/                                                28-Nov-2016 07:10                   -
+aislib/                                            01-Nov-2005 05:14                   -
+al/                                                21-Nov-2016 13:18                   -
+altrmi/                                            01-Nov-2005 05:14                   -
+am/                                                21-Nov-2016 13:19                   -
+andromda/                                          01-Nov-2005 05:19                   -
+annogen/                                           01-Nov-2005 05:19                   -
+ant/                                               01-Nov-2005 05:17                   -
+ant-contrib/                                       08-Aug-2008 22:17                   -
+ant-doxygen/                                       01-Nov-2005 05:04                   -
+ant4eclipse/                                       21-Aug-2011 11:53                   -
+antlr/                                             01-Nov-2005 05:12                   -
+anttex/                                            01-Nov-2005 05:19                   -
+aopalliance/                                       28-Oct-2005 01:26                   -
+apache-jaxme/                                      01-Nov-2005 05:10                   -
+aptconvert/                                        01-Nov-2005 05:07                   -
+ar/                                                06-Mar-2008 17:19                   -
+args4j/                                            16-Mar-2013 07:01                   -
+as/                                                25-May-2015 06:15                   -
+ashkay/                                            01-Nov-2005 05:13                   -
+ashkelon/                                          01-Nov-2005 05:20                   -
+asia/                                              23-Feb-2013 08:01                   -
+asm/                                               07-Jul-2009 04:08                   -
+aspectj/                                           21-Dec-2005 12:23                   -
+aspectwerkz/                                       01-Nov-2005 05:09                   -
+at/                                                28-Nov-2016 07:12                   -
+au/                                                12-Oct-2015 07:37                   -
+avalon/                                            19-Oct-2006 19:23                   -
+avalon-activation/                                 01-Nov-2005 05:20                   -
+avalon-apps/                                       01-Nov-2005 05:14                   -
+avalon-composition/                                01-Nov-2005 05:13                   -
+avalon-cornerstone/                                01-Nov-2005 05:02                   -
+avalon-extension/                                  01-Nov-2005 05:09                   -
+avalon-framework/                                  01-Nov-2005 05:15                   -
+avalon-http/                                       18-Jul-2006 18:10                   -
+avalon-logging/                                    01-Nov-2005 05:19                   -
+avalon-logkit/                                     01-Nov-2005 05:11                   -
+avalon-meta/                                       01-Nov-2005 05:05                   -
+avalon-phoenix/                                    01-Nov-2005 05:10                   -
+avalon-repository/                                 01-Nov-2005 05:10                   -
+avalon-util/                                       01-Nov-2005 05:12                   -
+axion/                                             01-Nov-2005 05:20                   -
+axis/                                              19-Oct-2006 19:23                   -
+axis2/                                             04-May-2006 20:31                   -
+azote/                                             01-Nov-2005 05:14                   -
+ba/                                                29-Jun-2015 06:17                   -
+backport-util-concurrent/                          20-Feb-2008 05:30                   -
+backport175/                                       01-Nov-2005 05:07                   -
+band/                                              21-Nov-2016 13:41                   -
+barsuift/                                          21-Aug-2011 11:54                   -
+batik/                                             01-Nov-2005 05:09                   -
+bcel/                                              28-Oct-2005 01:26                   -
+be/                                                21-Nov-2016 13:41                   -
+beehive/                                           01-Nov-2005 05:10                   -
+berkano/                                           01-Nov-2005 05:14                   -
+berkeleydb/                                        01-Nov-2005 05:06                   -
+binky/                                             26-Feb-2010 19:31                   -
+biz/                                               14-Mar-2016 06:15                   -
+black/                                             01-Jun-2015 06:20                   -
+blissed/                                           01-Nov-2005 05:04                   -
+boo/                                               06-Nov-2006 01:04                   -
+bouncycastle/                                      03-Sep-2009 13:30                   -
+boxstuff/                                          01-Nov-2005 05:12                   -
+br/                                                21-Nov-2016 13:45                   -
+bsf/                                               01-Nov-2005 05:03                   -
+bsh/                                               01-Nov-2005 05:03                   -
+burlap/                                            01-Nov-2005 05:03                   -
+by/                                                12-Jan-2015 07:18                   -
+bz/                                                01-Aug-2014 14:08                   -
+c10n/                                              09-Mar-2013 08:02                   -
+c3p0/                                              01-Nov-2005 05:06                   -
+ca/                                                21-Nov-2016 13:53                   -
+cactus/                                            11-Apr-2008 19:59                   -
+cargo/                                             01-Nov-2005 05:07                   -
+cas/                                               22-Jun-2006 17:05                   -
+castor/                                            06-Dec-2007 02:46                   -
+cat/                                               21-Nov-2016 14:02                   -
+cc/                                                21-Nov-2016 14:02                   -
+cd/                                                05-Jan-2015 07:18                   -
+cewolf/                                            01-Nov-2005 05:04                   -
+cf/                                                01-Aug-2014 14:11                   -
+cglib/                                             29-Feb-2016 07:17                   -
+ch/                                                21-Nov-2016 14:07                   -
+charlotte/                                         01-Nov-2005 05:04                   -
+checkstyle/                                        28-Oct-2005 01:27                   -
+cl/                                                06-Jul-2015 06:24                   -
+classworlds/                                       01-Nov-2005 05:10                   -
+clickstream/                                       24-Nov-2005 06:03                   -
+clirr/                                             01-Nov-2005 05:04                   -
+cloud/                                             21-Nov-2016 14:20                   -
+clover/                                            01-Nov-2005 05:11                   -
+cm/                                                21-Nov-2016 14:20                   -
+cmsdeploy/                                         06-Dec-2005 20:10                   -
+cn/                                                28-Nov-2016 07:25                   -
+co/                                                21-Nov-2016 14:24                   -
+cobertura/                                         06-Feb-2006 21:04                   -
+coconut/                                           01-Nov-2005 05:21                   -
+cocoon/                                            09-Jun-2008 20:01                   -
+code/                                              21-Aug-2011 11:56                   -
+code316/                                           01-Nov-2005 05:03                   -
+codehaus/                                          16-Jul-2008 22:44                   -
+codes/                                             01-Jun-2015 06:28                   -
+colt/                                              01-Nov-2005 05:03                   -
+com/                                               28-Nov-2016 07:29                   -
+commons-attributes/                                03-Jul-2006 21:30                   -
+commons-beanutils/                                 01-Dec-2012 08:50                   -
+commons-betwixt/                                   01-Nov-2005 05:13                   -
+commons-chain/                                     01-Jun-2008 18:20                   -
+commons-cli/                                       19-Mar-2009 20:08                   -
+commons-codec/                                     09-Aug-2009 21:14                   -
+commons-collections/                               15-Apr-2008 01:05                   -
+commons-compress/                                  01-Nov-2005 05:21                   -
+commons-configuration/                             11-Jan-2009 14:01                   -
+commons-daemon/                                    01-Nov-2005 05:12                   -
+commons-dbcp/                                      28-Oct-2005 01:26                   -
+commons-dbutils/                                   26-Apr-2009 04:30                   -
+commons-digester/                                  03-Jan-2009 21:44                   -
+commons-discovery/                                 01-Nov-2005 05:03                   -
+commons-el/                                        28-Oct-2005 01:27                   -
+commons-email/                                     28-Sep-2007 19:29                   -
+commons-fileupload/                                20-Feb-2007 11:31                   -
+commons-grafolia/                                  01-Nov-2005 05:03                   -
+commons-grant/                                     01-Nov-2005 05:16                   -
+commons-graph/                                     01-Nov-2005 05:19                   -
+commons-http/                                      01-Nov-2005 05:21                   -
+commons-httpclient/                                01-Nov-2005 05:19                   -
+commons-i18n/                                      01-Nov-2005 05:19                   -
+commons-io/                                        01-Jan-2008 21:00                   -
+commons-jdbc2pool/                                 01-Nov-2005 05:11                   -
+commons-jelly/                                     01-Nov-2005 05:12                   -
+commons-jexl/                                      01-Nov-2005 05:08                   -
+commons-jux/                                       01-Nov-2005 05:05                   -
+commons-jxpath/                                    13-Aug-2008 22:13                   -
+commons-lang/                                      19-Mar-2008 05:42                   -
+commons-latka/                                     01-Nov-2005 05:19                   -
+commons-launcher/                                  03-Jul-2006 21:30                   -
+commons-logging/                                   26-Nov-2007 19:24                   -
+commons-math/                                      25-Feb-2008 00:30                   -
+commons-messenger/                                 01-Nov-2005 05:14                   -
+commons-modeler/                                   01-Nov-2005 05:03                   -
+commons-naming/                                    01-Nov-2005 05:13                   -
+commons-net/                                       30-Oct-2008 20:28                   -
+commons-pool/                                      21-Dec-2008 00:14                   -
+commons-primitives/                                01-Nov-2005 05:08                   -
+commons-resources/                                 01-Nov-2005 05:09                   -
+commons-scxml/                                     19-May-2008 19:41                   -
+commons-services/                                  28-Oct-2005 01:27                   -
+commons-sql/                                       01-Nov-2005 05:14                   -
+commons-test/                                      08-Nov-2005 09:49                   -
+commons-threadpool/                                01-Nov-2005 05:14                   -
+commons-transaction/                               01-Nov-2005 05:14                   -
+commons-util/                                      01-Nov-2005 05:19                   -
+commons-validator/                                 28-Oct-2005 01:27                   -
+commons-vfs/                                       01-Nov-2005 05:10                   -
+commons-xo/                                        01-Nov-2005 05:08                   -
+concurrent/                                        28-Oct-2005 01:26                   -
+consulting/                                        10-Aug-2015 10:55                   -
+continuum/                                         01-Nov-2005 05:04                   -
+controlhaus/                                       01-Nov-2005 05:19                   -
+cool/                                              29-Nov-2016 23:08                   -
+coop/                                              20-Oct-2014 09:33                   -
+cornerstone-connection/                            01-Nov-2005 05:20                   -
+cornerstone-datasources/                           01-Nov-2005 05:21                   -
+cornerstone-scheduler/                             01-Nov-2005 05:12                   -
+cornerstone-sockets/                               01-Nov-2005 05:13                   -
+cornerstone-store/                                 01-Nov-2005 05:03                   -
+cornerstone-threads/                               01-Nov-2005 05:07                   -
+cos/                                               06-Dec-2005 20:11                   -
+crimson/                                           01-Nov-2005 05:03                   -
+cryptix/                                           01-Nov-2005 05:07                   -
+cssparser/                                         21-Aug-2011 14:29                   -
+cz/                                                29-Nov-2016 23:08                   -
+d-haven-event/                                     01-Nov-2005 05:14                   -
+d-haven-eventbus/                                  01-Nov-2005 05:09                   -
+d-haven-mpool/                                     01-Nov-2005 05:16                   -
+dalma/                                             21-Aug-2011 14:29                   -
+dalms/                                             21-Aug-2011 14:29                   -
+damagecontrol/                                     01-Nov-2005 05:10                   -
+dataforge/                                         01-Nov-2005 05:11                   -
+datasift/                                          01-Nov-2005 05:14                   -
+dbunit/                                            01-Nov-2005 05:13                   -
+de/                                                29-Nov-2016 23:10                   -
+decorutils/                                        01-Nov-2005 05:04                   -
+dentaku/                                           01-Nov-2005 05:07                   -
+directory/                                         24-Dec-2005 17:47                   -
+directory-asn1/                                    01-Nov-2005 05:19                   -
+directory-authx/                                   01-Nov-2005 05:21                   -
+directory-clients/                                 01-Nov-2005 05:05                   -
+directory-naming/                                  01-Nov-2005 05:03                   -
+directory-network/                                 01-Nov-2005 05:07                   -
+directory-protocols/                               01-Nov-2005 05:09                   -
+directory-shared/                                  01-Nov-2005 05:19                   -
+displaytag/                                        12-Aug-2008 07:35                   -
+ditchnet/                                          24-Nov-2005 06:03                   -
+dk/                                                30-Nov-2016 00:31                   -
+dna/                                               01-Nov-2005 05:21                   -
+dnsjava/                                           01-Nov-2005 05:14                   -
+docbook/                                           16-Jun-2006 18:32                   -
+doccheck/                                          01-Nov-2005 05:10                   -
+dom4j/                                             01-Nov-2005 05:16                   -
+domify/                                            21-Aug-2011 14:31                   -
+dot-index/                                         15-Jul-2012 10:55                   -
+doxia/                                             28-Oct-2005 01:27                   -
+drone/                                             01-Nov-2005 05:03                   -
+drools/                                            31-Jan-2007 18:40                   -
+drools-examples/                                   01-Nov-2005 05:10                   -
+dsh-vocabulary/                                    01-Nov-2005 05:09                   -
+dtdparser/                                         01-Nov-2005 05:15                   -
+dumbster/                                          01-Nov-2005 05:03                   -
+dwr/                                               24-Nov-2005 06:03                   -
+dynaop/                                            01-Nov-2005 05:04                   -
+easyconf/                                          01-Nov-2005 05:19                   -
+easymock/                                          28-Oct-2005 01:27                   -
+ec/                                                26-Jan-2015 11:42                   -
+echo/                                              01-Nov-2005 05:07                   -
+echo3/                                             21-Aug-2011 14:32                   -
+echo3extras/                                       21-Aug-2011 14:32                   -
+eclipse/                                           01-Nov-2005 05:03                   -
+ecs/                                               01-Nov-2005 05:14                   -
+edenlib/                                           01-Nov-2005 05:05                   -
+edtftp/                                            01-Nov-2005 05:16                   -
+edu/                                               30-Nov-2016 00:32                   -
+ee/                                                30-Nov-2016 01:01                   -
+ehcache/                                           28-Oct-2005 01:26                   -
+ejb/                                               06-Dec-2005 20:11                   -
+el-impl/                                           21-Aug-2011 14:32                   -
+emberio/                                           01-Nov-2005 05:17                   -
+emma/                                              01-Nov-2005 05:03                   -
+enterprises/                                       07-Dec-2015 10:38                   -
+ervacon/                                           01-Nov-2005 05:21                   -
+es/                                                30-Nov-2016 01:01                   -
+esper/                                             29-Jan-2008 02:43                   -
+eu/                                                30-Nov-2016 01:03                   -
+eus/                                               27-Apr-2015 10:40                   -
+excalibur/                                         01-Nov-2005 05:06                   -
+excalibur-altrmi/                                  01-Nov-2005 05:05                   -
+excalibur-cli/                                     01-Nov-2005 05:07                   -
+excalibur-collections/                             01-Nov-2005 05:10                   -
+excalibur-component/                               01-Nov-2005 05:10                   -
+excalibur-component-examples/                      01-Nov-2005 05:04                   -
+excalibur-component-tests/                         01-Nov-2005 05:15                   -
+excalibur-concurrent/                              01-Nov-2005 05:07                   -
+excalibur-configuration/                           01-Nov-2005 05:09                   -
+excalibur-containerkit/                            01-Nov-2005 05:03                   -
+excalibur-datasource/                              01-Nov-2005 05:03                   -
+excalibur-event/                                   01-Nov-2005 05:03                   -
+excalibur-extension/                               01-Nov-2005 05:04                   -
+excalibur-fortress/                                01-Nov-2005 05:04                   -
+excalibur-i18n/                                    01-Nov-2005 05:15                   -
+excalibur-instrument/                              01-Nov-2005 05:10                   -
+excalibur-instrument-manager/                      01-Nov-2005 05:08                   -
+excalibur-instrument-manager-interfaces/           01-Nov-2005 05:07                   -
+excalibur-io/                                      01-Nov-2005 05:11                   -
+excalibur-lifecycle/                               01-Nov-2005 05:15                   -
+excalibur-logger/                                  01-Nov-2005 05:04                   -
+excalibur-monitor/                                 01-Nov-2005 05:15                   -
+excalibur-mpool/                                   01-Nov-2005 05:05                   -
+excalibur-naming/                                  01-Nov-2005 05:14                   -
+excalibur-pool/                                    01-Nov-2005 05:03                   -
+excalibur-sourceresolve/                           01-Nov-2005 05:14                   -
+excalibur-store/                                   01-Nov-2005 05:09                   -
+excalibur-thread/                                  01-Nov-2005 05:07                   -
+excalibur-util/                                    01-Nov-2005 05:15                   -
+excalibur-xmlutil/                                 01-Nov-2005 05:04                   -
+exist/                                             01-Nov-2005 05:12                   -
+exml/                                              01-Nov-2005 05:16                   -
+exo/                                               01-Nov-2005 00:35                   -
+exolabcore/                                        01-Nov-2005 00:35                   -
+exteca/                                            01-Nov-2005 00:35                   -
+external/                                          01-Aug-2014 20:15                   -
+farm/                                              26-Oct-2015 11:01                   -
+fastutil/                                          01-Nov-2005 00:35                   -
+fesi/                                              01-Nov-2005 00:35                   -
+fi/                                                30-Nov-2016 01:13                   -
+findbugs/                                          06-Nov-2006 01:05                   -
+fish/                                              18-May-2015 10:45                   -
+flox/                                              01-Nov-2005 00:35                   -
+flux/                                              21-Aug-2011 14:32                   -
+fm/                                                22-Feb-2016 09:57                   -
+foo/                                               30-Nov-2016 01:49                   -
+foo3/                                              21-Nov-2016 12:45                   -
+fop/                                               01-Nov-2005 00:35                   -
+forehead/                                          01-Nov-2005 00:35                   -
+formproc/                                          01-Nov-2005 00:34                   -
+foundation/                                        30-Nov-2016 01:49                   -
+foxtrot/                                           12-Nov-2011 11:19                   -
+fr/                                                30-Nov-2016 01:49                   -
+freebxml/                                          01-Nov-2005 00:34                   -
+freemarker/                                        01-Nov-2005 00:35                   -
+frl/                                               14-Sep-2015 11:30                   -
+fulcrum/                                           01-Nov-2005 00:35                   -
+ga/                                                30-Nov-2016 02:02                   -
+gabriel/                                           01-Nov-2005 00:35                   -
+gbean/                                             01-Nov-2005 00:35                   -
+generama/                                          17-Jul-2008 20:56                   -
+genjar/                                            01-Nov-2005 00:34                   -
+genjava/                                           01-Nov-2005 00:35                   -
+geronimo/                                          08-Jan-2007 15:55                   -
+geronimo-spec/                                     01-Nov-2005 00:35                   -
+gg/                                                12-May-2012 09:05                   -
+github/                                            30-Nov-2016 02:04                   -
+glassfish/                                         21-Aug-2011 14:33                   -
+global/                                            30-Nov-2016 02:04                   -
+gnu/                                               21-Aug-2011 14:33                   -
+gnu-regexp/                                        01-Nov-2005 00:35                   -
+gov/                                               30-Nov-2016 02:04                   -
+gr/                                                30-Nov-2016 02:18                   -
+graphlayout/                                       01-Nov-2005 00:35                   -
+grizzly/                                           21-Aug-2011 14:33                   -
+grizzly-cachetest/                                 21-Aug-2011 14:33                   -
+groovy/                                            30-Apr-2007 21:29                   -
+groovy-xmlrpc/                                     26-May-2006 21:50                   -
+gs/                                                08-Sep-2012 07:49                   -
+gsbase/                                            01-Nov-2005 00:35                   -
+guru/                                              26-Jan-2015 11:51                   -
+hessian/                                           01-Nov-2005 00:34                   -
+hibernate/                                         26-Dec-2008 14:12                   -
+hivemind/                                          01-Nov-2005 00:34                   -
+hm/                                                01-Aug-2014 20:22                   -
+howl/                                              01-Nov-2005 00:35                   -
+hr/                                                30-Nov-2016 02:20                   -
+hsqldb/                                            28-Oct-2005 01:27                   -
+htmlunit/                                          01-Nov-2005 00:34                   -
+httpcomponents-httpcore/                           02-Jul-2007 18:15                   -
+httpunit/                                          28-Oct-2005 01:26                   -
+hu/                                                30-Nov-2016 02:20                   -
+hudson/                                            21-Aug-2011 14:34                   -
+ical4j/                                            01-Nov-2005 00:34                   -
+icu/                                               03-Nov-2005 01:12                   -
+icu4j/                                             03-Nov-2005 21:39                   -
+id/                                                30-Nov-2016 02:21                   -
+idb/                                               01-Nov-2005 00:35                   -
+ie/                                                21-Dec-2015 09:56                   -
+iirekm/                                            21-Aug-2011 14:34                   -
+il/                                                30-Nov-2016 02:21                   -
+im/                                                30-Nov-2016 02:21                   -
+in/                                                30-Nov-2016 02:50                   -
+info/                                              30-Nov-2016 02:51                   -
+informa/                                           01-Nov-2005 00:34                   -
+innig/                                             01-Nov-2005 00:35                   -
+int/                                               24-Aug-2014 05:19                   -
+io/                                                30-Nov-2016 03:02                   -
+ir/                                                30-Nov-2016 13:35                   -
+is/                                                03-Nov-2014 11:18                   -
+isorelax/                                          01-Nov-2005 00:35                   -
+it/                                                30-Nov-2016 13:37                   -
+itext/                                             01-Nov-2005 00:35                   -
+ivory/                                             01-Nov-2005 00:35                   -
+izpack/                                            01-Nov-2005 00:35                   -
+jaas/                                              01-Nov-2005 00:35                   -
+jackcess/                                          01-Nov-2005 00:35                   -
+jackson/                                           06-Sep-2008 07:58                   -
+jacl/                                              01-Nov-2005 00:35                   -
+jaf/                                               28-Oct-2005 01:27                   -
+jaimbot/                                           01-Nov-2005 00:35                   -
+jakarta-regexp/                                    01-Nov-2005 00:34                   -
+jalopy/                                            01-Nov-2005 00:35                   -
+james/                                             01-Nov-2005 00:35                   -
+janino/                                            01-Nov-2005 00:35                   -
+jardiff/                                           14-Feb-2006 01:31                   -
+jarjar/                                            01-Nov-2005 00:35                   -
+jarsync/                                           01-Nov-2005 00:35                   -
+jasper-jsr199/                                     21-Aug-2011 14:37                   -
+jasperreports/                                     01-Nov-2005 00:35                   -
+java2html/                                         01-Nov-2005 00:34                   -
+java3d/                                            01-Nov-2005 00:35                   -
+java_cup/                                          01-Aug-2014 21:21                   -
+javacc/                                            01-Nov-2005 00:34                   -
+javaconfig/                                        01-Nov-2005 00:35                   -
+javadb/                                            21-Aug-2011 14:37                   -
+javadoc/                                           31-Oct-2005 19:40                   -
+javaee/                                            21-Aug-2011 14:37                   -
+javagroups/                                        01-Nov-2005 05:14                   -
+javainetlocator/                                   01-Nov-2005 05:03                   -
+javamail/                                          01-Nov-2005 05:07                   -
+javancss/                                          01-Nov-2005 05:19                   -
+javanettasks/                                      21-Aug-2011 14:37                   -
+javassist/                                         01-Apr-2008 07:08                   -
+javassist /                                        04-Apr-2008 17:18                   -
+javatar/                                           01-Nov-2005 05:19                   -
+javax/                                             20-Jul-2015 11:38                   -
+javazoom/                                          10-Nov-2012 09:25                   -
+javolution/                                        21-Aug-2011 17:05                   -
+jawin/                                             24-Nov-2005 06:03                   -
+jaxb/                                              21-Aug-2011 14:37                   -
+jaxen/                                             19-Oct-2006 19:23                   -
+jaxme/                                             06-Nov-2006 01:06                   -
+jaxr-ra/                                           21-Aug-2011 14:37                   -
+jblanket/                                          01-Nov-2005 05:11                   -
+jboss/                                             27-Apr-2013 08:15                   -
+jca/                                               01-Nov-2005 05:03                   -
+jcache/                                            01-Nov-2005 05:03                   -
+jcharts/                                           06-Dec-2007 02:46                   -
+jcifs/                                             29-Apr-2008 16:16                   -
+jcom/                                              24-Nov-2005 06:03                   -
+jcommon/                                           28-Oct-2005 01:27                   -
+jcoverage/                                         01-Nov-2005 05:20                   -
+jcs/                                               01-Nov-2005 05:03                   -
+jcs-javagroups/                                    01-Nov-2005 05:18                   -
+jcvsii/                                            01-Nov-2005 05:03                   -
+jdbc/                                              28-Oct-2005 01:26                   -
+jdbm/                                              01-Nov-2005 05:13                   -
+jdepend/                                           01-Nov-2005 05:03                   -
+jdiff/                                             01-Nov-2005 05:19                   -
+jdo/                                               01-Nov-2005 05:03                   -
+jdom/                                              28-Oct-2005 01:27                   -
+jdring/                                            01-Nov-2005 05:09                   -
+jdsl/                                              01-Nov-2005 05:04                   -
+jen/                                               21-Aug-2011 14:38                   -
+jencks/                                            01-Nov-2005 05:13                   -
+jep/                                               01-Nov-2005 05:03                   -
+jepi/                                              21-Aug-2011 14:38                   -
+jersey/                                            21-Aug-2011 14:38                   -
+jetty/                                             20-Oct-2006 15:24                   -
+jexcelapi/                                         06-Nov-2006 01:07                   -
+jface/                                             01-Nov-2005 05:09                   -
+jfree/                                             13-Dec-2006 19:51                   -
+jfreechart/                                        01-Nov-2005 05:15                   -
+jgen/                                              01-Nov-2005 05:20                   -
+jgoodies/                                          01-Nov-2005 05:13                   -
+jgraph/                                            01-Nov-2005 05:07                   -
+jgrapht/                                           01-Nov-2005 05:07                   -
+jgroups/                                           01-Nov-2005 05:04                   -
+jhunlang/                                          01-Nov-2005 05:04                   -
+jini/                                              10-Dec-2005 02:18                   -
+jintention/                                        21-Aug-2011 14:38                   -
+jisp/                                              01-Nov-2005 05:10                   -
+jivesoftware/                                      01-Nov-2005 05:03                   -
+jlibdiff/                                          01-Nov-2005 05:03                   -
+jline/                                             19-Oct-2006 19:23                   -
+jmagick/                                           21-Aug-2011 14:38                   -
+jmaki/                                             21-Aug-2011 14:38                   -
+jmdns/                                             01-Nov-2005 05:14                   -
+jmimemagic/                                        01-Nov-2005 05:14                   -
+jmml/                                              01-Nov-2005 05:12                   -
+jmock/                                             28-Oct-2005 01:26                   -
+jms/                                               28-Oct-2005 01:27                   -
+jmscts/                                            01-Nov-2005 05:09                   -
+jmsn/                                              01-Nov-2005 05:16                   -
+joda-time/                                         15-Nov-2009 14:12                   -
+john-test/                                         29-May-2008 08:01                   -
+jotm/                                              01-Nov-2005 05:20                   -
+jp/                                                30-Nov-2016 13:53                   -
+jparsec/                                           26-Aug-2006 17:55                   -
+jpl/                                               10-Nov-2012 09:26                   -
+jpox/                                              21-Jan-2008 06:44                   -
+jpox-dbcp/                                         13-Mar-2007 21:30                   -
+jpox-enhancer/                                     13-Mar-2007 21:30                   -
+jpox-java5/                                        13-Mar-2007 21:30                   -
+jrexx/                                             01-Nov-2005 05:11                   -
+jrms/                                              01-Nov-2005 05:19                   -
+jrobin/                                            01-Nov-2005 05:06                   -
+jruby/                                             21-Aug-2007 18:14                   -
+jsch/                                              28-Oct-2005 01:26                   -
+jsf-extensions/                                    21-Aug-2011 14:38                   -
+jspapi/                                            28-Oct-2005 01:26                   -
+jsptags/                                           01-Nov-2005 05:15                   -
+jstl/                                              28-Oct-2005 01:26                   -
+jstyle/                                            01-Nov-2005 05:09                   -
+jta/                                               28-Oct-2005 01:26                   -
+jtds/                                              20-Jan-2006 12:18                   -
+jtidy/                                             28-Oct-2005 01:27                   -
+juddi/                                             01-Nov-2005 05:03                   -
+jug/                                               01-Nov-2005 05:12                   -
+jung/                                              01-Nov-2005 05:03                   -
+junit/                                             10-May-2009 13:17                   -
+junit-addons/                                      28-Oct-2005 01:27                   -
+junit-doclet/                                      01-Nov-2005 05:19                   -
+junitperf/                                         01-Nov-2005 05:21                   -
+juno/                                              21-Aug-2011 14:38                   -
+jwebunit/                                          01-Nov-2005 05:10                   -
+jxta/                                              01-Nov-2005 05:10                   -
+jython/                                            01-Nov-2005 05:04                   -
+kawa/                                              01-Nov-2005 05:04                   -
+kg/                                                23-Feb-2013 09:19                   -
+kohsuke/                                           21-Aug-2011 14:38                   -
+kr/                                                30-Nov-2016 13:56                   -
+kxml/                                              01-Nov-2005 05:09                   -
+kxml2/                                             01-Nov-2005 05:07                   -
+kz/                                                04-Jan-2016 09:50                   -
+la/                                                20-Apr-2015 11:09                   -
+ldapd-common/                                      01-Nov-2005 05:21                   -
+ldapsdk/                                           01-Nov-2005 05:11                   -
+li/                                                30-Nov-2016 14:03                   -
+life/                                              30-Nov-2016 14:04                   -
+lingo/                                             01-Nov-2005 05:21                   -
+link/                                              07-Dec-2015 11:24                   -
+locc/                                              01-Nov-2005 05:11                   -
+log4j/                                             28-Nov-2007 21:22                   -
+log4unit/                                          01-Nov-2005 05:20                   -
+logkit/                                            02-Nov-2005 09:29                   -
+loom/                                              01-Nov-2005 05:21                   -
+lpg/                                               16-Nov-2013 10:06                   -
+lt/                                                19-Jan-2013 09:12                   -
+lucene/                                            01-Nov-2005 05:04                   -
+lv/                                                22-Feb-2016 10:49                   -
+ly/                                                29-Sep-2014 10:35                   -
+ma/                                                30-Nov-2016 14:08                   -
+magicGball/                                        01-Nov-2005 05:03                   -
+maps/                                              21-Aug-2011 14:38                   -
+market/                                            12-Oct-2015 22:45                   -
+marmalade/                                         21-Jul-2006 17:02                   -
+math/                                              23-Nov-2013 10:01                   -
+maven/                                             06-Nov-2006 01:08                   -
+maven-integration-test-helper/                     11-Jun-2011 11:01                   -
+maven-javanet-plugin/                              21-Aug-2011 14:39                   -
+maven-new/                                         01-Nov-2005 05:06                   -
+maven-plugins/                                     06-Nov-2006 01:07                   -
+maven-proxy/                                       01-Nov-2005 05:03                   -
+maven-taglib/                                      01-Nov-2005 05:19                   -
+maven-torque-plugin/                               01-Nov-2005 05:03                   -
+maven-validator/                                   01-Nov-2005 05:07                   -
+maven-xdoclet2-plugin/                             01-Nov-2005 05:19                   -
+maxq/                                              01-Nov-2005 05:09                   -
+mckoi/                                             01-Nov-2005 05:12                   -
+md/                                                30-Nov-2016 14:09                   -
+me/                                                30-Nov-2016 14:09                   -
+merlin/                                            01-Nov-2005 05:02                   -
+merlin-developer/                                  01-Nov-2005 05:19                   -
+merlin-tutorial/                                   01-Nov-2005 05:15                   -
+messenger/                                         01-Nov-2005 05:08                   -
+metaclass/                                         01-Nov-2005 05:08                   -
+mevenide/                                          01-Nov-2005 05:14                   -
+microcontainer/                                    01-Nov-2005 05:16                   -
+middlegen/                                         01-Nov-2005 05:03                   -
+mil/                                               30-Nov-2016 14:19                   -
+milyn/                                             16-May-2007 17:40                   -
+ml/                                                30-Nov-2016 14:20                   -
+mm/                                                01-Nov-2005 05:12                   -
+mm-mysql/                                          01-Nov-2005 05:16                   -
+mobi/                                              30-Nov-2016 14:22                   -
+mockcreator/                                       01-Nov-2005 05:09                   -
+mockit/                                            21-Aug-2011 14:39                   -
+mockmaker/                                         01-Nov-2005 05:07                   -
+mockobjects/                                       01-Nov-2005 05:05                   -
+mockrunner/                                        24-Nov-2005 06:03                   -
+modello/                                           01-Nov-2005 05:12                   -
+mrj/                                               01-Nov-2005 05:14                   -
+ms/                                                01-Aug-2014 21:28                   -
+mstor/                                             01-Nov-2005 05:14                   -
+msv/                                               01-Nov-2005 05:15                   -
+mule/                                              10-Apr-2007 13:34                   -
+muse/                                              01-Nov-2005 05:11                   -
+mx/                                                22-Feb-2016 10:54                   -
+mx4j/                                              01-Nov-2005 05:14                   -
+myfaces/                                           21-Nov-2005 13:21                   -
+mysql/                                             15-Oct-2011 10:12                   -
+name/                                              30-Nov-2016 14:22                   -
+nanning/                                           01-Nov-2005 05:11                   -
+nanocontainer/                                     14-Jun-2006 10:28                   -
+nekohtml/                                          01-Jun-2008 16:25                   -
+neo/                                               01-Nov-2005 05:08                   -
+net/                                               30-Nov-2016 14:23                   -
+netbeans/                                          01-Nov-2005 05:04                   -
+new/                                               21-Aug-2011 15:09                   -
+nf/                                                02-Mar-2013 10:13                   -
+ng/                                                30-Nov-2016 16:55                   -
+ninja/                                             16-Nov-2015 14:52                   -
+nl/                                                30-Nov-2016 16:55                   -
+no/                                                30-Nov-2016 17:07                   -
+norbert/                                           01-Nov-2005 05:03                   -
+np/                                                17-Nov-2014 12:32                   -
+nsuml/                                             01-Nov-2005 05:16                   -
+nu/                                                30-Nov-2016 17:15                   -
+nz/                                                30-Nov-2016 17:15                   -
+oauth/                                             26-Feb-2010 19:44                   -
+odmg/                                              28-Oct-2005 01:27                   -
+ognl/                                              20-Jun-2007 20:09                   -
+ojb/                                               01-Nov-2005 05:11                   -
+ojdbc/                                             28-Oct-2005 01:26                   -
+old/                                               01-Nov-2005 05:13                   -
+one/                                               30-Nov-2015 14:42                   -
+oness/                                             01-Nov-2005 05:13                   -
+online/                                            30-Nov-2016 17:23                   -
+open/                                              21-Aug-2011 15:33                   -
+open-esb/                                          21-Aug-2011 15:33                   -
+opencypher/                                        30-Nov-2016 17:23                   -
+openejb/                                           07-May-2006 00:35                   -
+openim/                                            01-Nov-2005 05:12                   -
+openjms/                                           01-Nov-2005 05:03                   -
+opennms/                                           01-Nov-2005 05:06                   -
+opensymphony/                                      19-Feb-2009 14:07                   -
+oracle/                                            21-Aug-2011 15:33                   -
+org/                                               30-Nov-2016 17:23                   -
+org.elasticsearch/                                 30-Nov-2016 17:23                   -
+org.elasticsearch.client/                          30-Nov-2016 17:23                   -
+org.elasticsearch.distribution.integ-test-zip/     30-Nov-2016 17:23                   -
+org.elasticsearch.distribution.zip/                30-Nov-2016 17:23                   -
+org.elasticsearch.gradle/                          30-Nov-2016 17:23                   -
+org.elasticsearch.plugin/                          30-Nov-2016 17:23                   -
+org.elasticsearch.test/                            30-Nov-2016 17:23                   -
+oro/                                               28-Oct-2005 01:27                   -
+oscube/                                            01-Nov-2005 05:02                   -
+p2psockets/                                        01-Nov-2005 05:15                   -
+p6spy/                                             01-Nov-2005 05:05                   -
+patterntesting/                                    01-Nov-2005 05:05                   -
+payload/                                           01-Nov-2005 05:03                   -
+pcj/                                               01-Nov-2005 05:09                   -
+pdfbox/                                            01-Nov-2005 05:16                   -
+pe/                                                21-Nov-2016 12:45                   -
+penguin/                                           01-Nov-2005 05:10                   -
+petridish/                                         01-Nov-2005 05:06                   -
+ph/                                                30-Jun-2012 17:32                   -
+piccolo/                                           01-Nov-2005 05:03                   -
+picocontainer/                                     14-Jun-2006 10:25                   -
+picounit/                                          01-Nov-2005 05:10                   -
+pircbot/                                           01-Nov-2005 05:06                   -
+pitt/                                              07-Dec-2013 15:12                   -
+pl/                                                25-Jan-2016 18:00                   -
+plexus/                                            04-Jan-2007 19:16                   -
+plj/                                               01-Nov-2005 05:14                   -
+plugin/                                            01-Nov-2005 05:07                   -
+pluto-container/                                   01-Nov-2005 05:07                   -
+pmd/                                               10-Aug-2008 09:08                   -
+pnuts/                                             22-Aug-2011 09:13                   -
+poi/                                               28-Oct-2005 23:26                   -
+poolman/                                           01-Nov-2005 05:20                   -
+portlet-api/                                       01-Nov-2005 05:10                   -
+postgresql/                                        01-Nov-2005 05:15                   -
+prevayler/                                         01-Nov-2005 05:13                   -
+pro/                                               03-Nov-2015 02:37                   -
+proctor/                                           22-Aug-2011 09:13                   -
+profiler/                                          01-Nov-2005 05:11                   -
+proxool/                                           28-Oct-2005 01:27                   -
+proxytoys/                                         01-Nov-2005 05:04                   -
+pt/                                                15-Dec-2015 03:32                   -
+pubscribe/                                         01-Nov-2005 05:11                   -
+pull-parser/                                       28-Oct-2005 01:27                   -
+pw/                                                26-Oct-2013 13:30                   -
+qdox/                                              28-Oct-2005 01:27                   -
+qfork/                                             01-Nov-2005 05:14                   -
+quartz/                                            01-Nov-2005 05:16                   -
+quartz-jboss/                                      26-Feb-2010 21:25                   -
+quartz-oracle/                                     26-Feb-2010 21:25                   -
+quartz-weblogic/                                   26-Feb-2010 21:25                   -
+quilt/                                             01-Nov-2005 05:12                   -
+radeox/                                            01-Nov-2005 05:14                   -
+re/                                                17-Aug-2014 12:17                   -
+readline/                                          01-Nov-2005 05:10                   -
+red/                                               21-Nov-2016 12:45                   -
+redhill/                                           01-Nov-2005 05:03                   -
+redis/                                             09-Oct-2010 07:48                   -
+redmine/                                           22-Aug-2011 09:13                   -
+regexp/                                            19-Oct-2006 19:23                   -
+relaxngDatatype/                                   01-Nov-2005 05:15                   -
+ren/                                               19-Oct-2015 23:59                   -
+reportrunner/                                      01-Nov-2005 05:15                   -
+rest/                                              21-Nov-2016 12:45                   -
+rhino/                                             01-Nov-2005 05:11                   -
+ro/                                                21-Dec-2015 16:56                   -
+robo-guice/                                        22-Aug-2011 09:13                   -
+roboguice/                                         22-Aug-2011 09:13                   -
+rocks/                                             20-Oct-2014 18:43                   -
+roller/                                            22-Aug-2011 09:13                   -
+rome/                                              22-Aug-2011 09:13                   -
+rs/                                                01-Dec-2014 19:54                   -
+rss4j/                                             01-Nov-2005 05:08                   -
+rsslibj/                                           01-Nov-2005 05:04                   -
+ru/                                                14-Mar-2016 15:50                   -
+rubygems/                                          27-Oct-2015 00:40                   -
+run/                                               21-Nov-2016 12:45                   -
+sablecc/                                           01-Nov-2005 05:04                   -
+sax/                                               01-Nov-2005 05:11                   -
+saxon/                                             19-Oct-2006 19:23                   -
+saxpath/                                           28-Oct-2005 01:26                   -
+sc/                                                15-Jun-2015 21:26                   -
+science/                                           21-Nov-2016 12:45                   -
+scout/                                             29-Oct-2005 08:00                   -
+scraping-engine/                                   01-Nov-2005 05:07                   -
+se/                                                11-Jan-2016 15:55                   -
+securityfilter/                                    01-Nov-2005 05:13                   -
+servicemix/                                        25-Mar-2006 00:55                   -
+servicemix-ws/                                     01-Nov-2005 05:15                   -
+servletapi/                                        28-Oct-2005 23:26                   -
+servlets/                                          01-Nov-2005 05:12                   -
+setpoint/                                          06-Nov-2006 01:09                   -
+sfx4j/                                             22-Aug-2011 09:14                   -
+sg/                                                21-Nov-2016 12:45                   -
+sh/                                                10-Nov-2015 04:31                   -
+shellix/                                           22-Aug-2011 09:14                   -
+shocks/                                            01-Nov-2005 05:11                   -
+si/                                                15-Feb-2016 16:33                   -
+sillyexceptions/                                   01-Nov-2005 05:04                   -
+simple-jms/                                        09-Dec-2005 01:32                   -
+simple-jndi/                                       01-Nov-2005 05:19                   -
+sk/                                                15-Feb-2016 16:33                   -
+skaringa/                                          01-Nov-2005 05:09                   -
+skinlf/                                            01-Nov-2005 05:03                   -
+slide/                                             01-Nov-2005 05:14                   -
+smartrics/                                         15-Dec-2012 12:57                   -
+soap/                                              01-Nov-2005 05:04                   -
+software/                                          14-Mar-2016 15:54                   -
+soimp/                                             22-Aug-2011 09:14                   -
+solarisrealm/                                      22-Aug-2011 09:14                   -
+solutions/                                         20-Oct-2015 00:09                   -
+space/                                             21-Nov-2016 12:45                   -
+speexx/                                            01-Nov-2005 05:04                   -
+spice/                                             01-Nov-2005 05:03                   -
+spring/                                            01-Nov-2005 05:07                   -
+springframework/                                   01-Nov-2005 05:11                   -
+springmodules/                                     19-Jun-2006 22:22                   -
+sqlline/                                           09-Mar-2015 21:41                   -
+sshtools/                                          01-Nov-2005 05:03                   -
+sslext/                                            01-Nov-2005 05:04                   -
+st/                                                10-Aug-2015 22:33                   -
+stapler/                                           22-Aug-2011 09:15                   -
+statcvs/                                           01-Nov-2005 05:07                   -
+stax/                                              06-Nov-2006 01:09                   -
+stax-utils/                                        01-Nov-2005 05:11                   -
+stratum/                                           01-Nov-2005 05:14                   -
+stream/                                            21-Nov-2016 12:45                   -
+struts/                                            01-Nov-2005 05:15                   -
+struts-menu/                                       01-Nov-2005 05:03                   -
+strutstestcase/                                    01-Nov-2005 05:12                   -
+studio/                                            21-Nov-2016 12:45                   -
+stxx/                                              01-Nov-2005 05:05                   -
+su/                                                10-Aug-2014 15:19                   -
+subpersistence/                                    01-Nov-2005 05:09                   -
+subshell/                                          01-Nov-2005 05:03                   -
+suiterunner/                                       01-Nov-2005 05:09                   -
+surefire/                                          28-Oct-2005 01:26                   -
+swarmcache/                                        28-Oct-2005 01:26                   -
+swt/                                               01-Nov-2005 05:05                   -
+systems/                                           18-Jan-2016 16:33                   -
+sysunit/                                           01-Nov-2005 05:15                   -
+tablelayout/                                       01-Nov-2005 05:14                   -
+tagalog/                                           01-Nov-2005 05:16                   -
+tagishauth/                                        01-Nov-2005 05:03                   -
+taglibrarydoc/                                     01-Nov-2005 05:07                   -
+taglibs/                                           01-Nov-2005 05:06                   -
+tagsoup/                                           05-Nov-2005 01:42                   -
+tambora/                                           01-Nov-2005 05:20                   -
+tanukisoft/                                        07-Mar-2008 02:07                   -
+tapestry/                                          01-Nov-2005 05:04                   -
+tclib/                                             01-Nov-2005 05:07                   -
+tec/                                               23-Mar-2015 21:07                   -
+tech/                                              22-Feb-2016 17:58                   -
+technology/                                        15-Dec-2015 03:41                   -
+textarea/                                          01-Nov-2005 05:16                   -
+th/                                                13-Oct-2015 11:58                   -
+thaiopensource/                                    19-Oct-2006 19:23                   -
+tiffrenderer/                                      01-Nov-2005 05:09                   -
+tjdo/                                              01-Nov-2005 05:03                   -
+tk/                                                11-Jan-2016 15:58                   -
+tl/                                                13-Jul-2013 12:50                   -
+tmporb/                                            01-Nov-2005 05:09                   -
+to/                                                25-Jan-2016 18:06                   -
+tokyo/                                             21-Nov-2016 12:45                   -
+tomcat/                                            24-Jan-2008 04:19                   -
+tomcat-util/                                       01-Nov-2005 05:20                   -
+tonic/                                             08-Nov-2005 05:35                   -
+tools/                                             29-Feb-2016 17:11                   -
+top/                                               08-Feb-2016 18:28                   -
+toplink/                                           22-Aug-2011 09:16                   -
+torque/                                            11-Jan-2008 22:47                   -
+torque-gen/                                        01-Nov-2005 05:04                   -
+touchstone/                                        01-Nov-2005 05:10                   -
+tr/                                                15-Dec-2015 03:41                   -
+traer/                                             07-Apr-2012 17:18                   -
+trail-taglib/                                      01-Nov-2005 05:04                   -
+tranql/                                            01-Nov-2005 05:10                   -
+travel/                                            04-May-2015 22:09                   -
+trove/                                             01-Nov-2005 05:08                   -
+turbine/                                           01-Nov-2005 05:04                   -
+tv/                                                18-Jan-2016 16:34                   -
+tw/                                                18-May-2015 21:53                   -
+tyrex/                                             01-Nov-2005 05:14                   -
+ua/                                                29-Feb-2016 17:11                   -
+uaihebert/                                         23-Feb-2013 13:20                   -
+ubique/                                            01-Nov-2005 05:15                   -
+ug/                                                25-Jan-2016 18:07                   -
+uispec4j/                                          01-Nov-2005 05:07                   -
+uk/                                                10-Aug-2015 22:35                   -
+uno/                                               01-Dec-2015 04:36                   -
+urbanophile/                                       01-Nov-2005 05:03                   -
+urlrewrite/                                        24-Nov-2005 06:03                   -
+us/                                                18-Jan-2016 16:35                   -
+uy/                                                24-Aug-2015 23:36                   -
+vc/                                                28-Dec-2015 15:38                   -
+vdoclet/                                           01-Nov-2005 05:11                   -
+velocity/                                          29-Apr-2007 21:29                   -
+velocity-anakia/                                   29-Apr-2007 21:29                   -
+velocity-dvsl/                                     01-Nov-2005 05:12                   -
+velocity-tools/                                    01-Nov-2005 05:10                   -
+village/                                           01-Nov-2005 05:04                   -
+vn/                                                02-Dec-2016 00:09                   -
+vu/                                                20-Jul-2013 12:57                   -
+wadi/                                              01-Nov-2005 05:15                   -
+wang/                                              10-Aug-2015 22:36                   -
+webmacro/                                          01-Nov-2005 05:12                   -
+website/                                           22-Feb-2016 18:03                   -
+webtest/                                           01-Nov-2005 05:19                   -
+werken-xpath/                                      28-Oct-2005 01:26                   -
+werkflow/                                          01-Nov-2005 05:16                   -
+werkz/                                             01-Nov-2005 05:08                   -
+westhawk/                                          01-Nov-2005 05:18                   -
+wf/                                                10-Nov-2014 19:54                   -
+which/                                             01-Nov-2005 05:16                   -
+wicket/                                            11-Aug-2008 15:44                   -
+wiki/                                              22-Feb-2016 18:03                   -
+win/                                               21-Nov-2016 12:45                   -
+woodstox/                                          21-Nov-2007 04:35                   -
+work/                                              18-Jan-2016 16:37                   -
+works/                                             22-Feb-2016 18:03                   -
+wrapper/                                           01-Nov-2005 05:14                   -
+ws/                                                25-Jan-2016 18:11                   -
+ws-commons/                                        19-Sep-2006 14:21                   -
+ws-commons-java5/                                  01-Nov-2005 05:03                   -
+ws-commons-util/                                   01-Nov-2005 05:16                   -
+ws-scout/                                          18-Feb-2006 13:32                   -
+wsdl4j/                                            01-Nov-2005 05:07                   -
+wsrf/                                              01-Nov-2005 05:08                   -
+wss4j/                                             02-May-2006 20:32                   -
+wstx/                                              01-Nov-2005 05:09                   -
+wurfl/                                             01-Nov-2005 05:14                   -
+wutka/                                             01-Nov-2005 05:21                   -
+xajile/                                            03-Aug-2009 09:25                   -
+xalan/                                             30-Sep-2008 08:02                   -
+xbean/                                             04-Jan-2006 17:31                   -
+xdoclet/                                           17-Jul-2008 21:29                   -
+xdoclet-plugins/                                   02-Jul-2006 21:14                   -
+xerces/                                            19-Oct-2006 19:23                   -
+xercesjarv/                                        01-Nov-2005 05:06                   -
+xfire/                                             06-Nov-2006 01:09                   -
+xfire-root/                                        01-Nov-2005 05:03                   -
+xin/                                               21-Nov-2016 12:45                   -
+xjavadoc/                                          01-Nov-2005 05:14                   -
+xml-apis/                                          22-Dec-2006 13:37                   -
+xml-resolver/                                      01-Nov-2005 05:11                   -
+xml-security/                                      19-Oct-2006 19:23                   -
+xmlbeans/                                          03-Jul-2007 16:43                   -
+xmldb/                                             01-Nov-2005 05:12                   -
+xmlenc/                                            01-Nov-2005 05:19                   -
+xmlmind/                                           01-Nov-2005 05:21                   -
+xmlpull/                                           01-Nov-2005 05:21                   -
+xmlrpc/                                            25-Jun-2006 02:41                   -
+xmlrpc-helma/                                      01-Nov-2005 05:03                   -
+xmlunit/                                           15-Sep-2008 23:50                   -
+xmlwise/                                           27-Oct-2012 10:59                   -
+xmlwriter/                                         01-Nov-2005 05:04                   -
+xom/                                               19-Oct-2006 19:23                   -
+xpp3/                                              28-Oct-2005 01:26                   -
+xsddoc/                                            01-Nov-2005 05:19                   -
+xsdlib/                                            01-Nov-2005 05:04                   -
+xstream/                                           27-Nov-2006 21:45                   -
+xtc/                                               07-Apr-2012 17:20                   -
+xtiff-jai/                                         01-Nov-2005 05:10                   -
+xxl/                                               01-Nov-2005 05:12                   -
+xyz/                                               08-Feb-2016 18:33                   -
+yan/                                               13-Jan-2006 21:31                   -
+ymsg/                                              01-Nov-2005 05:04                   -
+yom/                                               01-Nov-2005 05:08                   -
+za/                                                25-May-2013 12:39                   -
+zone/                                              26-Jan-2015 23:05                   -
+94a8262a403880.properties                          03-Feb-2015 07:36                 301
+94a8262a403880.properties.md5                      20-May-2015 05:24                  32
+94a8262a403880.properties.sha1                     20-May-2015 05:24                  40
+9e9bbc30f020cf.properties                          03-Oct-2014 19:03                 310
+9e9bbc30f020cf.properties.md5                      02-Nov-2014 16:27                  32
+9e9bbc30f020cf.properties.sha1                     02-Nov-2014 16:27                  40
+archetype-catalog.xml                              27-Nov-2016 13:20             5385400
+archetype-catalog.xml.md5                          27-Nov-2016 13:20                  32
+archetype-catalog.xml.sha1                         27-Nov-2016 13:20                  40
+fb69c44c24b38.properties                           17-Apr-2014 13:29                 307
+fb69c44c24b38.properties.md5                       02-Nov-2014 14:37                  32
+fb69c44c24b38.properties.sha1                      02-Nov-2014 14:37                  40
+last_updated.txt                                   28-Nov-2016 06:55                  29
+robots.txt                                         10-Nov-2009 12:12                  26
+server.txt                                         08-Nov-2014 19:04                 207
+

+ diff --git a/pdfbox-0.8.0-incubating_3.jar b/pdfbox-0.8.0-incubating_3.jar new file mode 100644 index 000000000..df1ca619e --- /dev/null +++ b/pdfbox-0.8.0-incubating_3.jar @@ -0,0 +1,889 @@ + +Index of /maven2/ + +

Index of /maven2/


../
+HTTPClient/                                        01-Nov-2005 05:03                   -
+abbot/                                             28-Sep-2015 06:18                   -
+acegisecurity/                                     23-Dec-2005 12:20                   -
+activation/                                        21-Dec-2005 15:37                   -
+activecluster/                                     01-Nov-2005 05:09                   -
+activeio/                                          01-Nov-2005 05:10                   -
+activemq/                                          01-Nov-2005 05:13                   -
+activemq-jaxb/                                     01-Nov-2005 05:11                   -
+activesoap/                                        01-Nov-2005 05:20                   -
+activespace/                                       01-Nov-2005 05:04                   -
+adarwin/                                           01-Nov-2005 05:03                   -
+ae/                                                06-Apr-2015 06:14                   -
+aelfred/                                           01-Nov-2005 05:03                   -
+aero/                                              01-Aug-2014 14:03                   -
+ai/                                                28-Nov-2016 07:10                   -
+aislib/                                            01-Nov-2005 05:14                   -
+al/                                                21-Nov-2016 13:18                   -
+altrmi/                                            01-Nov-2005 05:14                   -
+am/                                                21-Nov-2016 13:19                   -
+andromda/                                          01-Nov-2005 05:19                   -
+annogen/                                           01-Nov-2005 05:19                   -
+ant/                                               01-Nov-2005 05:17                   -
+ant-contrib/                                       08-Aug-2008 22:17                   -
+ant-doxygen/                                       01-Nov-2005 05:04                   -
+ant4eclipse/                                       21-Aug-2011 11:53                   -
+antlr/                                             01-Nov-2005 05:12                   -
+anttex/                                            01-Nov-2005 05:19                   -
+aopalliance/                                       28-Oct-2005 01:26                   -
+apache-jaxme/                                      01-Nov-2005 05:10                   -
+aptconvert/                                        01-Nov-2005 05:07                   -
+ar/                                                06-Mar-2008 17:19                   -
+args4j/                                            16-Mar-2013 07:01                   -
+as/                                                25-May-2015 06:15                   -
+ashkay/                                            01-Nov-2005 05:13                   -
+ashkelon/                                          01-Nov-2005 05:20                   -
+asia/                                              23-Feb-2013 08:01                   -
+asm/                                               07-Jul-2009 04:08                   -
+aspectj/                                           21-Dec-2005 12:23                   -
+aspectwerkz/                                       01-Nov-2005 05:09                   -
+at/                                                28-Nov-2016 07:12                   -
+au/                                                12-Oct-2015 07:37                   -
+avalon/                                            19-Oct-2006 19:23                   -
+avalon-activation/                                 01-Nov-2005 05:20                   -
+avalon-apps/                                       01-Nov-2005 05:14                   -
+avalon-composition/                                01-Nov-2005 05:13                   -
+avalon-cornerstone/                                01-Nov-2005 05:02                   -
+avalon-extension/                                  01-Nov-2005 05:09                   -
+avalon-framework/                                  01-Nov-2005 05:15                   -
+avalon-http/                                       18-Jul-2006 18:10                   -
+avalon-logging/                                    01-Nov-2005 05:19                   -
+avalon-logkit/                                     01-Nov-2005 05:11                   -
+avalon-meta/                                       01-Nov-2005 05:05                   -
+avalon-phoenix/                                    01-Nov-2005 05:10                   -
+avalon-repository/                                 01-Nov-2005 05:10                   -
+avalon-util/                                       01-Nov-2005 05:12                   -
+axion/                                             01-Nov-2005 05:20                   -
+axis/                                              19-Oct-2006 19:23                   -
+axis2/                                             04-May-2006 20:31                   -
+azote/                                             01-Nov-2005 05:14                   -
+ba/                                                29-Jun-2015 06:17                   -
+backport-util-concurrent/                          20-Feb-2008 05:30                   -
+backport175/                                       01-Nov-2005 05:07                   -
+band/                                              21-Nov-2016 13:41                   -
+barsuift/                                          21-Aug-2011 11:54                   -
+batik/                                             01-Nov-2005 05:09                   -
+bcel/                                              28-Oct-2005 01:26                   -
+be/                                                21-Nov-2016 13:41                   -
+beehive/                                           01-Nov-2005 05:10                   -
+berkano/                                           01-Nov-2005 05:14                   -
+berkeleydb/                                        01-Nov-2005 05:06                   -
+binky/                                             26-Feb-2010 19:31                   -
+biz/                                               14-Mar-2016 06:15                   -
+black/                                             01-Jun-2015 06:20                   -
+blissed/                                           01-Nov-2005 05:04                   -
+boo/                                               06-Nov-2006 01:04                   -
+bouncycastle/                                      03-Sep-2009 13:30                   -
+boxstuff/                                          01-Nov-2005 05:12                   -
+br/                                                21-Nov-2016 13:45                   -
+bsf/                                               01-Nov-2005 05:03                   -
+bsh/                                               01-Nov-2005 05:03                   -
+burlap/                                            01-Nov-2005 05:03                   -
+by/                                                12-Jan-2015 07:18                   -
+bz/                                                01-Aug-2014 14:08                   -
+c10n/                                              09-Mar-2013 08:02                   -
+c3p0/                                              01-Nov-2005 05:06                   -
+ca/                                                21-Nov-2016 13:53                   -
+cactus/                                            11-Apr-2008 19:59                   -
+cargo/                                             01-Nov-2005 05:07                   -
+cas/                                               22-Jun-2006 17:05                   -
+castor/                                            06-Dec-2007 02:46                   -
+cat/                                               21-Nov-2016 14:02                   -
+cc/                                                21-Nov-2016 14:02                   -
+cd/                                                05-Jan-2015 07:18                   -
+cewolf/                                            01-Nov-2005 05:04                   -
+cf/                                                01-Aug-2014 14:11                   -
+cglib/                                             29-Feb-2016 07:17                   -
+ch/                                                21-Nov-2016 14:07                   -
+charlotte/                                         01-Nov-2005 05:04                   -
+checkstyle/                                        28-Oct-2005 01:27                   -
+cl/                                                06-Jul-2015 06:24                   -
+classworlds/                                       01-Nov-2005 05:10                   -
+clickstream/                                       24-Nov-2005 06:03                   -
+clirr/                                             01-Nov-2005 05:04                   -
+cloud/                                             21-Nov-2016 14:20                   -
+clover/                                            01-Nov-2005 05:11                   -
+cm/                                                21-Nov-2016 14:20                   -
+cmsdeploy/                                         06-Dec-2005 20:10                   -
+cn/                                                28-Nov-2016 07:25                   -
+co/                                                21-Nov-2016 14:24                   -
+cobertura/                                         06-Feb-2006 21:04                   -
+coconut/                                           01-Nov-2005 05:21                   -
+cocoon/                                            09-Jun-2008 20:01                   -
+code/                                              21-Aug-2011 11:56                   -
+code316/                                           01-Nov-2005 05:03                   -
+codehaus/                                          16-Jul-2008 22:44                   -
+codes/                                             01-Jun-2015 06:28                   -
+colt/                                              01-Nov-2005 05:03                   -
+com/                                               28-Nov-2016 07:29                   -
+commons-attributes/                                03-Jul-2006 21:30                   -
+commons-beanutils/                                 01-Dec-2012 08:50                   -
+commons-betwixt/                                   01-Nov-2005 05:13                   -
+commons-chain/                                     01-Jun-2008 18:20                   -
+commons-cli/                                       19-Mar-2009 20:08                   -
+commons-codec/                                     09-Aug-2009 21:14                   -
+commons-collections/                               15-Apr-2008 01:05                   -
+commons-compress/                                  01-Nov-2005 05:21                   -
+commons-configuration/                             11-Jan-2009 14:01                   -
+commons-daemon/                                    01-Nov-2005 05:12                   -
+commons-dbcp/                                      28-Oct-2005 01:26                   -
+commons-dbutils/                                   26-Apr-2009 04:30                   -
+commons-digester/                                  03-Jan-2009 21:44                   -
+commons-discovery/                                 01-Nov-2005 05:03                   -
+commons-el/                                        28-Oct-2005 01:27                   -
+commons-email/                                     28-Sep-2007 19:29                   -
+commons-fileupload/                                20-Feb-2007 11:31                   -
+commons-grafolia/                                  01-Nov-2005 05:03                   -
+commons-grant/                                     01-Nov-2005 05:16                   -
+commons-graph/                                     01-Nov-2005 05:19                   -
+commons-http/                                      01-Nov-2005 05:21                   -
+commons-httpclient/                                01-Nov-2005 05:19                   -
+commons-i18n/                                      01-Nov-2005 05:19                   -
+commons-io/                                        01-Jan-2008 21:00                   -
+commons-jdbc2pool/                                 01-Nov-2005 05:11                   -
+commons-jelly/                                     01-Nov-2005 05:12                   -
+commons-jexl/                                      01-Nov-2005 05:08                   -
+commons-jux/                                       01-Nov-2005 05:05                   -
+commons-jxpath/                                    13-Aug-2008 22:13                   -
+commons-lang/                                      19-Mar-2008 05:42                   -
+commons-latka/                                     01-Nov-2005 05:19                   -
+commons-launcher/                                  03-Jul-2006 21:30                   -
+commons-logging/                                   26-Nov-2007 19:24                   -
+commons-math/                                      25-Feb-2008 00:30                   -
+commons-messenger/                                 01-Nov-2005 05:14                   -
+commons-modeler/                                   01-Nov-2005 05:03                   -
+commons-naming/                                    01-Nov-2005 05:13                   -
+commons-net/                                       30-Oct-2008 20:28                   -
+commons-pool/                                      21-Dec-2008 00:14                   -
+commons-primitives/                                01-Nov-2005 05:08                   -
+commons-resources/                                 01-Nov-2005 05:09                   -
+commons-scxml/                                     19-May-2008 19:41                   -
+commons-services/                                  28-Oct-2005 01:27                   -
+commons-sql/                                       01-Nov-2005 05:14                   -
+commons-test/                                      08-Nov-2005 09:49                   -
+commons-threadpool/                                01-Nov-2005 05:14                   -
+commons-transaction/                               01-Nov-2005 05:14                   -
+commons-util/                                      01-Nov-2005 05:19                   -
+commons-validator/                                 28-Oct-2005 01:27                   -
+commons-vfs/                                       01-Nov-2005 05:10                   -
+commons-xo/                                        01-Nov-2005 05:08                   -
+concurrent/                                        28-Oct-2005 01:26                   -
+consulting/                                        10-Aug-2015 10:55                   -
+continuum/                                         01-Nov-2005 05:04                   -
+controlhaus/                                       01-Nov-2005 05:19                   -
+cool/                                              29-Nov-2016 23:08                   -
+coop/                                              20-Oct-2014 09:33                   -
+cornerstone-connection/                            01-Nov-2005 05:20                   -
+cornerstone-datasources/                           01-Nov-2005 05:21                   -
+cornerstone-scheduler/                             01-Nov-2005 05:12                   -
+cornerstone-sockets/                               01-Nov-2005 05:13                   -
+cornerstone-store/                                 01-Nov-2005 05:03                   -
+cornerstone-threads/                               01-Nov-2005 05:07                   -
+cos/                                               06-Dec-2005 20:11                   -
+crimson/                                           01-Nov-2005 05:03                   -
+cryptix/                                           01-Nov-2005 05:07                   -
+cssparser/                                         21-Aug-2011 14:29                   -
+cz/                                                29-Nov-2016 23:08                   -
+d-haven-event/                                     01-Nov-2005 05:14                   -
+d-haven-eventbus/                                  01-Nov-2005 05:09                   -
+d-haven-mpool/                                     01-Nov-2005 05:16                   -
+dalma/                                             21-Aug-2011 14:29                   -
+dalms/                                             21-Aug-2011 14:29                   -
+damagecontrol/                                     01-Nov-2005 05:10                   -
+dataforge/                                         01-Nov-2005 05:11                   -
+datasift/                                          01-Nov-2005 05:14                   -
+dbunit/                                            01-Nov-2005 05:13                   -
+de/                                                29-Nov-2016 23:10                   -
+decorutils/                                        01-Nov-2005 05:04                   -
+dentaku/                                           01-Nov-2005 05:07                   -
+directory/                                         24-Dec-2005 17:47                   -
+directory-asn1/                                    01-Nov-2005 05:19                   -
+directory-authx/                                   01-Nov-2005 05:21                   -
+directory-clients/                                 01-Nov-2005 05:05                   -
+directory-naming/                                  01-Nov-2005 05:03                   -
+directory-network/                                 01-Nov-2005 05:07                   -
+directory-protocols/                               01-Nov-2005 05:09                   -
+directory-shared/                                  01-Nov-2005 05:19                   -
+displaytag/                                        12-Aug-2008 07:35                   -
+ditchnet/                                          24-Nov-2005 06:03                   -
+dk/                                                30-Nov-2016 00:31                   -
+dna/                                               01-Nov-2005 05:21                   -
+dnsjava/                                           01-Nov-2005 05:14                   -
+docbook/                                           16-Jun-2006 18:32                   -
+doccheck/                                          01-Nov-2005 05:10                   -
+dom4j/                                             01-Nov-2005 05:16                   -
+domify/                                            21-Aug-2011 14:31                   -
+dot-index/                                         15-Jul-2012 10:55                   -
+doxia/                                             28-Oct-2005 01:27                   -
+drone/                                             01-Nov-2005 05:03                   -
+drools/                                            31-Jan-2007 18:40                   -
+drools-examples/                                   01-Nov-2005 05:10                   -
+dsh-vocabulary/                                    01-Nov-2005 05:09                   -
+dtdparser/                                         01-Nov-2005 05:15                   -
+dumbster/                                          01-Nov-2005 05:03                   -
+dwr/                                               24-Nov-2005 06:03                   -
+dynaop/                                            01-Nov-2005 05:04                   -
+easyconf/                                          01-Nov-2005 05:19                   -
+easymock/                                          28-Oct-2005 01:27                   -
+ec/                                                26-Jan-2015 11:42                   -
+echo/                                              01-Nov-2005 05:07                   -
+echo3/                                             21-Aug-2011 14:32                   -
+echo3extras/                                       21-Aug-2011 14:32                   -
+eclipse/                                           01-Nov-2005 05:03                   -
+ecs/                                               01-Nov-2005 05:14                   -
+edenlib/                                           01-Nov-2005 05:05                   -
+edtftp/                                            01-Nov-2005 05:16                   -
+edu/                                               30-Nov-2016 00:32                   -
+ee/                                                30-Nov-2016 01:01                   -
+ehcache/                                           28-Oct-2005 01:26                   -
+ejb/                                               06-Dec-2005 20:11                   -
+el-impl/                                           21-Aug-2011 14:32                   -
+emberio/                                           01-Nov-2005 05:17                   -
+emma/                                              01-Nov-2005 05:03                   -
+enterprises/                                       07-Dec-2015 10:38                   -
+ervacon/                                           01-Nov-2005 05:21                   -
+es/                                                30-Nov-2016 01:01                   -
+esper/                                             29-Jan-2008 02:43                   -
+eu/                                                30-Nov-2016 01:03                   -
+eus/                                               27-Apr-2015 10:40                   -
+excalibur/                                         01-Nov-2005 05:06                   -
+excalibur-altrmi/                                  01-Nov-2005 05:05                   -
+excalibur-cli/                                     01-Nov-2005 05:07                   -
+excalibur-collections/                             01-Nov-2005 05:10                   -
+excalibur-component/                               01-Nov-2005 05:10                   -
+excalibur-component-examples/                      01-Nov-2005 05:04                   -
+excalibur-component-tests/                         01-Nov-2005 05:15                   -
+excalibur-concurrent/                              01-Nov-2005 05:07                   -
+excalibur-configuration/                           01-Nov-2005 05:09                   -
+excalibur-containerkit/                            01-Nov-2005 05:03                   -
+excalibur-datasource/                              01-Nov-2005 05:03                   -
+excalibur-event/                                   01-Nov-2005 05:03                   -
+excalibur-extension/                               01-Nov-2005 05:04                   -
+excalibur-fortress/                                01-Nov-2005 05:04                   -
+excalibur-i18n/                                    01-Nov-2005 05:15                   -
+excalibur-instrument/                              01-Nov-2005 05:10                   -
+excalibur-instrument-manager/                      01-Nov-2005 05:08                   -
+excalibur-instrument-manager-interfaces/           01-Nov-2005 05:07                   -
+excalibur-io/                                      01-Nov-2005 05:11                   -
+excalibur-lifecycle/                               01-Nov-2005 05:15                   -
+excalibur-logger/                                  01-Nov-2005 05:04                   -
+excalibur-monitor/                                 01-Nov-2005 05:15                   -
+excalibur-mpool/                                   01-Nov-2005 05:05                   -
+excalibur-naming/                                  01-Nov-2005 05:14                   -
+excalibur-pool/                                    01-Nov-2005 05:03                   -
+excalibur-sourceresolve/                           01-Nov-2005 05:14                   -
+excalibur-store/                                   01-Nov-2005 05:09                   -
+excalibur-thread/                                  01-Nov-2005 05:07                   -
+excalibur-util/                                    01-Nov-2005 05:15                   -
+excalibur-xmlutil/                                 01-Nov-2005 05:04                   -
+exist/                                             01-Nov-2005 05:12                   -
+exml/                                              01-Nov-2005 05:16                   -
+exo/                                               01-Nov-2005 00:35                   -
+exolabcore/                                        01-Nov-2005 00:35                   -
+exteca/                                            01-Nov-2005 00:35                   -
+external/                                          01-Aug-2014 20:15                   -
+farm/                                              26-Oct-2015 11:01                   -
+fastutil/                                          01-Nov-2005 00:35                   -
+fesi/                                              01-Nov-2005 00:35                   -
+fi/                                                30-Nov-2016 01:13                   -
+findbugs/                                          06-Nov-2006 01:05                   -
+fish/                                              18-May-2015 10:45                   -
+flox/                                              01-Nov-2005 00:35                   -
+flux/                                              21-Aug-2011 14:32                   -
+fm/                                                22-Feb-2016 09:57                   -
+foo/                                               30-Nov-2016 01:49                   -
+foo3/                                              21-Nov-2016 12:45                   -
+fop/                                               01-Nov-2005 00:35                   -
+forehead/                                          01-Nov-2005 00:35                   -
+formproc/                                          01-Nov-2005 00:34                   -
+foundation/                                        30-Nov-2016 01:49                   -
+foxtrot/                                           12-Nov-2011 11:19                   -
+fr/                                                30-Nov-2016 01:49                   -
+freebxml/                                          01-Nov-2005 00:34                   -
+freemarker/                                        01-Nov-2005 00:35                   -
+frl/                                               14-Sep-2015 11:30                   -
+fulcrum/                                           01-Nov-2005 00:35                   -
+ga/                                                30-Nov-2016 02:02                   -
+gabriel/                                           01-Nov-2005 00:35                   -
+gbean/                                             01-Nov-2005 00:35                   -
+generama/                                          17-Jul-2008 20:56                   -
+genjar/                                            01-Nov-2005 00:34                   -
+genjava/                                           01-Nov-2005 00:35                   -
+geronimo/                                          08-Jan-2007 15:55                   -
+geronimo-spec/                                     01-Nov-2005 00:35                   -
+gg/                                                12-May-2012 09:05                   -
+github/                                            30-Nov-2016 02:04                   -
+glassfish/                                         21-Aug-2011 14:33                   -
+global/                                            30-Nov-2016 02:04                   -
+gnu/                                               21-Aug-2011 14:33                   -
+gnu-regexp/                                        01-Nov-2005 00:35                   -
+gov/                                               30-Nov-2016 02:04                   -
+gr/                                                30-Nov-2016 02:18                   -
+graphlayout/                                       01-Nov-2005 00:35                   -
+grizzly/                                           21-Aug-2011 14:33                   -
+grizzly-cachetest/                                 21-Aug-2011 14:33                   -
+groovy/                                            30-Apr-2007 21:29                   -
+groovy-xmlrpc/                                     26-May-2006 21:50                   -
+gs/                                                08-Sep-2012 07:49                   -
+gsbase/                                            01-Nov-2005 00:35                   -
+guru/                                              26-Jan-2015 11:51                   -
+hessian/                                           01-Nov-2005 00:34                   -
+hibernate/                                         26-Dec-2008 14:12                   -
+hivemind/                                          01-Nov-2005 00:34                   -
+hm/                                                01-Aug-2014 20:22                   -
+howl/                                              01-Nov-2005 00:35                   -
+hr/                                                30-Nov-2016 02:20                   -
+hsqldb/                                            28-Oct-2005 01:27                   -
+htmlunit/                                          01-Nov-2005 00:34                   -
+httpcomponents-httpcore/                           02-Jul-2007 18:15                   -
+httpunit/                                          28-Oct-2005 01:26                   -
+hu/                                                30-Nov-2016 02:20                   -
+hudson/                                            21-Aug-2011 14:34                   -
+ical4j/                                            01-Nov-2005 00:34                   -
+icu/                                               03-Nov-2005 01:12                   -
+icu4j/                                             03-Nov-2005 21:39                   -
+id/                                                30-Nov-2016 02:21                   -
+idb/                                               01-Nov-2005 00:35                   -
+ie/                                                21-Dec-2015 09:56                   -
+iirekm/                                            21-Aug-2011 14:34                   -
+il/                                                30-Nov-2016 02:21                   -
+im/                                                30-Nov-2016 02:21                   -
+in/                                                30-Nov-2016 02:50                   -
+info/                                              30-Nov-2016 02:51                   -
+informa/                                           01-Nov-2005 00:34                   -
+innig/                                             01-Nov-2005 00:35                   -
+int/                                               24-Aug-2014 05:19                   -
+io/                                                30-Nov-2016 03:02                   -
+ir/                                                30-Nov-2016 13:35                   -
+is/                                                03-Nov-2014 11:18                   -
+isorelax/                                          01-Nov-2005 00:35                   -
+it/                                                30-Nov-2016 13:37                   -
+itext/                                             01-Nov-2005 00:35                   -
+ivory/                                             01-Nov-2005 00:35                   -
+izpack/                                            01-Nov-2005 00:35                   -
+jaas/                                              01-Nov-2005 00:35                   -
+jackcess/                                          01-Nov-2005 00:35                   -
+jackson/                                           06-Sep-2008 07:58                   -
+jacl/                                              01-Nov-2005 00:35                   -
+jaf/                                               28-Oct-2005 01:27                   -
+jaimbot/                                           01-Nov-2005 00:35                   -
+jakarta-regexp/                                    01-Nov-2005 00:34                   -
+jalopy/                                            01-Nov-2005 00:35                   -
+james/                                             01-Nov-2005 00:35                   -
+janino/                                            01-Nov-2005 00:35                   -
+jardiff/                                           14-Feb-2006 01:31                   -
+jarjar/                                            01-Nov-2005 00:35                   -
+jarsync/                                           01-Nov-2005 00:35                   -
+jasper-jsr199/                                     21-Aug-2011 14:37                   -
+jasperreports/                                     01-Nov-2005 00:35                   -
+java2html/                                         01-Nov-2005 00:34                   -
+java3d/                                            01-Nov-2005 00:35                   -
+java_cup/                                          01-Aug-2014 21:21                   -
+javacc/                                            01-Nov-2005 00:34                   -
+javaconfig/                                        01-Nov-2005 00:35                   -
+javadb/                                            21-Aug-2011 14:37                   -
+javadoc/                                           31-Oct-2005 19:40                   -
+javaee/                                            21-Aug-2011 14:37                   -
+javagroups/                                        01-Nov-2005 05:14                   -
+javainetlocator/                                   01-Nov-2005 05:03                   -
+javamail/                                          01-Nov-2005 05:07                   -
+javancss/                                          01-Nov-2005 05:19                   -
+javanettasks/                                      21-Aug-2011 14:37                   -
+javassist/                                         01-Apr-2008 07:08                   -
+javassist /                                        04-Apr-2008 17:18                   -
+javatar/                                           01-Nov-2005 05:19                   -
+javax/                                             20-Jul-2015 11:38                   -
+javazoom/                                          10-Nov-2012 09:25                   -
+javolution/                                        21-Aug-2011 17:05                   -
+jawin/                                             24-Nov-2005 06:03                   -
+jaxb/                                              21-Aug-2011 14:37                   -
+jaxen/                                             19-Oct-2006 19:23                   -
+jaxme/                                             06-Nov-2006 01:06                   -
+jaxr-ra/                                           21-Aug-2011 14:37                   -
+jblanket/                                          01-Nov-2005 05:11                   -
+jboss/                                             27-Apr-2013 08:15                   -
+jca/                                               01-Nov-2005 05:03                   -
+jcache/                                            01-Nov-2005 05:03                   -
+jcharts/                                           06-Dec-2007 02:46                   -
+jcifs/                                             29-Apr-2008 16:16                   -
+jcom/                                              24-Nov-2005 06:03                   -
+jcommon/                                           28-Oct-2005 01:27                   -
+jcoverage/                                         01-Nov-2005 05:20                   -
+jcs/                                               01-Nov-2005 05:03                   -
+jcs-javagroups/                                    01-Nov-2005 05:18                   -
+jcvsii/                                            01-Nov-2005 05:03                   -
+jdbc/                                              28-Oct-2005 01:26                   -
+jdbm/                                              01-Nov-2005 05:13                   -
+jdepend/                                           01-Nov-2005 05:03                   -
+jdiff/                                             01-Nov-2005 05:19                   -
+jdo/                                               01-Nov-2005 05:03                   -
+jdom/                                              28-Oct-2005 01:27                   -
+jdring/                                            01-Nov-2005 05:09                   -
+jdsl/                                              01-Nov-2005 05:04                   -
+jen/                                               21-Aug-2011 14:38                   -
+jencks/                                            01-Nov-2005 05:13                   -
+jep/                                               01-Nov-2005 05:03                   -
+jepi/                                              21-Aug-2011 14:38                   -
+jersey/                                            21-Aug-2011 14:38                   -
+jetty/                                             20-Oct-2006 15:24                   -
+jexcelapi/                                         06-Nov-2006 01:07                   -
+jface/                                             01-Nov-2005 05:09                   -
+jfree/                                             13-Dec-2006 19:51                   -
+jfreechart/                                        01-Nov-2005 05:15                   -
+jgen/                                              01-Nov-2005 05:20                   -
+jgoodies/                                          01-Nov-2005 05:13                   -
+jgraph/                                            01-Nov-2005 05:07                   -
+jgrapht/                                           01-Nov-2005 05:07                   -
+jgroups/                                           01-Nov-2005 05:04                   -
+jhunlang/                                          01-Nov-2005 05:04                   -
+jini/                                              10-Dec-2005 02:18                   -
+jintention/                                        21-Aug-2011 14:38                   -
+jisp/                                              01-Nov-2005 05:10                   -
+jivesoftware/                                      01-Nov-2005 05:03                   -
+jlibdiff/                                          01-Nov-2005 05:03                   -
+jline/                                             19-Oct-2006 19:23                   -
+jmagick/                                           21-Aug-2011 14:38                   -
+jmaki/                                             21-Aug-2011 14:38                   -
+jmdns/                                             01-Nov-2005 05:14                   -
+jmimemagic/                                        01-Nov-2005 05:14                   -
+jmml/                                              01-Nov-2005 05:12                   -
+jmock/                                             28-Oct-2005 01:26                   -
+jms/                                               28-Oct-2005 01:27                   -
+jmscts/                                            01-Nov-2005 05:09                   -
+jmsn/                                              01-Nov-2005 05:16                   -
+joda-time/                                         15-Nov-2009 14:12                   -
+john-test/                                         29-May-2008 08:01                   -
+jotm/                                              01-Nov-2005 05:20                   -
+jp/                                                30-Nov-2016 13:53                   -
+jparsec/                                           26-Aug-2006 17:55                   -
+jpl/                                               10-Nov-2012 09:26                   -
+jpox/                                              21-Jan-2008 06:44                   -
+jpox-dbcp/                                         13-Mar-2007 21:30                   -
+jpox-enhancer/                                     13-Mar-2007 21:30                   -
+jpox-java5/                                        13-Mar-2007 21:30                   -
+jrexx/                                             01-Nov-2005 05:11                   -
+jrms/                                              01-Nov-2005 05:19                   -
+jrobin/                                            01-Nov-2005 05:06                   -
+jruby/                                             21-Aug-2007 18:14                   -
+jsch/                                              28-Oct-2005 01:26                   -
+jsf-extensions/                                    21-Aug-2011 14:38                   -
+jspapi/                                            28-Oct-2005 01:26                   -
+jsptags/                                           01-Nov-2005 05:15                   -
+jstl/                                              28-Oct-2005 01:26                   -
+jstyle/                                            01-Nov-2005 05:09                   -
+jta/                                               28-Oct-2005 01:26                   -
+jtds/                                              20-Jan-2006 12:18                   -
+jtidy/                                             28-Oct-2005 01:27                   -
+juddi/                                             01-Nov-2005 05:03                   -
+jug/                                               01-Nov-2005 05:12                   -
+jung/                                              01-Nov-2005 05:03                   -
+junit/                                             10-May-2009 13:17                   -
+junit-addons/                                      28-Oct-2005 01:27                   -
+junit-doclet/                                      01-Nov-2005 05:19                   -
+junitperf/                                         01-Nov-2005 05:21                   -
+juno/                                              21-Aug-2011 14:38                   -
+jwebunit/                                          01-Nov-2005 05:10                   -
+jxta/                                              01-Nov-2005 05:10                   -
+jython/                                            01-Nov-2005 05:04                   -
+kawa/                                              01-Nov-2005 05:04                   -
+kg/                                                23-Feb-2013 09:19                   -
+kohsuke/                                           21-Aug-2011 14:38                   -
+kr/                                                30-Nov-2016 13:56                   -
+kxml/                                              01-Nov-2005 05:09                   -
+kxml2/                                             01-Nov-2005 05:07                   -
+kz/                                                04-Jan-2016 09:50                   -
+la/                                                20-Apr-2015 11:09                   -
+ldapd-common/                                      01-Nov-2005 05:21                   -
+ldapsdk/                                           01-Nov-2005 05:11                   -
+li/                                                30-Nov-2016 14:03                   -
+life/                                              30-Nov-2016 14:04                   -
+lingo/                                             01-Nov-2005 05:21                   -
+link/                                              07-Dec-2015 11:24                   -
+locc/                                              01-Nov-2005 05:11                   -
+log4j/                                             28-Nov-2007 21:22                   -
+log4unit/                                          01-Nov-2005 05:20                   -
+logkit/                                            02-Nov-2005 09:29                   -
+loom/                                              01-Nov-2005 05:21                   -
+lpg/                                               16-Nov-2013 10:06                   -
+lt/                                                19-Jan-2013 09:12                   -
+lucene/                                            01-Nov-2005 05:04                   -
+lv/                                                22-Feb-2016 10:49                   -
+ly/                                                29-Sep-2014 10:35                   -
+ma/                                                30-Nov-2016 14:08                   -
+magicGball/                                        01-Nov-2005 05:03                   -
+maps/                                              21-Aug-2011 14:38                   -
+market/                                            12-Oct-2015 22:45                   -
+marmalade/                                         21-Jul-2006 17:02                   -
+math/                                              23-Nov-2013 10:01                   -
+maven/                                             06-Nov-2006 01:08                   -
+maven-integration-test-helper/                     11-Jun-2011 11:01                   -
+maven-javanet-plugin/                              21-Aug-2011 14:39                   -
+maven-new/                                         01-Nov-2005 05:06                   -
+maven-plugins/                                     06-Nov-2006 01:07                   -
+maven-proxy/                                       01-Nov-2005 05:03                   -
+maven-taglib/                                      01-Nov-2005 05:19                   -
+maven-torque-plugin/                               01-Nov-2005 05:03                   -
+maven-validator/                                   01-Nov-2005 05:07                   -
+maven-xdoclet2-plugin/                             01-Nov-2005 05:19                   -
+maxq/                                              01-Nov-2005 05:09                   -
+mckoi/                                             01-Nov-2005 05:12                   -
+md/                                                30-Nov-2016 14:09                   -
+me/                                                30-Nov-2016 14:09                   -
+merlin/                                            01-Nov-2005 05:02                   -
+merlin-developer/                                  01-Nov-2005 05:19                   -
+merlin-tutorial/                                   01-Nov-2005 05:15                   -
+messenger/                                         01-Nov-2005 05:08                   -
+metaclass/                                         01-Nov-2005 05:08                   -
+mevenide/                                          01-Nov-2005 05:14                   -
+microcontainer/                                    01-Nov-2005 05:16                   -
+middlegen/                                         01-Nov-2005 05:03                   -
+mil/                                               30-Nov-2016 14:19                   -
+milyn/                                             16-May-2007 17:40                   -
+ml/                                                30-Nov-2016 14:20                   -
+mm/                                                01-Nov-2005 05:12                   -
+mm-mysql/                                          01-Nov-2005 05:16                   -
+mobi/                                              30-Nov-2016 14:22                   -
+mockcreator/                                       01-Nov-2005 05:09                   -
+mockit/                                            21-Aug-2011 14:39                   -
+mockmaker/                                         01-Nov-2005 05:07                   -
+mockobjects/                                       01-Nov-2005 05:05                   -
+mockrunner/                                        24-Nov-2005 06:03                   -
+modello/                                           01-Nov-2005 05:12                   -
+mrj/                                               01-Nov-2005 05:14                   -
+ms/                                                01-Aug-2014 21:28                   -
+mstor/                                             01-Nov-2005 05:14                   -
+msv/                                               01-Nov-2005 05:15                   -
+mule/                                              10-Apr-2007 13:34                   -
+muse/                                              01-Nov-2005 05:11                   -
+mx/                                                22-Feb-2016 10:54                   -
+mx4j/                                              01-Nov-2005 05:14                   -
+myfaces/                                           21-Nov-2005 13:21                   -
+mysql/                                             15-Oct-2011 10:12                   -
+name/                                              30-Nov-2016 14:22                   -
+nanning/                                           01-Nov-2005 05:11                   -
+nanocontainer/                                     14-Jun-2006 10:28                   -
+nekohtml/                                          01-Jun-2008 16:25                   -
+neo/                                               01-Nov-2005 05:08                   -
+net/                                               30-Nov-2016 14:23                   -
+netbeans/                                          01-Nov-2005 05:04                   -
+new/                                               21-Aug-2011 15:09                   -
+nf/                                                02-Mar-2013 10:13                   -
+ng/                                                30-Nov-2016 16:55                   -
+ninja/                                             16-Nov-2015 14:52                   -
+nl/                                                30-Nov-2016 16:55                   -
+no/                                                30-Nov-2016 17:07                   -
+norbert/                                           01-Nov-2005 05:03                   -
+np/                                                17-Nov-2014 12:32                   -
+nsuml/                                             01-Nov-2005 05:16                   -
+nu/                                                30-Nov-2016 17:15                   -
+nz/                                                30-Nov-2016 17:15                   -
+oauth/                                             26-Feb-2010 19:44                   -
+odmg/                                              28-Oct-2005 01:27                   -
+ognl/                                              20-Jun-2007 20:09                   -
+ojb/                                               01-Nov-2005 05:11                   -
+ojdbc/                                             28-Oct-2005 01:26                   -
+old/                                               01-Nov-2005 05:13                   -
+one/                                               30-Nov-2015 14:42                   -
+oness/                                             01-Nov-2005 05:13                   -
+online/                                            30-Nov-2016 17:23                   -
+open/                                              21-Aug-2011 15:33                   -
+open-esb/                                          21-Aug-2011 15:33                   -
+opencypher/                                        30-Nov-2016 17:23                   -
+openejb/                                           07-May-2006 00:35                   -
+openim/                                            01-Nov-2005 05:12                   -
+openjms/                                           01-Nov-2005 05:03                   -
+opennms/                                           01-Nov-2005 05:06                   -
+opensymphony/                                      19-Feb-2009 14:07                   -
+oracle/                                            21-Aug-2011 15:33                   -
+org/                                               30-Nov-2016 17:23                   -
+org.elasticsearch/                                 30-Nov-2016 17:23                   -
+org.elasticsearch.client/                          30-Nov-2016 17:23                   -
+org.elasticsearch.distribution.integ-test-zip/     30-Nov-2016 17:23                   -
+org.elasticsearch.distribution.zip/                30-Nov-2016 17:23                   -
+org.elasticsearch.gradle/                          30-Nov-2016 17:23                   -
+org.elasticsearch.plugin/                          30-Nov-2016 17:23                   -
+org.elasticsearch.test/                            30-Nov-2016 17:23                   -
+oro/                                               28-Oct-2005 01:27                   -
+oscube/                                            01-Nov-2005 05:02                   -
+p2psockets/                                        01-Nov-2005 05:15                   -
+p6spy/                                             01-Nov-2005 05:05                   -
+patterntesting/                                    01-Nov-2005 05:05                   -
+payload/                                           01-Nov-2005 05:03                   -
+pcj/                                               01-Nov-2005 05:09                   -
+pdfbox/                                            01-Nov-2005 05:16                   -
+pe/                                                21-Nov-2016 12:45                   -
+penguin/                                           01-Nov-2005 05:10                   -
+petridish/                                         01-Nov-2005 05:06                   -
+ph/                                                30-Jun-2012 17:32                   -
+piccolo/                                           01-Nov-2005 05:03                   -
+picocontainer/                                     14-Jun-2006 10:25                   -
+picounit/                                          01-Nov-2005 05:10                   -
+pircbot/                                           01-Nov-2005 05:06                   -
+pitt/                                              07-Dec-2013 15:12                   -
+pl/                                                25-Jan-2016 18:00                   -
+plexus/                                            04-Jan-2007 19:16                   -
+plj/                                               01-Nov-2005 05:14                   -
+plugin/                                            01-Nov-2005 05:07                   -
+pluto-container/                                   01-Nov-2005 05:07                   -
+pmd/                                               10-Aug-2008 09:08                   -
+pnuts/                                             22-Aug-2011 09:13                   -
+poi/                                               28-Oct-2005 23:26                   -
+poolman/                                           01-Nov-2005 05:20                   -
+portlet-api/                                       01-Nov-2005 05:10                   -
+postgresql/                                        01-Nov-2005 05:15                   -
+prevayler/                                         01-Nov-2005 05:13                   -
+pro/                                               03-Nov-2015 02:37                   -
+proctor/                                           22-Aug-2011 09:13                   -
+profiler/                                          01-Nov-2005 05:11                   -
+proxool/                                           28-Oct-2005 01:27                   -
+proxytoys/                                         01-Nov-2005 05:04                   -
+pt/                                                15-Dec-2015 03:32                   -
+pubscribe/                                         01-Nov-2005 05:11                   -
+pull-parser/                                       28-Oct-2005 01:27                   -
+pw/                                                26-Oct-2013 13:30                   -
+qdox/                                              28-Oct-2005 01:27                   -
+qfork/                                             01-Nov-2005 05:14                   -
+quartz/                                            01-Nov-2005 05:16                   -
+quartz-jboss/                                      26-Feb-2010 21:25                   -
+quartz-oracle/                                     26-Feb-2010 21:25                   -
+quartz-weblogic/                                   26-Feb-2010 21:25                   -
+quilt/                                             01-Nov-2005 05:12                   -
+radeox/                                            01-Nov-2005 05:14                   -
+re/                                                17-Aug-2014 12:17                   -
+readline/                                          01-Nov-2005 05:10                   -
+red/                                               21-Nov-2016 12:45                   -
+redhill/                                           01-Nov-2005 05:03                   -
+redis/                                             09-Oct-2010 07:48                   -
+redmine/                                           22-Aug-2011 09:13                   -
+regexp/                                            19-Oct-2006 19:23                   -
+relaxngDatatype/                                   01-Nov-2005 05:15                   -
+ren/                                               19-Oct-2015 23:59                   -
+reportrunner/                                      01-Nov-2005 05:15                   -
+rest/                                              21-Nov-2016 12:45                   -
+rhino/                                             01-Nov-2005 05:11                   -
+ro/                                                21-Dec-2015 16:56                   -
+robo-guice/                                        22-Aug-2011 09:13                   -
+roboguice/                                         22-Aug-2011 09:13                   -
+rocks/                                             20-Oct-2014 18:43                   -
+roller/                                            22-Aug-2011 09:13                   -
+rome/                                              22-Aug-2011 09:13                   -
+rs/                                                01-Dec-2014 19:54                   -
+rss4j/                                             01-Nov-2005 05:08                   -
+rsslibj/                                           01-Nov-2005 05:04                   -
+ru/                                                14-Mar-2016 15:50                   -
+rubygems/                                          27-Oct-2015 00:40                   -
+run/                                               21-Nov-2016 12:45                   -
+sablecc/                                           01-Nov-2005 05:04                   -
+sax/                                               01-Nov-2005 05:11                   -
+saxon/                                             19-Oct-2006 19:23                   -
+saxpath/                                           28-Oct-2005 01:26                   -
+sc/                                                15-Jun-2015 21:26                   -
+science/                                           21-Nov-2016 12:45                   -
+scout/                                             29-Oct-2005 08:00                   -
+scraping-engine/                                   01-Nov-2005 05:07                   -
+se/                                                11-Jan-2016 15:55                   -
+securityfilter/                                    01-Nov-2005 05:13                   -
+servicemix/                                        25-Mar-2006 00:55                   -
+servicemix-ws/                                     01-Nov-2005 05:15                   -
+servletapi/                                        28-Oct-2005 23:26                   -
+servlets/                                          01-Nov-2005 05:12                   -
+setpoint/                                          06-Nov-2006 01:09                   -
+sfx4j/                                             22-Aug-2011 09:14                   -
+sg/                                                21-Nov-2016 12:45                   -
+sh/                                                10-Nov-2015 04:31                   -
+shellix/                                           22-Aug-2011 09:14                   -
+shocks/                                            01-Nov-2005 05:11                   -
+si/                                                15-Feb-2016 16:33                   -
+sillyexceptions/                                   01-Nov-2005 05:04                   -
+simple-jms/                                        09-Dec-2005 01:32                   -
+simple-jndi/                                       01-Nov-2005 05:19                   -
+sk/                                                15-Feb-2016 16:33                   -
+skaringa/                                          01-Nov-2005 05:09                   -
+skinlf/                                            01-Nov-2005 05:03                   -
+slide/                                             01-Nov-2005 05:14                   -
+smartrics/                                         15-Dec-2012 12:57                   -
+soap/                                              01-Nov-2005 05:04                   -
+software/                                          14-Mar-2016 15:54                   -
+soimp/                                             22-Aug-2011 09:14                   -
+solarisrealm/                                      22-Aug-2011 09:14                   -
+solutions/                                         20-Oct-2015 00:09                   -
+space/                                             21-Nov-2016 12:45                   -
+speexx/                                            01-Nov-2005 05:04                   -
+spice/                                             01-Nov-2005 05:03                   -
+spring/                                            01-Nov-2005 05:07                   -
+springframework/                                   01-Nov-2005 05:11                   -
+springmodules/                                     19-Jun-2006 22:22                   -
+sqlline/                                           09-Mar-2015 21:41                   -
+sshtools/                                          01-Nov-2005 05:03                   -
+sslext/                                            01-Nov-2005 05:04                   -
+st/                                                10-Aug-2015 22:33                   -
+stapler/                                           22-Aug-2011 09:15                   -
+statcvs/                                           01-Nov-2005 05:07                   -
+stax/                                              06-Nov-2006 01:09                   -
+stax-utils/                                        01-Nov-2005 05:11                   -
+stratum/                                           01-Nov-2005 05:14                   -
+stream/                                            21-Nov-2016 12:45                   -
+struts/                                            01-Nov-2005 05:15                   -
+struts-menu/                                       01-Nov-2005 05:03                   -
+strutstestcase/                                    01-Nov-2005 05:12                   -
+studio/                                            21-Nov-2016 12:45                   -
+stxx/                                              01-Nov-2005 05:05                   -
+su/                                                10-Aug-2014 15:19                   -
+subpersistence/                                    01-Nov-2005 05:09                   -
+subshell/                                          01-Nov-2005 05:03                   -
+suiterunner/                                       01-Nov-2005 05:09                   -
+surefire/                                          28-Oct-2005 01:26                   -
+swarmcache/                                        28-Oct-2005 01:26                   -
+swt/                                               01-Nov-2005 05:05                   -
+systems/                                           18-Jan-2016 16:33                   -
+sysunit/                                           01-Nov-2005 05:15                   -
+tablelayout/                                       01-Nov-2005 05:14                   -
+tagalog/                                           01-Nov-2005 05:16                   -
+tagishauth/                                        01-Nov-2005 05:03                   -
+taglibrarydoc/                                     01-Nov-2005 05:07                   -
+taglibs/                                           01-Nov-2005 05:06                   -
+tagsoup/                                           05-Nov-2005 01:42                   -
+tambora/                                           01-Nov-2005 05:20                   -
+tanukisoft/                                        07-Mar-2008 02:07                   -
+tapestry/                                          01-Nov-2005 05:04                   -
+tclib/                                             01-Nov-2005 05:07                   -
+tec/                                               23-Mar-2015 21:07                   -
+tech/                                              22-Feb-2016 17:58                   -
+technology/                                        15-Dec-2015 03:41                   -
+textarea/                                          01-Nov-2005 05:16                   -
+th/                                                13-Oct-2015 11:58                   -
+thaiopensource/                                    19-Oct-2006 19:23                   -
+tiffrenderer/                                      01-Nov-2005 05:09                   -
+tjdo/                                              01-Nov-2005 05:03                   -
+tk/                                                11-Jan-2016 15:58                   -
+tl/                                                13-Jul-2013 12:50                   -
+tmporb/                                            01-Nov-2005 05:09                   -
+to/                                                25-Jan-2016 18:06                   -
+tokyo/                                             21-Nov-2016 12:45                   -
+tomcat/                                            24-Jan-2008 04:19                   -
+tomcat-util/                                       01-Nov-2005 05:20                   -
+tonic/                                             08-Nov-2005 05:35                   -
+tools/                                             29-Feb-2016 17:11                   -
+top/                                               08-Feb-2016 18:28                   -
+toplink/                                           22-Aug-2011 09:16                   -
+torque/                                            11-Jan-2008 22:47                   -
+torque-gen/                                        01-Nov-2005 05:04                   -
+touchstone/                                        01-Nov-2005 05:10                   -
+tr/                                                15-Dec-2015 03:41                   -
+traer/                                             07-Apr-2012 17:18                   -
+trail-taglib/                                      01-Nov-2005 05:04                   -
+tranql/                                            01-Nov-2005 05:10                   -
+travel/                                            04-May-2015 22:09                   -
+trove/                                             01-Nov-2005 05:08                   -
+turbine/                                           01-Nov-2005 05:04                   -
+tv/                                                18-Jan-2016 16:34                   -
+tw/                                                18-May-2015 21:53                   -
+tyrex/                                             01-Nov-2005 05:14                   -
+ua/                                                29-Feb-2016 17:11                   -
+uaihebert/                                         23-Feb-2013 13:20                   -
+ubique/                                            01-Nov-2005 05:15                   -
+ug/                                                25-Jan-2016 18:07                   -
+uispec4j/                                          01-Nov-2005 05:07                   -
+uk/                                                10-Aug-2015 22:35                   -
+uno/                                               01-Dec-2015 04:36                   -
+urbanophile/                                       01-Nov-2005 05:03                   -
+urlrewrite/                                        24-Nov-2005 06:03                   -
+us/                                                18-Jan-2016 16:35                   -
+uy/                                                24-Aug-2015 23:36                   -
+vc/                                                28-Dec-2015 15:38                   -
+vdoclet/                                           01-Nov-2005 05:11                   -
+velocity/                                          29-Apr-2007 21:29                   -
+velocity-anakia/                                   29-Apr-2007 21:29                   -
+velocity-dvsl/                                     01-Nov-2005 05:12                   -
+velocity-tools/                                    01-Nov-2005 05:10                   -
+village/                                           01-Nov-2005 05:04                   -
+vn/                                                02-Dec-2016 00:09                   -
+vu/                                                20-Jul-2013 12:57                   -
+wadi/                                              01-Nov-2005 05:15                   -
+wang/                                              10-Aug-2015 22:36                   -
+webmacro/                                          01-Nov-2005 05:12                   -
+website/                                           22-Feb-2016 18:03                   -
+webtest/                                           01-Nov-2005 05:19                   -
+werken-xpath/                                      28-Oct-2005 01:26                   -
+werkflow/                                          01-Nov-2005 05:16                   -
+werkz/                                             01-Nov-2005 05:08                   -
+westhawk/                                          01-Nov-2005 05:18                   -
+wf/                                                10-Nov-2014 19:54                   -
+which/                                             01-Nov-2005 05:16                   -
+wicket/                                            11-Aug-2008 15:44                   -
+wiki/                                              22-Feb-2016 18:03                   -
+win/                                               21-Nov-2016 12:45                   -
+woodstox/                                          21-Nov-2007 04:35                   -
+work/                                              18-Jan-2016 16:37                   -
+works/                                             22-Feb-2016 18:03                   -
+wrapper/                                           01-Nov-2005 05:14                   -
+ws/                                                25-Jan-2016 18:11                   -
+ws-commons/                                        19-Sep-2006 14:21                   -
+ws-commons-java5/                                  01-Nov-2005 05:03                   -
+ws-commons-util/                                   01-Nov-2005 05:16                   -
+ws-scout/                                          18-Feb-2006 13:32                   -
+wsdl4j/                                            01-Nov-2005 05:07                   -
+wsrf/                                              01-Nov-2005 05:08                   -
+wss4j/                                             02-May-2006 20:32                   -
+wstx/                                              01-Nov-2005 05:09                   -
+wurfl/                                             01-Nov-2005 05:14                   -
+wutka/                                             01-Nov-2005 05:21                   -
+xajile/                                            03-Aug-2009 09:25                   -
+xalan/                                             30-Sep-2008 08:02                   -
+xbean/                                             04-Jan-2006 17:31                   -
+xdoclet/                                           17-Jul-2008 21:29                   -
+xdoclet-plugins/                                   02-Jul-2006 21:14                   -
+xerces/                                            19-Oct-2006 19:23                   -
+xercesjarv/                                        01-Nov-2005 05:06                   -
+xfire/                                             06-Nov-2006 01:09                   -
+xfire-root/                                        01-Nov-2005 05:03                   -
+xin/                                               21-Nov-2016 12:45                   -
+xjavadoc/                                          01-Nov-2005 05:14                   -
+xml-apis/                                          22-Dec-2006 13:37                   -
+xml-resolver/                                      01-Nov-2005 05:11                   -
+xml-security/                                      19-Oct-2006 19:23                   -
+xmlbeans/                                          03-Jul-2007 16:43                   -
+xmldb/                                             01-Nov-2005 05:12                   -
+xmlenc/                                            01-Nov-2005 05:19                   -
+xmlmind/                                           01-Nov-2005 05:21                   -
+xmlpull/                                           01-Nov-2005 05:21                   -
+xmlrpc/                                            25-Jun-2006 02:41                   -
+xmlrpc-helma/                                      01-Nov-2005 05:03                   -
+xmlunit/                                           15-Sep-2008 23:50                   -
+xmlwise/                                           27-Oct-2012 10:59                   -
+xmlwriter/                                         01-Nov-2005 05:04                   -
+xom/                                               19-Oct-2006 19:23                   -
+xpp3/                                              28-Oct-2005 01:26                   -
+xsddoc/                                            01-Nov-2005 05:19                   -
+xsdlib/                                            01-Nov-2005 05:04                   -
+xstream/                                           27-Nov-2006 21:45                   -
+xtc/                                               07-Apr-2012 17:20                   -
+xtiff-jai/                                         01-Nov-2005 05:10                   -
+xxl/                                               01-Nov-2005 05:12                   -
+xyz/                                               08-Feb-2016 18:33                   -
+yan/                                               13-Jan-2006 21:31                   -
+ymsg/                                              01-Nov-2005 05:04                   -
+yom/                                               01-Nov-2005 05:08                   -
+za/                                                25-May-2013 12:39                   -
+zone/                                              26-Jan-2015 23:05                   -
+94a8262a403880.properties                          03-Feb-2015 07:36                 301
+94a8262a403880.properties.md5                      20-May-2015 05:24                  32
+94a8262a403880.properties.sha1                     20-May-2015 05:24                  40
+9e9bbc30f020cf.properties                          03-Oct-2014 19:03                 310
+9e9bbc30f020cf.properties.md5                      02-Nov-2014 16:27                  32
+9e9bbc30f020cf.properties.sha1                     02-Nov-2014 16:27                  40
+archetype-catalog.xml                              27-Nov-2016 13:20             5385400
+archetype-catalog.xml.md5                          27-Nov-2016 13:20                  32
+archetype-catalog.xml.sha1                         27-Nov-2016 13:20                  40
+fb69c44c24b38.properties                           17-Apr-2014 13:29                 307
+fb69c44c24b38.properties.md5                       02-Nov-2014 14:37                  32
+fb69c44c24b38.properties.sha1                      02-Nov-2014 14:37                  40
+last_updated.txt                                   28-Nov-2016 06:55                  29
+robots.txt                                         10-Nov-2009 12:12                  26
+server.txt                                         08-Nov-2014 19:04                 207
+

+ diff --git a/pom.xml b/pom.xml new file mode 100644 index 000000000..0b08f813d --- /dev/null +++ b/pom.xml @@ -0,0 +1,34 @@ + + + + 4.0.0 + groupId + 484_P7_1-GUI + 1.0-SNAPSHOT + + + + junit + junit + 4.12 + test + + + org.seleniumhq.selenium + selenium-java + 3.11.0 + + + org.junit.jupiter + junit-jupiter-api + 5.1.0 + + + org.apache.pdfbox + pdfbox + 2.0.1 + + + \ No newline at end of file diff --git a/pom.xml.versionsBackup b/pom.xml.versionsBackup new file mode 100644 index 000000000..bdd1af24c --- /dev/null +++ b/pom.xml.versionsBackup @@ -0,0 +1,33 @@ + + + + 4.0.0 + groupId + 484_P7_1-GUI + 1.0-SNAPSHOT + pom + 484_P7_1-GUI + + + + + junit + junit + RELEASE + test + + + org.seleniumhq.selenium + selenium-java + RELEASE + + + org.junit.jupiter + junit-jupiter-api + RELEASE + + + + \ No newline at end of file diff --git a/run.sh b/run.sh new file mode 100644 index 000000000..d2138e2b9 --- /dev/null +++ b/run.sh @@ -0,0 +1,26 @@ +#!/usr/bin/env bash +gem update --system +# download and use jruby +wget https://repo1.maven.org/maven2/org/jruby/jruby-dist/9.1.16.0/jruby-dist-9.1.16.0-bin.zip +unzip jruby-dist-9.1.16.0-bin.zip +mv jruby-9.1.16.0 ~/ +export PATH=~/jruby-9.1.16.0/bin:$PATH +# create back-end jar +echo 'CLONING BACK END REPO...' +cd ~/ +git clone https://github.com/redmyers/tabula-java.git +cd tabula-java +echo 'CREATING BACK-END JAR...' +mvn clean compile assembly:single +mvn install:install-file -Dfile=../tabula-java/target/tabula-1.0.2-SNAPSHOT-jar-with-dependencies.jar -DgroupId=technology.tabula -DartifactId=tabula -Dversion=1.0.2-SNAPSHOT -Dpackaging=jar -DpomFile=pom.xml +# start server via GUI repo +cd ~/ +git clone https://github.com/redmyers/484_P7_1-GUI.git +cd 484_P7_1-GUI +git checkout Header_Addition +export PATH=~/jruby-9.1.16.0/bin:$PATH +gem install bundler +bundle install +jruby -S jbundle install +jruby -G -r jbundler -S rackup + diff --git a/src/test/css/_bootstrap-variables.scss b/src/test/css/_bootstrap-variables.scss new file mode 100644 index 000000000..2e546934d --- /dev/null +++ b/src/test/css/_bootstrap-variables.scss @@ -0,0 +1,830 @@ +// Override Bootstrap variables here (defaults from bootstrap-sass v3.3.1.0): + +// When true, asset path helpers are used, otherwise the regular CSS `url()` is used. +// When there no function is defined, `fn('')` is parsed as string that equals the right hand side +// NB: in Sass 3.3 there is a native function: function-exists(twbs-font-path) +// $bootstrap-sass-asset-helper: (twbs-font-path("") != unquote('twbs-font-path("")')) + +// +// Variables +// -------------------------------------------------- + +//== Colors +// +//## Gray and brand colors for use across Bootstrap. + +// $gray-base: #000 +// $gray-darker: lighten($gray-base, 13.5%) // #222 +// $gray-dark: lighten($gray-base, 20%) // #333 +// $gray: lighten($gray-base, 33.5%) // #555 +// $gray-light: lighten($gray-base, 46.7%) // #777 +// $gray-lighter: lighten($gray-base, 93.5%) // #eee + +// $brand-primary: darken(#428bca, 6.5%) +// $brand-success: #5cb85c +// $brand-info: #5bc0de +// $brand-warning: #f0ad4e +// $brand-danger: #d9534f + +//== Scaffolding +// +//## Settings for some of the most global styles. + +//** Background color for ``. +// $body-bg: #fff +//** Global text color on ``. +// $text-color: $gray-dark + +//** Global textual link color. +// $link-color: $brand-primary +//** Link hover color set via `darken()` function. +// $link-hover-color: darken($link-color, 15%) +//** Link hover decoration. +// $link-hover-decoration: underline + +//== Typography +// +//## Font, line-height, and color for body text, headings, and more. + +// $font-family-sans-serif: "Helvetica Neue", Helvetica, Arial, sans-serif +// $font-family-serif: Georgia, "Times New Roman", Times, serif +//** Default monospace fonts for ``, ``, and `
`.
+// $font-family-monospace:   Menlo, Monaco, Consolas, "Courier New", monospace
+// $font-family-base:        $font-family-sans-serif
+
+// $font-size-base:          14px
+// $font-size-large:         ceil(($font-size-base * 1.25)) // ~18px
+// $font-size-small:         ceil(($font-size-base * 0.85)) // ~12px
+
+// $font-size-h1:            floor(($font-size-base * 2.6)) // ~36px
+// $font-size-h2:            floor(($font-size-base * 2.15)) // ~30px
+// $font-size-h3:            ceil(($font-size-base * 1.7)) // ~24px
+// $font-size-h4:            ceil(($font-size-base * 1.25)) // ~18px
+// $font-size-h5:            $font-size-base
+// $font-size-h6:            ceil(($font-size-base * 0.85)) // ~12px
+
+//** Unit-less `line-height` for use in components like buttons.
+// $line-height-base:        1.428571429 // 20/14
+//** Computed "line-height" (`font-size` * `line-height`) for use with `margin`, `padding`, etc.
+// $line-height-computed:    floor(($font-size-base * $line-height-base)) // ~20px
+
+//** By default, this inherits from the ``.
+// $headings-font-family:    inherit
+// $headings-font-weight:    500
+// $headings-line-height:    1.1
+// $headings-color:          inherit
+
+//== Iconography
+//
+//## Specify custom location and filename of the included Glyphicons icon font. Useful for those including Bootstrap via Bower.
+
+//** Load fonts from this directory.
+
+// [converter] Asset helpers such as Sprockets and Node.js Mincer do not resolve relative paths
+// $icon-font-path: if($bootstrap-sass-asset-helper, "bootstrap/", "../fonts/bootstrap/")
+
+//** File name for all font files.
+// $icon-font-name:          "glyphicons-halflings-regular"
+//** Element ID within SVG icon file.
+// $icon-font-svg-id:        "glyphicons_halflingsregular"
+
+//== Components
+//
+//## Define common padding and border radius sizes and more. Values based on 14px text and 1.428 line-height (~20px to start).
+
+// $padding-base-vertical:     6px
+// $padding-base-horizontal:   12px
+
+// $padding-large-vertical:    10px
+// $padding-large-horizontal:  16px
+
+// $padding-small-vertical:    5px
+// $padding-small-horizontal:  10px
+
+// $padding-xs-vertical:       1px
+// $padding-xs-horizontal:     5px
+
+// $line-height-large:         1.33
+// $line-height-small:         1.5
+
+// $border-radius-base:        4px
+// $border-radius-large:       6px
+// $border-radius-small:       3px
+
+//** Global color for active items (e.g., navs or dropdowns).
+// $component-active-color:    #fff
+//** Global background color for active items (e.g., navs or dropdowns).
+// $component-active-bg:       $brand-primary
+
+//** Width of the `border` for generating carets that indicator dropdowns.
+// $caret-width-base:          4px
+//** Carets increase slightly in size for larger components.
+// $caret-width-large:         5px
+
+//== Tables
+//
+//## Customizes the `.table` component with basic values, each used across all table variations.
+
+//** Padding for ``s and ``s.
+// $table-cell-padding:            8px
+//** Padding for cells in `.table-condensed`.
+// $table-condensed-cell-padding:  5px
+
+//** Default background color used for all tables.
+// $table-bg:                      transparent
+//** Background color used for `.table-striped`.
+// $table-bg-accent:               #f9f9f9
+//** Background color used for `.table-hover`.
+// $table-bg-hover:                #f5f5f5
+// $table-bg-active:               $table-bg-hover
+
+//** Border color for table and cell borders.
+// $table-border-color:            #ddd
+
+//== Buttons
+//
+//## For each of Bootstrap's buttons, define text, background and border color.
+
+// $btn-font-weight:                normal
+
+// $btn-default-color:              #333
+// $btn-default-bg:                 #fff
+// $btn-default-border:             #ccc
+
+// $btn-primary-color:              #fff
+// $btn-primary-bg:                 $brand-primary
+// $btn-primary-border:             darken($btn-primary-bg, 5%)
+
+// $btn-success-color:              #fff
+// $btn-success-bg:                 $brand-success
+// $btn-success-border:             darken($btn-success-bg, 5%)
+
+// $btn-info-color:                 #fff
+// $btn-info-bg:                    $brand-info
+// $btn-info-border:                darken($btn-info-bg, 5%)
+
+// $btn-warning-color:              #fff
+// $btn-warning-bg:                 $brand-warning
+// $btn-warning-border:             darken($btn-warning-bg, 5%)
+
+// $btn-danger-color:               #fff
+// $btn-danger-bg:                  $brand-danger
+// $btn-danger-border:              darken($btn-danger-bg, 5%)
+
+// $btn-link-disabled-color:        $gray-light
+
+//== Forms
+//
+//##
+
+//** `` background color
+// $input-bg:                       #fff
+//** `` background color
+// $input-bg-disabled:              $gray-lighter
+
+//** Text color for ``s
+// $input-color:                    $gray
+//** `` border color
+// $input-border:                   #ccc
+
+// TODO: Rename `$input-border-radius` to `$input-border-radius-base` in v4
+//** Default `.form-control` border radius
+// $input-border-radius:            $border-radius-base
+//** Large `.form-control` border radius
+// $input-border-radius-large:      $border-radius-large
+//** Small `.form-control` border radius
+// $input-border-radius-small:      $border-radius-small
+
+//** Border color for inputs on focus
+// $input-border-focus:             #66afe9
+
+//** Placeholder text color
+// $input-color-placeholder:        #999
+
+//** Default `.form-control` height
+// $input-height-base:              ($line-height-computed + ($padding-base-vertical * 2) + 2)
+//** Large `.form-control` height
+// $input-height-large:             (ceil($font-size-large * $line-height-large) + ($padding-large-vertical * 2) + 2)
+//** Small `.form-control` height
+// $input-height-small:             (floor($font-size-small * $line-height-small) + ($padding-small-vertical * 2) + 2)
+
+// $legend-color:                   $gray-dark
+// $legend-border-color:            #e5e5e5
+
+//** Background color for textual input addons
+// $input-group-addon-bg:           $gray-lighter
+//** Border color for textual input addons
+// $input-group-addon-border-color: $input-border
+
+//** Disabled cursor for form controls and buttons.
+// $cursor-disabled:                not-allowed
+
+//== Dropdowns
+//
+//## Dropdown menu container and contents.
+
+//** Background for the dropdown menu.
+// $dropdown-bg:                    #fff
+//** Dropdown menu `border-color`.
+// $dropdown-border:                rgba(0,0,0,.15)
+//** Dropdown menu `border-color` **for IE8**.
+// $dropdown-fallback-border:       #ccc
+//** Divider color for between dropdown items.
+// $dropdown-divider-bg:            #e5e5e5
+
+//** Dropdown link text color.
+// $dropdown-link-color:            $gray-dark
+//** Hover color for dropdown links.
+// $dropdown-link-hover-color:      darken($gray-dark, 5%)
+//** Hover background for dropdown links.
+// $dropdown-link-hover-bg:         #f5f5f5
+
+//** Active dropdown menu item text color.
+// $dropdown-link-active-color:     $component-active-color
+//** Active dropdown menu item background color.
+// $dropdown-link-active-bg:        $component-active-bg
+
+//** Disabled dropdown menu item background color.
+// $dropdown-link-disabled-color:   $gray-light
+
+//** Text color for headers within dropdown menus.
+// $dropdown-header-color:          $gray-light
+
+//** Deprecated `$dropdown-caret-color` as of v3.1.0
+// $dropdown-caret-color:           #000
+
+//-- Z-index master list
+//
+// Warning: Avoid customizing these values. They're used for a bird's eye view
+// of components dependent on the z-axis and are designed to all work together.
+//
+// Note: These variables are not generated into the Customizer.
+
+// $zindex-navbar:            1000
+// $zindex-dropdown:          1000
+// $zindex-popover:           1060
+// $zindex-tooltip:           1070
+// $zindex-navbar-fixed:      1030
+// $zindex-modal:             1040
+
+//== Media queries breakpoints
+//
+//## Define the breakpoints at which your layout will change, adapting to different screen sizes.
+
+// Extra small screen / phone
+//** Deprecated `$screen-xs` as of v3.0.1
+// $screen-xs:                  480px
+//** Deprecated `$screen-xs-min` as of v3.2.0
+// $screen-xs-min:              $screen-xs
+//** Deprecated `$screen-phone` as of v3.0.1
+// $screen-phone:               $screen-xs-min
+
+// Small screen / tablet
+//** Deprecated `$screen-sm` as of v3.0.1
+// $screen-sm:                  768px
+// $screen-sm-min:              $screen-sm
+//** Deprecated `$screen-tablet` as of v3.0.1
+// $screen-tablet:              $screen-sm-min
+
+// Medium screen / desktop
+//** Deprecated `$screen-md` as of v3.0.1
+// $screen-md:                  992px
+// $screen-md-min:              $screen-md
+//** Deprecated `$screen-desktop` as of v3.0.1
+// $screen-desktop:             $screen-md-min
+
+// Large screen / wide desktop
+//** Deprecated `$screen-lg` as of v3.0.1
+// $screen-lg:                  1200px
+// $screen-lg-min:              $screen-lg
+//** Deprecated `$screen-lg-desktop` as of v3.0.1
+// $screen-lg-desktop:          $screen-lg-min
+
+// So media queries don't overlap when required, provide a maximum
+// $screen-xs-max:              ($screen-sm-min - 1)
+// $screen-sm-max:              ($screen-md-min - 1)
+// $screen-md-max:              ($screen-lg-min - 1)
+
+//== Grid system
+//
+//## Define your custom responsive grid.
+
+//** Number of columns in the grid.
+// $grid-columns:              12
+//** Padding between columns. Gets divided in half for the left and right.
+// $grid-gutter-width:         30px
+// Navbar collapse
+//** Point at which the navbar becomes uncollapsed.
+// $grid-float-breakpoint:     $screen-sm-min
+//** Point at which the navbar begins collapsing.
+// $grid-float-breakpoint-max: ($grid-float-breakpoint - 1)
+
+//== Container sizes
+//
+//## Define the maximum width of `.container` for different screen sizes.
+
+// Small screen / tablet
+// $container-tablet:             (720px + $grid-gutter-width)
+//** For `$screen-sm-min` and up.
+// $container-sm:                 $container-tablet
+
+// Medium screen / desktop
+// $container-desktop:            (940px + $grid-gutter-width)
+//** For `$screen-md-min` and up.
+// $container-md:                 $container-desktop
+
+// Large screen / wide desktop
+// $container-large-desktop:      (1140px + $grid-gutter-width)
+//** For `$screen-lg-min` and up.
+// $container-lg:                 $container-large-desktop
+
+//== Navbar
+//
+//##
+
+// Basics of a navbar
+// $navbar-height:                    50px
+// $navbar-margin-bottom:             $line-height-computed
+// $navbar-border-radius:             $border-radius-base
+// $navbar-padding-horizontal:        floor(($grid-gutter-width / 2))
+// $navbar-padding-vertical:          (($navbar-height - $line-height-computed) / 2)
+// $navbar-collapse-max-height:       340px
+
+// $navbar-default-color:             #777
+// $navbar-default-bg:                #f8f8f8
+// $navbar-default-border:            darken($navbar-default-bg, 6.5%)
+
+// Navbar links
+// $navbar-default-link-color:                #777
+// $navbar-default-link-hover-color:          #333
+// $navbar-default-link-hover-bg:             transparent
+// $navbar-default-link-active-color:         #555
+// $navbar-default-link-active-bg:            darken($navbar-default-bg, 6.5%)
+// $navbar-default-link-disabled-color:       #ccc
+// $navbar-default-link-disabled-bg:          transparent
+
+// Navbar brand label
+// $navbar-default-brand-color:               $navbar-default-link-color
+// $navbar-default-brand-hover-color:         darken($navbar-default-brand-color, 10%)
+// $navbar-default-brand-hover-bg:            transparent
+
+// Navbar toggle
+// $navbar-default-toggle-hover-bg:           #ddd
+// $navbar-default-toggle-icon-bar-bg:        #888
+// $navbar-default-toggle-border-color:       #ddd
+
+// Inverted navbar
+// Reset inverted navbar basics
+// $navbar-inverse-color:                      lighten($gray-light, 15%)
+// $navbar-inverse-bg:                         #222
+// $navbar-inverse-border:                     darken($navbar-inverse-bg, 10%)
+
+// Inverted navbar links
+// $navbar-inverse-link-color:                 lighten($gray-light, 15%)
+// $navbar-inverse-link-hover-color:           #fff
+// $navbar-inverse-link-hover-bg:              transparent
+// $navbar-inverse-link-active-color:          $navbar-inverse-link-hover-color
+// $navbar-inverse-link-active-bg:             darken($navbar-inverse-bg, 10%)
+// $navbar-inverse-link-disabled-color:        #444
+// $navbar-inverse-link-disabled-bg:           transparent
+
+// Inverted navbar brand label
+// $navbar-inverse-brand-color:                $navbar-inverse-link-color
+// $navbar-inverse-brand-hover-color:          #fff
+// $navbar-inverse-brand-hover-bg:             transparent
+
+// Inverted navbar toggle
+// $navbar-inverse-toggle-hover-bg:            #333
+// $navbar-inverse-toggle-icon-bar-bg:         #fff
+// $navbar-inverse-toggle-border-color:        #333
+
+//== Navs
+//
+//##
+
+//=== Shared nav styles
+// $nav-link-padding:                          10px 15px
+// $nav-link-hover-bg:                         $gray-lighter
+
+// $nav-disabled-link-color:                   $gray-light
+// $nav-disabled-link-hover-color:             $gray-light
+
+//== Tabs
+// $nav-tabs-border-color:                     #ddd
+
+// $nav-tabs-link-hover-border-color:          $gray-lighter
+
+// $nav-tabs-active-link-hover-bg:             $body-bg
+// $nav-tabs-active-link-hover-color:          $gray
+// $nav-tabs-active-link-hover-border-color:   #ddd
+
+// $nav-tabs-justified-link-border-color:            #ddd
+// $nav-tabs-justified-active-link-border-color:     $body-bg
+
+//== Pills
+// $nav-pills-border-radius:                   $border-radius-base
+// $nav-pills-active-link-hover-bg:            $component-active-bg
+// $nav-pills-active-link-hover-color:         $component-active-color
+
+//== Pagination
+//
+//##
+
+// $pagination-color:                     $link-color
+// $pagination-bg:                        #fff
+// $pagination-border:                    #ddd
+
+// $pagination-hover-color:               $link-hover-color
+// $pagination-hover-bg:                  $gray-lighter
+// $pagination-hover-border:              #ddd
+
+// $pagination-active-color:              #fff
+// $pagination-active-bg:                 $brand-primary
+// $pagination-active-border:             $brand-primary
+
+// $pagination-disabled-color:            $gray-light
+// $pagination-disabled-bg:               #fff
+// $pagination-disabled-border:           #ddd
+
+//== Pager
+//
+//##
+
+// $pager-bg:                             $pagination-bg
+// $pager-border:                         $pagination-border
+// $pager-border-radius:                  15px
+
+// $pager-hover-bg:                       $pagination-hover-bg
+
+// $pager-active-bg:                      $pagination-active-bg
+// $pager-active-color:                   $pagination-active-color
+
+// $pager-disabled-color:                 $pagination-disabled-color
+
+//== Jumbotron
+//
+//##
+
+// $jumbotron-padding:              30px
+// $jumbotron-color:                inherit
+// $jumbotron-bg:                   $gray-lighter
+// $jumbotron-heading-color:        inherit
+// $jumbotron-font-size:            ceil(($font-size-base * 1.5))
+
+//== Form states and alerts
+//
+//## Define colors for form feedback states and, by default, alerts.
+
+// $state-success-text:             #3c763d
+// $state-success-bg:               #dff0d8
+// $state-success-border:           darken(adjust-hue($state-success-bg, -10), 5%)
+
+// $state-info-text:                #31708f
+// $state-info-bg:                  #d9edf7
+// $state-info-border:              darken(adjust-hue($state-info-bg, -10), 7%)
+
+// $state-warning-text:             #8a6d3b
+// $state-warning-bg:               #fcf8e3
+// $state-warning-border:           darken(adjust-hue($state-warning-bg, -10), 5%)
+
+// $state-danger-text:              #a94442
+// $state-danger-bg:                #f2dede
+// $state-danger-border:            darken(adjust-hue($state-danger-bg, -10), 5%)
+
+//== Tooltips
+//
+//##
+
+//** Tooltip max width
+// $tooltip-max-width:           200px
+//** Tooltip text color
+// $tooltip-color:               #fff
+//** Tooltip background color
+// $tooltip-bg:                  #000
+// $tooltip-opacity:             .9
+
+//** Tooltip arrow width
+// $tooltip-arrow-width:         5px
+//** Tooltip arrow color
+// $tooltip-arrow-color:         $tooltip-bg
+
+//== Popovers
+//
+//##
+
+//** Popover body background color
+// $popover-bg:                          #fff
+//** Popover maximum width
+// $popover-max-width:                   276px
+//** Popover border color
+// $popover-border-color:                rgba(0,0,0,.2)
+//** Popover fallback border color
+// $popover-fallback-border-color:       #ccc
+
+//** Popover title background color
+// $popover-title-bg:                    darken($popover-bg, 3%)
+
+//** Popover arrow width
+// $popover-arrow-width:                 10px
+//** Popover arrow color
+// $popover-arrow-color:                 $popover-bg
+
+//** Popover outer arrow width
+// $popover-arrow-outer-width:           ($popover-arrow-width + 1)
+//** Popover outer arrow color
+// $popover-arrow-outer-color:           fade_in($popover-border-color, 0.05)
+//** Popover outer arrow fallback color
+// $popover-arrow-outer-fallback-color:  darken($popover-fallback-border-color, 20%)
+
+//== Labels
+//
+//##
+
+//** Default label background color
+// $label-default-bg:            $gray-light
+//** Primary label background color
+// $label-primary-bg:            $brand-primary
+//** Success label background color
+// $label-success-bg:            $brand-success
+//** Info label background color
+// $label-info-bg:               $brand-info
+//** Warning label background color
+// $label-warning-bg:            $brand-warning
+//** Danger label background color
+// $label-danger-bg:             $brand-danger
+
+//** Default label text color
+// $label-color:                 #fff
+//** Default text color of a linked label
+// $label-link-hover-color:      #fff
+
+//== Modals
+//
+//##
+
+//** Padding applied to the modal body
+// $modal-inner-padding:         15px
+
+//** Padding applied to the modal title
+// $modal-title-padding:         15px
+//** Modal title line-height
+// $modal-title-line-height:     $line-height-base
+
+//** Background color of modal content area
+// $modal-content-bg:                             #fff
+//** Modal content border color
+// $modal-content-border-color:                   rgba(0,0,0,.2)
+//** Modal content border color **for IE8**
+// $modal-content-fallback-border-color:          #999
+
+//** Modal backdrop background color
+// $modal-backdrop-bg:           #000
+//** Modal backdrop opacity
+// $modal-backdrop-opacity:      .5
+//** Modal header border color
+// $modal-header-border-color:   #e5e5e5
+//** Modal footer border color
+// $modal-footer-border-color:   $modal-header-border-color
+
+// $modal-lg:                    900px
+// $modal-md:                    600px
+// $modal-sm:                    300px
+
+//== Alerts
+//
+//## Define alert colors, border radius, and padding.
+
+// $alert-padding:               15px
+// $alert-border-radius:         $border-radius-base
+// $alert-link-font-weight:      bold
+
+// $alert-success-bg:            $state-success-bg
+// $alert-success-text:          $state-success-text
+// $alert-success-border:        $state-success-border
+
+// $alert-info-bg:               $state-info-bg
+// $alert-info-text:             $state-info-text
+// $alert-info-border:           $state-info-border
+
+// $alert-warning-bg:            $state-warning-bg
+// $alert-warning-text:          $state-warning-text
+// $alert-warning-border:        $state-warning-border
+
+// $alert-danger-bg:             $state-danger-bg
+// $alert-danger-text:           $state-danger-text
+// $alert-danger-border:         $state-danger-border
+
+//== Progress bars
+//
+//##
+
+//** Background color of the whole progress component
+// $progress-bg:                 #f5f5f5
+//** Progress bar text color
+// $progress-bar-color:          #fff
+//** Variable for setting rounded corners on progress bar.
+// $progress-border-radius:      $border-radius-base
+
+//** Default progress bar color
+// $progress-bar-bg:             $brand-primary
+//** Success progress bar color
+// $progress-bar-success-bg:     $brand-success
+//** Warning progress bar color
+// $progress-bar-warning-bg:     $brand-warning
+//** Danger progress bar color
+// $progress-bar-danger-bg:      $brand-danger
+//** Info progress bar color
+// $progress-bar-info-bg:        $brand-info
+
+//== List group
+//
+//##
+
+//** Background color on `.list-group-item`
+// $list-group-bg:                 #fff
+//** `.list-group-item` border color
+// $list-group-border:             #ddd
+//** List group border radius
+// $list-group-border-radius:      $border-radius-base
+
+//** Background color of single list items on hover
+// $list-group-hover-bg:           #f5f5f5
+//** Text color of active list items
+// $list-group-active-color:       $component-active-color
+//** Background color of active list items
+// $list-group-active-bg:          $component-active-bg
+//** Border color of active list elements
+// $list-group-active-border:      $list-group-active-bg
+//** Text color for content within active list items
+// $list-group-active-text-color:  lighten($list-group-active-bg, 40%)
+
+//** Text color of disabled list items
+// $list-group-disabled-color:      $gray-light
+//** Background color of disabled list items
+// $list-group-disabled-bg:         $gray-lighter
+//** Text color for content within disabled list items
+// $list-group-disabled-text-color: $list-group-disabled-color
+
+// $list-group-link-color:         #555
+// $list-group-link-hover-color:   $list-group-link-color
+// $list-group-link-heading-color: #333
+
+//== Panels
+//
+//##
+
+// $panel-bg:                    #fff
+// $panel-body-padding:          15px
+// $panel-heading-padding:       10px 15px
+// $panel-footer-padding:        $panel-heading-padding
+// $panel-border-radius:         $border-radius-base
+
+//** Border color for elements within panels
+// $panel-inner-border:          #ddd
+// $panel-footer-bg:             #f5f5f5
+
+// $panel-default-text:          $gray-dark
+// $panel-default-border:        #ddd
+// $panel-default-heading-bg:    #f5f5f5
+
+// $panel-primary-text:          #fff
+// $panel-primary-border:        $brand-primary
+// $panel-primary-heading-bg:    $brand-primary
+
+// $panel-success-text:          $state-success-text
+// $panel-success-border:        $state-success-border
+// $panel-success-heading-bg:    $state-success-bg
+
+// $panel-info-text:             $state-info-text
+// $panel-info-border:           $state-info-border
+// $panel-info-heading-bg:       $state-info-bg
+
+// $panel-warning-text:          $state-warning-text
+// $panel-warning-border:        $state-warning-border
+// $panel-warning-heading-bg:    $state-warning-bg
+
+// $panel-danger-text:           $state-danger-text
+// $panel-danger-border:         $state-danger-border
+// $panel-danger-heading-bg:     $state-danger-bg
+
+//== Thumbnails
+//
+//##
+
+//** Padding around the thumbnail image
+// $thumbnail-padding:           4px
+//** Thumbnail background color
+// $thumbnail-bg:                $body-bg
+//** Thumbnail border color
+// $thumbnail-border:            #ddd
+//** Thumbnail border radius
+// $thumbnail-border-radius:     $border-radius-base
+
+//** Custom text color for thumbnail captions
+// $thumbnail-caption-color:     $text-color
+//** Padding around the thumbnail caption
+// $thumbnail-caption-padding:   9px
+
+//== Wells
+//
+//##
+
+// $well-bg:                     #f5f5f5
+// $well-border:                 darken($well-bg, 7%)
+
+//== Badges
+//
+//##
+
+// $badge-color:                 #fff
+//** Linked badge text color on hover
+// $badge-link-hover-color:      #fff
+// $badge-bg:                    $gray-light
+
+//** Badge text color in active nav link
+// $badge-active-color:          $link-color
+//** Badge background color in active nav link
+// $badge-active-bg:             #fff
+
+// $badge-font-weight:           bold
+// $badge-line-height:           1
+// $badge-border-radius:         10px
+
+//== Breadcrumbs
+//
+//##
+
+// $breadcrumb-padding-vertical:   8px
+// $breadcrumb-padding-horizontal: 15px
+//** Breadcrumb background color
+// $breadcrumb-bg:                 #f5f5f5
+//** Breadcrumb text color
+// $breadcrumb-color:              #ccc
+//** Text color of current page in the breadcrumb
+// $breadcrumb-active-color:       $gray-light
+//** Textual separator for between breadcrumb elements
+// $breadcrumb-separator:          "/"
+
+//== Carousel
+//
+//##
+
+// $carousel-text-shadow:                        0 1px 2px rgba(0,0,0,.6)
+
+// $carousel-control-color:                      #fff
+// $carousel-control-width:                      15%
+// $carousel-control-opacity:                    .5
+// $carousel-control-font-size:                  20px
+
+// $carousel-indicator-active-bg:                #fff
+// $carousel-indicator-border-color:             #fff
+
+// $carousel-caption-color:                      #fff
+
+//== Close
+//
+//##
+
+// $close-font-weight:           bold
+// $close-color:                 #000
+// $close-text-shadow:           0 1px 0 #fff
+
+//== Code
+//
+//##
+
+// $code-color:                  #c7254e
+// $code-bg:                     #f9f2f4
+
+// $kbd-color:                   #fff
+// $kbd-bg:                      #333
+
+// $pre-bg:                      #f5f5f5
+// $pre-color:                   $gray-dark
+// $pre-border-color:            #ccc
+// $pre-scrollable-max-height:   340px
+
+//== Type
+//
+//##
+
+//** Horizontal offset for forms and lists.
+// $component-offset-horizontal: 180px
+//** Text muted color
+// $text-muted:                  $gray-light
+//** Abbreviations and acronyms border color
+// $abbr-border-color:           $gray-light
+//** Headings small color
+// $headings-small-color:        $gray-light
+//** Blockquote small color
+// $blockquote-small-color:      $gray-light
+//** Blockquote font size
+// $blockquote-font-size:        ($font-size-base * 1.25)
+//** Blockquote border color
+// $blockquote-border-color:     $gray-lighter
+//** Page header border color
+// $page-header-border-color:    $gray-lighter
+//** Width of horizontal description list titles
+// $dl-horizontal-offset:        $component-offset-horizontal
+//** Horizontal line color.
+// $hr-border:                   $gray-lighter
diff --git a/src/test/css/selectors.css b/src/test/css/selectors.css
new file mode 100644
index 000000000..2aa1791ef
--- /dev/null
+++ b/src/test/css/selectors.css
@@ -0,0 +1,146 @@
+.thumbnail-list li div.selection-show {
+  position: absolute;
+  border: 1px dashed red;
+  display: none;
+  pointer-events: none;
+}
+
+/* selections */
+.repeat-lassos-group {
+  position: absolute;
+  right: -185px;
+  bottom: -35px;
+}
+
+/* rectangularSelector.js classes */
+.selection-box, .table-region {
+  position: absolute;
+  border: 1px dashed rgba(255, 87, 0, 0.8);
+  background: rgba(255, 87, 0, 0.2);
+  box-sizing: border-box;
+}
+.selection-box:hover, .table-region:hover {
+  cursor: pointer;
+}
+
+.selection-box {
+  z-index: 42;
+  width: 0;
+  height: 0;
+  visibility: hidden;
+}
+
+.table-region {
+  top: 0;
+  left: 0;
+  z-index: 21;
+  
+}
+
+div.table-region .resize-handle {
+  position: absolute;
+}
+
+div.table-region .n-border {
+  width: calc(100% - 10px);
+  top: -5px;
+  left: 5px;
+  height: 10px;
+}
+
+div.table-region .s-border {
+  width: calc(100% - 10px);
+  bottom: -5px;
+  left: 5px;
+  height: 10px;
+}
+
+div.table-region .w-border {
+  height: calc(100% - 10px);
+  left: -5px;
+  top: 5px;
+  width: 10px;
+}
+
+div.table-region .e-border {
+  height: calc(100% - 10px);
+  top: 5px;
+  right: -5px;
+  width: 10px;
+}
+
+div.table-region .nw-border {
+  width: 10px;
+  height: 10px;
+  top: -5px;
+  left: -5px;
+}
+
+div.table-region .ne-border {
+  width: 10px;
+  height: 10px;
+  top: -5px;
+  right: -5px;
+}
+
+div.table-region .sw-border {
+  width: 10px;
+  height: 10px;
+  bottom: -5px;
+  left: -5px;
+}
+
+div.table-region .se-border {
+  width: 10px;
+  height: 10px;
+  bottom: -5px;
+  right: -5px;
+}
+
+div.table-region .n-border:hover {
+  cursor: n-resize;
+}
+
+div.table-region .nw-border:hover {
+  cursor: nw-resize;
+}
+
+div.table-region .ne-border:hover {
+  cursor: ne-resize;
+}
+
+div.table-region .s-border:hover {
+  cursor: s-resize;
+}
+
+div.table-region .sw-border:hover {
+  cursor: sw-resize;
+}
+
+div.table-region .se-border:hover {
+  cursor: se-resize;
+}
+
+div.table-region .w-border:hover {
+  cursor: w-resize;
+}
+
+div.table-region .e-border:hover {
+  cursor: e-resize;
+}
+
+div.table-region button[name=close] {
+  font-weight: bold;
+  border: 0;
+  background-color: transparent;
+  padding: 0;
+  font-size: 20px;
+  position: relative;
+  top: -25px;
+  left: 100%;
+  margin-left: 5px;
+}
+
+div.table-region button[name=close]:hover {
+  color: red;
+}
diff --git a/src/test/css/styles.css b/src/test/css/styles.css
new file mode 100644
index 000000000..856b8118b
--- /dev/null
+++ b/src/test/css/styles.css
@@ -0,0 +1,7852 @@
+@charset "UTF-8";
+/*! normalize.css v3.0.1 | 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: transparent;
+}
+
+a:active,
+a:hover {
+  outline: 0;
+}
+
+abbr[title] {
+  border-bottom: 1px dotted;
+}
+
+b,
+strong {
+  font-weight: bold;
+}
+
+dfn {
+  font-style: italic;
+}
+
+h1 {
+  font-size: 2em;
+  margin: 0.67em 0;
+}
+
+mark {
+  background: #ff0;
+  color: #000;
+}
+
+small {
+  font-size: 80%;
+}
+
+sub,
+sup {
+  font-size: 75%;
+  line-height: 0;
+  position: relative;
+  vertical-align: baseline;
+}
+
+sup {
+  top: -0.5em;
+}
+
+sub {
+  bottom: -0.25em;
+}
+
+img {
+  border: 0;
+}
+
+svg:not(:root) {
+  overflow: hidden;
+}
+
+figure {
+  margin: 1em 40px;
+}
+
+hr {
+  -moz-box-sizing: content-box;
+  box-sizing: content-box;
+  height: 0;
+}
+
+pre {
+  overflow: auto;
+}
+
+code,
+kbd,
+pre,
+samp {
+  font-family: monospace, monospace;
+  font-size: 1em;
+}
+
+button,
+input,
+optgroup,
+select,
+textarea {
+  color: inherit;
+  font: inherit;
+  margin: 0;
+}
+
+button {
+  overflow: visible;
+}
+
+button,
+select {
+  text-transform: none;
+}
+
+button,
+html input[type="button"],
+input[type="reset"],
+input[type="submit"] {
+  -webkit-appearance: button;
+  cursor: pointer;
+}
+
+button[disabled],
+html input[disabled] {
+  cursor: default;
+}
+
+button::-moz-focus-inner,
+input::-moz-focus-inner {
+  border: 0;
+  padding: 0;
+}
+
+input {
+  line-height: normal;
+}
+
+input[type="checkbox"],
+input[type="radio"] {
+  box-sizing: border-box;
+  padding: 0;
+}
+
+input[type="number"]::-webkit-inner-spin-button,
+input[type="number"]::-webkit-outer-spin-button {
+  height: auto;
+}
+
+input[type="search"] {
+  -webkit-appearance: textfield;
+  -moz-box-sizing: content-box;
+  -webkit-box-sizing: content-box;
+  box-sizing: content-box;
+}
+
+input[type="search"]::-webkit-search-cancel-button,
+input[type="search"]::-webkit-search-decoration {
+  -webkit-appearance: none;
+}
+
+fieldset {
+  border: 1px solid #c0c0c0;
+  margin: 0 2px;
+  padding: 0.35em 0.625em 0.75em;
+}
+
+legend {
+  border: 0;
+  padding: 0;
+}
+
+textarea {
+  overflow: auto;
+}
+
+optgroup {
+  font-weight: bold;
+}
+
+table {
+  border-collapse: collapse;
+  border-spacing: 0;
+}
+
+td,
+th {
+  padding: 0;
+}
+
+@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;
+  }
+}
+@font-face {
+  font-family: 'Glyphicons Halflings';
+  src: url(webapp/fonts/bootstrap/glyphicons-halflings-regular.eot);
+  src: url(webapp/fonts/bootstrap/glyphicons-halflings-regular.eot?#iefix) format("embedded-opentype"), url(webapp/fonts/bootstrap/glyphicons-halflings-regular.woff) format("woff"), url(webapp/fonts/bootstrap/glyphicons-halflings-regular.ttf) format("truetype"), url(webapp/fonts/bootstrap/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: normal;
+  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:before {
+  content: "\e022";
+}
+
+.glyphicon-time:before {
+  content: "\e023";
+}
+
+.glyphicon-road:before {
+  content: "\e024";
+}
+
+.glyphicon-download-alt:before {
+  content: "\e025";
+}
+
+.glyphicon-download:before {
+  content: "\e026";
+}
+
+.glyphicon-upload:before {
+  content: "\e027";
+}
+
+.glyphicon-inbox:before {
+  content: "\e028";
+}
+
+.glyphicon-play-circle:before {
+  content: "\e029";
+}
+
+.glyphicon-repeat:before {
+  content: "\e030";
+}
+
+.glyphicon-refresh:before {
+  content: "\e031";
+}
+
+.glyphicon-list-alt:before {
+  content: "\e032";
+}
+
+.glyphicon-lock:before {
+  content: "\e033";
+}
+
+.glyphicon-flag:before {
+  content: "\e034";
+}
+
+.glyphicon-headphones:before {
+  content: "\e035";
+}
+
+.glyphicon-volume-off:before {
+  content: "\e036";
+}
+
+.glyphicon-volume-down:before {
+  content: "\e037";
+}
+
+.glyphicon-volume-up:before {
+  content: "\e038";
+}
+
+.glyphicon-qrcode:before {
+  content: "\e039";
+}
+
+.glyphicon-barcode:before {
+  content: "\e040";
+}
+
+.glyphicon-tag:before {
+  content: "\e041";
+}
+
+.glyphicon-tags:before {
+  content: "\e042";
+}
+
+.glyphicon-book:before {
+  content: "\e043";
+}
+
+.glyphicon-bookmark:before {
+  content: "\e044";
+}
+
+.glyphicon-print:before {
+  content: "\e045";
+}
+
+.glyphicon-camera:before {
+  content: "\e046";
+}
+
+.glyphicon-font:before {
+  content: "\e047";
+}
+
+.glyphicon-bold:before {
+  content: "\e048";
+}
+
+.glyphicon-italic:before {
+  content: "\e049";
+}
+
+.glyphicon-text-height:before {
+  content: "\e050";
+}
+
+.glyphicon-text-width:before {
+  content: "\e051";
+}
+
+.glyphicon-align-left:before {
+  content: "\e052";
+}
+
+.glyphicon-align-center:before {
+  content: "\e053";
+}
+
+.glyphicon-align-right:before {
+  content: "\e054";
+}
+
+.glyphicon-align-justify:before {
+  content: "\e055";
+}
+
+.glyphicon-list:before {
+  content: "\e056";
+}
+
+.glyphicon-indent-left:before {
+  content: "\e057";
+}
+
+.glyphicon-indent-right:before {
+  content: "\e058";
+}
+
+.glyphicon-facetime-video:before {
+  content: "\e059";
+}
+
+.glyphicon-picture:before {
+  content: "\e060";
+}
+
+.glyphicon-map-marker:before {
+  content: "\e062";
+}
+
+.glyphicon-adjust:before {
+  content: "\e063";
+}
+
+.glyphicon-tint:before {
+  content: "\e064";
+}
+
+.glyphicon-edit:before {
+  content: "\e065";
+}
+
+.glyphicon-share:before {
+  content: "\e066";
+}
+
+.glyphicon-check:before {
+  content: "\e067";
+}
+
+.glyphicon-move:before {
+  content: "\e068";
+}
+
+.glyphicon-step-backward:before {
+  content: "\e069";
+}
+
+.glyphicon-fast-backward:before {
+  content: "\e070";
+}
+
+.glyphicon-backward:before {
+  content: "\e071";
+}
+
+.glyphicon-play:before {
+  content: "\e072";
+}
+
+.glyphicon-pause:before {
+  content: "\e073";
+}
+
+.glyphicon-stop:before {
+  content: "\e074";
+}
+
+.glyphicon-forward:before {
+  content: "\e075";
+}
+
+.glyphicon-fast-forward:before {
+  content: "\e076";
+}
+
+.glyphicon-step-forward:before {
+  content: "\e077";
+}
+
+.glyphicon-eject:before {
+  content: "\e078";
+}
+
+.glyphicon-chevron-left:before {
+  content: "\e079";
+}
+
+.glyphicon-chevron-right:before {
+  content: "\e080";
+}
+
+.glyphicon-plus-sign:before {
+  content: "\e081";
+}
+
+.glyphicon-minus-sign:before {
+  content: "\e082";
+}
+
+.glyphicon-remove-sign:before {
+  content: "\e083";
+}
+
+.glyphicon-ok-sign:before {
+  content: "\e084";
+}
+
+.glyphicon-question-sign:before {
+  content: "\e085";
+}
+
+.glyphicon-info-sign:before {
+  content: "\e086";
+}
+
+.glyphicon-screenshot:before {
+  content: "\e087";
+}
+
+.glyphicon-remove-circle:before {
+  content: "\e088";
+}
+
+.glyphicon-ok-circle:before {
+  content: "\e089";
+}
+
+.glyphicon-ban-circle:before {
+  content: "\e090";
+}
+
+.glyphicon-arrow-left:before {
+  content: "\e091";
+}
+
+.glyphicon-arrow-right:before {
+  content: "\e092";
+}
+
+.glyphicon-arrow-up:before {
+  content: "\e093";
+}
+
+.glyphicon-arrow-down:before {
+  content: "\e094";
+}
+
+.glyphicon-share-alt:before {
+  content: "\e095";
+}
+
+.glyphicon-resize-full:before {
+  content: "\e096";
+}
+
+.glyphicon-resize-small:before {
+  content: "\e097";
+}
+
+.glyphicon-exclamation-sign:before {
+  content: "\e101";
+}
+
+.glyphicon-gift:before {
+  content: "\e102";
+}
+
+.glyphicon-leaf:before {
+  content: "\e103";
+}
+
+.glyphicon-fire:before {
+  content: "\e104";
+}
+
+.glyphicon-eye-open:before {
+  content: "\e105";
+}
+
+.glyphicon-eye-close:before {
+  content: "\e106";
+}
+
+.glyphicon-warning-sign:before {
+  content: "\e107";
+}
+
+.glyphicon-plane:before {
+  content: "\e108";
+}
+
+.glyphicon-calendar:before {
+  content: "\e109";
+}
+
+.glyphicon-random:before {
+  content: "\e110";
+}
+
+.glyphicon-comment:before {
+  content: "\e111";
+}
+
+.glyphicon-magnet:before {
+  content: "\e112";
+}
+
+.glyphicon-chevron-up:before {
+  content: "\e113";
+}
+
+.glyphicon-chevron-down:before {
+  content: "\e114";
+}
+
+.glyphicon-retweet:before {
+  content: "\e115";
+}
+
+.glyphicon-shopping-cart:before {
+  content: "\e116";
+}
+
+.glyphicon-folder-close:before {
+  content: "\e117";
+}
+
+.glyphicon-folder-open:before {
+  content: "\e118";
+}
+
+.glyphicon-resize-vertical:before {
+  content: "\e119";
+}
+
+.glyphicon-resize-horizontal:before {
+  content: "\e120";
+}
+
+.glyphicon-hdd:before {
+  content: "\e121";
+}
+
+.glyphicon-bullhorn:before {
+  content: "\e122";
+}
+
+.glyphicon-bell:before {
+  content: "\e123";
+}
+
+.glyphicon-certificate:before {
+  content: "\e124";
+}
+
+.glyphicon-thumbs-up:before {
+  content: "\e125";
+}
+
+.glyphicon-thumbs-down:before {
+  content: "\e126";
+}
+
+.glyphicon-hand-right:before {
+  content: "\e127";
+}
+
+.glyphicon-hand-left:before {
+  content: "\e128";
+}
+
+.glyphicon-hand-up:before {
+  content: "\e129";
+}
+
+.glyphicon-hand-down:before {
+  content: "\e130";
+}
+
+.glyphicon-circle-arrow-right:before {
+  content: "\e131";
+}
+
+.glyphicon-circle-arrow-left:before {
+  content: "\e132";
+}
+
+.glyphicon-circle-arrow-up:before {
+  content: "\e133";
+}
+
+.glyphicon-circle-arrow-down:before {
+  content: "\e134";
+}
+
+.glyphicon-globe:before {
+  content: "\e135";
+}
+
+.glyphicon-wrench:before {
+  content: "\e136";
+}
+
+.glyphicon-tasks:before {
+  content: "\e137";
+}
+
+.glyphicon-filter:before {
+  content: "\e138";
+}
+
+.glyphicon-briefcase:before {
+  content: "\e139";
+}
+
+.glyphicon-fullscreen:before {
+  content: "\e140";
+}
+
+.glyphicon-dashboard:before {
+  content: "\e141";
+}
+
+.glyphicon-paperclip:before {
+  content: "\e142";
+}
+
+.glyphicon-heart-empty:before {
+  content: "\e143";
+}
+
+.glyphicon-link:before {
+  content: "\e144";
+}
+
+.glyphicon-phone:before {
+  content: "\e145";
+}
+
+.glyphicon-pushpin:before {
+  content: "\e146";
+}
+
+.glyphicon-usd:before {
+  content: "\e148";
+}
+
+.glyphicon-gbp:before {
+  content: "\e149";
+}
+
+.glyphicon-sort:before {
+  content: "\e150";
+}
+
+.glyphicon-sort-by-alphabet:before {
+  content: "\e151";
+}
+
+.glyphicon-sort-by-alphabet-alt:before {
+  content: "\e152";
+}
+
+.glyphicon-sort-by-order:before {
+  content: "\e153";
+}
+
+.glyphicon-sort-by-order-alt:before {
+  content: "\e154";
+}
+
+.glyphicon-sort-by-attributes:before {
+  content: "\e155";
+}
+
+.glyphicon-sort-by-attributes-alt:before {
+  content: "\e156";
+}
+
+.glyphicon-unchecked:before {
+  content: "\e157";
+}
+
+.glyphicon-expand:before {
+  content: "\e158";
+}
+
+.glyphicon-collapse-down:before {
+  content: "\e159";
+}
+
+.glyphicon-collapse-up:before {
+  content: "\e160";
+}
+
+.glyphicon-log-in:before {
+  content: "\e161";
+}
+
+.glyphicon-flash:before {
+  content: "\e162";
+}
+
+.glyphicon-log-out:before {
+  content: "\e163";
+}
+
+.glyphicon-new-window:before {
+  content: "\e164";
+}
+
+.glyphicon-record:before {
+  content: "\e165";
+}
+
+.glyphicon-save:before {
+  content: "\e166";
+}
+
+.glyphicon-open:before {
+  content: "\e167";
+}
+
+.glyphicon-saved:before {
+  content: "\e168";
+}
+
+.glyphicon-import:before {
+  content: "\e169";
+}
+
+.glyphicon-export:before {
+  content: "\e170";
+}
+
+.glyphicon-send:before {
+  content: "\e171";
+}
+
+.glyphicon-floppy-disk:before {
+  content: "\e172";
+}
+
+.glyphicon-floppy-saved:before {
+  content: "\e173";
+}
+
+.glyphicon-floppy-remove:before {
+  content: "\e174";
+}
+
+.glyphicon-floppy-save:before {
+  content: "\e175";
+}
+
+.glyphicon-floppy-open:before {
+  content: "\e176";
+}
+
+.glyphicon-credit-card:before {
+  content: "\e177";
+}
+
+.glyphicon-transfer:before {
+  content: "\e178";
+}
+
+.glyphicon-cutlery:before {
+  content: "\e179";
+}
+
+.glyphicon-header:before {
+  content: "\e180";
+}
+
+.glyphicon-compressed:before {
+  content: "\e181";
+}
+
+.glyphicon-earphone:before {
+  content: "\e182";
+}
+
+.glyphicon-phone-alt:before {
+  content: "\e183";
+}
+
+.glyphicon-tower:before {
+  content: "\e184";
+}
+
+.glyphicon-stats:before {
+  content: "\e185";
+}
+
+.glyphicon-sd-video:before {
+  content: "\e186";
+}
+
+.glyphicon-hd-video:before {
+  content: "\e187";
+}
+
+.glyphicon-subtitles:before {
+  content: "\e188";
+}
+
+.glyphicon-sound-stereo:before {
+  content: "\e189";
+}
+
+.glyphicon-sound-dolby:before {
+  content: "\e190";
+}
+
+.glyphicon-sound-5-1:before {
+  content: "\e191";
+}
+
+.glyphicon-sound-6-1:before {
+  content: "\e192";
+}
+
+.glyphicon-sound-7-1:before {
+  content: "\e193";
+}
+
+.glyphicon-copyright-mark:before {
+  content: "\e194";
+}
+
+.glyphicon-registration-mark:before {
+  content: "\e195";
+}
+
+.glyphicon-cloud-download:before {
+  content: "\e197";
+}
+
+.glyphicon-cloud-upload:before {
+  content: "\e198";
+}
+
+.glyphicon-tree-conifer:before {
+  content: "\e199";
+}
+
+.glyphicon-tree-deciduous:before {
+  content: "\e200";
+}
+
+* {
+  -webkit-box-sizing: border-box;
+  -moz-box-sizing: border-box;
+  box-sizing: border-box;
+}
+
+*:before,
+*:after {
+  -webkit-box-sizing: border-box;
+  -moz-box-sizing: border-box;
+  box-sizing: border-box;
+}
+
+html {
+  font-size: 10px;
+  -webkit-tap-highlight-color: transparent;
+}
+
+body {
+  font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
+  line-height: 1.428571429;
+  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 {
+  display: block;
+  width: 100% \9;
+  max-width: 100%;
+  height: auto;
+}
+
+.img-rounded {
+  border-radius: 6px;
+}
+
+.img-thumbnail {
+  padding: 4px;
+  line-height: 1.428571429;
+  background-color: #fff;
+  border: 1px solid #ddd;
+  border-radius: 4px;
+  -webkit-transition: all 0.2s ease-in-out;
+  -o-transition: all 0.2s ease-in-out;
+  transition: all 0.2s ease-in-out;
+  display: inline-block;
+  width: 100% \9;
+  max-width: 100%;
+  height: auto;
+}
+
+.img-circle {
+  border-radius: 50%;
+}
+
+hr {
+  margin-top: 20px;
+  margin-bottom: 20px;
+  border: 0;
+  border-top: 1px solid #eeeeee;
+}
+
+.sr-only {
+  position: absolute;
+  width: 1px;
+  height: 1px;
+  margin: -1px;
+  padding: 0;
+  overflow: hidden;
+  clip: rect(0, 0, 0, 0);
+  border: 0;
+}
+
+.sr-only-focusable:active, .sr-only-focusable:focus {
+  position: static;
+  width: auto;
+  height: auto;
+  margin: 0;
+  overflow: visible;
+  clip: auto;
+}
+
+h1, h2, h3, h4, h5, h6,
+.h1, .h2, .h3, .h4, .h5, .h6 {
+  font-family: inherit;
+  font-weight: 500;
+  line-height: 1.1;
+  color: inherit;
+}
+h1 small,
+h1 .small, h2 small,
+h2 .small, h3 small,
+h3 .small, h4 small,
+h4 .small, h5 small,
+h5 .small, h6 small,
+h6 .small,
+.h1 small,
+.h1 .small, .h2 small,
+.h2 .small, .h3 small,
+.h3 .small, .h4 small,
+.h4 .small, .h5 small,
+.h5 .small, .h6 small,
+.h6 .small {
+  font-weight: normal;
+  line-height: 1;
+  color: #777777;
+}
+
+h1, .h1,
+h2, .h2,
+h3, .h3 {
+  margin-top: 20px;
+  margin-bottom: 10px;
+}
+h1 small,
+h1 .small, .h1 small,
+.h1 .small,
+h2 small,
+h2 .small, .h2 small,
+.h2 .small,
+h3 small,
+h3 .small, .h3 small,
+.h3 .small {
+  font-size: 65%;
+}
+
+h4, .h4,
+h5, .h5,
+h6, .h6 {
+  margin-top: 0px;
+  margin-bottom: 10px;
+}
+h4 small,
+h4 .small, .h4 small,
+.h4 .small,
+h5 small,
+h5 .small, .h5 small,
+.h5 .small,
+h6 small,
+h6 .small, .h6 small,
+.h6 .small {
+  font-size: 75%;
+}
+
+h1, .h1 {
+  font-size: 36px;
+}
+
+h2, .h2 {
+  font-size: 30px;
+}
+
+h3, .h3 {
+  font-size: 24px;
+}
+
+h4, .h4 {
+  font-size: 18px;
+}
+
+h5, .h5 {
+  font-size: 14px;
+}
+
+h6, .h6 {
+  font-size: 12px;
+}
+
+p {
+  margin: 0 0 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%;
+}
+
+cite {
+  font-style: normal;
+}
+
+mark,
+.mark {
+  background-color: #fcf8e3;
+  padding: .2em;
+}
+
+.text-left {
+  text-align: left;
+}
+
+.text-right {
+  text-align: right;
+}
+
+.text-center {
+  text-align: center;
+}
+
+.text-justify {
+  text-align: justify;
+}
+
+.text-nowrap {
+  white-space: nowrap;
+}
+
+.text-lowercase {
+  text-transform: lowercase;
+}
+
+.text-uppercase {
+  text-transform: uppercase;
+}
+
+.text-capitalize {
+  text-transform: capitalize;
+}
+
+.text-muted {
+  color: #777777;
+}
+
+.text-primary {
+  color: #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;
+}
+
+.bg-primary {
+  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 {
+  background-color: #f2dede;
+}
+
+a.bg-danger:hover {
+  background-color: #e4b9b9;
+}
+
+.page-header {
+  padding-bottom: 9px;
+  margin: 40px 0 20px;
+  border-bottom: 1px solid #eeeeee;
+}
+
+ul,
+ol {
+  margin-top: 0;
+  margin-bottom: 0px;
+}
+ul ul,
+ul ol,
+ol ul,
+ol ol {
+  margin-bottom: 0;
+}
+
+.list-unstyled, .list-inline {
+  padding-left: 0;
+  list-style: none;
+}
+
+.list-inline {
+  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.428571429;
+}
+
+dt {
+  font-weight: bold;
+}
+
+dd {
+  margin-left: 0;
+}
+
+.dl-horizontal dd:before, .dl-horizontal dd:after {
+  content: " ";
+  display: table;
+}
+.dl-horizontal dd:after {
+  clear: both;
+}
+@media (min-width: 768px) {
+  .dl-horizontal dt {
+    float: left;
+    width: 160px;
+    clear: left;
+    text-align: right;
+    overflow: hidden;
+    text-overflow: ellipsis;
+    white-space: nowrap;
+  }
+  .dl-horizontal dd {
+    margin-left: 180px;
+  }
+}
+
+abbr[title],
+abbr[data-original-title] {
+  cursor: help;
+  border-bottom: 1px dotted #777777;
+}
+
+.initialism {
+  font-size: 90%;
+  text-transform: uppercase;
+}
+
+blockquote {
+  padding: 10px 20px;
+  margin: 0 0 20px;
+  font-size: 17.5px;
+  border-left: 5px solid #eeeeee;
+}
+blockquote p:last-child,
+blockquote ul:last-child,
+blockquote ol:last-child {
+  margin-bottom: 0;
+}
+blockquote footer,
+blockquote small,
+blockquote .small {
+  display: block;
+  font-size: 80%;
+  line-height: 1.428571429;
+  color: #777777;
+}
+blockquote footer:before,
+blockquote small:before,
+blockquote .small:before {
+  content: '\2014 \00A0';
+}
+
+.blockquote-reverse,
+blockquote.pull-right {
+  padding-right: 15px;
+  padding-left: 0;
+  border-right: 5px solid #eeeeee;
+  border-left: 0;
+  text-align: right;
+}
+.blockquote-reverse footer:before,
+.blockquote-reverse small:before,
+.blockquote-reverse .small:before,
+blockquote.pull-right footer:before,
+blockquote.pull-right small:before,
+blockquote.pull-right .small:before {
+  content: '';
+}
+.blockquote-reverse footer:after,
+.blockquote-reverse small:after,
+.blockquote-reverse .small:after,
+blockquote.pull-right footer:after,
+blockquote.pull-right small:after,
+blockquote.pull-right .small:after {
+  content: '\00A0 \2014';
+}
+
+blockquote:before,
+blockquote:after {
+  content: "";
+}
+
+address {
+  margin-bottom: 20px;
+  font-style: normal;
+  line-height: 1.428571429;
+}
+
+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;
+  box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.25);
+}
+kbd kbd {
+  padding: 0;
+  font-size: 100%;
+  box-shadow: none;
+}
+
+pre {
+  display: block;
+  padding: 9.5px;
+  margin: 0 0 10px;
+  font-size: 13px;
+  line-height: 1.428571429;
+  word-break: break-all;
+  word-wrap: break-word;
+  color: #333333;
+  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;
+}
+.container:before, .container:after {
+  content: " ";
+  display: table;
+}
+.container:after {
+  clear: both;
+}
+@media (min-width: 768px) {
+  .container {
+    width: 750px;
+  }
+}
+@media (min-width: 992px) {
+  .container {
+    width: 970px;
+  }
+}
+@media (min-width: 1200px) {
+  .container {
+    width: 1170px;
+  }
+}
+.container-fluid {
+  margin-right: auto;
+  margin-left: auto;
+  padding-left: 15px;
+  padding-right: 15px;
+}
+.container-fluid:before, .container-fluid:after {
+  content: " ";
+  display: table;
+}
+.container-fluid:after {
+  clear: both;
+}
+
+.row {
+  margin-left: -15px;
+  margin-right: -15px;
+}
+.row:before, .row:after {
+  content: " ";
+  display: table;
+}
+.row:after {
+  clear: both;
+}
+
+.col-xs-1, .col-sm-1, .col-md-1, .col-lg-1, .col-xs-2, .col-sm-2, .col-md-2, .col-lg-2, .col-xs-3, .col-sm-3, .col-md-3, .col-lg-3, .col-xs-4, .col-sm-4, .col-md-4, .col-lg-4, .col-xs-5, .col-sm-5, .col-md-5, .col-lg-5, .col-xs-6, .col-sm-6, .col-md-6, .col-lg-6, .col-xs-7, .col-sm-7, .col-md-7, .col-lg-7, .col-xs-8, .col-sm-8, .col-md-8, .col-lg-8, .col-xs-9, .col-sm-9, .col-md-9, .col-lg-9, .col-xs-10, .col-sm-10, .col-md-10, .col-lg-10, .col-xs-11, .col-sm-11, .col-md-11, .col-lg-11, .col-xs-12, .col-sm-12, .col-md-12, .col-lg-12 {
+  position: relative;
+  min-height: 1px;
+  padding-left: 15px;
+  padding-right: 15px;
+}
+
+.col-xs-1, .col-xs-2, .col-xs-3, .col-xs-4, .col-xs-5, .col-xs-6, .col-xs-7, .col-xs-8, .col-xs-9, .col-xs-10, .col-xs-11, .col-xs-12 {
+  float: left;
+}
+
+.col-xs-1 {
+  width: 8.3333333333%;
+}
+
+.col-xs-2 {
+  width: 16.6666666667%;
+}
+
+.col-xs-3 {
+  width: 25%;
+}
+
+.col-xs-4 {
+  width: 33.3333333333%;
+}
+
+.col-xs-5 {
+  width: 41.6666666667%;
+}
+
+.col-xs-6 {
+  width: 50%;
+}
+
+.col-xs-7 {
+  width: 58.3333333333%;
+}
+
+.col-xs-8 {
+  width: 66.6666666667%;
+}
+
+.col-xs-9 {
+  width: 75%;
+}
+
+.col-xs-10 {
+  width: 83.3333333333%;
+}
+
+.col-xs-11 {
+  width: 91.6666666667%;
+}
+
+.col-xs-12 {
+  width: 100%;
+}
+
+.col-xs-pull-0 {
+  right: auto;
+}
+
+.col-xs-pull-1 {
+  right: 8.3333333333%;
+}
+
+.col-xs-pull-2 {
+  right: 16.6666666667%;
+}
+
+.col-xs-pull-3 {
+  right: 25%;
+}
+
+.col-xs-pull-4 {
+  right: 33.3333333333%;
+}
+
+.col-xs-pull-5 {
+  right: 41.6666666667%;
+}
+
+.col-xs-pull-6 {
+  right: 50%;
+}
+
+.col-xs-pull-7 {
+  right: 58.3333333333%;
+}
+
+.col-xs-pull-8 {
+  right: 66.6666666667%;
+}
+
+.col-xs-pull-9 {
+  right: 75%;
+}
+
+.col-xs-pull-10 {
+  right: 83.3333333333%;
+}
+
+.col-xs-pull-11 {
+  right: 91.6666666667%;
+}
+
+.col-xs-pull-12 {
+  right: 100%;
+}
+
+.col-xs-push-0 {
+  left: auto;
+}
+
+.col-xs-push-1 {
+  left: 8.3333333333%;
+}
+
+.col-xs-push-2 {
+  left: 16.6666666667%;
+}
+
+.col-xs-push-3 {
+  left: 25%;
+}
+
+.col-xs-push-4 {
+  left: 33.3333333333%;
+}
+
+.col-xs-push-5 {
+  left: 41.6666666667%;
+}
+
+.col-xs-push-6 {
+  left: 50%;
+}
+
+.col-xs-push-7 {
+  left: 58.3333333333%;
+}
+
+.col-xs-push-8 {
+  left: 66.6666666667%;
+}
+
+.col-xs-push-9 {
+  left: 75%;
+}
+
+.col-xs-push-10 {
+  left: 83.3333333333%;
+}
+
+.col-xs-push-11 {
+  left: 91.6666666667%;
+}
+
+.col-xs-push-12 {
+  left: 100%;
+}
+
+.col-xs-offset-0 {
+  margin-left: 0%;
+}
+
+.col-xs-offset-1 {
+  margin-left: 8.3333333333%;
+}
+
+.col-xs-offset-2 {
+  margin-left: 16.6666666667%;
+}
+
+.col-xs-offset-3 {
+  margin-left: 25%;
+}
+
+.col-xs-offset-4 {
+  margin-left: 33.3333333333%;
+}
+
+.col-xs-offset-5 {
+  margin-left: 41.6666666667%;
+}
+
+.col-xs-offset-6 {
+  margin-left: 50%;
+}
+
+.col-xs-offset-7 {
+  margin-left: 58.3333333333%;
+}
+
+.col-xs-offset-8 {
+  margin-left: 66.6666666667%;
+}
+
+.col-xs-offset-9 {
+  margin-left: 75%;
+}
+
+.col-xs-offset-10 {
+  margin-left: 83.3333333333%;
+}
+
+.col-xs-offset-11 {
+  margin-left: 91.6666666667%;
+}
+
+.col-xs-offset-12 {
+  margin-left: 100%;
+}
+
+@media (min-width: 768px) {
+  .col-sm-1, .col-sm-2, .col-sm-3, .col-sm-4, .col-sm-5, .col-sm-6, .col-sm-7, .col-sm-8, .col-sm-9, .col-sm-10, .col-sm-11, .col-sm-12 {
+    float: left;
+  }
+
+  .col-sm-1 {
+    width: 8.3333333333%;
+  }
+
+  .col-sm-2 {
+    width: 16.6666666667%;
+  }
+
+  .col-sm-3 {
+    width: 25%;
+  }
+
+  .col-sm-4 {
+    width: 33.3333333333%;
+  }
+
+  .col-sm-5 {
+    width: 41.6666666667%;
+  }
+
+  .col-sm-6 {
+    width: 50%;
+  }
+
+  .col-sm-7 {
+    width: 58.3333333333%;
+  }
+
+  .col-sm-8 {
+    width: 66.6666666667%;
+  }
+
+  .col-sm-9 {
+    width: 75%;
+  }
+
+  .col-sm-10 {
+    width: 83.3333333333%;
+  }
+
+  .col-sm-11 {
+    width: 91.6666666667%;
+  }
+
+  .col-sm-12 {
+    width: 100%;
+  }
+
+  .col-sm-pull-0 {
+    right: auto;
+  }
+
+  .col-sm-pull-1 {
+    right: 8.3333333333%;
+  }
+
+  .col-sm-pull-2 {
+    right: 16.6666666667%;
+  }
+
+  .col-sm-pull-3 {
+    right: 25%;
+  }
+
+  .col-sm-pull-4 {
+    right: 33.3333333333%;
+  }
+
+  .col-sm-pull-5 {
+    right: 41.6666666667%;
+  }
+
+  .col-sm-pull-6 {
+    right: 50%;
+  }
+
+  .col-sm-pull-7 {
+    right: 58.3333333333%;
+  }
+
+  .col-sm-pull-8 {
+    right: 66.6666666667%;
+  }
+
+  .col-sm-pull-9 {
+    right: 75%;
+  }
+
+  .col-sm-pull-10 {
+    right: 83.3333333333%;
+  }
+
+  .col-sm-pull-11 {
+    right: 91.6666666667%;
+  }
+
+  .col-sm-pull-12 {
+    right: 100%;
+  }
+
+  .col-sm-push-0 {
+    left: auto;
+  }
+
+  .col-sm-push-1 {
+    left: 8.3333333333%;
+  }
+
+  .col-sm-push-2 {
+    left: 16.6666666667%;
+  }
+
+  .col-sm-push-3 {
+    left: 25%;
+  }
+
+  .col-sm-push-4 {
+    left: 33.3333333333%;
+  }
+
+  .col-sm-push-5 {
+    left: 41.6666666667%;
+  }
+
+  .col-sm-push-6 {
+    left: 50%;
+  }
+
+  .col-sm-push-7 {
+    left: 58.3333333333%;
+  }
+
+  .col-sm-push-8 {
+    left: 66.6666666667%;
+  }
+
+  .col-sm-push-9 {
+    left: 75%;
+  }
+
+  .col-sm-push-10 {
+    left: 83.3333333333%;
+  }
+
+  .col-sm-push-11 {
+    left: 91.6666666667%;
+  }
+
+  .col-sm-push-12 {
+    left: 100%;
+  }
+
+  .col-sm-offset-0 {
+    margin-left: 0%;
+  }
+
+  .col-sm-offset-1 {
+    margin-left: 8.3333333333%;
+  }
+
+  .col-sm-offset-2 {
+    margin-left: 16.6666666667%;
+  }
+
+  .col-sm-offset-3 {
+    margin-left: 25%;
+  }
+
+  .col-sm-offset-4 {
+    margin-left: 33.3333333333%;
+  }
+
+  .col-sm-offset-5 {
+    margin-left: 41.6666666667%;
+  }
+
+  .col-sm-offset-6 {
+    margin-left: 50%;
+  }
+
+  .col-sm-offset-7 {
+    margin-left: 58.3333333333%;
+  }
+
+  .col-sm-offset-8 {
+    margin-left: 66.6666666667%;
+  }
+
+  .col-sm-offset-9 {
+    margin-left: 75%;
+  }
+
+  .col-sm-offset-10 {
+    margin-left: 83.3333333333%;
+  }
+
+  .col-sm-offset-11 {
+    margin-left: 91.6666666667%;
+  }
+
+  .col-sm-offset-12 {
+    margin-left: 100%;
+  }
+}
+@media (min-width: 992px) {
+  .col-md-1, .col-md-2, .col-md-3, .col-md-4, .col-md-5, .col-md-6, .col-md-7, .col-md-8, .col-md-9, .col-md-10, .col-md-11, .col-md-12 {
+    float: left;
+  }
+
+  .col-md-1 {
+    width: 8.3333333333%;
+  }
+
+  .col-md-2 {
+    width: 16.6666666667%;
+  }
+
+  .col-md-3 {
+    width: 25%;
+  }
+
+  .col-md-4 {
+    width: 33.3333333333%;
+  }
+
+  .col-md-5 {
+    width: 41.6666666667%;
+  }
+
+  .col-md-6 {
+    width: 50%;
+  }
+
+  .col-md-7 {
+    width: 58.3333333333%;
+  }
+
+  .col-md-8 {
+    width: 66.6666666667%;
+  }
+
+  .col-md-9 {
+    width: 75%;
+  }
+
+  .col-md-10 {
+    width: 83.3333333333%;
+  }
+
+  .col-md-11 {
+    width: 91.6666666667%;
+  }
+
+  .col-md-12 {
+    width: 100%;
+  }
+
+  .col-md-pull-0 {
+    right: auto;
+  }
+
+  .col-md-pull-1 {
+    right: 8.3333333333%;
+  }
+
+  .col-md-pull-2 {
+    right: 16.6666666667%;
+  }
+
+  .col-md-pull-3 {
+    right: 25%;
+  }
+
+  .col-md-pull-4 {
+    right: 33.3333333333%;
+  }
+
+  .col-md-pull-5 {
+    right: 41.6666666667%;
+  }
+
+  .col-md-pull-6 {
+    right: 50%;
+  }
+
+  .col-md-pull-7 {
+    right: 58.3333333333%;
+  }
+
+  .col-md-pull-8 {
+    right: 66.6666666667%;
+  }
+
+  .col-md-pull-9 {
+    right: 75%;
+  }
+
+  .col-md-pull-10 {
+    right: 83.3333333333%;
+  }
+
+  .col-md-pull-11 {
+    right: 91.6666666667%;
+  }
+
+  .col-md-pull-12 {
+    right: 100%;
+  }
+
+  .col-md-push-0 {
+    left: auto;
+  }
+
+  .col-md-push-1 {
+    left: 8.3333333333%;
+  }
+
+  .col-md-push-2 {
+    left: 16.6666666667%;
+  }
+
+  .col-md-push-3 {
+    left: 25%;
+  }
+
+  .col-md-push-4 {
+    left: 33.3333333333%;
+  }
+
+  .col-md-push-5 {
+    left: 41.6666666667%;
+  }
+
+  .col-md-push-6 {
+    left: 50%;
+  }
+
+  .col-md-push-7 {
+    left: 58.3333333333%;
+  }
+
+  .col-md-push-8 {
+    left: 66.6666666667%;
+  }
+
+  .col-md-push-9 {
+    left: 75%;
+  }
+
+  .col-md-push-10 {
+    left: 83.3333333333%;
+  }
+
+  .col-md-push-11 {
+    left: 91.6666666667%;
+  }
+
+  .col-md-push-12 {
+    left: 100%;
+  }
+
+  .col-md-offset-0 {
+    margin-left: 0%;
+  }
+
+  .col-md-offset-1 {
+    margin-left: 8.3333333333%;
+  }
+
+  .col-md-offset-2 {
+    margin-left: 16.6666666667%;
+  }
+
+  .col-md-offset-3 {
+    margin-left: 25%;
+  }
+
+  .col-md-offset-4 {
+    margin-left: 33.3333333333%;
+  }
+
+  .col-md-offset-5 {
+    margin-left: 41.6666666667%;
+  }
+
+  .col-md-offset-6 {
+    margin-left: 50%;
+  }
+
+  .col-md-offset-7 {
+    margin-left: 58.3333333333%;
+  }
+
+  .col-md-offset-8 {
+    margin-left: 66.6666666667%;
+  }
+
+  .col-md-offset-9 {
+    margin-left: 75%;
+  }
+
+  .col-md-offset-10 {
+    margin-left: 83.3333333333%;
+  }
+
+  .col-md-offset-11 {
+    margin-left: 91.6666666667%;
+  }
+
+  .col-md-offset-12 {
+    margin-left: 100%;
+  }
+}
+@media (min-width: 1200px) {
+  .col-lg-1, .col-lg-2, .col-lg-3, .col-lg-4, .col-lg-5, .col-lg-6, .col-lg-7, .col-lg-8, .col-lg-9, .col-lg-10, .col-lg-11, .col-lg-12 {
+    float: left;
+  }
+
+  .col-lg-1 {
+    width: 8.3333333333%;
+  }
+
+  .col-lg-2 {
+    width: 16.6666666667%;
+  }
+
+  .col-lg-3 {
+    width: 25%;
+  }
+
+  .col-lg-4 {
+    width: 33.3333333333%;
+  }
+
+  .col-lg-5 {
+    width: 41.6666666667%;
+  }
+
+  .col-lg-6 {
+    width: 50%;
+  }
+
+  .col-lg-7 {
+    width: 58.3333333333%;
+  }
+
+  .col-lg-8 {
+    width: 66.6666666667%;
+  }
+
+  .col-lg-9 {
+    width: 75%;
+  }
+
+  .col-lg-10 {
+    width: 83.3333333333%;
+  }
+
+  .col-lg-11 {
+    width: 91.6666666667%;
+  }
+
+  .col-lg-12 {
+    width: 100%;
+  }
+
+  .col-lg-pull-0 {
+    right: auto;
+  }
+
+  .col-lg-pull-1 {
+    right: 8.3333333333%;
+  }
+
+  .col-lg-pull-2 {
+    right: 16.6666666667%;
+  }
+
+  .col-lg-pull-3 {
+    right: 25%;
+  }
+
+  .col-lg-pull-4 {
+    right: 33.3333333333%;
+  }
+
+  .col-lg-pull-5 {
+    right: 41.6666666667%;
+  }
+
+  .col-lg-pull-6 {
+    right: 50%;
+  }
+
+  .col-lg-pull-7 {
+    right: 58.3333333333%;
+  }
+
+  .col-lg-pull-8 {
+    right: 66.6666666667%;
+  }
+
+  .col-lg-pull-9 {
+    right: 75%;
+  }
+
+  .col-lg-pull-10 {
+    right: 83.3333333333%;
+  }
+
+  .col-lg-pull-11 {
+    right: 91.6666666667%;
+  }
+
+  .col-lg-pull-12 {
+    right: 100%;
+  }
+
+  .col-lg-push-0 {
+    left: auto;
+  }
+
+  .col-lg-push-1 {
+    left: 8.3333333333%;
+  }
+
+  .col-lg-push-2 {
+    left: 16.6666666667%;
+  }
+
+  .col-lg-push-3 {
+    left: 25%;
+  }
+
+  .col-lg-push-4 {
+    left: 33.3333333333%;
+  }
+
+  .col-lg-push-5 {
+    left: 41.6666666667%;
+  }
+
+  .col-lg-push-6 {
+    left: 50%;
+  }
+
+  .col-lg-push-7 {
+    left: 58.3333333333%;
+  }
+
+  .col-lg-push-8 {
+    left: 66.6666666667%;
+  }
+
+  .col-lg-push-9 {
+    left: 75%;
+  }
+
+  .col-lg-push-10 {
+    left: 83.3333333333%;
+  }
+
+  .col-lg-push-11 {
+    left: 91.6666666667%;
+  }
+
+  .col-lg-push-12 {
+    left: 100%;
+  }
+
+  .col-lg-offset-0 {
+    margin-left: 0%;
+  }
+
+  .col-lg-offset-1 {
+    margin-left: 8.3333333333%;
+  }
+
+  .col-lg-offset-2 {
+    margin-left: 16.6666666667%;
+  }
+
+  .col-lg-offset-3 {
+    margin-left: 25%;
+  }
+
+  .col-lg-offset-4 {
+    margin-left: 33.3333333333%;
+  }
+
+  .col-lg-offset-5 {
+    margin-left: 41.6666666667%;
+  }
+
+  .col-lg-offset-6 {
+    margin-left: 50%;
+  }
+
+  .col-lg-offset-7 {
+    margin-left: 58.3333333333%;
+  }
+
+  .col-lg-offset-8 {
+    margin-left: 66.6666666667%;
+  }
+
+  .col-lg-offset-9 {
+    margin-left: 75%;
+  }
+
+  .col-lg-offset-10 {
+    margin-left: 83.3333333333%;
+  }
+
+  .col-lg-offset-11 {
+    margin-left: 91.6666666667%;
+  }
+
+  .col-lg-offset-12 {
+    margin-left: 100%;
+  }
+}
+table {
+  background-color: transparent;
+}
+
+th {
+  text-align: left;
+}
+
+.table {
+  width: 100%;
+  max-width: 100%;
+  margin-bottom: 20px;
+}
+.table > thead > tr > th,
+.table > thead > tr > td,
+.table > tbody > tr > th,
+.table > tbody > tr > td,
+.table > tfoot > tr > th,
+.table > tfoot > tr > td {
+  padding: 8px;
+  line-height: 1.428571429;
+  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 > caption + thead > tr:first-child > td,
+.table > colgroup + thead > tr:first-child > th,
+.table > colgroup + thead > tr:first-child > td,
+.table > thead:first-child > tr:first-child > th,
+.table > thead:first-child > tr:first-child > td {
+  border-top: 0;
+}
+.table > tbody + tbody {
+  border-top: 2px solid #ddd;
+}
+.table .table {
+  background-color: #fff;
+}
+
+.table-condensed > thead > tr > th,
+.table-condensed > thead > tr > td,
+.table-condensed > tbody > tr > th,
+.table-condensed > tbody > tr > td,
+.table-condensed > tfoot > tr > th,
+.table-condensed > tfoot > tr > td {
+  padding: 5px;
+}
+
+.table-bordered {
+  border: 1px solid #ddd;
+}
+.table-bordered > thead > tr > th,
+.table-bordered > thead > tr > td,
+.table-bordered > tbody > tr > th,
+.table-bordered > tbody > tr > td,
+.table-bordered > tfoot > tr > th,
+.table-bordered > tfoot > tr > td {
+  border: 1px solid #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;
+  float: none;
+  display: table-column;
+}
+
+table td[class*="col-"],
+table th[class*="col-"] {
+  position: static;
+  float: none;
+  display: table-cell;
+}
+
+.table > thead > tr > td.active,
+.table > thead > tr > th.active, .table > thead > tr.active > td, .table > thead > tr.active > th,
+.table > tbody > tr > td.active,
+.table > tbody > tr > th.active,
+.table > tbody > tr.active > td,
+.table > tbody > tr.active > th,
+.table > tfoot > tr > td.active,
+.table > tfoot > tr > th.active,
+.table > tfoot > tr.active > td,
+.table > tfoot > tr.active > th {
+  background-color: #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:hover > .active, .table-hover > tbody > tr.active:hover > th {
+  background-color: #e8e8e8;
+}
+
+.table > thead > tr > td.success,
+.table > thead > tr > th.success, .table > thead > tr.success > td, .table > thead > tr.success > th,
+.table > tbody > tr > td.success,
+.table > tbody > tr > th.success,
+.table > tbody > tr.success > td,
+.table > tbody > tr.success > th,
+.table > tfoot > tr > td.success,
+.table > tfoot > tr > th.success,
+.table > tfoot > tr.success > td,
+.table > tfoot > tr.success > th {
+  background-color: #dff0d8;
+}
+
+.table-hover > tbody > tr > td.success:hover,
+.table-hover > tbody > tr > th.success:hover, .table-hover > tbody > tr.success:hover > td, .table-hover > tbody > tr:hover > .success, .table-hover > tbody > tr.success:hover > th {
+  background-color: #d0e9c6;
+}
+
+.table > thead > tr > td.info,
+.table > thead > tr > th.info, .table > thead > tr.info > td, .table > thead > tr.info > th,
+.table > tbody > tr > td.info,
+.table > tbody > tr > th.info,
+.table > tbody > tr.info > td,
+.table > tbody > tr.info > th,
+.table > tfoot > tr > td.info,
+.table > tfoot > tr > th.info,
+.table > tfoot > tr.info > td,
+.table > tfoot > tr.info > th {
+  background-color: #d9edf7;
+}
+
+.table-hover > tbody > tr > td.info:hover,
+.table-hover > tbody > tr > th.info:hover, .table-hover > tbody > tr.info:hover > td, .table-hover > tbody > tr:hover > .info, .table-hover > tbody > tr.info:hover > th {
+  background-color: #c4e3f3;
+}
+
+.table > thead > tr > td.warning,
+.table > thead > tr > th.warning, .table > thead > tr.warning > td, .table > thead > tr.warning > th,
+.table > tbody > tr > td.warning,
+.table > tbody > tr > th.warning,
+.table > tbody > tr.warning > td,
+.table > tbody > tr.warning > th,
+.table > tfoot > tr > td.warning,
+.table > tfoot > tr > th.warning,
+.table > tfoot > tr.warning > td,
+.table > tfoot > tr.warning > th {
+  background-color: #fcf8e3;
+}
+
+.table-hover > tbody > tr > td.warning:hover,
+.table-hover > tbody > tr > th.warning:hover, .table-hover > tbody > tr.warning:hover > td, .table-hover > tbody > tr:hover > .warning, .table-hover > tbody > tr.warning:hover > th {
+  background-color: #faf2cc;
+}
+
+.table > thead > tr > td.danger,
+.table > thead > tr > th.danger, .table > thead > tr.danger > td, .table > thead > tr.danger > th,
+.table > tbody > tr > td.danger,
+.table > tbody > tr > th.danger,
+.table > tbody > tr.danger > td,
+.table > tbody > tr.danger > th,
+.table > tfoot > tr > td.danger,
+.table > tfoot > tr > th.danger,
+.table > tfoot > tr.danger > td,
+.table > tfoot > tr.danger > th {
+  background-color: #f2dede;
+}
+
+.table-hover > tbody > tr > td.danger:hover,
+.table-hover > tbody > tr > th.danger:hover, .table-hover > tbody > tr.danger:hover > td, .table-hover > tbody > tr:hover > .danger, .table-hover > tbody > tr.danger:hover > th {
+  background-color: #ebcccc;
+}
+
+@media screen and (max-width: 767px) {
+  .table-responsive {
+    width: 100%;
+    margin-bottom: 15px;
+    overflow-y: hidden;
+    overflow-x: auto;
+    -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-responsive > .table > thead > tr > td,
+  .table-responsive > .table > tbody > tr > th,
+  .table-responsive > .table > tbody > tr > td,
+  .table-responsive > .table > tfoot > tr > th,
+  .table-responsive > .table > tfoot > tr > td {
+    white-space: nowrap;
+  }
+  .table-responsive > .table-bordered {
+    border: 0;
+  }
+  .table-responsive > .table-bordered > thead > tr > th:first-child,
+  .table-responsive > .table-bordered > thead > tr > td:first-child,
+  .table-responsive > .table-bordered > tbody > tr > th:first-child,
+  .table-responsive > .table-bordered > tbody > tr > td:first-child,
+  .table-responsive > .table-bordered > tfoot > tr > th:first-child,
+  .table-responsive > .table-bordered > tfoot > tr > td:first-child {
+    border-left: 0;
+  }
+  .table-responsive > .table-bordered > thead > tr > th:last-child,
+  .table-responsive > .table-bordered > thead > tr > td:last-child,
+  .table-responsive > .table-bordered > tbody > tr > th:last-child,
+  .table-responsive > .table-bordered > tbody > tr > td:last-child,
+  .table-responsive > .table-bordered > tfoot > tr > th:last-child,
+  .table-responsive > .table-bordered > tfoot > tr > td:last-child {
+    border-right: 0;
+  }
+  .table-responsive > .table-bordered > tbody > tr:last-child > th,
+  .table-responsive > .table-bordered > tbody > tr:last-child > td,
+  .table-responsive > .table-bordered > tfoot > tr:last-child > th,
+  .table-responsive > .table-bordered > tfoot > tr:last-child > td {
+    border-bottom: 0;
+  }
+}
+
+fieldset {
+  padding: 0;
+  margin: 0;
+  border: 0;
+  min-width: 0;
+}
+
+legend {
+  display: block;
+  width: 100%;
+  padding: 0;
+  margin-bottom: 20px;
+  font-size: 21px;
+  line-height: inherit;
+  color: #333333;
+  border: 0;
+  border-bottom: 1px solid #e5e5e5;
+}
+
+label {
+  display: inline-block;
+  max-width: 100%;
+  margin-bottom: 5px;
+  font-weight: bold;
+}
+
+input[type="search"] {
+  -webkit-box-sizing: border-box;
+  -moz-box-sizing: border-box;
+  box-sizing: border-box;
+}
+
+input[type="radio"],
+input[type="checkbox"] {
+  margin: 4px 0 0;
+  margin-top: 1px \9;
+  line-height: normal;
+}
+
+input[type="file"] {
+  display: block;
+}
+
+input[type="range"] {
+  display: block;
+  width: 100%;
+}
+
+select[multiple],
+select[size] {
+  height: auto;
+}
+
+input[type="file"]:focus,
+input[type="radio"]:focus,
+input[type="checkbox"]:focus {
+  outline: thin dotted;
+  outline: 5px auto -webkit-focus-ring-color;
+  outline-offset: -2px;
+}
+
+output {
+  display: block;
+  padding-top: 7px;
+  font-size: 14px;
+  line-height: 1.428571429;
+  color: #555555;
+}
+
+.form-control {
+  display: block;
+  width: 100%;
+  height: 34px;
+  padding: 6px 12px;
+  font-size: 14px;
+  line-height: 1.428571429;
+  color: #555555;
+  background-color: #fff;
+  background-image: none;
+  border: 1px solid #ccc;
+  border-radius: 4px;
+  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
+  box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
+  -webkit-transition: border-color ease-in-out 0.15s, box-shadow ease-in-out 0.15s;
+  -o-transition: border-color ease-in-out 0.15s, box-shadow ease-in-out 0.15s;
+  transition: border-color ease-in-out 0.15s, box-shadow ease-in-out 0.15s;
+}
+.form-control:focus {
+  border-color: #66afe9;
+  outline: 0;
+  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(102, 175, 233, 0.6);
+  box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(102, 175, 233, 0.6);
+}
+.form-control::-moz-placeholder {
+  color: #777777;
+  opacity: 1;
+}
+.form-control:-ms-input-placeholder {
+  color: #777777;
+}
+.form-control::-webkit-input-placeholder {
+  color: #777777;
+}
+.form-control[disabled], .form-control[readonly], fieldset[disabled] .form-control {
+  cursor: not-allowed;
+  background-color: #eeeeee;
+  opacity: 1;
+}
+
+textarea.form-control {
+  height: auto;
+}
+
+input[type="search"] {
+  -webkit-appearance: none;
+}
+
+input[type="date"],
+input[type="time"],
+input[type="datetime-local"],
+input[type="month"] {
+  line-height: 34px;
+  line-height: 1.428571429 \0;
+}
+input[type="date"].input-sm, .form-horizontal .form-group-sm input[type="date"].form-control, .input-group-sm > input[type="date"].form-control,
+.input-group-sm > input[type="date"].input-group-addon,
+.input-group-sm > .input-group-btn > input[type="date"].btn,
+input[type="time"].input-sm,
+.form-horizontal .form-group-sm input[type="time"].form-control,
+.input-group-sm > input[type="time"].form-control,
+.input-group-sm > input[type="time"].input-group-addon,
+.input-group-sm > .input-group-btn > input[type="time"].btn,
+input[type="datetime-local"].input-sm,
+.form-horizontal .form-group-sm input[type="datetime-local"].form-control,
+.input-group-sm > input[type="datetime-local"].form-control,
+.input-group-sm > input[type="datetime-local"].input-group-addon,
+.input-group-sm > .input-group-btn > input[type="datetime-local"].btn,
+input[type="month"].input-sm,
+.form-horizontal .form-group-sm input[type="month"].form-control,
+.input-group-sm > input[type="month"].form-control,
+.input-group-sm > input[type="month"].input-group-addon,
+.input-group-sm > .input-group-btn > input[type="month"].btn {
+  line-height: 30px;
+}
+input[type="date"].input-lg, .form-horizontal .form-group-lg input[type="date"].form-control, .input-group-lg > input[type="date"].form-control,
+.input-group-lg > input[type="date"].input-group-addon,
+.input-group-lg > .input-group-btn > input[type="date"].btn,
+input[type="time"].input-lg,
+.form-horizontal .form-group-lg input[type="time"].form-control,
+.input-group-lg > input[type="time"].form-control,
+.input-group-lg > input[type="time"].input-group-addon,
+.input-group-lg > .input-group-btn > input[type="time"].btn,
+input[type="datetime-local"].input-lg,
+.form-horizontal .form-group-lg input[type="datetime-local"].form-control,
+.input-group-lg > input[type="datetime-local"].form-control,
+.input-group-lg > input[type="datetime-local"].input-group-addon,
+.input-group-lg > .input-group-btn > input[type="datetime-local"].btn,
+input[type="month"].input-lg,
+.form-horizontal .form-group-lg input[type="month"].form-control,
+.input-group-lg > input[type="month"].form-control,
+.input-group-lg > input[type="month"].input-group-addon,
+.input-group-lg > .input-group-btn > input[type="month"].btn {
+  line-height: 46px;
+}
+
+.form-group {
+  margin-bottom: 15px;
+}
+
+.radio,
+.checkbox {
+  position: relative;
+  display: block;
+  min-height: 20px;
+  margin-top: 10px;
+  margin-bottom: 10px;
+}
+.radio label,
+.checkbox label {
+  padding-left: 20px;
+  margin-bottom: 0;
+  font-weight: normal;
+  cursor: pointer;
+}
+
+.radio input[type="radio"],
+.radio-inline input[type="radio"],
+.checkbox input[type="checkbox"],
+.checkbox-inline input[type="checkbox"] {
+  position: absolute;
+  margin-left: -20px;
+  margin-top: 4px \9;
+}
+
+.radio + .radio,
+.checkbox + .checkbox {
+  margin-top: -5px;
+}
+
+.radio-inline,
+.checkbox-inline {
+  display: inline-block;
+  padding-left: 20px;
+  margin-bottom: 0;
+  vertical-align: middle;
+  font-weight: normal;
+  cursor: pointer;
+}
+
+.radio-inline + .radio-inline,
+.checkbox-inline + .checkbox-inline {
+  margin-top: 0;
+  margin-left: 10px;
+}
+
+input[type="radio"][disabled], input[type="radio"].disabled, fieldset[disabled] input[type="radio"],
+input[type="checkbox"][disabled],
+input[type="checkbox"].disabled, fieldset[disabled]
+input[type="checkbox"] {
+  cursor: not-allowed;
+}
+
+.radio-inline.disabled, fieldset[disabled] .radio-inline,
+.checkbox-inline.disabled, fieldset[disabled]
+.checkbox-inline {
+  cursor: not-allowed;
+}
+
+.radio.disabled label, fieldset[disabled] .radio label,
+.checkbox.disabled label, fieldset[disabled]
+.checkbox label {
+  cursor: not-allowed;
+}
+
+.form-control-static {
+  padding-top: 7px;
+  padding-bottom: 7px;
+  margin-bottom: 0;
+}
+.form-control-static.input-lg, .form-horizontal .form-group-lg .form-control-static.form-control, .input-group-lg > .form-control-static.form-control,
+.input-group-lg > .form-control-static.input-group-addon,
+.input-group-lg > .input-group-btn > .form-control-static.btn, .form-control-static.input-sm, .form-horizontal .form-group-sm .form-control-static.form-control, .input-group-sm > .form-control-static.form-control,
+.input-group-sm > .form-control-static.input-group-addon,
+.input-group-sm > .input-group-btn > .form-control-static.btn {
+  padding-left: 0;
+  padding-right: 0;
+}
+
+.input-sm, .form-horizontal .form-group-sm .form-control, .input-group-sm > .form-control,
+.input-group-sm > .input-group-addon,
+.input-group-sm > .input-group-btn > .btn {
+  height: 30px;
+  padding: 5px 10px;
+  font-size: 12px;
+  line-height: 1.5;
+  border-radius: 3px;
+}
+
+select.input-sm, .form-horizontal .form-group-sm select.form-control, .input-group-sm > select.form-control,
+.input-group-sm > select.input-group-addon,
+.input-group-sm > .input-group-btn > select.btn {
+  height: 30px;
+  line-height: 30px;
+}
+
+textarea.input-sm, .form-horizontal .form-group-sm textarea.form-control, .input-group-sm > textarea.form-control,
+.input-group-sm > textarea.input-group-addon,
+.input-group-sm > .input-group-btn > textarea.btn,
+select[multiple].input-sm,
+.form-horizontal .form-group-sm select[multiple].form-control,
+.input-group-sm > select[multiple].form-control,
+.input-group-sm > select[multiple].input-group-addon,
+.input-group-sm > .input-group-btn > select[multiple].btn {
+  height: auto;
+}
+
+.input-lg, .form-horizontal .form-group-lg .form-control, .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-lg, .form-horizontal .form-group-lg select.form-control, .input-group-lg > select.form-control,
+.input-group-lg > select.input-group-addon,
+.input-group-lg > .input-group-btn > select.btn {
+  height: 46px;
+  line-height: 46px;
+}
+
+textarea.input-lg, .form-horizontal .form-group-lg textarea.form-control, .input-group-lg > textarea.form-control,
+.input-group-lg > textarea.input-group-addon,
+.input-group-lg > .input-group-btn > textarea.btn,
+select[multiple].input-lg,
+.form-horizontal .form-group-lg select[multiple].form-control,
+.input-group-lg > select[multiple].form-control,
+.input-group-lg > select[multiple].input-group-addon,
+.input-group-lg > .input-group-btn > select[multiple].btn {
+  height: auto;
+}
+
+.has-feedback {
+  position: relative;
+}
+.has-feedback .form-control {
+  padding-right: 42.5px;
+}
+
+.form-control-feedback {
+  position: absolute;
+  top: 25px;
+  right: 0;
+  z-index: 2;
+  display: block;
+  width: 34px;
+  height: 34px;
+  line-height: 34px;
+  text-align: center;
+}
+
+.input-lg + .form-control-feedback, .form-horizontal .form-group-lg .form-control + .form-control-feedback, .input-group-lg > .form-control + .form-control-feedback,
+.input-group-lg > .input-group-addon + .form-control-feedback,
+.input-group-lg > .input-group-btn > .btn + .form-control-feedback {
+  width: 46px;
+  height: 46px;
+  line-height: 46px;
+}
+
+.input-sm + .form-control-feedback, .form-horizontal .form-group-sm .form-control + .form-control-feedback, .input-group-sm > .form-control + .form-control-feedback,
+.input-group-sm > .input-group-addon + .form-control-feedback,
+.input-group-sm > .input-group-btn > .btn + .form-control-feedback {
+  width: 30px;
+  height: 30px;
+  line-height: 30px;
+}
+
+.has-success .help-block,
+.has-success .control-label,
+.has-success .radio,
+.has-success .checkbox,
+.has-success .radio-inline,
+.has-success .checkbox-inline {
+  color: #3c763d;
+}
+.has-success .form-control {
+  border-color: #3c763d;
+  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
+  box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
+}
+.has-success .form-control:focus {
+  border-color: #2b542c;
+  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #67b168;
+  box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #67b168;
+}
+.has-success .input-group-addon {
+  color: #3c763d;
+  border-color: #3c763d;
+  background-color: #dff0d8;
+}
+.has-success .form-control-feedback {
+  color: #3c763d;
+}
+
+.has-warning .help-block,
+.has-warning .control-label,
+.has-warning .radio,
+.has-warning .checkbox,
+.has-warning .radio-inline,
+.has-warning .checkbox-inline {
+  color: #8a6d3b;
+}
+.has-warning .form-control {
+  border-color: #8a6d3b;
+  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
+  box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
+}
+.has-warning .form-control:focus {
+  border-color: #66512c;
+  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #c0a16b;
+  box-shadow: inset 0 1px 1px rgba(0, 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-error .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, 0.075);
+  box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
+}
+.has-error .form-control:focus {
+  border-color: #843534;
+  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #ce8483;
+  box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #ce8483;
+}
+.has-error .input-group-addon {
+  color: #a94442;
+  border-color: #a94442;
+  background-color: #f2dede;
+}
+.has-error .form-control-feedback {
+  color: #a94442;
+}
+
+.has-feedback label.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, .navbar-form .form-group {
+    display: inline-block;
+    margin-bottom: 0;
+    vertical-align: middle;
+  }
+  .form-inline .form-control, .navbar-form .form-control {
+    display: inline-block;
+    width: auto;
+    vertical-align: middle;
+  }
+  .form-inline .input-group, .navbar-form .input-group {
+    display: inline-table;
+    vertical-align: middle;
+  }
+  .form-inline .input-group .input-group-addon, .navbar-form .input-group .input-group-addon,
+  .form-inline .input-group .input-group-btn,
+  .navbar-form .input-group .input-group-btn,
+  .form-inline .input-group .form-control,
+  .navbar-form .input-group .form-control {
+    width: auto;
+  }
+  .form-inline .input-group > .form-control, .navbar-form .input-group > .form-control {
+    width: 100%;
+  }
+  .form-inline .control-label, .navbar-form .control-label {
+    margin-bottom: 0;
+    vertical-align: middle;
+  }
+  .form-inline .radio, .navbar-form .radio,
+  .form-inline .checkbox,
+  .navbar-form .checkbox {
+    display: inline-block;
+    margin-top: 0;
+    margin-bottom: 0;
+    vertical-align: middle;
+  }
+  .form-inline .radio label, .navbar-form .radio label,
+  .form-inline .checkbox label,
+  .navbar-form .checkbox label {
+    padding-left: 0;
+  }
+  .form-inline .radio input[type="radio"], .navbar-form .radio input[type="radio"],
+  .form-inline .checkbox input[type="checkbox"],
+  .navbar-form .checkbox input[type="checkbox"] {
+    position: relative;
+    margin-left: 0;
+  }
+  .form-inline .has-feedback .form-control-feedback, .navbar-form .has-feedback .form-control-feedback {
+    top: 0;
+  }
+}
+
+.form-horizontal .radio,
+.form-horizontal .checkbox,
+.form-horizontal .radio-inline,
+.form-horizontal .checkbox-inline {
+  margin-top: 0;
+  margin-bottom: 0;
+  padding-top: 7px;
+}
+.form-horizontal .radio,
+.form-horizontal .checkbox {
+  min-height: 27px;
+}
+.form-horizontal .form-group {
+  margin-left: -15px;
+  margin-right: -15px;
+}
+.form-horizontal .form-group:before, .form-horizontal .form-group:after {
+  content: " ";
+  display: table;
+}
+.form-horizontal .form-group:after {
+  clear: both;
+}
+@media (min-width: 768px) {
+  .form-horizontal .control-label {
+    text-align: right;
+    margin-bottom: 0;
+    padding-top: 7px;
+  }
+}
+.form-horizontal .has-feedback .form-control-feedback {
+  top: 0;
+  right: 15px;
+}
+@media (min-width: 768px) {
+  .form-horizontal .form-group-lg .control-label {
+    padding-top: 14.3px;
+  }
+}
+@media (min-width: 768px) {
+  .form-horizontal .form-group-sm .control-label {
+    padding-top: 6px;
+  }
+}
+
+.btn {
+  display: inline-block;
+  margin-bottom: 0;
+  font-weight: normal;
+  text-align: center;
+  vertical-align: middle;
+  cursor: pointer;
+  background-image: none;
+  border: 1px solid transparent;
+  white-space: nowrap;
+  padding: 6px 12px;
+  font-size: 14px;
+  line-height: 1.428571429;
+  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, 0.125);
+  box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);
+}
+.btn.disabled, .btn[disabled], fieldset[disabled] .btn {
+  cursor: not-allowed;
+  pointer-events: none;
+  opacity: 0.65;
+  filter: alpha(opacity=65);
+  -webkit-box-shadow: none;
+  box-shadow: none;
+}
+
+.btn-default {
+  color: #333;
+  background-color: #fff;
+  border-color: #ccc;
+}
+.btn-default:hover, .btn-default:focus, .btn-default:active, .btn-default.active, .open > .btn-default.dropdown-toggle {
+  color: #333;
+  background-color: #e6e6e6;
+  border-color: #adadad;
+}
+.btn-default:active, .btn-default.active, .open > .btn-default.dropdown-toggle {
+  background-image: none;
+}
+.btn-default.disabled, .btn-default.disabled:hover, .btn-default.disabled:focus, .btn-default.disabled:active, .btn-default.disabled.active, .btn-default[disabled], .btn-default[disabled]:hover, .btn-default[disabled]:focus, .btn-default[disabled]:active, .btn-default[disabled].active, fieldset[disabled] .btn-default, fieldset[disabled] .btn-default:hover, fieldset[disabled] .btn-default:focus, fieldset[disabled] .btn-default: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 > .btn-primary.dropdown-toggle {
+  color: #fff;
+  background-color: #3071a9;
+  border-color: #285e8e;
+}
+.btn-primary:active, .btn-primary.active, .open > .btn-primary.dropdown-toggle {
+  background-image: none;
+}
+.btn-primary.disabled, .btn-primary.disabled:hover, .btn-primary.disabled:focus, .btn-primary.disabled:active, .btn-primary.disabled.active, .btn-primary[disabled], .btn-primary[disabled]:hover, .btn-primary[disabled]:focus, .btn-primary[disabled]:active, .btn-primary[disabled].active, fieldset[disabled] .btn-primary, fieldset[disabled] .btn-primary:hover, fieldset[disabled] .btn-primary:focus, fieldset[disabled] .btn-primary: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 > .btn-success.dropdown-toggle {
+  color: #fff;
+  background-color: #449d44;
+  border-color: #398439;
+}
+.btn-success:active, .btn-success.active, .open > .btn-success.dropdown-toggle {
+  background-image: none;
+}
+
+
+.btn-success.disabled, .btn-success.disabled:hover, .btn-success.disabled:focus, .btn-success.disabled:active, .btn-success.disabled.active, .btn-success[disabled], .btn-success[disabled]:hover, .btn-success[disabled]:focus, .btn-success[disabled]:active, .btn-success[disabled].active, fieldset[disabled] .btn-success, fieldset[disabled] .btn-success:hover, fieldset[disabled] .btn-success:focus, fieldset[disabled] .btn-success:active, fieldset[disabled] .btn-success.active {
+  background-color: #b82a4f;
+  border-color: #ae5437;
+}
+.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 > .btn-info.dropdown-toggle {
+  color: #fff;
+  background-color: #31b0d5;
+  border-color: #269abc;
+}
+.btn-info:active, .btn-info.active, .open > .btn-info.dropdown-toggle {
+  background-image: none;
+}
+.btn-info.disabled, .btn-info.disabled:hover, .btn-info.disabled:focus, .btn-info.disabled:active, .btn-info.disabled.active, .btn-info[disabled], .btn-info[disabled]:hover, .btn-info[disabled]:focus, .btn-info[disabled]:active, .btn-info[disabled].active, fieldset[disabled] .btn-info, fieldset[disabled] .btn-info:hover, fieldset[disabled] .btn-info:focus, fieldset[disabled] .btn-info: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 > .btn-warning.dropdown-toggle {
+  color: #fff;
+  background-color: #ec971f;
+  border-color: #d58512;
+}
+.btn-warning:active, .btn-warning.active, .open > .btn-warning.dropdown-toggle {
+  background-image: none;
+}
+.btn-warning.disabled, .btn-warning.disabled:hover, .btn-warning.disabled:focus, .btn-warning.disabled:active, .btn-warning.disabled.active, .btn-warning[disabled], .btn-warning[disabled]:hover, .btn-warning[disabled]:focus, .btn-warning[disabled]:active, .btn-warning[disabled].active, fieldset[disabled] .btn-warning, fieldset[disabled] .btn-warning:hover, fieldset[disabled] .btn-warning:focus, fieldset[disabled] .btn-warning: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 > .btn-danger.dropdown-toggle {
+  color: #fff;
+  background-color: #c9302c;
+  border-color: #ac2925;
+}
+.btn-danger:active, .btn-danger.active, .open > .btn-danger.dropdown-toggle {
+  background-image: none;
+}
+.btn-danger.disabled, .btn-danger.disabled:hover, .btn-danger.disabled:focus, .btn-danger.disabled:active, .btn-danger.disabled.active, .btn-danger[disabled], .btn-danger[disabled]:hover, .btn-danger[disabled]:focus, .btn-danger[disabled]:active, .btn-danger[disabled].active, fieldset[disabled] .btn-danger, fieldset[disabled] .btn-danger:hover, fieldset[disabled] .btn-danger:focus, fieldset[disabled] .btn-danger: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: normal;
+  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, .btn-link[disabled]:focus, fieldset[disabled] .btn-link:hover, fieldset[disabled] .btn-link:focus {
+  color: #777777;
+  text-decoration: none;
+}
+
+.btn-lg, .btn-group-lg > .btn {
+  padding: 10px 16px;
+  font-size: 18px;
+  line-height: 1.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%;
+}
+
+.btn-block + .btn-block {
+  margin-top: 5px;
+}
+
+input[type="submit"].btn-block,
+input[type="reset"].btn-block,
+input[type="button"].btn-block {
+  width: 100%;
+}
+
+.fade {
+  opacity: 0;
+  -webkit-transition: opacity 0.15s linear;
+  -o-transition: opacity 0.15s linear;
+  transition: opacity 0.15s linear;
+}
+.fade.in {
+  opacity: 1;
+}
+
+.collapse {
+  display: none;
+}
+.collapse.in {
+  display: block;
+}
+
+tr.collapse.in {
+  display: table-row;
+}
+
+tbody.collapse.in {
+  display: table-row-group;
+}
+
+.collapsing {
+  position: relative;
+  height: 0;
+  overflow: hidden;
+  -webkit-transition: height 0.35s ease;
+  -o-transition: height 0.35s ease;
+  transition: height 0.35s ease;
+}
+
+.caret {
+  display: inline-block;
+  width: 0;
+  height: 0;
+  margin-left: 2px;
+  vertical-align: middle;
+  border-top: 4px solid;
+  border-right: 4px solid transparent;
+  border-left: 4px solid transparent;
+}
+
+.dropdown {
+  position: relative;
+}
+
+.dropdown-toggle:focus {
+  outline: 0;
+}
+
+.dropdown-menu {
+  position: absolute;
+  top: 100%;
+  left: 0;
+  z-index: 1000;
+  display: none;
+  float: left;
+  min-width: 160px;
+  padding: 5px 0;
+  margin: 2px 0 0;
+  list-style: none;
+  font-size: 14px;
+  text-align: left;
+  background-color: #fff;
+  border: 1px solid #ccc;
+  border: 1px solid rgba(0, 0, 0, 0.15);
+  border-radius: 4px;
+  -webkit-box-shadow: 0 6px 12px rgba(0, 0, 0, 0.175);
+  box-shadow: 0 6px 12px rgba(0, 0, 0, 0.175);
+  background-clip: padding-box;
+}
+.dropdown-menu.pull-right {
+  right: 0;
+  left: auto;
+}
+.dropdown-menu .divider {
+  height: 1px;
+  margin: 9px 0;
+  overflow: hidden;
+  background-color: #e5e5e5;
+}
+.dropdown-menu > li > a {
+  display: block;
+  padding: 3px 20px;
+  clear: both;
+  font-weight: normal;
+  line-height: 1.428571429;
+  color: #333333;
+  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: #777777;
+}
+
+.dropdown-menu > .disabled > a:hover, .dropdown-menu > .disabled > a:focus {
+  text-decoration: none;
+  background-color: transparent;
+  background-image: none;
+  filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);
+  cursor: not-allowed;
+}
+
+.open > .dropdown-menu {
+  display: block;
+}
+.open > a {
+  outline: 0;
+}
+
+.dropdown-menu-right {
+  left: auto;
+  right: 0;
+}
+
+.dropdown-menu-left {
+  left: 0;
+  right: auto;
+}
+
+.dropdown-header {
+  display: block;
+  padding: 3px 20px;
+  font-size: 12px;
+  line-height: 1.428571429;
+  color: #777777;
+  white-space: nowrap;
+}
+
+.dropdown-backdrop {
+  position: fixed;
+  left: 0;
+  right: 0;
+  bottom: 0;
+  top: 0;
+  z-index: 990;
+}
+
+.pull-right > .dropdown-menu {
+  right: 0;
+  left: auto;
+}
+
+.dropup .caret,
+.navbar-fixed-bottom .dropdown .caret {
+  border-top: 0;
+  border-bottom: 4px solid;
+  content: "";
+}
+.dropup .dropdown-menu,
+.navbar-fixed-bottom .dropdown .dropdown-menu {
+  top: auto;
+  bottom: 100%;
+  margin-bottom: 1px;
+}
+
+@media (min-width: 768px) {
+  .navbar-right .dropdown-menu {
+    right: 0;
+    left: auto;
+  }
+  .navbar-right .dropdown-menu-left {
+    left: 0;
+    right: auto;
+  }
+}
+.btn-group,
+.btn-group-vertical {
+  position: relative;
+  display: inline-block;
+  vertical-align: middle;
+}
+.btn-group > .btn,
+.btn-group-vertical > .btn {
+  position: relative;
+  float: left;
+}
+.btn-group > .btn:hover, .btn-group > .btn:focus, .btn-group > .btn:active, .btn-group > .btn.active,
+.btn-group-vertical > .btn:hover,
+.btn-group-vertical > .btn:focus,
+.btn-group-vertical > .btn:active,
+.btn-group-vertical > .btn.active {
+  z-index: 2;
+}
+.btn-group > .btn: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:before, .btn-toolbar:after {
+  content: " ";
+  display: table;
+}
+.btn-toolbar:after {
+  clear: both;
+}
+.btn-toolbar .btn-group,
+.btn-toolbar .input-group {
+  float: left;
+}
+.btn-toolbar > .btn,
+.btn-toolbar > .btn-group,
+.btn-toolbar > .input-group {
+  margin-left: 5px;
+}
+
+.btn-group > .btn:not(:first-child):not(:last-child):not(.dropdown-toggle) {
+  border-radius: 0;
+}
+
+.btn-group > .btn:first-child {
+  margin-left: 0;
+}
+.btn-group > .btn:first-child:not(:last-child):not(.dropdown-toggle) {
+  border-bottom-right-radius: 0;
+  border-top-right-radius: 0;
+}
+
+.btn-group > .btn:last-child:not(:first-child),
+.btn-group > .dropdown-toggle:not(:first-child) {
+  border-bottom-left-radius: 0;
+  border-top-left-radius: 0;
+}
+
+.btn-group > .btn-group {
+  float: left;
+}
+
+.btn-group > .btn-group:not(:first-child):not(:last-child) > .btn {
+  border-radius: 0;
+}
+
+.btn-group > .btn-group:first-child > .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, .btn-group-lg.btn-group > .btn + .dropdown-toggle {
+  padding-left: 12px;
+  padding-right: 12px;
+}
+
+.btn-group.open .dropdown-toggle {
+  -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);
+  box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);
+}
+.btn-group.open .dropdown-toggle.btn-link {
+  -webkit-box-shadow: none;
+  box-shadow: none;
+}
+
+.btn .caret {
+  margin-left: 0;
+}
+
+.btn-lg .caret, .btn-group-lg > .btn .caret {
+  border-width: 5px 5px 0;
+  border-bottom-width: 0;
+}
+
+.dropup .btn-lg .caret, .dropup .btn-group-lg > .btn .caret {
+  border-width: 0 5px 5px;
+}
+
+.btn-group-vertical > .btn,
+.btn-group-vertical > .btn-group,
+.btn-group-vertical > .btn-group > .btn {
+  display: block;
+  float: none;
+  width: 100%;
+  max-width: 100%;
+}
+.btn-group-vertical > .btn-group:before, .btn-group-vertical > .btn-group:after {
+  content: " ";
+  display: table;
+}
+.btn-group-vertical > .btn-group:after {
+  clear: both;
+}
+.btn-group-vertical > .btn-group > .btn {
+  float: none;
+}
+.btn-group-vertical > .btn + .btn,
+.btn-group-vertical > .btn + .btn-group,
+.btn-group-vertical > .btn-group + .btn,
+.btn-group-vertical > .btn-group + .btn-group {
+  margin-top: -1px;
+  margin-left: 0;
+}
+
+.btn-group-vertical > .btn:not(:first-child):not(:last-child) {
+  border-radius: 0;
+}
+.btn-group-vertical > .btn:first-child:not(:last-child) {
+  border-top-right-radius: 4px;
+  border-bottom-right-radius: 0;
+  border-bottom-left-radius: 0;
+}
+.btn-group-vertical > .btn:last-child:not(:first-child) {
+  border-bottom-left-radius: 4px;
+  border-top-right-radius: 0;
+  border-top-left-radius: 0;
+}
+
+.btn-group-vertical > .btn-group:not(:first-child):not(:last-child) > .btn {
+  border-radius: 0;
+}
+
+.btn-group-vertical > .btn-group:first-child:not(:last-child) > .btn:last-child,
+.btn-group-vertical > .btn-group:first-child:not(:last-child) > .dropdown-toggle {
+  border-bottom-right-radius: 0;
+  border-bottom-left-radius: 0;
+}
+
+.btn-group-vertical > .btn-group:last-child:not(:first-child) > .btn:first-child {
+  border-top-right-radius: 0;
+  border-top-left-radius: 0;
+}
+
+.btn-group-justified {
+  display: table;
+  width: 100%;
+  table-layout: fixed;
+  border-collapse: separate;
+}
+.btn-group-justified > .btn,
+.btn-group-justified > .btn-group {
+  float: none;
+  display: table-cell;
+  width: 1%;
+}
+.btn-group-justified > .btn-group .btn {
+  width: 100%;
+}
+.btn-group-justified > .btn-group .dropdown-menu {
+  left: auto;
+}
+
+[data-toggle="buttons"] > .btn > input[type="radio"],
+[data-toggle="buttons"] > .btn > input[type="checkbox"] {
+  position: absolute;
+  z-index: -1;
+  opacity: 0;
+  filter: alpha(opacity=0);
+}
+
+.input-group {
+  position: relative;
+  display: table;
+  border-collapse: separate;
+}
+.input-group[class*="col-"] {
+  float: none;
+  padding-left: 0;
+  padding-right: 0;
+}
+.input-group .form-control {
+  position: relative;
+  z-index: 2;
+  float: left;
+  width: 100%;
+  margin-bottom: 0;
+}
+
+.input-group-addon,
+.input-group-btn,
+.input-group .form-control {
+  display: table-cell;
+}
+.input-group-addon:not(:first-child):not(:last-child),
+.input-group-btn:not(:first-child):not(:last-child),
+.input-group .form-control:not(:first-child):not(:last-child) {
+  border-radius: 0;
+}
+
+.input-group-addon,
+.input-group-btn {
+  width: 1%;
+  white-space: nowrap;
+  vertical-align: middle;
+}
+
+.input-group-addon {
+  padding: 6px 12px;
+  font-size: 14px;
+  font-weight: normal;
+  line-height: 1;
+  color: #555555;
+  text-align: center;
+  background-color: #eeeeee;
+  border: 1px solid #ccc;
+  border-radius: 4px;
+}
+.input-group-addon.input-sm, .form-horizontal .form-group-sm .input-group-addon.form-control,
+.input-group-sm > .input-group-addon,
+.input-group-sm > .input-group-btn > .input-group-addon.btn {
+  padding: 5px 10px;
+  font-size: 12px;
+  border-radius: 3px;
+}
+.input-group-addon.input-lg, .form-horizontal .form-group-lg .input-group-addon.form-control,
+.input-group-lg > .input-group-addon,
+.input-group-lg > .input-group-btn > .input-group-addon.btn {
+  padding: 10px 16px;
+  font-size: 18px;
+  border-radius: 6px;
+}
+.input-group-addon input[type="radio"],
+.input-group-addon input[type="checkbox"] {
+  margin-top: 0;
+}
+
+.input-group .form-control:first-child,
+.input-group-addon:first-child,
+.input-group-btn:first-child > .btn,
+.input-group-btn:first-child > .btn-group > .btn,
+.input-group-btn:first-child > .dropdown-toggle,
+.input-group-btn:last-child > .btn:not(:last-child):not(.dropdown-toggle),
+.input-group-btn:last-child > .btn-group:not(:last-child) > .btn {
+  border-bottom-right-radius: 0;
+  border-top-right-radius: 0;
+}
+
+.input-group-addon:first-child {
+  border-right: 0;
+}
+
+.input-group .form-control:last-child,
+.input-group-addon:last-child,
+.input-group-btn:last-child > .btn,
+.input-group-btn:last-child > .btn-group > .btn,
+.input-group-btn:last-child > .dropdown-toggle,
+.input-group-btn:first-child > .btn:not(:first-child),
+.input-group-btn:first-child > .btn-group:not(:first-child) > .btn {
+  border-bottom-left-radius: 0;
+  border-top-left-radius: 0;
+}
+
+.input-group-addon:last-child {
+  border-left: 0;
+}
+
+.input-group-btn {
+  position: relative;
+  font-size: 0;
+  white-space: nowrap;
+}
+.input-group-btn > .btn {
+  position: relative;
+}
+.input-group-btn > .btn + .btn {
+  margin-left: -1px;
+}
+.input-group-btn > .btn:hover, .input-group-btn > .btn:focus, .input-group-btn > .btn:active {
+  z-index: 2;
+}
+.input-group-btn:first-child > .btn,
+.input-group-btn:first-child > .btn-group {
+  margin-right: -1px;
+}
+.input-group-btn:last-child > .btn,
+.input-group-btn:last-child > .btn-group {
+  margin-left: -1px;
+}
+
+.nav {
+  margin-bottom: 0;
+  padding-left: 0;
+  list-style: none;
+}
+.nav:before, .nav:after {
+  content: " ";
+  display: table;
+}
+.nav:after {
+  clear: both;
+}
+.nav > li {
+  position: relative;
+  display: block;
+}
+.nav > li > a {
+  position: relative;
+  display: block;
+  padding: 10px 15px;
+}
+.nav > li > a:hover, .nav > li > a:focus {
+  text-decoration: none;
+  background-color: #eeeeee;
+}
+.nav > li.disabled > a {
+  color: #777777;
+}
+.nav > li.disabled > a:hover, .nav > li.disabled > a:focus {
+  color: #777777;
+  text-decoration: none;
+  background-color: transparent;
+  cursor: not-allowed;
+}
+.nav .open > a, .nav .open > a:hover, .nav .open > a:focus {
+  background-color: #eeeeee;
+  border-color: #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.428571429;
+  border: 1px solid transparent;
+  border-radius: 4px 4px 0 0;
+}
+.nav-tabs > li > a:hover {
+  border-color: #eeeeee #eeeeee #ddd;
+}
+.nav-tabs > li.active > a, .nav-tabs > li.active > a:hover, .nav-tabs > li.active > a:focus {
+  color: #555555;
+  background-color: #fff;
+  border: 1px solid #ddd;
+  border-bottom-color: transparent;
+  cursor: default;
+}
+
+.nav-pills > li {
+  float: left;
+}
+.nav-pills > li > a {
+  border-radius: 4px;
+}
+.nav-pills > li + li {
+  margin-left: 2px;
+}
+.nav-pills > li.active > a, .nav-pills > li.active > a:hover, .nav-pills > li.active > a:focus {
+  color: #fff;
+  background-color: #428bca;
+}
+
+.nav-stacked > li {
+  float: none;
+}
+.nav-stacked > li + li {
+  margin-top: 2px;
+  margin-left: 0;
+}
+
+.nav-justified, .nav-tabs.nav-justified {
+  width: 100%;
+}
+.nav-justified > li, .nav-tabs.nav-justified > li {
+  float: none;
+}
+.nav-justified > li > a, .nav-tabs.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, .nav-tabs.nav-justified > li {
+    display: table-cell;
+    width: 1%;
+  }
+  .nav-justified > li > a, .nav-tabs.nav-justified > li > a {
+    margin-bottom: 0;
+  }
+}
+
+.nav-tabs-justified, .nav-tabs.nav-justified {
+  border-bottom: 0;
+}
+.nav-tabs-justified > li > a, .nav-tabs.nav-justified > li > a {
+  margin-right: 0;
+  border-radius: 4px;
+}
+.nav-tabs-justified > .active > a, .nav-tabs.nav-justified > .active > a,
+.nav-tabs-justified > .active > a:hover,
+.nav-tabs.nav-justified > .active > a:hover,
+.nav-tabs-justified > .active > a:focus,
+.nav-tabs.nav-justified > .active > a:focus {
+  border: 1px solid #ddd;
+}
+@media (min-width: 768px) {
+  .nav-tabs-justified > li > a, .nav-tabs.nav-justified > li > a {
+    border-bottom: 1px solid #ddd;
+    border-radius: 4px 4px 0 0;
+  }
+  .nav-tabs-justified > .active > a, .nav-tabs.nav-justified > .active > a,
+  .nav-tabs-justified > .active > a:hover,
+  .nav-tabs.nav-justified > .active > a:hover,
+  .nav-tabs-justified > .active > a:focus,
+  .nav-tabs.nav-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;
+}
+.navbar:before, .navbar:after {
+  content: " ";
+  display: table;
+}
+.navbar:after {
+  clear: both;
+}
+@media (min-width: 768px) {
+  .navbar {
+    border-radius: 4px;
+  }
+}
+
+.navbar-header:before, .navbar-header:after {
+  content: " ";
+  display: table;
+}
+.navbar-header:after {
+  clear: both;
+}
+@media (min-width: 768px) {
+  .navbar-header {
+    float: left;
+  }
+}
+
+.navbar-collapse {
+  overflow-x: visible;
+  padding-right: 15px;
+  padding-left: 15px;
+  border-top: 1px solid transparent;
+  box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1);
+  -webkit-overflow-scrolling: touch;
+}
+.navbar-collapse:before, .navbar-collapse:after {
+  content: " ";
+  display: table;
+}
+.navbar-collapse:after {
+  clear: both;
+}
+.navbar-collapse.in {
+  overflow-y: auto;
+}
+@media (min-width: 768px) {
+  .navbar-collapse {
+    width: auto;
+    border-top: 0;
+    box-shadow: none;
+  }
+  .navbar-collapse.collapse {
+    display: block !important;
+    height: auto !important;
+    padding-bottom: 0;
+    overflow: visible !important;
+  }
+  .navbar-collapse.in {
+    overflow-y: visible;
+  }
+  .navbar-fixed-top .navbar-collapse, .navbar-static-top .navbar-collapse, .navbar-fixed-bottom .navbar-collapse {
+    padding-left: 0;
+    padding-right: 0;
+  }
+}
+
+.navbar-fixed-top .navbar-collapse,
+.navbar-fixed-bottom .navbar-collapse {
+  max-height: 340px;
+}
+@media (max-width: 480px) and (orientation: landscape) {
+  .navbar-fixed-top .navbar-collapse,
+  .navbar-fixed-bottom .navbar-collapse {
+    max-height: 200px;
+  }
+}
+
+.container > .navbar-header,
+.container > .navbar-collapse,
+.container-fluid > .navbar-header,
+.container-fluid > .navbar-collapse {
+  margin-right: -15px;
+  margin-left: -15px;
+}
+@media (min-width: 768px) {
+  .container > .navbar-header,
+  .container > .navbar-collapse,
+  .container-fluid > .navbar-header,
+  .container-fluid > .navbar-collapse {
+    margin-right: 0;
+    margin-left: 0;
+  }
+}
+
+.navbar-static-top {
+  z-index: 1000;
+  border-width: 0 0 1px;
+}
+@media (min-width: 768px) {
+  .navbar-static-top {
+    border-radius: 0;
+  }
+}
+
+.navbar-fixed-top,
+.navbar-fixed-bottom {
+  position: fixed;
+  right: 0;
+  left: 0;
+  z-index: 1030;
+  -webkit-transform: translate3d(0, 0, 0);
+  transform: translate3d(0, 0, 0);
+}
+@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 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 solid transparent;
+  -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1);
+  box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1);
+  margin-top: 8px;
+  margin-bottom: 8px;
+}
+@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;
+    -webkit-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, .btn-group-sm > .navbar-btn.btn {
+  margin-top: 10px;
+  margin-bottom: 10px;
+}
+.navbar-btn.btn-xs, .btn-group-xs > .navbar-btn.btn {
+  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 .navbar-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-default .btn-link {
+  color: #777;
+}
+.navbar-default .btn-link:hover, .navbar-default .btn-link:focus {
+  color: #333;
+}
+.navbar-default .btn-link[disabled]:hover, .navbar-default .btn-link[disabled]:focus, fieldset[disabled] .navbar-default .btn-link:hover, fieldset[disabled] .navbar-default .btn-link:focus {
+  color: #ccc;
+}
+
+.navbar-inverse {
+  background-color: #222;
+  border-color: #090909;
+}
+.navbar-inverse .navbar-brand {
+  color: #777777;
+}
+.navbar-inverse .navbar-brand:hover, .navbar-inverse .navbar-brand:focus {
+  color: #fff;
+  background-color: transparent;
+}
+.navbar-inverse .navbar-text {
+  color: #777777;
+}
+.navbar-inverse .navbar-nav > li > a {
+  color: #777777;
+}
+.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: #090909;
+}
+.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: #090909;
+  color: #fff;
+}
+@media (max-width: 767px) {
+  .navbar-inverse .navbar-nav .open .dropdown-menu > .dropdown-header {
+    border-color: #090909;
+  }
+  .navbar-inverse .navbar-nav .open .dropdown-menu .divider {
+    background-color: #090909;
+  }
+  .navbar-inverse .navbar-nav .open .dropdown-menu > li > a {
+    color: #777777;
+  }
+  .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: #090909;
+  }
+  .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a, .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a:hover, .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a:focus {
+    color: #444;
+    background-color: transparent;
+  }
+}
+.navbar-inverse .navbar-link {
+  color: #777777;
+}
+.navbar-inverse .navbar-link:hover {
+  color: #fff;
+}
+.navbar-inverse .btn-link {
+  color: #777777;
+}
+.navbar-inverse .btn-link:hover, .navbar-inverse .btn-link:focus {
+  color: #fff;
+}
+.navbar-inverse .btn-link[disabled]:hover, .navbar-inverse .btn-link[disabled]:focus, fieldset[disabled] .navbar-inverse .btn-link:hover, fieldset[disabled] .navbar-inverse .btn-link:focus {
+  color: #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 {
+  content: "/ ";
+  padding: 0 5px;
+  color: #ccc;
+}
+.breadcrumb > .active {
+  color: #777777;
+}
+
+.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.428571429;
+  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 > a:focus,
+.pagination > li > span:hover,
+.pagination > li > span:focus {
+  color: #2a6496;
+  background-color: #eeeeee;
+  border-color: #ddd;
+}
+.pagination > .active > a, .pagination > .active > a:hover, .pagination > .active > a:focus,
+.pagination > .active > span,
+.pagination > .active > span:hover,
+.pagination > .active > span:focus {
+  z-index: 2;
+  color: #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: #777777;
+  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:before, .pager:after {
+  content: " ";
+  display: table;
+}
+.pager:after {
+  clear: both;
+}
+.pager li {
+  display: inline;
+}
+.pager li > a,
+.pager li > span {
+  display: inline-block;
+  padding: 5px 14px;
+  background-color: #fff;
+  border: 1px solid #ddd;
+  border-radius: 15px;
+}
+.pager li > a:hover,
+.pager li > a:focus {
+  text-decoration: none;
+  background-color: #eeeeee;
+}
+.pager .next > a,
+.pager .next > span {
+  float: right;
+}
+.pager .previous > a,
+.pager .previous > span {
+  float: left;
+}
+.pager .disabled > a,
+.pager .disabled > a:hover,
+.pager .disabled > a:focus,
+.pager .disabled > span {
+  color: #777777;
+  background-color: #fff;
+  cursor: not-allowed;
+}
+
+.label {
+  display: inline;
+  padding: .2em .6em .3em;
+  font-size: 75%;
+  font-weight: bold;
+  line-height: 1;
+  color: #fff;
+  text-align: center;
+  white-space: nowrap;
+  vertical-align: baseline;
+  border-radius: .25em;
+}
+.label:empty {
+  display: none;
+}
+.btn .label {
+  position: relative;
+  top: -1px;
+}
+
+a.label:hover, a.label:focus {
+  color: #fff;
+  text-decoration: none;
+  cursor: pointer;
+}
+
+.label-default {
+  background-color: #777777;
+}
+.label-default[href]:hover, .label-default[href]:focus {
+  background-color: #5e5e5e;
+}
+
+.label-primary {
+  background-color: #428bca;
+}
+.label-primary[href]:hover, .label-primary[href]:focus {
+  background-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: bold;
+  color: #fff;
+  line-height: 1;
+  vertical-align: baseline;
+  white-space: nowrap;
+  text-align: center;
+  background-color: #777777;
+  border-radius: 10px;
+}
+.badge:empty {
+  display: none;
+}
+.btn .badge {
+  position: relative;
+  top: -1px;
+}
+.btn-xs .badge, .btn-group-xs > .btn .badge {
+  top: 0;
+  padding: 1px 5px;
+}
+a.list-group-item.active > .badge, .nav-pills > .active > a > .badge {
+  color: #428bca;
+  background-color: #fff;
+}
+.nav-pills > li > a > .badge {
+  margin-left: 3px;
+}
+
+a.badge:hover, a.badge:focus {
+  color: #fff;
+  text-decoration: none;
+  cursor: pointer;
+}
+
+.jumbotron {
+  padding: 30px;
+  margin-bottom: 30px;
+  color: inherit;
+  background-color: #eeeeee;
+}
+.jumbotron h1,
+.jumbotron .h1 {
+  color: inherit;
+}
+.jumbotron p {
+  margin-bottom: 0px;
+  font-size: 21px;
+  font-weight: 200;
+}
+.jumbotron > hr {
+  border-top-color: #d5d5d5;
+}
+.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.428571429;
+  background-color: #fff;
+  border: 1px solid #ddd;
+  border-radius: 4px;
+  -webkit-transition: all 0.2s ease-in-out;
+  -o-transition: all 0.2s ease-in-out;
+  transition: all 0.2s ease-in-out;
+}
+.thumbnail > img,
+.thumbnail a > img {
+  display: block;
+  width: 100% \9;
+  max-width: 100%;
+  height: auto;
+  margin-left: auto;
+  margin-right: auto;
+}
+.thumbnail .caption {
+  padding: 9px;
+  color: #333333;
+}
+
+a.thumbnail:hover,
+a.thumbnail:focus,
+a.thumbnail.active {
+  border-color: #428bca;
+}
+
+.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: bold;
+}
+.alert > p,
+.alert > ul {
+  margin-bottom: 0;
+}
+.alert > p + p {
+  margin-top: 5px;
+}
+
+.alert-dismissable,
+.alert-dismissible {
+  padding-right: 35px;
+}
+.alert-dismissable .close,
+.alert-dismissible .close {
+  position: relative;
+  top: -2px;
+  right: -21px;
+  color: inherit;
+}
+
+.alert-success {
+  background-color: #dff0d8;
+  border-color: #d6e9c6;
+  color: #3c763d;
+}
+.alert-success hr {
+  border-top-color: #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 {
+    background-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, 0.1);
+  box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1);
+}
+
+.progress-bar {
+  float: left;
+  width: 0%;
+  height: 100%;
+  font-size: 12px;
+  line-height: 20px;
+  color: #fff;
+  text-align: center;
+  background-color: #428bca;
+  -webkit-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15);
+  box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15);
+  -webkit-transition: width 0.6s ease;
+  -o-transition: width 0.6s ease;
+  transition: width 0.6s ease;
+}
+
+.progress-striped .progress-bar,
+.progress-bar-striped {
+  background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
+  background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
+  background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, rgba(0, 0, 0, 0) 25%, rgba(0, 0, 0, 0) 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, rgba(0, 0, 0, 0) 75%, rgba(0, 0, 0, 0));
+  background-size: 40px 40px;
+}
+
+.progress.active .progress-bar,
+.progress-bar.active {
+  -webkit-animation: progress-bar-stripes 2s linear infinite;
+  -o-animation: progress-bar-stripes 2s linear infinite;
+  animation: progress-bar-stripes 2s linear infinite;
+}
+
+.progress-bar[aria-valuenow="1"], .progress-bar[aria-valuenow="2"] {
+  min-width: 30px;
+}
+.progress-bar[aria-valuenow="0"] {
+  color: #777777;
+  min-width: 30px;
+  background-color: transparent;
+  background-image: none;
+  box-shadow: none;
+}
+
+.progress-bar-success {
+  background-color: #5cb85c;
+}
+.progress-striped .progress-bar-success {
+  background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
+  background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
+  background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, rgba(0, 0, 0, 0) 25%, rgba(0, 0, 0, 0) 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, rgba(0, 0, 0, 0) 75%, rgba(0, 0, 0, 0));
+}
+
+.progress-bar-info {
+  background-color: #5bc0de;
+}
+.progress-striped .progress-bar-info {
+  background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
+  background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
+  background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, rgba(0, 0, 0, 0) 25%, rgba(0, 0, 0, 0) 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, rgba(0, 0, 0, 0) 75%, rgba(0, 0, 0, 0));
+}
+
+.progress-bar-warning {
+  background-color: #f0ad4e;
+}
+.progress-striped .progress-bar-warning {
+  background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
+  background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
+  background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, rgba(0, 0, 0, 0) 25%, rgba(0, 0, 0, 0) 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, rgba(0, 0, 0, 0) 75%, rgba(0, 0, 0, 0));
+}
+
+.progress-bar-danger {
+  background-color: #d9534f;
+}
+.progress-striped .progress-bar-danger {
+  background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
+  background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
+  background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, rgba(0, 0, 0, 0) 25%, rgba(0, 0, 0, 0) 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, rgba(0, 0, 0, 0) 75%, rgba(0, 0, 0, 0));
+}
+
+.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;
+  color: #555;
+  background-color: #f5f5f5;
+}
+
+.list-group-item.disabled, .list-group-item.disabled:hover, .list-group-item.disabled:focus {
+  background-color: #eeeeee;
+  color: #777777;
+}
+.list-group-item.disabled .list-group-item-heading, .list-group-item.disabled:hover .list-group-item-heading, .list-group-item.disabled:focus .list-group-item-heading {
+  color: inherit;
+}
+.list-group-item.disabled .list-group-item-text, .list-group-item.disabled:hover .list-group-item-text, .list-group-item.disabled:focus .list-group-item-text {
+  color: #777777;
+}
+.list-group-item.active, .list-group-item.active:hover, .list-group-item.active:focus {
+  z-index: 2;
+  color: #fff;
+  background-color: #428bca;
+  border-color: #428bca;
+}
+.list-group-item.active .list-group-item-heading,
+.list-group-item.active .list-group-item-heading > small,
+.list-group-item.active .list-group-item-heading > .small, .list-group-item.active:hover .list-group-item-heading,
+.list-group-item.active:hover .list-group-item-heading > small,
+.list-group-item.active:hover .list-group-item-heading > .small, .list-group-item.active:focus .list-group-item-heading,
+.list-group-item.active:focus .list-group-item-heading > small,
+.list-group-item.active:focus .list-group-item-heading > .small {
+  color: inherit;
+}
+.list-group-item.active .list-group-item-text, .list-group-item.active:hover .list-group-item-text, .list-group-item.active:focus .list-group-item-text {
+  color: #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.active, 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: #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, 0.05);
+  box-shadow: 0 1px 1px rgba(0, 0, 0, 0.05);
+}
+
+.panel-body {
+  padding: 15px;
+}
+.panel-body:before, .panel-body:after {
+  content: " ";
+  display: table;
+}
+.panel-body:after {
+  clear: both;
+}
+
+.panel-heading {
+  padding: 10px 15px;
+  border-bottom: 1px solid transparent;
+  border-top-right-radius: 3px;
+  border-top-left-radius: 3px;
+}
+.panel-heading > .dropdown .dropdown-toggle {
+  color: inherit;
+}
+
+.panel-title {
+  margin-top: 0;
+  margin-bottom: 0;
+  font-size: 16px;
+  color: inherit;
+}
+.panel-title > a {
+  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:last-child .list-group-item:last-child {
+  border-bottom: 0;
+  border-bottom-right-radius: 3px;
+  border-bottom-left-radius: 3px;
+}
+
+.panel-heading + .list-group .list-group-item:first-child {
+  border-top-width: 0;
+}
+
+.list-group + .panel-footer {
+  border-top-width: 0;
+}
+
+.panel > .table,
+.panel > .table-responsive > .table,
+.panel > .panel-collapse > .table {
+  margin-bottom: 0;
+}
+.panel > .table: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:first-child > thead:first-child > tr:first-child th:first-child,
+.panel > .table:first-child > tbody:first-child > tr:first-child td:first-child,
+.panel > .table:first-child > tbody:first-child > tr:first-child th:first-child,
+.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child td:first-child,
+.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child th:first-child,
+.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child td:first-child,
+.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child th:first-child {
+  border-top-left-radius: 3px;
+}
+.panel > .table:first-child > thead:first-child > tr:first-child td:last-child,
+.panel > .table:first-child > thead:first-child > tr:first-child th:last-child,
+.panel > .table:first-child > tbody:first-child > tr:first-child td:last-child,
+.panel > .table:first-child > tbody:first-child > tr:first-child th:last-child,
+.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child td:last-child,
+.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child th:last-child,
+.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child td:last-child,
+.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child th:last-child {
+  border-top-right-radius: 3px;
+}
+.panel > .table:last-child,
+.panel > .table-responsive:last-child > .table:last-child {
+  border-bottom-right-radius: 3px;
+  border-bottom-left-radius: 3px;
+}
+.panel > .table:last-child > tbody:last-child > tr:last-child td:first-child,
+.panel > .table:last-child > tbody:last-child > tr:last-child th:first-child,
+.panel > .table:last-child > tfoot:last-child > tr:last-child td:first-child,
+.panel > .table:last-child > tfoot:last-child > tr:last-child th:first-child,
+.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child td:first-child,
+.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child th:first-child,
+.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child td:first-child,
+.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child th:first-child {
+  border-bottom-left-radius: 3px;
+}
+.panel > .table:last-child > tbody:last-child > tr:last-child td:last-child,
+.panel > .table:last-child > tbody:last-child > tr:last-child th:last-child,
+.panel > .table:last-child > tfoot:last-child > tr:last-child td:last-child,
+.panel > .table:last-child > tfoot:last-child > tr:last-child th:last-child,
+.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child td:last-child,
+.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child th:last-child,
+.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child td:last-child,
+.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child th:last-child {
+  border-bottom-right-radius: 3px;
+}
+.panel > .panel-body + .table,
+.panel > .panel-body + .table-responsive {
+  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-bordered > thead > tr > td:first-child,
+.panel > .table-bordered > tbody > tr > th:first-child,
+.panel > .table-bordered > tbody > tr > td:first-child,
+.panel > .table-bordered > tfoot > tr > th:first-child,
+.panel > .table-bordered > tfoot > tr > td:first-child,
+.panel > .table-responsive > .table-bordered > thead > tr > th:first-child,
+.panel > .table-responsive > .table-bordered > thead > tr > td:first-child,
+.panel > .table-responsive > .table-bordered > tbody > tr > th:first-child,
+.panel > .table-responsive > .table-bordered > tbody > tr > td:first-child,
+.panel > .table-responsive > .table-bordered > tfoot > tr > th:first-child,
+.panel > .table-responsive > .table-bordered > tfoot > tr > td:first-child {
+  border-left: 0;
+}
+.panel > .table-bordered > thead > tr > th:last-child,
+.panel > .table-bordered > thead > tr > td:last-child,
+.panel > .table-bordered > tbody > tr > th:last-child,
+.panel > .table-bordered > tbody > tr > td:last-child,
+.panel > .table-bordered > tfoot > tr > th:last-child,
+.panel > .table-bordered > tfoot > tr > td:last-child,
+.panel > .table-responsive > .table-bordered > thead > tr > th:last-child,
+.panel > .table-responsive > .table-bordered > thead > tr > td:last-child,
+.panel > .table-responsive > .table-bordered > tbody > tr > th:last-child,
+.panel > .table-responsive > .table-bordered > tbody > tr > td:last-child,
+.panel > .table-responsive > .table-bordered > tfoot > tr > th:last-child,
+.panel > .table-responsive > .table-bordered > tfoot > tr > td:last-child {
+  border-right: 0;
+}
+.panel > .table-bordered > thead > tr:first-child > td,
+.panel > .table-bordered > thead > tr:first-child > th,
+.panel > .table-bordered > tbody > tr:first-child > td,
+.panel > .table-bordered > tbody > tr:first-child > th,
+.panel > .table-responsive > .table-bordered > thead > tr:first-child > td,
+.panel > .table-responsive > .table-bordered > thead > tr:first-child > th,
+.panel > .table-responsive > .table-bordered > tbody > tr:first-child > td,
+.panel > .table-responsive > .table-bordered > tbody > tr:first-child > th {
+  border-bottom: 0;
+}
+.panel > .table-bordered > tbody > tr:last-child > td,
+.panel > .table-bordered > tbody > tr:last-child > th,
+.panel > .table-bordered > tfoot > tr:last-child > td,
+.panel > .table-bordered > tfoot > tr:last-child > th,
+.panel > .table-responsive > .table-bordered > tbody > tr:last-child > td,
+.panel > .table-responsive > .table-bordered > tbody > tr:last-child > th,
+.panel > .table-responsive > .table-bordered > tfoot > tr:last-child > td,
+.panel > .table-responsive > .table-bordered > tfoot > tr:last-child > th {
+  border-bottom: 0;
+}
+.panel > .table-responsive {
+  border: 0;
+  margin-bottom: 0;
+}
+
+.panel-group {
+  margin-bottom: 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 > .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: #333333;
+  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: #333333;
+}
+.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-heading .badge {
+  color: #428bca;
+  background-color: #fff;
+}
+.panel-primary > .panel-footer + .panel-collapse > .panel-body {
+  border-bottom-color: #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-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 > .panel-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 iframe,
+.embed-responsive embed,
+.embed-responsive object {
+  position: absolute;
+  top: 0;
+  left: 0;
+  bottom: 0;
+  height: 100%;
+  width: 100%;
+  border: 0;
+}
+.embed-responsive.embed-responsive-16by9 {
+  padding-bottom: 56.25%;
+}
+.embed-responsive.embed-responsive-4by3 {
+  padding-bottom: 75%;
+}
+
+.well {
+  min-height: 20px;
+  padding: 19px;
+  margin-bottom: 20px;
+  background-color: #f5f5f5;
+  border: 1px solid #e3e3e3;
+  border-radius: 4px;
+  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05);
+  box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05);
+}
+.well blockquote {
+  border-color: #ddd;
+  border-color: rgba(0, 0, 0, 0.15);
+}
+
+.well-lg {
+  padding: 24px;
+  border-radius: 6px;
+}
+
+.well-sm {
+  padding: 9px;
+  border-radius: 3px;
+}
+
+.close {
+  float: right;
+  font-size: 21px;
+  font-weight: bold;
+  line-height: 1;
+  color: #000;
+  text-shadow: 0 1px 0 #fff;
+  opacity: 0.2;
+  filter: alpha(opacity=20);
+}
+.close:hover, .close:focus {
+  color: #000;
+  text-decoration: none;
+  cursor: pointer;
+  opacity: 0.5;
+  filter: alpha(opacity=50);
+}
+
+button.close {
+  padding: 0;
+  cursor: pointer;
+  background: transparent;
+  border: 0;
+  -webkit-appearance: none;
+}
+
+.modal-open {
+  overflow: hidden;
+}
+
+.modal {
+  display: none;
+  overflow: hidden;
+  position: fixed;
+  top: 0;
+  right: 0;
+  bottom: 0;
+  left: 0;
+  z-index: 1050;
+  -webkit-overflow-scrolling: touch;
+  outline: 0;
+}
+.modal.fade .modal-dialog {
+  -webkit-transform: translate3d(0, -25%, 0);
+  transform: translate3d(0, -25%, 0);
+  -webkit-transition: -webkit-transform 0.3s ease-out;
+  -moz-transition: -moz-transform 0.3s ease-out;
+  -o-transition: -o-transform 0.3s ease-out;
+  transition: transform 0.3s ease-out;
+}
+.modal.in .modal-dialog {
+  -webkit-transform: translate3d(0, 0, 0);
+  transform: translate3d(0, 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;
+  border: 1px solid #999;
+  border: 1px solid rgba(0, 0, 0, 0.2);
+  border-radius: 6px;
+  -webkit-box-shadow: 0 3px 9px rgba(0, 0, 0, 0.5);
+  box-shadow: 0 3px 9px rgba(0, 0, 0, 0.5);
+  background-clip: padding-box;
+  outline: 0;
+}
+
+.modal-backdrop {
+  position: 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: 0.5;
+  filter: alpha(opacity=50);
+}
+
+.modal-header {
+  padding: 15px;
+  border-bottom: 1px solid #e5e5e5;
+  min-height: 16.428571429px;
+}
+
+.modal-header .close {
+  margin-top: -2px;
+}
+
+.modal-title {
+  margin: 0;
+  line-height: 1.428571429;
+}
+
+.modal-body {
+  position: relative;
+  padding: 15px;
+}
+
+.modal-footer {
+  padding: 15px;
+  text-align: right;
+  border-top: 1px solid #e5e5e5;
+}
+.modal-footer:before, .modal-footer:after {
+  content: " ";
+  display: table;
+}
+.modal-footer:after {
+  clear: both;
+}
+.modal-footer .btn + .btn {
+  margin-left: 5px;
+  margin-bottom: 0;
+}
+.modal-footer .btn-group .btn + .btn {
+  margin-left: -1px;
+}
+.modal-footer .btn-block + .btn-block {
+  margin-left: 0;
+}
+
+.modal-scrollbar-measure {
+  position: absolute;
+  top: -9999px;
+  width: 50px;
+  height: 50px;
+  overflow: scroll;
+}
+
+@media (min-width: 768px) {
+  .modal-dialog {
+    width: 600px;
+    margin: 30px auto;
+  }
+
+  .modal-content {
+    -webkit-box-shadow: 0 5px 15px rgba(0, 0, 0, 0.5);
+    box-shadow: 0 5px 15px rgba(0, 0, 0, 0.5);
+  }
+
+  .modal-sm {
+    width: 300px;
+  }
+}
+@media (min-width: 992px) {
+  .modal-lg {
+    width: 900px;
+  }
+}
+.tooltip {
+  position: absolute;
+  z-index: 1070;
+  display: block;
+  visibility: visible;
+  font-size: 12px;
+  line-height: 1.4;
+  opacity: 0;
+  filter: alpha(opacity=0);
+}
+.tooltip.in {
+  opacity: 0.9;
+  filter: alpha(opacity=90);
+}
+.tooltip.top {
+  margin-top: -3px;
+  padding: 5px 0;
+}
+.tooltip.right {
+  margin-left: 3px;
+  padding: 0 5px;
+}
+.tooltip.bottom {
+  margin-top: 3px;
+  padding: 5px 0;
+}
+.tooltip.left {
+  margin-left: -3px;
+  padding: 0 5px;
+}
+
+.tooltip-inner {
+  max-width: 200px;
+  padding: 3px 8px;
+  color: #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;
+}
+.tooltip.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: 1060;
+  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, 0.2);
+  border-radius: 6px;
+  -webkit-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);
+  box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);
+  white-space: normal;
+}
+.popover.top {
+  margin-top: -10px;
+}
+.popover.right {
+  margin-left: 10px;
+}
+.popover.bottom {
+  margin-top: 10px;
+}
+.popover.left {
+  margin-left: -10px;
+}
+
+.popover-title {
+  margin: 0;
+  padding: 8px 14px;
+  font-size: 14px;
+  font-weight: normal;
+  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: #999999;
+  border-top-color: rgba(0, 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: #999999;
+  border-right-color: rgba(0, 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: #999999;
+  border-bottom-color: rgba(0, 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: #999999;
+  border-left-color: rgba(0, 0, 0, 0.25);
+}
+.popover.left > .arrow:after {
+  content: " ";
+  right: 1px;
+  border-right-width: 0;
+  border-left-color: #fff;
+  bottom: -10px;
+}
+
+.carousel {
+  position: relative;
+}
+
+.carousel-inner {
+  position: relative;
+  overflow: hidden;
+  width: 100%;
+}
+.carousel-inner > .item {
+  display: none;
+  position: relative;
+  -webkit-transition: 0.6s ease-in-out left;
+  -o-transition: 0.6s ease-in-out left;
+  transition: 0.6s ease-in-out left;
+}
+.carousel-inner > .item > img,
+.carousel-inner > .item > a > img {
+  display: block;
+  width: 100% \9;
+  max-width: 100%;
+  height: auto;
+  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: 0.5;
+  filter: alpha(opacity=50);
+  font-size: 20px;
+  color: #fff;
+  text-align: center;
+  text-shadow: 0 1px 2px rgba(0, 0, 0, 0.6);
+}
+.carousel-control.left {
+  background-image: -webkit-linear-gradient(left, rgba(0, 0, 0, 0.5) 0%, rgba(0, 0, 0, 0.0001) 100%);
+  background-image: -o-linear-gradient(left, rgba(0, 0, 0, 0.5) 0%, rgba(0, 0, 0, 0.0001) 100%);
+  background-image: linear-gradient(to right, rgba(0, 0, 0, 0.5) 0%, rgba(0, 0, 0, 0.0001) 100%);
+  background-repeat: repeat-x;
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#80000000', endColorstr='#00000000', GradientType=1);
+}
+.carousel-control.right {
+  left: auto;
+  right: 0;
+  background-image: -webkit-linear-gradient(left, rgba(0, 0, 0, 0.0001) 0%, rgba(0, 0, 0, 0.5) 100%);
+  background-image: -o-linear-gradient(left, rgba(0, 0, 0, 0.0001) 0%, rgba(0, 0, 0, 0.5) 100%);
+  background-image: linear-gradient(to right, rgba(0, 0, 0, 0.0001) 0%, rgba(0, 0, 0, 0.5) 100%);
+  background-repeat: repeat-x;
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#00000000', endColorstr='#80000000', GradientType=1);
+}
+.carousel-control:hover, .carousel-control:focus {
+  outline: 0;
+  color: #fff;
+  text-decoration: none;
+  opacity: 0.9;
+  filter: alpha(opacity=90);
+}
+.carousel-control .icon-prev,
+.carousel-control .icon-next,
+.carousel-control .glyphicon-chevron-left,
+.carousel-control .glyphicon-chevron-right {
+  position: absolute;
+  top: 50%;
+  z-index: 5;
+  display: inline-block;
+}
+.carousel-control .icon-prev,
+.carousel-control .glyphicon-chevron-left {
+  left: 50%;
+  margin-left: -10px;
+}
+.carousel-control .icon-next,
+.carousel-control .glyphicon-chevron-right {
+  right: 50%;
+  margin-right: -10px;
+}
+.carousel-control .icon-prev,
+.carousel-control .icon-next {
+  width: 20px;
+  height: 20px;
+  margin-top: -10px;
+  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: transparent;
+}
+.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, 0.6);
+}
+.carousel-caption .btn {
+  text-shadow: none;
+}
+
+@media screen and (min-width: 768px) {
+  .carousel-control .glyphicon-chevron-left,
+  .carousel-control .glyphicon-chevron-right,
+  .carousel-control .icon-prev,
+  .carousel-control .icon-next {
+    width: 30px;
+    height: 30px;
+    margin-top: -15px;
+    font-size: 30px;
+  }
+  .carousel-control .glyphicon-chevron-left,
+  .carousel-control .icon-prev {
+    margin-left: -15px;
+  }
+  .carousel-control .glyphicon-chevron-right,
+  .carousel-control .icon-next {
+    margin-right: -15px;
+  }
+
+  .carousel-caption {
+    left: 20%;
+    right: 20%;
+    padding-bottom: 30px;
+  }
+
+  .carousel-indicators {
+    bottom: 20px;
+  }
+}
+.clearfix:before, .clearfix:after {
+  content: " ";
+  display: table;
+}
+.clearfix:after {
+  clear: both;
+}
+
+.center-block {
+  display: block;
+  margin-left: auto;
+  margin-right: auto;
+}
+
+.pull-right {
+  float: right !important;
+}
+
+.pull-left {
+  float: left !important;
+}
+
+.hide {
+  display: none !important;
+}
+
+.show {
+  display: block !important;
+}
+
+.invisible {
+  visibility: hidden;
+}
+
+.text-hide {
+  font: 0/0 a;
+  color: transparent;
+  text-shadow: none;
+  background-color: transparent;
+  border: 0;
+}
+
+.hidden {
+  display: none !important;
+  visibility: hidden !important;
+}
+
+.affix {
+  position: fixed;
+  -webkit-transform: translate3d(0, 0, 0);
+  transform: translate3d(0, 0, 0);
+}
+
+@-ms-viewport {
+  width: device-width;
+}
+.visible-xs, .visible-sm, .visible-md, .visible-lg {
+  display: none !important;
+}
+
+.visible-xs-block,
+.visible-xs-inline,
+.visible-xs-inline-block,
+.visible-sm-block,
+.visible-sm-inline,
+.visible-sm-inline-block,
+.visible-md-block,
+.visible-md-inline,
+.visible-md-inline-block,
+.visible-lg-block,
+.visible-lg-inline,
+.visible-lg-inline-block {
+  display: none !important;
+}
+
+@media (max-width: 767px) {
+  .visible-xs {
+    display: block !important;
+  }
+
+  table.visible-xs {
+    display: table;
+  }
+
+  tr.visible-xs {
+    display: table-row !important;
+  }
+
+  th.visible-xs,
+  td.visible-xs {
+    display: table-cell !important;
+  }
+}
+@media (max-width: 767px) {
+  .visible-xs-block {
+    display: block !important;
+  }
+}
+
+@media (max-width: 767px) {
+  .visible-xs-inline {
+    display: inline !important;
+  }
+}
+
+@media (max-width: 767px) {
+  .visible-xs-inline-block {
+    display: inline-block !important;
+  }
+}
+
+@media (min-width: 768px) and (max-width: 991px) {
+  .visible-sm {
+    display: block !important;
+  }
+
+  table.visible-sm {
+    display: table;
+  }
+
+  tr.visible-sm {
+    display: table-row !important;
+  }
+
+  th.visible-sm,
+  td.visible-sm {
+    display: table-cell !important;
+  }
+}
+@media (min-width: 768px) and (max-width: 991px) {
+  .visible-sm-block {
+    display: block !important;
+  }
+}
+
+@media (min-width: 768px) and (max-width: 991px) {
+  .visible-sm-inline {
+    display: inline !important;
+  }
+}
+
+@media (min-width: 768px) and (max-width: 991px) {
+  .visible-sm-inline-block {
+    display: inline-block !important;
+  }
+}
+
+@media (min-width: 992px) and (max-width: 1199px) {
+  .visible-md {
+    display: block !important;
+  }
+
+  table.visible-md {
+    display: table;
+  }
+
+  tr.visible-md {
+    display: table-row !important;
+  }
+
+  th.visible-md,
+  td.visible-md {
+    display: table-cell !important;
+  }
+}
+@media (min-width: 992px) and (max-width: 1199px) {
+  .visible-md-block {
+    display: block !important;
+  }
+}
+
+@media (min-width: 992px) and (max-width: 1199px) {
+  .visible-md-inline {
+    display: inline !important;
+  }
+}
+
+@media (min-width: 992px) and (max-width: 1199px) {
+  .visible-md-inline-block {
+    display: inline-block !important;
+  }
+}
+
+@media (min-width: 1200px) {
+  .visible-lg {
+    display: block !important;
+  }
+
+  table.visible-lg {
+    display: table;
+  }
+
+  tr.visible-lg {
+    display: table-row !important;
+  }
+
+  th.visible-lg,
+  td.visible-lg {
+    display: table-cell !important;
+  }
+}
+@media (min-width: 1200px) {
+  .visible-lg-block {
+    display: block !important;
+  }
+}
+
+@media (min-width: 1200px) {
+  .visible-lg-inline {
+    display: inline !important;
+  }
+}
+
+@media (min-width: 1200px) {
+  .visible-lg-inline-block {
+    display: inline-block !important;
+  }
+}
+
+@media (max-width: 767px) {
+  .hidden-xs {
+    display: none !important;
+  }
+}
+@media (min-width: 768px) and (max-width: 991px) {
+  .hidden-sm {
+    display: none !important;
+  }
+}
+@media (min-width: 992px) and (max-width: 1199px) {
+  .hidden-md {
+    display: none !important;
+  }
+}
+@media (min-width: 1200px) {
+  .hidden-lg {
+    display: none !important;
+  }
+}
+.visible-print {
+  display: none !important;
+}
+
+@media print {
+  .visible-print {
+    display: block !important;
+  }
+
+  table.visible-print {
+    display: table;
+  }
+
+  tr.visible-print {
+    display: table-row !important;
+  }
+
+  th.visible-print,
+  td.visible-print {
+    display: table-cell !important;
+  }
+}
+.visible-print-block {
+  display: none !important;
+}
+@media print {
+  .visible-print-block {
+    display: block !important;
+  }
+}
+
+.visible-print-inline {
+  display: none !important;
+}
+@media print {
+  .visible-print-inline {
+    display: inline !important;
+  }
+}
+
+.visible-print-inline-block {
+  display: none !important;
+}
+@media print {
+  .visible-print-inline-block {
+    display: inline-block !important;
+  }
+}
+
+@media print {
+  .hidden-print {
+    display: none !important;
+  }
+}
+.btn-default,
+.btn-primary,
+.btn-success,
+.btn-info,
+.btn-warning,
+.btn-danger {
+  text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.2);
+  -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.15), 0 1px 1px rgba(0, 0, 0, 0.075);
+  box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.15), 0 1px 1px rgba(0, 0, 0, 0.075);
+}
+.btn-default:active, .btn-default.active,
+.btn-primary:active,
+.btn-primary.active,
+.btn-success:active,
+.btn-success.active,
+.btn-info:active,
+.btn-info.active,
+.btn-warning:active,
+.btn-warning.active,
+.btn-danger:active,
+.btn-danger.active {
+  -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);
+  box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);
+}
+
+.btn:active, .btn.active {
+  background-image: none;
+}
+
+.btn-default {
+  background-image: -webkit-linear-gradient(top, #fff 0%, #e0e0e0 100%);
+  background-image: -o-linear-gradient(top, #fff 0%, #e0e0e0 100%);
+  background-image: linear-gradient(to bottom, #ffffff 0%, #e0e0e0 100%);
+  background-repeat: repeat-x;
+  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;
+  text-shadow: 0 1px 0 #fff;
+  border-color: #ccc;
+}
+.btn-default:hover, .btn-default:focus {
+  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] {
+  background-color: #e0e0e0;
+  background-image: none;
+}
+
+.btn-primary {
+  background-image: -webkit-linear-gradient(top, #428bca 0%, #2d6ca2 100%);
+  background-image: -o-linear-gradient(top, #428bca 0%, #2d6ca2 100%);
+  background-image: linear-gradient(to bottom, #428bca 0%, #2d6ca2 100%);
+  background-repeat: repeat-x;
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#FF428BCA', endColorstr='#FF2D6CA2', GradientType=0);
+  filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);
+  background-repeat: repeat-x;
+  border-color: #2b669a;
+}
+.btn-primary:hover, .btn-primary:focus {
+  background-color: #2d6ca2;
+  background-position: 0 -15px;
+}
+.btn-primary:active, .btn-primary.active {
+  background-color: #2d6ca2;
+  border-color: #2b669a;
+}
+.btn-primary:disabled, .btn-primary[disabled] {
+  background-color: #2d6ca2;
+  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: linear-gradient(to bottom, #5cb85c 0%, #419641 100%);
+  background-repeat: repeat-x;
+  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;
+}
+.btn-success:hover, .btn-success:focus {
+  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] {
+  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: linear-gradient(to bottom, #5bc0de 0%, #2aabd2 100%);
+  background-repeat: repeat-x;
+  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:hover, .btn-info:focus {
+  background-color: #2aabd2;
+  background-position: 0 -15px;
+}
+.btn-info:active, .btn-info.active {
+  background-color: #2aabd2;
+  border-color: #28a4c9;
+}
+.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: linear-gradient(to bottom, #f0ad4e 0%, #eb9316 100%);
+  background-repeat: repeat-x;
+  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:hover, .btn-warning:focus {
+  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] {
+  background-color: #eb9316;
+  background-image: none;
+}
+
+.btn-danger {
+  background-image: -webkit-linear-gradient(top, #d9534f 0%, #c12e2a 100%);
+  background-image: -o-linear-gradient(top, #d9534f 0%, #c12e2a 100%);
+  background-image: linear-gradient(to bottom, #d9534f 0%, #c12e2a 100%);
+  background-repeat: repeat-x;
+  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:hover, .btn-danger:focus {
+  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] {
+  background-color: #c12e2a;
+  background-image: none;
+}
+
+.thumbnail,
+.img-thumbnail {
+  -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.075);
+  box-shadow: 0 1px 2px rgba(0, 0, 0, 0.075);
+}
+
+.dropdown-menu > li > a:hover,
+.dropdown-menu > li > a:focus {
+  background-image: -webkit-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%);
+  background-image: -o-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%);
+  background-image: linear-gradient(to bottom, #f5f5f5 0%, #e8e8e8 100%);
+  background-repeat: repeat-x;
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#FFF5F5F5', endColorstr='#FFE8E8E8', GradientType=0);
+  background-color: #e8e8e8;
+}
+
+.dropdown-menu > .active > a,
+.dropdown-menu > .active > a:hover,
+.dropdown-menu > .active > a:focus {
+  background-image: -webkit-linear-gradient(top, #428bca 0%, #357ebd 100%);
+  background-image: -o-linear-gradient(top, #428bca 0%, #357ebd 100%);
+  background-image: linear-gradient(to bottom, #428bca 0%, #357ebd 100%);
+  background-repeat: repeat-x;
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#FF428BCA', endColorstr='#FF357EBD', GradientType=0);
+  background-color: #357ebd;
+}
+
+.navbar-default {
+  background-image: -webkit-linear-gradient(top, white 0%, #f8f8f8 100%);
+  background-image: -o-linear-gradient(top, white 0%, #f8f8f8 100%);
+  background-image: linear-gradient(to bottom, #ffffff 0%, #f8f8f8 100%);
+  background-repeat: repeat-x;
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#FFFFFFFF', endColorstr='#FFF8F8F8', GradientType=0);
+  filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);
+  border-radius: 4px;
+  -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.15), 0 1px 5px rgba(0, 0, 0, 0.075);
+  box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.15), 0 1px 5px rgba(0, 0, 0, 0.075);
+}
+.navbar-default .navbar-nav > .active > a {
+  background-image: -webkit-linear-gradient(top, #ebebeb 0%, #f3f3f3 100%);
+  background-image: -o-linear-gradient(top, #ebebeb 0%, #f3f3f3 100%);
+  background-image: linear-gradient(to bottom, #ebebeb 0%, #f3f3f3 100%);
+  background-repeat: repeat-x;
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#FFEBEBEB', endColorstr='#FFF3F3F3', GradientType=0);
+  -webkit-box-shadow: inset 0 3px 9px rgba(0, 0, 0, 0.075);
+  box-shadow: inset 0 3px 9px rgba(0, 0, 0, 0.075);
+}
+
+.navbar-brand,
+.navbar-nav > li > a {
+  text-shadow: 0 1px 0 rgba(255, 255, 255, 0.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: linear-gradient(to bottom, #3c3c3c 0%, #222222 100%);
+  background-repeat: repeat-x;
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#FF3C3C3C', endColorstr='#FF222222', GradientType=0);
+  filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);
+}
+.navbar-inverse .navbar-nav > .active > a {
+  background-image: -webkit-linear-gradient(top, #222 0%, #282828 100%);
+  background-image: -o-linear-gradient(top, #222 0%, #282828 100%);
+  background-image: linear-gradient(to bottom, #222222 0%, #282828 100%);
+  background-repeat: repeat-x;
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#FF222222', endColorstr='#FF282828', GradientType=0);
+  -webkit-box-shadow: inset 0 3px 9px rgba(0, 0, 0, 0.25);
+  box-shadow: inset 0 3px 9px rgba(0, 0, 0, 0.25);
+}
+.navbar-inverse .navbar-brand,
+.navbar-inverse .navbar-nav > li > a {
+  text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);
+}
+
+.navbar-static-top,
+.navbar-fixed-top,
+.navbar-fixed-bottom {
+  border-radius: 0;
+}
+
+.alert {
+  text-shadow: 0 1px 0 rgba(255, 255, 255, 0.2);
+  -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.25), 0 1px 2px rgba(0, 0, 0, 0.05);
+  box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.25), 0 1px 2px rgba(0, 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: linear-gradient(to bottom, #dff0d8 0%, #c8e5bc 100%);
+  background-repeat: repeat-x;
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#FFDFF0D8', endColorstr='#FFC8E5BC', GradientType=0);
+  border-color: #b2dba1;
+}
+
+.alert-info {
+  background-image: -webkit-linear-gradient(top, #d9edf7 0%, #b9def0 100%);
+  background-image: -o-linear-gradient(top, #d9edf7 0%, #b9def0 100%);
+  background-image: linear-gradient(to bottom, #d9edf7 0%, #b9def0 100%);
+  background-repeat: repeat-x;
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#FFD9EDF7', endColorstr='#FFB9DEF0', GradientType=0);
+  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: linear-gradient(to bottom, #fcf8e3 0%, #f8efc0 100%);
+  background-repeat: repeat-x;
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#FFFCF8E3', endColorstr='#FFF8EFC0', GradientType=0);
+  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: linear-gradient(to bottom, #f2dede 0%, #e7c3c3 100%);
+  background-repeat: repeat-x;
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#FFF2DEDE', endColorstr='#FFE7C3C3', GradientType=0);
+  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: linear-gradient(to bottom, #ebebeb 0%, #f5f5f5 100%);
+  background-repeat: repeat-x;
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#FFEBEBEB', endColorstr='#FFF5F5F5', GradientType=0);
+}
+
+.progress-bar {
+  background-image: -webkit-linear-gradient(top, #428bca 0%, #3071a9 100%);
+  background-image: -o-linear-gradient(top, #428bca 0%, #3071a9 100%);
+  background-image: linear-gradient(to bottom, #428bca 0%, #3071a9 100%);
+  background-repeat: repeat-x;
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#FF428BCA', endColorstr='#FF3071A9', GradientType=0);
+}
+
+.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: linear-gradient(to bottom, #5cb85c 0%, #449d44 100%);
+  background-repeat: repeat-x;
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#FF5CB85C', endColorstr='#FF449D44', GradientType=0);
+}
+
+.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: linear-gradient(to bottom, #5bc0de 0%, #31b0d5 100%);
+  background-repeat: repeat-x;
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#FF5BC0DE', endColorstr='#FF31B0D5', GradientType=0);
+}
+
+.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: linear-gradient(to bottom, #f0ad4e 0%, #ec971f 100%);
+  background-repeat: repeat-x;
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#FFF0AD4E', endColorstr='#FFEC971F', GradientType=0);
+}
+
+.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: linear-gradient(to bottom, #d9534f 0%, #c9302c 100%);
+  background-repeat: repeat-x;
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#FFD9534F', endColorstr='#FFC9302C', GradientType=0);
+}
+
+.progress-bar-striped {
+  background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
+  background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
+  background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, rgba(0, 0, 0, 0) 25%, rgba(0, 0, 0, 0) 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, rgba(0, 0, 0, 0) 75%, rgba(0, 0, 0, 0));
+}
+
+.list-group {
+  border-radius: 4px;
+  -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.075);
+  box-shadow: 0 1px 2px rgba(0, 0, 0, 0.075);
+}
+
+.list-group-item.active,
+.list-group-item.active:hover,
+.list-group-item.active:focus {
+  text-shadow: 0 -1px 0 #3071a9;
+  background-image: -webkit-linear-gradient(top, #428bca 0%, #3278b3 100%);
+  background-image: -o-linear-gradient(top, #428bca 0%, #3278b3 100%);
+  background-image: linear-gradient(to bottom, #428bca 0%, #3278b3 100%);
+  background-repeat: repeat-x;
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#FF428BCA', endColorstr='#FF3278B3', GradientType=0);
+  border-color: #3278b3;
+}
+
+.panel {
+  -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05);
+  box-shadow: 0 1px 2px rgba(0, 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: linear-gradient(to bottom, #f5f5f5 0%, #e8e8e8 100%);
+  background-repeat: repeat-x;
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#FFF5F5F5', endColorstr='#FFE8E8E8', GradientType=0);
+}
+
+.panel-primary > .panel-heading {
+  background-image: -webkit-linear-gradient(top, #428bca 0%, #357ebd 100%);
+  background-image: -o-linear-gradient(top, #428bca 0%, #357ebd 100%);
+  background-image: linear-gradient(to bottom, #428bca 0%, #357ebd 100%);
+  background-repeat: repeat-x;
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#FF428BCA', endColorstr='#FF357EBD', GradientType=0);
+}
+
+.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: linear-gradient(to bottom, #dff0d8 0%, #d0e9c6 100%);
+  background-repeat: repeat-x;
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#FFDFF0D8', endColorstr='#FFD0E9C6', GradientType=0);
+}
+
+.panel-info > .panel-heading {
+  background-image: -webkit-linear-gradient(top, #d9edf7 0%, #c4e3f3 100%);
+  background-image: -o-linear-gradient(top, #d9edf7 0%, #c4e3f3 100%);
+  background-image: linear-gradient(to bottom, #d9edf7 0%, #c4e3f3 100%);
+  background-repeat: repeat-x;
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#FFD9EDF7', endColorstr='#FFC4E3F3', GradientType=0);
+}
+
+.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: linear-gradient(to bottom, #fcf8e3 0%, #faf2cc 100%);
+  background-repeat: repeat-x;
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#FFFCF8E3', endColorstr='#FFFAF2CC', GradientType=0);
+}
+
+.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: linear-gradient(to bottom, #f2dede 0%, #ebcccc 100%);
+  background-repeat: repeat-x;
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#FFF2DEDE', endColorstr='#FFEBCCCC', GradientType=0);
+}
+
+.well {
+  background-image: -webkit-linear-gradient(top, #e8e8e8 0%, #f5f5f5 100%);
+  background-image: -o-linear-gradient(top, #e8e8e8 0%, #f5f5f5 100%);
+  background-image: linear-gradient(to bottom, #e8e8e8 0%, #f5f5f5 100%);
+  background-repeat: repeat-x;
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#FFE8E8E8', endColorstr='#FFF5F5F5', GradientType=0);
+  border-color: gainsboro;
+  -webkit-box-shadow: inset 0 1px 3px rgba(0, 0, 0, 0.05), 0 1px 0 rgba(255, 255, 255, 0.1);
+  box-shadow: inset 0 1px 3px rgba(0, 0, 0, 0.05), 0 1px 0 rgba(255, 255, 255, 0.1);
+}
+
+.thumbnail-list li div.selection-show {
+  position: absolute;
+  border: 1px dashed red;
+  display: none;
+  pointer-events: none;
+}
+
+/* selections */
+.repeat-lassos-group {
+  position: absolute;
+  right: -185px;
+  bottom: -35px;
+}
+
+.header-region{
+  position: absolute;
+  border: 3px solid rgba(41, 255, 52, 0.8);
+  background: rgba(31, 255, 32, 0.2);
+  box-sizing: border-box;
+}
+
+.footer-region{
+  position: absolute;
+  border: 3px solid rgba(19, 248, 255, 0.8);
+  background: rgba(15, 183, 255, 0.2);
+  box-sizing: border-box;
+}
+
+.header-region:hover, .footer-region:hover{
+  cursor: row-resize;
+}
+
+/* rectangularSelector.js classes */
+.selection-box, .table-region {
+  position: absolute;
+  border: 1px dashed rgba(255, 87, 0, 0.8);
+  background: rgba(255, 87, 0, 0.2);
+  box-sizing: border-box;
+}
+
+.regex-table-region {
+  position: absolute;
+  border: 1px dashed rgba(255, 172, 23, 0.8);
+  background: rgba(255, 150, 11, 0.2);
+  box-sizing: border-box;
+}
+
+.selection-box:hover, .table-region:hover {
+  cursor: pointer;
+}
+
+.selection-box {
+  z-index: 42;
+  width: 0;
+  height: 0;
+  visibility: hidden;
+}
+
+.table-region, .regex-table-region {
+  top: 0;
+  left: 0;
+  z-index: 21;
+}
+
+div.table-region .fixed-handle, div.regex-table-region.fixed-handle {
+  position: absolute;
+}
+
+div.table-region .resize-handle, div.regex-table-region.resize-handle {
+  position: absolute;
+}
+
+div.table-region .n-border, div.regex-table-region.n-border {
+  width: calc(100% - 10px);
+  top: -5px;
+  left: 5px;
+  height: 10px;
+}
+
+div.table-region .s-border, div.regex-table-region.s-border {
+  width: calc(100% - 10px);
+  bottom: -5px;
+  left: 5px;
+  height: 10px;
+}
+
+div.table-region .w-border, div.regex-table-region.w-border {
+  height: calc(100% - 10px);
+  left: -5px;
+  top: 5px;
+  width: 10px;
+}
+
+div.table-region .e-border, div.regex-table-region.e-border {
+  height: calc(100% - 10px);
+  top: 5px;
+  right: -5px;
+  width: 10px;
+}
+
+div.table-region .nw-border, div.regex-table-region.nw-border {
+  width: 10px;
+  height: 10px;
+  top: -5px;
+  left: -5px;
+}
+
+div.table-region .ne-border, div.regex-table-region.ne-border {
+  width: 10px;
+  height: 10px;
+  top: -5px;
+  right: -5px;
+}
+
+div.table-region .sw-border, div.regex-table-region.sw-border {
+  width: 10px;
+  height: 10px;
+  bottom: -5px;
+  left: -5px;
+}
+
+div.table-region .se-border, div.regex-table-region.se-border {
+  width: 10px;
+  height: 10px;
+  bottom: -5px;
+  right: -5px;
+}
+
+div.table-region .n-border:hover {
+  cursor: n-resize;
+}
+
+div.table-region .nw-border:hover {
+  cursor: nw-resize;
+}
+
+div.table-region .ne-border:hover {
+  cursor: ne-resize;
+}
+
+div.table-region .s-border:hover {
+  cursor: s-resize;
+}
+
+div.table-region .sw-border:hover {
+  cursor: sw-resize;
+}
+
+div.table-region .se-border:hover {
+  cursor: se-resize;
+}
+
+div.table-region .w-border:hover {
+  cursor: w-resize;
+}
+
+div.table-region .e-border:hover {
+  cursor: e-resize;
+}
+
+div.table-region button[name=close] {
+  font-weight: bold;
+  border: 0;
+  background-color: transparent;
+  padding: 0;
+  font-size: 20px;
+  position: relative;
+  top: -25px;
+  left: 100%;
+  margin-left: 5px;
+}
+
+div.table-region button[name=close]:hover {
+  color: red;
+}
+
+@font-face {
+  font-family: 'Glyphicons Halflings';
+  src: url("glyphicons-halflings-regular.eot");
+  src: url("../fonts/bootstrap/glyphicons-halflings-regular.eot?#iefix") format("embedded-opentype"), url("../fonts/bootstrap/glyphicons-halflings-regular.woff") format("woff"), url("../fonts/bootstrap/glyphicons-halflings-regular.ttf") format("truetype"), url("../fonts/bootstrap/glyphicons-halflings-regular.svg#webfont") format("svg");
+}
+body {
+  padding-top: 70px;
+}
+
+.jumbotron h1 {
+  font-size: 2em;
+}
+.jumbotron h2, .jumbotron h3, .jumbotron h4, .jumbotron h5, .jumbotron h6 {
+  font-size: 1.3em;
+}
+.jumbotron p {
+  font-size: 1.3em;
+}
+
+.navbar-fixed-top .container {
+  margin: 0 1em;
+}
+
+#navbar .active {
+  font-weight: 500;
+  color: #333333;
+}
+
+
+.navbar-default a.navbar-brand {
+  padding-left: 30px;
+  position: relative;
+  font-weight: bold;
+  color: black;
+}
+.navbar-default a.navbar-brand::before {
+  position: absolute;
+  content: "";
+  display: block;
+  background-image: url("../img/logo.png");
+  background-repeat: no-repeat;
+  background-size: 25px 30px;
+  width: 25px;
+  height: 30px;
+  left: 0;
+  top: 10px;
+}
+
+.btn-file {
+  position: relative;
+  overflow: hidden;
+}
+
+.btn-file input[type=file] {
+  position: absolute;
+  top: 0;
+  right: 0;
+  min-width: 100%;
+  min-height: 100%;
+  font-size: 100px;
+  text-align: right;
+  filter: alpha(opacity=0);
+  opacity: 0;
+  outline: none;
+  background: white;
+  cursor: inherit;
+  display: block;
+}
+
+.form-inline .input-group > .form-control, .navbar-form .input-group > .form-control {
+  background: white;
+  width: 500px;
+}
+
+form {
+  margin-bottom: 1em;
+}
+
+#file-list-container {
+  max-height: 500px;
+  overflow-y: scroll;
+}
+#file-list-container .file-list thead tr th {
+  text-align: center;
+  cursor: pointer;
+  position: relative;
+  border-right: 1px solid #ddd;
+  padding-right: 20px;
+}
+#file-list-container .file-list thead tr th::before, #file-list-container .file-list thead tr th::after {
+  text-align: right;
+  width: 11px;
+  color: #ddd;
+  position: absolute;
+  display: block;
+  font-family: 'Glyphicons Halflings';
+  font-size: .8em;
+  font-style: normal;
+  font-weight: normal;
+  line-height: 1;
+  -webkit-font-smoothing: antialiased;
+  -moz-osx-font-smoothing: grayscale;
+}
+#file-list-container .file-list thead tr th::before {
+  content: "\e113";
+  right: 3px;
+  top: 6px;
+}
+#file-list-container .file-list thead tr th::after {
+  content: "\e114";
+  right: 4px;
+  bottom: 6px;
+}
+#file-list-container .file-list thead tr th.headerSortUp::before {
+  color: #777777 !important;
+}
+#file-list-container .file-list thead tr th.headerSortDown:after {
+  color: #777777 !important;
+}
+#file-list-container .file-list thead tr th:first-of-type {
+  text-align: left;
+}
+#file-list-container .file-list thead tr th:nth-child(n+5) {
+  cursor: default;
+  padding-right: 8px;
+}
+#file-list-container .file-list thead tr th:nth-child(n+5)::before, #file-list-container .file-list thead tr th:nth-child(n+5)::after {
+  content: "";
+  display: none;
+  position: relative;
+}
+#file-list-container .file-list tbody tr {
+  background: white;
+}
+#file-list-container .file-list tbody tr:hover {
+  background: #d9edf7;
+}
+#file-list-container .file-list tbody tr td {
+  line-height: 2.25;
+  text-align: center;
+}
+#file-list-container .file-list tbody tr td:first-of-type {
+  font-weight: bold;
+  text-align: left;
+}
+#file-list-container .file-list tbody tr td a {
+  color: #333;
+}
+
+.glyphicon-remove {
+  color: #777777;
+}
+.glyphicon-remove:hover {
+  color: #d9534f;
+}
+
+#sidebar {
+  background: #eeeeee;
+  width: 195px;
+  padding: 0em 0 0;
+  height: calc(100% - 51px);
+  text-align: center;
+  overflow-y: scroll;
+  overflow-x: hidden;
+  position: fixed;
+  left: 0;
+  top: 104px;
+  z-index: 2;
+  -webkit-box-shadow: inset -0.25em 0 0.5em -0.25em rgba(0, 0, 0, 0.1);
+  box-shadow: inset -0.25em 0 0.5em -0.25em rgba(0, 0, 0, 0.1);
+  height: 100%;
+}
+#sidebar h5 {
+  border-top: 1px solid #777777;
+  padding-top: 1em;
+  margin-top: 1em;
+}
+#sidebar .btn-group button {
+  width: 83px;
+  margin-bottom: 10px;
+}
+#sidebar p {
+  font-size: .9em;
+}
+#sidebar .thumbnail-list {
+  padding-left: 0px;
+}
+#sidebar .thumbnail-list .page {
+  margin: 0 auto 1.25em;
+  display: block;
+  width: 90%;
+  padding-left: .5em;
+  padding-right: .5em;
+/*  padding: 1em .5em .5em 1em; */
+  position: relative;
+}
+#sidebar .thumbnail-list .page img {
+  display: block;
+  width: 100%;
+}
+#sidebar .thumbnail-list .page p {
+  margin-top: .25em;
+  color: #555555;
+  line-height: 1;
+}
+#sidebar .thumbnail-list .page:hover img {
+  cursor: pointer;
+  -webkit-box-shadow: 0 0 0 0.1em rgba(0, 0, 0, 0.1);
+  box-shadow: 0 0 0 0.1em rgba(0, 0, 0, 0.1);
+}
+#sidebar .thumbnail-list .page.active img {
+  -webkit-box-shadow: 0 0 0 0.1em #5bc0de;
+  box-shadow: 0 0 0 0.1em #5bc0de;
+}
+#sidebar .thumbnail-list .page .remove {
+  position: absolute;
+  left: -.25em;
+  top: 1em;
+  height: 1em;
+  display: block;
+  line-height: 1;
+  font-size: 1em;
+}
+#sidebar .thumbnail-list .page .remove:hover {
+  cursor: pointer;
+}
+
+#control-panel {
+  position: fixed;
+  top: 50px;
+  left: 0px;
+  width: 100%;
+  z-index: 101;
+  /* gotta be >100, which is the max z-index for selections */
+  background: #d9edf7;
+  padding: 1em;
+  -webkit-box-shadow: 0 1px 5px rgba(0, 0, 0, 0.075);
+  box-shadow: 0 1px 5px rgba(0, 0, 0, 0.075);
+  padding-left: 5%;
+  padding-right: 5%;
+}
+#control-panel button {
+  margin-right: 1.25em;
+}
+#control-panel .filename {
+  display: inline-block;
+  margin-right: 20px;
+  max-width: 270px;
+  white-space: nowrap;
+  overflow: hidden;
+  text-overflow: ellipsis;
+}
+#control-panel span.filename {
+  vertical-align: middle;
+}
+#control-panel #template-dropdown-container ul {
+  padding-left: 20px;
+}
+#control-panel #template-dropdown-container button {
+  padding-left: 0px;
+}
+#control-panel #template-dropdown-container ul:first-of-type {
+  margin-bottom: 0px;
+}
+#control-panel #template-dropdown-container li a {
+  cursor: pointer;
+  color: #333;
+}
+#control-panel #template-dropdown-templates-list-container li a {
+  cursor: pointer;
+  color: #333;
+}
+
+#main-pane {
+  background: #777777;
+  padding: 4.25em 2em 2em 2em;
+  margin-left: 195px;
+  height: 100%;
+  width: calc(100% - 200px);
+  z-index: 1;
+}
+
+/*
+#pages-container {
+  width: 100%;
+  height: auto;
+   margin: 0 auto;
+   padding: 3px;
+   position: relative;
+   padding-right: 20%;
+}
+*/
+
+html.wait, html.wait * { cursor: wait !important; }
+
+#main-pane .pdf-page {
+  position: relative;
+}
+#main-pane .pdf-page .page-number {
+  position: absolute;
+}
+#main-pane .page {
+  width: 100%;
+  max-width: 800px;
+  min-width: 179px;
+  -webkit-box-shadow: 0 0 2em rgba(0, 0, 0, 0.4);
+
+  position: relative;
+  margin: 0 auto;
+}
+#main-pane .page img {
+  margin: 2em 0;
+  display: block;
+  width: 100%;
+  max-width: 800px;
+  min-width: 0px;
+  user-select: none;
+  -moz-user-select: none;
+  -webkit-user-select: none;
+  -ms-user-select: none;
+}
+#main-pane .page img:hover {
+  cursor: crosshair;
+}
+#main-pane .selection-box, #main-pane .table-region {
+  border: 3px dashed rgba(224, 1, 1, 0.6);
+  background: rgba(224, 1, 1, 0.2);
+}
+#main-pane .selection-box .selection-panel, #main-pane .table-region .selection-panel {
+  display: none;
+  position: absolute;
+  bottom: -2.8em;
+  left: 0;
+  min-width: 320px;
+}
+#main-pane .selection-box .selection-panel button:hover, #main-pane .table-region .selection-panel button:hover {
+  cursor: pointer;
+}
+#main-pane .selection-box:hover, #main-pane .table-region:hover {
+  cursor: move;
+}
+#main-pane .selection-box:hover .selection-panel, #main-pane .table-region:hover .selection-panel {
+  display: block;
+}
+
+body.page-selections {
+  padding-top: 50px;
+  background: #777777;
+}
+body.page-selections #main-pane {
+  background: #777777;
+}
+
+body.page-export {
+  padding-top: 50px;
+  background: white;
+}
+body.page-export #sidebar {
+  text-align: left;
+  padding: .5em;
+}
+body.page-export #sidebar .lattice.glyphicon {
+  color: #ededed;
+  background: #666;
+  text-shadow: none;
+  border: solid #666;
+  border-width: 0 0 1px 1px;
+}
+body.page-export #main-pane {
+  background: white;
+  padding-top: 5.5em;
+}
+body.page-export #main-pane #control-panel form {
+  display: inline-block;
+  margin-bottom: 0;
+}
+body.page-export #main-pane #control-panel form .form-control {
+  width: 100px;
+  margin-right: 1em;
+  display: inline-block;
+}
+body.page-export #main-pane #control-panel form .form-control.format {
+  width: 130px;
+}
+body.page-export #main-pane #control-panel form #copy-csv-to-clipboard {
+  min-width: 140px;
+}
+body.page-export #main-pane table {
+  margin-top: 2em;
+}
+
+.jumbotron.about p {
+  font-size: 1.1em;
+}
+
+div.spinner {
+  top: 10px !important;
+}
+
+#progress-container h5 {
+  display: inline-block;
+  font-size: 1.1em;
+  font-weight: bold;
+}
+
+#progress-container #message {
+  color: #aaa;
+}
+
+.autodetect-in-progress .glyphicon-refresh,
+#download-data.download-in-progress .glyphicon-refresh {
+  animation: 4s linear 0s normal none infinite running spin;
+  display: inline-block;
+}
+
+@-moz-keyframes spin {
+  0% {
+    -moz-transform: rotate(0deg);
+  }
+  100% {
+    -moz-transform: rotate(359deg);
+  }
+}
+@-webkit-keyframes spin {
+  0% {
+    -webkit-transform: rotate(0deg);
+  }
+  100% {
+    -webkit-transform: rotate(359deg);
+  }
+}
+@-o-keyframes spin {
+  0% {
+    -o-transform: rotate(0deg);
+  }
+  100% {
+    -o-transform: rotate(359deg);
+  }
+}
+@keyframes spin {
+  0% {
+    -webkit-transform: rotate(0deg);
+    transform: rotate(0deg);
+  }
+  100% {
+    -webkit-transform: rotate(359deg);
+    transform: rotate(359deg);
+  }
+}
+.autodetect-in-progress .glyphicon-flash {
+  display: none;
+}
+
+.autodetect-finished .glyphicon-flash {
+  display: inline;
+}
+
+.autodetect-finished .glyphicon-refresh {
+  display: none;
+}
+
+#download-data.download-in-progress .glyphicon-download {
+  display: none;
+}
+#download-data .glyphicon-download {
+  display: inline;
+}
+#download-data .glyphicon-refresh {
+  display: none;
+}
+
+.flash {
+  -moz-animation: flash 2s ease-out;
+  -moz-animation-iteration-count: 1;
+  -webkit-animation: flash 2s ease-out;
+  -webkit-animation-iteration-count: 1;
+  -ms-animation: flash 2s ease-out;
+  -ms-animation-iteration-count: 1;
+}
+
+@-webkit-keyframes flash {
+  0% {
+    background-color: none;
+  }
+  50% {
+    background-color: #fbf8b2;
+  }
+  100% {
+    background-color: none;
+  }
+}
+@-moz-keyframes flash {
+  0% {
+    background-color: none;
+  }
+  50% {
+    background-color: #fbf8b2;
+  }
+  100% {
+    background-color: none;
+  }
+}
+@-ms-keyframes flash {
+  0% {
+    background-color: none;
+  }
+  50% {
+    background-color: #fbf8b2;
+  }
+  100% {
+    background-color: none;
+  }
+}
+#loading {
+  padding-left: 30px;
+}
+#loading #spinner {
+  position: relative;
+  top: 6px;
+  margin-right: 5px;
+}
+.social_media_nav {
+  display: block;
+  margin: 0 auto;
+  text-align: center;
+  width: 70%;
+  padding-bottom: 5px;
+}
+.navbar_1 .navbar-nav_1 {
+    display: inline-block;
+    float: none;
+}
+
+.navbar_1 .navbar-collapse_1 {
+    text-align: center;
+}
+#regex-container {
+  background: #eeeeee;
+  float: right;
+  right: 0px;
+  position: fixed;
+  top: 104px;
+  height:100%;
+  width: 230px;
+  display: inline;
+  overflow-y: scroll;
+  padding-bottom: 40px;
+}
+
+.regex-result:hover {
+  background: #ffc314;
+}
+
+.regex-result:hover {
+  background: #ffc314;
+}
diff --git a/src/test/java/TestAboutPage.java b/src/test/java/TestAboutPage.java
new file mode 100644
index 000000000..14d956a5d
--- /dev/null
+++ b/src/test/java/TestAboutPage.java
@@ -0,0 +1,144 @@
+import org.junit.After;
+import org.junit.Test;
+import org.openqa.selenium.By;
+import org.openqa.selenium.WebDriver;
+import org.openqa.selenium.WebElement;
+import org.openqa.selenium.chrome.ChromeDriver;
+import org.openqa.selenium.chrome.ChromeOptions;
+import org.openqa.selenium.support.ui.ExpectedConditions;
+import org.openqa.selenium.support.ui.WebDriverWait;
+
+import java.util.concurrent.TimeUnit;
+
+import static junit.framework.TestCase.assertTrue;
+
+//Checks the multiple links found on the About page. For three of the links, there will be 3 tabs that open in addition to
+// to the original tab. The three tabs, I have not been able to switch control to another tab so it only checks to open the
+// url. Additionally, the media menu is not tested for since it is already tested in TestHomePage. Additionally, the media
+// menu is not tested for since it is already tested in TestHomePage.
+//@author: SM  modified: 2/22/18
+public class TestAboutPage {
+    WebDriver driver;
+
+    @Test
+    public void startWebDriver(){
+        System.setProperty("webdriver.chrome.driver","/usr/local/bin/chromedriver");
+        ChromeOptions options = new ChromeOptions();
+        options.addArguments("headless");
+        options.addArguments("no-sandbox");
+
+        driver = new ChromeDriver(options);
+        driver.get("http://127.0.0.1:9292/");
+        driver.manage().window().maximize();
+        WebDriverWait wait = new WebDriverWait(driver, 100);
+
+        try {
+            //checks for the multiple links found on the About page and compares the url that the link navigates
+            // to the one that is set for in the html page
+            By about_id = By.linkText("About");
+            WebElement about_icon = wait.until(ExpectedConditions.visibilityOfElementLocated(about_id));
+            about_icon.click();
+            WebElement about_icon2 = wait.until(ExpectedConditions.visibilityOfElementLocated(about_id));
+            about_icon2.click();
+            String about_title = "About Tabula";
+            By abouttabula_classname = By.className("abouttabula");
+            WebElement abouttabula = wait.until(ExpectedConditions.visibilityOfElementLocated(abouttabula_classname));
+            assertTrue("Failed, couldn't find About page", about_title.equals(abouttabula.getText()));
+
+            By github_fork_link = By.id("github_fork");
+            WebElement github_fork = wait.until(ExpectedConditions.elementToBeClickable(github_fork_link));
+            github_fork.click();
+            String tabula_github_url = "https://github.com/tabulapdf/tabula";
+            assertTrue("Failed, couldn't find Tabula's GitHub page", driver.getCurrentUrl().equals(tabula_github_url));
+            driver.navigate().back();
+
+            //The following 3 links open up 3 additional tabs which are not tested for, since I wasn't able to find a correct
+            //way to switch the control of the tab to another tab to check for the correct url, the test only opens up the urls.
+            By Manuel_text = By.linkText("Manuel Aristarán");
+            WebElement Manuel_link = wait.until(ExpectedConditions.elementToBeClickable(Manuel_text));
+            Manuel_link.click();
+            Thread.sleep(3000);
+
+            By Mike_text = By.linkText("Mike Tigas");
+            WebElement Mike_link = wait.until(ExpectedConditions.elementToBeClickable(Mike_text));
+            Mike_link.click();
+
+            By Jeremy_text = By.linkText("Jeremy B. Merrill");
+            WebElement Jeremy_link = wait.until(ExpectedConditions.elementToBeClickable(Jeremy_text));
+            Jeremy_link.click();
+
+            //the following links will check for the correct url.
+            By ProPublica_text = By.linkText("ProPublica");
+            WebElement ProPublica_link = wait.until(ExpectedConditions.elementToBeClickable(ProPublica_text));
+            ProPublica_link.click();
+            String ProPublica_url = "https://www.propublica.org/";
+            driver.manage().timeouts().pageLoadTimeout(60, TimeUnit.SECONDS);
+            assertTrue("Failed, couldn't find ProPublica's page", driver.getCurrentUrl().equals(ProPublica_url));
+            driver.navigate().back();
+
+            By LaNacion_text = By.linkText("La Nación DATA");
+            WebElement LaNacion_link = wait.until(ExpectedConditions.elementToBeClickable(LaNacion_text));
+            LaNacion_link.click();
+            String LaNacion_url = "http://blogs.lanacion.com.ar/data/";
+            driver.manage().timeouts().pageLoadTimeout(60, TimeUnit.SECONDS);
+            assertTrue("Failed, couldn't find La Nacion DATA's page", driver.getCurrentUrl().equals(LaNacion_url));
+            driver.navigate().back();
+
+            By KnightMozilla_text = By.linkText("Knight-Mozilla OpenNews");
+            WebElement KnightMozilla_link = wait.until(ExpectedConditions.elementToBeClickable(KnightMozilla_text));
+            KnightMozilla_link.click();
+            String KnightMozilla_url = "https://opennews.org/";
+            driver.manage().timeouts().pageLoadTimeout(60, TimeUnit.SECONDS);
+            assertTrue("Failed, couldn't find Knight-Mozilla OpenNews' page", driver.getCurrentUrl().equals(KnightMozilla_url));
+            driver.navigate().back();
+
+            By NYTimes_text = By.linkText("The New York Times");
+            WebElement NYTimes_link = wait.until(ExpectedConditions.elementToBeClickable(NYTimes_text));
+            NYTimes_link.click();
+            String NYTimes_url = "https://www.nytimes.com/";
+            driver.manage().timeouts().pageLoadTimeout(150, TimeUnit.SECONDS);
+            assertTrue("Failed, couldn't find The New York Times' page", driver.getCurrentUrl().equals(NYTimes_url));
+            driver.navigate().back();
+
+            By NUKnight_text = By.linkText("Northwestern University Knight Lab");
+            WebElement NUKnight_link = wait.until(ExpectedConditions.elementToBeClickable(NUKnight_text));
+            NUKnight_link.click();
+            String NUKnight_url = "https://knightlab.northwestern.edu/";
+            driver.manage().timeouts().pageLoadTimeout(60, TimeUnit.SECONDS);
+            assertTrue("Failed, couldn't find Northwestern University Knight Lab's page", driver.getCurrentUrl().equals(NUKnight_url));
+            driver.navigate().back();
+
+            By KnightFoundation_text = By.linkText("The Knight Foundation");
+            WebElement KnightFoundation_link = wait.until(ExpectedConditions.elementToBeClickable(KnightFoundation_text));
+            KnightFoundation_link.click();
+            String KnightFoundation_url = "https://www.knightfoundation.org/";
+            driver.manage().timeouts().pageLoadTimeout(60, TimeUnit.SECONDS);
+            assertTrue("Failed, couldn't find The Knight Foundation's page", driver.getCurrentUrl().equals(KnightFoundation_url));
+            driver.navigate().back();
+
+            By Shuttleworth_text = By.linkText("The Shuttleworth Foundation");
+            WebElement Shuttleworth_link = wait.until(ExpectedConditions.elementToBeClickable(Shuttleworth_text));
+            Shuttleworth_link.click();
+            String Shuttleworth_url = "https://shuttleworthfoundation.org/";
+            driver.manage().timeouts().pageLoadTimeout(60, TimeUnit.SECONDS);
+            assertTrue("Failed, couldn't find The Shuttleworth Foundation's page", driver.getCurrentUrl().equals(Shuttleworth_url));
+            driver.navigate().back();
+
+            By Jason_text = By.linkText("Jason Das.");
+            WebElement Jason_link = wait.until(ExpectedConditions.elementToBeClickable(Jason_text));
+            Jason_link.click();
+            String Jason_url = "http://www.jasondas.com/";
+            driver.manage().timeouts().pageLoadTimeout(60, TimeUnit.SECONDS);
+            assertTrue("Failed, couldn't find Jason Das's page", driver.getCurrentUrl().equals(Jason_url));
+
+            driver.navigate().back();
+
+        }catch(Exception e){
+            System.out.print(e);
+        }
+    }
+    @After
+    public void TearDown(){
+        driver.quit();
+    }
+}
\ No newline at end of file
diff --git a/src/test/java/TestCorrespondence_FINAL_SBE.java b/src/test/java/TestCorrespondence_FINAL_SBE.java
new file mode 100644
index 000000000..599a77724
--- /dev/null
+++ b/src/test/java/TestCorrespondence_FINAL_SBE.java
@@ -0,0 +1,339 @@
+import org.junit.AfterClass;
+import org.junit.BeforeClass;
+import org.junit.Test;
+import org.openqa.selenium.By;
+import org.openqa.selenium.WebDriver;
+import org.openqa.selenium.WebElement;
+import org.openqa.selenium.chrome.ChromeDriver;
+import org.openqa.selenium.chrome.ChromeOptions;
+import org.openqa.selenium.support.ui.ExpectedConditions;
+import org.openqa.selenium.support.ui.WebDriverWait;
+
+import java.util.List;
+
+import static junit.framework.TestCase.assertTrue;
+//Test of the Correspondence_FINAL_SBE pdf file, it will go through various user scenarios to test the functionality of the regex
+// implementation (spanning pages, multiple search results, inclusive and non-inclusive, and overlap)
+// @author SM modified: 4/29/18
+
+public class TestCorrespondence_FINAL_SBE {
+    //Test of the Correspondence_FINAL_SBE pdf file.
+    private static WebDriver driver;
+    private static String Tabula_url = "http://127.0.0.1:9292/";
+    private WebDriverWait wait = new WebDriverWait(driver, 500);
+
+    //will continue to refresh the page until it sees one of the buttons appear in the menu option of the extraction page
+    private void PageRefresh() throws InterruptedException {
+        //menu options did not fully load
+        Thread.sleep(1000);
+        //refresh the page
+        while(driver.findElements( By.id("restore-detected-tables")).size() == 0) {
+            driver.navigate().refresh();
+            Thread.sleep(700);
+        }
+    }
+    //will navigate and wait for the data to appear in the preview and export data page
+    private void PreviewandExportDatapg(){
+        By previewandexport_id = By.id("all-data");
+        WebElement previewandexport_button = wait.until(ExpectedConditions.visibilityOfElementLocated(previewandexport_id));
+        previewandexport_button.click();
+        wait.until(ExpectedConditions.visibilityOfElementLocated(By.className("detection-row")));
+    }
+    //will wait for the regex button to become clickable and then click the regex button
+    private void ClickRegexButton() throws InterruptedException {
+        By regex_search_id = By.id("regex-search");
+        WebElement regex_button = new WebDriverWait(driver, 30).until(ExpectedConditions.
+                elementToBeClickable(regex_search_id));
+        regex_button.click();
+        Thread.sleep(800);
+    }
+    //send regex inputs to the corresponding pattern type
+    private void PatternInputStrings(String pattern_before, String pattern_after){
+        By pattern_before_input = By.id("pattern_before");
+        By pattern_after_input = By.id("pattern_after");
+        driver.findElement(pattern_before_input).sendKeys(pattern_before);
+        driver.findElement(pattern_after_input).sendKeys(pattern_after);
+    }
+    //send corresponding info of inclusive to the pattern type
+    private void InclusiveButtons(boolean patternbefore, boolean patternafter){
+        WebElement inclusive_before_btn = new WebDriverWait(driver, 30).
+                until(ExpectedConditions.elementToBeClickable(driver.findElement(By.id("include_pattern_before"))));
+        WebElement inclusive_after_btn = new WebDriverWait(driver, 30).
+                until(ExpectedConditions.elementToBeClickable(driver.findElement(By.id("include_pattern_after"))));
+        if (patternbefore){
+            inclusive_before_btn.click(); }
+        if(patternafter){
+            inclusive_after_btn.click(); }
+    }
+    //go on and upload the pdf file
+    private void UploadPDF() throws InterruptedException {
+        String filePath = System.getProperty("user.dir") +
+                "/src/test/pdf/Correspondence_FINAL_SBE_one-stop_plans_adopted_for_non-unanimous_countiespdf.pdf";
+        WebElement chooseFile = driver.findElement(By.id("file"));
+        chooseFile.sendKeys(filePath);
+        Thread.sleep(1000);
+        WebElement import_btn = driver.findElement(By.id("import_file"));
+        import_btn.click();
+        Thread.sleep(5000);
+        wait.until(ExpectedConditions.elementToBeClickable(By.id("templates_title")));
+    }
+    //delete the pdf file
+    private void DeletePDF(){
+        //navigates back and deletes the pdf utilized
+        driver.findElement(By.id("delete_pdf")).click();
+        driver.switchTo().alert().accept();
+    }
+    //instantiation of Tabula
+    @BeforeClass
+    public static void SetUp(){
+        //set up of chromedriver and navigation to the url, as well as uploading of the pdf file
+        System.setProperty("webdriver.chrome.driver","/usr/local/bin/chromedriver");
+        ChromeOptions options = new ChromeOptions();
+        options.addArguments("headless");
+        options.addArguments("no-sandbox");
+
+        driver = new ChromeDriver(options);
+        driver.get(Tabula_url);
+        driver.manage().window().maximize();
+    }
+    //test of 2 different instances of inputting regex to get a multi spanning table
+    @Test
+    public void TestMultiPageTables() {
+        try {
+            UploadPDF();
+            PageRefresh();
+            //Test of regex input with inclusive for pattern before for a table of 3 pages in length
+            PatternInputStrings("VIA", "Additional sites:");
+            InclusiveButtons(true, false);
+            ClickRegexButton();
+            wait.until(ExpectedConditions.visibilityOfElementLocated(By.className("regex-result")));
+            //Confirm search found
+            String result = driver.findElement(By.xpath(".//*[@class='regex-results-table']//td[contains(.,'1')]")).getText();
+            Boolean regex_result;
+            if (result.equals("1")) {
+                regex_result = true;
+            } //if true, there are zero matches
+            else {
+                regex_result = false;
+            }
+            PreviewandExportDatapg();
+            //verify data extraction
+            String result_data = driver.findElement(By.xpath(".//*[@id='extracted-table']//td[contains(.," +
+                    "'VIA ELECTRONIC MAIL')]")).getText();
+            Boolean regex_data;
+            if (result_data.equals("VIA ELECTRONIC MAIL")) {
+                regex_data = true;
+            } else {
+                regex_data = false;
+            }
+            String result_data2 = driver.findElement(By.xpath(".//*[@id='extracted-table']//td[contains(.,'Sunday, October 30: 1:00 p.m. to 5:00 p.m.')]")).getText();
+            Boolean regex_data2;
+            if (result_data2.equals("Sunday, October 30: 1:00 p.m. to 5:00 p.m.")) {
+                regex_data2 = true;
+            } else {
+                regex_data2 = false;
+            }
+            Boolean final_results;
+            if (regex_result && regex_data && regex_data2) {
+                final_results = true;
+            } else {
+                final_results = false;
+            }
+            assertTrue("Failed, regex found no match for inclusive input for pattern before for a 3 page length table"
+                    , final_results);
+            driver.navigate().refresh();
+            PageRefresh();
+
+            //Test of regex input with inclusive for pattern after for a table of 7 pages in length
+            PatternInputStrings("Bertie County", "Watauga County");
+            ClickRegexButton();
+            wait.until(ExpectedConditions.visibilityOfElementLocated(By.className("regex-result")));
+            String result3 = driver.findElement(By.xpath(".//*[@class='regex-results-table']//td[contains(.,'2')]")).getText();
+            Boolean regex_result3;
+            if (result3.equals("2")) {
+                regex_result3 = true;
+            } //if true, there are zero matches
+            else {
+                regex_result3 = false;
+            }
+            PreviewandExportDatapg();
+            String result_data5 = driver.findElement(By.xpath(".//*[@id='extracted-table']//td[contains(.," +
+                    "'Bladen County Board of Elections')]")).getText();
+            Boolean regex_data5;
+            if (result_data5.equals("Bladen County Board of Elections")) {
+                regex_data5 = true;
+            } else {
+                regex_data5 = false;
+            }
+            String result_data6 = driver.findElement(By.xpath(".//*[@id='extracted-table']//td[contains(.,'Page 7')]")).getText();
+            Boolean regex_data6;
+            if (result_data6.equals("Page 7")) {
+                regex_data6 = true;
+            } else {
+                regex_data6 = false;
+            }
+            Boolean final_results3;
+            if (regex_result3 && regex_data5 && regex_data6) {
+                final_results3 = true;
+            } else {
+                final_results3 = false;
+            }
+            assertTrue("Failed, Tabula found no match for a multi page table spanning more than 5 pages", final_results3);
+
+            driver.navigate().back();
+            driver.navigate().back();
+            Thread.sleep(500);
+            DeletePDF();
+        }catch (Exception e){
+            System.out.print(e);
+        }
+    }
+    //test of 3 different instances of inputting regex searches with 3 different types of inclusive combinations to
+    // get multiple regex results
+    @Test
+    public void TestInclusivePatternswithRegexSearches() {
+        try{
+            UploadPDF();
+            PageRefresh();
+
+            //Tests for inclusive for pattern before and non-inclusive for pattern after
+            PatternInputStrings("County","County");
+            InclusiveButtons(true, false);
+            ClickRegexButton();
+            wait.until(ExpectedConditions.visibilityOfElementLocated(By.className("regex-result")));
+            String result = driver.findElement(By.xpath(".//*[@class='regex-results-table']//td[contains(.,'33')]")).getText();
+            Boolean regex_result;
+            if(result.equals("33")){ regex_result = true;} //if true, there are zero matches
+            else{ regex_result = false;}
+            PreviewandExportDatapg();
+            String result_data = driver.findElement(By.xpath(".//*[@id='extracted-table']//td[contains(.," +
+                    "'Nash County Board of Elections')]")).getText();
+            Boolean regex_data;
+            if(result_data.equals("Nash County Board of Elections")){ regex_data = true;}
+            else{ regex_data = false;}
+            Thread.sleep(600);
+            String result_data2 = driver.findElement(By.xpath(".//*[@id='extracted-table']//td[contains(.,'Modifications:')]")).getText();
+            Boolean regex_data2;
+            if(result_data2.equals("Modifications:")){ regex_data2 = true;}
+            else{ regex_data2 = false;}
+            Boolean final_results;
+            if(regex_result && regex_data && regex_data2){ final_results = true;}
+            else{final_results = false;}
+            assertTrue("Failed, Tabula found no match for inclusive for pattern before and non-inclusive for " +
+                    "pattern after", final_results);
+            driver.navigate().refresh();
+            PageRefresh();
+
+            //Tests for non-inclusive for pattern before and inclusive for pattern after
+            PatternInputStrings("Additional", "Plan");
+            InclusiveButtons(false, true);
+            ClickRegexButton();
+            wait.until(ExpectedConditions.visibilityOfElementLocated(By.className("regex-result")));
+            String result2 = driver.findElement(By.xpath(".//*[@class='regex-results-table']//td[contains(.,'2')]")).getText();
+            Boolean regex_result3;
+            if(result2.equals("2")){ regex_result3 = true;} //if true, there are zero matches
+            else{ regex_result3 = false;}
+            PreviewandExportDatapg();
+            String result_data3 = driver.findElement(By.xpath(".//*[@id='extracted-table']//td[contains(.," +
+                    "'Bladen County')]")).getText();
+            Boolean regex_data3;
+            if(result_data3.equals("Bladen County")){ regex_data3 = true;}
+            else{ regex_data3 = false;}
+            Thread.sleep(1000);
+            String result_data4 = driver.findElement(By.xpath(".//*[@id='extracted-table']//td[contains(.," +
+                    "'2016 General Election Early Voting Site Implementation Plans for Non-Unanimous Counties')]")).getText();
+            Boolean regex_data4;
+            if(result_data4.equals("2016 General Election Early Voting Site Implementation Plans for Non-Unanimous Counties")){ regex_data4 = true;}
+            else{ regex_data4 = false;}
+            Boolean final_results2;
+            if(regex_result3 && regex_data3 && regex_data4){ final_results2 = true;}
+            else{final_results2 = false;}
+            assertTrue("Failed, Tabula found no match for inclusive for pattern after and non-inclusive for " +
+                    "pattern before", final_results2);
+            driver.navigate().refresh();
+            PageRefresh();
+
+            //Tests for inclusive for pattern before and for pattern after
+            PatternInputStrings("Plan:","Modifications:");
+            InclusiveButtons(true, true);
+            ClickRegexButton();
+            wait.until(ExpectedConditions.visibilityOfElementLocated(By.className("regex-result")));
+            String result3 = driver.findElement(By.xpath(".//*[@class='regex-results-table']//td[contains(.,'31')]")).getText();
+            Boolean regex_result4;
+            if(result3.equals("31")){ regex_result4 = true;} //if true, there are zero matches
+            else{ regex_result4 = false;}
+            PreviewandExportDatapg();
+            String result_data5 = driver.findElement(By.xpath(".//*[@id='extracted-table']//td[contains(.,'Plan:')]")).getText();
+            Boolean regex_data5;
+            if(result_data5.equals("Plan:")){ regex_data5 = true;}
+            else{ regex_data5 = false;}
+            Thread.sleep(700);
+            String result_data6 = driver.findElement(By.xpath(".//*[@id='extracted-table']//td[contains(.,'Modifications:')]")).getText();
+            Boolean regex_data6;
+            if(result_data6.equals("Modifications:")){ regex_data6 = true;}
+            else{ regex_data6 = false;}
+            Boolean final_results3;
+            if(regex_result4 && regex_data5 && regex_data6){ final_results3 = true;}
+            else{final_results3 = false;}
+            assertTrue("Failed, Tabula found no match for inclusive for pattern after and inclusive for " +
+                    "pattern before", final_results3);
+            driver.navigate().back();
+            driver.navigate().back();
+            Thread.sleep(500);
+            DeletePDF();
+        }catch(Exception e){
+            System.out.print(e);
+        }
+    }
+    //test of an overlapping instance where it checks that there is only one regex result after attempting an overlap
+    @Test
+    public void TestOverlapRegexSearch() {
+        try{
+            //Test for overlapping regex searches
+            UploadPDF();
+            PageRefresh();
+
+            PatternInputStrings("Please contact", "Cc.:");
+            InclusiveButtons(true, false);
+            ClickRegexButton();
+            wait.until(ExpectedConditions.visibilityOfElementLocated(By.className("regex-result")));
+            PatternInputStrings("Sincerely", "Kimberly");
+            InclusiveButtons(false, true);
+            ClickRegexButton();
+            Thread.sleep(5000);
+            driver.switchTo().alert().accept(); //accept error pop-up window
+            //Checks that there is only one regex result, since it shouldn't had allowed for 2 results to appear since the
+            // 2nd one causes an overlap
+            Thread.sleep(2000);
+            List regex_rows = driver.findElements(By.className("regex-result"));
+            int regex_count = regex_rows.size();
+            int regex_count1 = 1;
+            assertTrue("Failed, Tabula found more than one match for an overlap regex search", (regex_count1 == regex_count ));
+            PreviewandExportDatapg();
+            String result_data = driver.findElement(By.xpath(".//*[@id='extracted-table']//td[contains(.," +
+                    "'Please contact me with any questions you may have.')]")).getText();
+            Boolean regex_data;
+            if (result_data.equals("Please contact me with any questions you may have.")) { regex_data = true;
+            } else { regex_data = false; }
+            String result_data2 = driver.findElement(By.xpath(".//*[@id='extracted-table']//td[contains(.," +
+                    "'Executive Director, North Carolina State Board of Elections')]")).getText();
+            Boolean regex_data2;
+            if (result_data2.equals("Executive Director, North Carolina State Board of Elections")) { regex_data2 = true;
+            } else { regex_data2 = false; }
+            Boolean final_results;
+            if (regex_data && regex_data2) { final_results = true;
+            } else { final_results = false; }
+            assertTrue("Failed, Tabula found no match for the multi-page table", final_results);
+            driver.navigate().back();
+            driver.navigate().back();
+            Thread.sleep(500);
+            DeletePDF();
+        }catch (Exception e){
+            System.out.print(e);
+        }
+    }
+    @AfterClass
+    public static void TearDown(){
+        driver.quit();
+    }
+}
diff --git a/src/test/java/TestEU_002.java b/src/test/java/TestEU_002.java
new file mode 100644
index 000000000..8e905df8d
--- /dev/null
+++ b/src/test/java/TestEU_002.java
@@ -0,0 +1,762 @@
+import org.junit.AfterClass;
+import org.junit.BeforeClass;
+import org.junit.Test;
+import org.openqa.selenium.By;
+import org.openqa.selenium.WebDriver;
+import org.openqa.selenium.WebElement;
+import org.openqa.selenium.chrome.ChromeDriver;
+import org.openqa.selenium.chrome.ChromeOptions;
+import org.openqa.selenium.support.ui.ExpectedConditions;
+import org.openqa.selenium.support.ui.WebDriverWait;
+
+import static junit.framework.TestCase.assertTrue;
+import static org.junit.Assert.assertFalse;
+
+//Test of the eu_002 pdf file, it will go through various user scenarios to test the functionality of the regex
+// implementation (spanning pages, multiple search results, inclusive and non-inclusive, and overlap)
+// @author SM modified: 4/28/18
+
+public class TestEU_002 {
+    private static WebDriver driver;
+    private static String Tabula_url = "http://127.0.0.1:9292/";
+    private WebDriverWait wait = new WebDriverWait(driver, 500);
+
+    //will continue to refresh the page until it sees one of the buttons appear inthe menu option of the extraction page
+    private void PageRefresh() throws InterruptedException {
+        //menu options did not fully load
+        Thread.sleep(1000);
+        //refresh the page
+        while(driver.findElements( By.id("restore-detected-tables")).size() == 0) {
+            driver.navigate().refresh();
+            Thread.sleep(700);
+        }
+    }
+    //will navigate and wait for the data to appear in the preview and export data page
+    private void PreviewandExportDatapg(){
+        By previewandexport_id = By.id("all-data");
+        WebElement previewandexport_button = wait.until(ExpectedConditions.visibilityOfElementLocated(previewandexport_id));
+        previewandexport_button.click();
+        wait.until(ExpectedConditions.visibilityOfElementLocated(By.className("detection-row")));
+    }
+    //will wait for the regex button to become clickable and then click the regex button
+    private void ClickRegexButton() throws InterruptedException {
+        By regex_search_id = By.id("regex-search");
+        WebElement regex_button = new WebDriverWait(driver, 30).until(ExpectedConditions.elementToBeClickable(regex_search_id));
+        regex_button.click();
+        Thread.sleep(800);
+    }
+    //send regex inputs to the corresponding pattern type
+    private void PatternInputStrings(String pattern_before, String pattern_after){
+        By pattern_before_input = By.id("pattern_before");
+        By pattern_after_input = By.id("pattern_after");
+        driver.findElement(pattern_before_input).sendKeys(pattern_before);
+        driver.findElement(pattern_after_input).sendKeys(pattern_after);
+    }
+    //send corresponding info of inclusive to the pattern type
+    private void InclusiveButtons(boolean patternbefore, boolean patternafter){
+        WebElement inclusive_before_btn = new WebDriverWait(driver, 30).
+                until(ExpectedConditions.elementToBeClickable(driver.findElement(By.id("include_pattern_before"))));
+        WebElement inclusive_after_btn = new WebDriverWait(driver, 30).
+                until(ExpectedConditions.elementToBeClickable(driver.findElement(By.id("include_pattern_after"))));
+        if (patternbefore){
+            inclusive_before_btn.click();
+        }
+
+        if(patternafter){
+            inclusive_after_btn.click();
+        }
+    }
+    //go on and upload the pdf file
+    private void UploadPDF() throws InterruptedException {
+        String filePath = System.getProperty("user.dir") + "/src/test/pdf/eu-002.pdf";
+        WebElement chooseFile = driver.findElement(By.id("file"));
+        chooseFile.sendKeys(filePath);
+        Thread.sleep(1000);
+        WebElement import_btn = driver.findElement(By.id("import_file"));
+        import_btn.click();
+        Thread.sleep(5000);
+        wait.until(ExpectedConditions.elementToBeClickable(By.id("restore-detected-tables")));
+    }
+    //delete the pdf file
+    private void DeletePDF(){
+        //navigates back and deletes the pdf utilized
+        driver.findElement(By.id("delete_pdf")).click();
+        driver.switchTo().alert().accept();
+    }
+    //instantiation of Tabula
+    @BeforeClass
+    public static void SetUp(){
+        System.setProperty("webdriver.chrome.driver","/usr/local/bin/chromedriver");
+        ChromeOptions options = new ChromeOptions();
+        options.addArguments("headless");
+        options.addArguments("no-sandbox");
+
+        //set up of chromdriver and navigation to the url, as well as uploading of the pdf file
+        driver = new ChromeDriver(options);
+        driver.get(Tabula_url);
+        driver.manage().window().maximize();
+
+    }
+    //test for 2 different cases of only filling one of the regex inputs and checking that it didn't enable the regex button
+    @Test
+    public void TestHalfRegexInputsforPatternBeforeandPatternAfter(){
+        try {
+            UploadPDF();
+            PageRefresh();
+
+            //Test that checks that the regex search button is disabled after entering "Table 5" in pattern_before and
+            // clicking the regex search button
+            By pattern_before_input = By.id("pattern_before");
+            driver.findElement(pattern_before_input).sendKeys("Chart 4");
+            By regex_search_id = By.id("regex-search");
+            Thread.sleep(600);
+            assertFalse("Failed, regex search button is enabled", driver.findElement(regex_search_id).isEnabled());
+            driver.findElement(pattern_before_input).clear();
+            driver.navigate().refresh();
+            PageRefresh();
+
+            //Test that checks that the regex search button is disabled after entering "Table 6" in pattern_after and
+            // clicking the regex search button
+            By pattern_after_input = By.id("pattern_after");
+            driver.findElement(pattern_after_input).sendKeys("Chart 5");
+            By regex_search_id2 = By.id("regex-search");
+            Thread.sleep(600);
+            assertFalse("Failed, regex search button is enabled", driver.findElement(regex_search_id2).isEnabled());
+            driver.findElement(pattern_after_input).clear();
+
+            driver.navigate().back();
+            Thread.sleep(500);
+            DeletePDF();
+
+        } catch (Exception e) {
+            System.out.print(e);
+        }
+    }
+    //Test of 3 different instances of either one of the inputs being wrong or both of the inputs being wrong and
+    // checking that it gave a regex result of zero
+    @Test
+    public void TestWrongInputsforBeforePatternandAfterPattern(){
+        try{
+            UploadPDF();
+            PageRefresh();
+            //Test that inputs an incorrect input for pattern before and incorrect input for pattern after
+            PatternInputStrings("ksgjlk", "fgfsgs");
+            ClickRegexButton();
+            wait.until(ExpectedConditions.visibilityOfElementLocated(By.className("regex-result")));
+            String result = driver.findElement(By.xpath(".//*[@class='regex-results-table']//td[contains(.,'0')]")).getText();
+            Boolean regex_result;
+            if(result.equals("0")){ regex_result = true;} //if true, there are zero matches
+            else{ regex_result = false;}
+            assertTrue("Failed, Tabula found a match for incorrect inputs for pattern before and pattern after",
+                    regex_result);
+            driver.navigate().refresh();
+            PageRefresh();
+
+            //Test inputs correct input for pattern after and incorrect input for pattern before
+            PatternInputStrings("jflaksl","Table 6" );
+            ClickRegexButton();
+            wait.until(ExpectedConditions.visibilityOfElementLocated(By.className("regex-result")));
+            String result2 = driver.findElement(By.xpath(".//*[@class='regex-results-table']//td[contains(.,'0')]")).getText();
+            Boolean regex_result2;
+            if(result2.equals("0")){ regex_result2 = true;} //if true, there are zero matches
+            else{ regex_result2 = false;}
+            assertTrue("Failed, Tabula found a match for a correct input for pattern after and incorrect input for " +
+                    "pattern before", regex_result2);
+            driver.navigate().refresh();
+            PageRefresh();
+
+            //Test inputs incorrect input for pattern after and correct input for pattern before
+            PatternInputStrings("Table 5","glslkgf");
+            ClickRegexButton();
+            wait.until(ExpectedConditions.visibilityOfElementLocated(By.className("regex-result")));
+            String result3 = driver.findElement(By.xpath(".//*[@class='regex-results-table']//td[contains(.,'0')]")).getText();
+            Boolean regex_result3;
+            if(result3.equals("0")){ regex_result3 = true;} //if true, there are zero matches
+            else{ regex_result3 = false;}
+            assertTrue("Failed, Tabula found a match for incorrect input for pattern after and correct input for" +
+                    " pattern before", regex_result3);
+
+            driver.navigate().back();
+            Thread.sleep(500);
+            DeletePDF();
+        }
+        catch(Exception e){
+            System.out.print(e);
+        }
+    }
+    //test of 3 different instances of inputting the same word for both regex inputs for one or the other or for both inputs
+    @Test
+    public void TestCommonWordInputforPatternBeforeandPatternAfter(){
+        try{
+            UploadPDF();
+            PageRefresh();
+
+            //Tests pattern before and pattern after with a common input found in the pdf
+            PatternInputStrings("Impacts", "Impacts");
+            ClickRegexButton();
+            Thread.sleep(1000);
+            PageRefresh();
+            //confirmation of data picked and number of results from the regex results table in the extraction page
+            Thread.sleep(600);
+            String result = driver.findElement(By.xpath(".//*[@class='regex-results-table']//td[contains(.,'1')]")).getText();
+            Boolean regex_result;
+            if(result.equals("1")){ regex_result = true;} //if true, there are zero matches
+            else{ regex_result = false;}
+            PreviewandExportDatapg();
+            String result_data = driver.findElement(By.xpath(".//*[@id='extracted-table']//td[contains(.,'Knowledge')]"))
+                    .getText();
+            Boolean regex_data;
+            if(result_data.equals("Knowledge and awareness of different cultures")){ regex_data = true;}
+            else{ regex_data = false;}
+            Thread.sleep(600);
+            String result_data2 = driver.findElement(By.xpath(".//*[@id='extracted-table']//td[contains(.,'Self')]")).getText();
+            Boolean regex_data2;
+            if(result_data2.equals("Self competence")){ regex_data2 = true;}
+            else{ regex_data2 = false;}
+            Boolean final_results;
+            if(regex_result && regex_data && regex_data2){ final_results = true;}
+            else{final_results = false;}
+            assertTrue("Failed, Tabula found no match/correct match for a common input found in the pdf for both " +
+                            "pattern before and pattern after",
+                    final_results);
+            driver.navigate().back();
+            Thread.sleep(500);
+
+            driver.navigate().refresh();
+            PageRefresh();
+
+            //Tests pattern before with a common input found in the pdf and pattern after with a correct input
+            PatternInputStrings("Impacts", "Impacts on participating teachers");
+            ClickRegexButton();
+            wait.until(ExpectedConditions.visibilityOfElementLocated(By.className("regex-result")));
+            String result2 = driver.findElement(By.xpath(".//*[@class='regex-results-table']//td[contains(.,'1')]")).getText();
+            Boolean regex_result2;
+            if(result2.equals("1")){ regex_result2 = true;}
+            else{ regex_result2 = false;}
+            PreviewandExportDatapg();
+            String result_data3 = driver.findElement(By.xpath(".//*[@id='extracted-table']//td[contains(.,'Knowledge')]")).getText();
+            Boolean regex_data3;
+            if(result_data3.equals("Knowledge and awareness of different cultures")){ regex_data3 = true;}
+            else{ regex_data3 = false;}
+            Thread.sleep(600);
+            String result_data4 = driver.findElement(By.xpath(".//*[@id='extracted-table']//td[contains(.,'Self')]")).getText();
+            Boolean regex_data4;
+            if(result_data4.equals("Self competence")){ regex_data4 = true;}
+            else{ regex_data4 = false;}
+            Boolean final_results2;
+            if(regex_result2 && regex_data3 && regex_data4){ final_results2 = true;}
+            else{final_results2 = false;}
+            assertTrue("Failed, Tabula found no match/correct match for a common input for pattern before and " +
+                    "correct input for pattern after", final_results2);
+            driver.navigate().refresh();
+            PageRefresh();
+
+            //Tests pattern before with a correct input and pattern after with a common input found in the pdf
+            PatternInputStrings("Impacts on participating pupils","Impacts");
+            ClickRegexButton();
+            wait.until(ExpectedConditions.visibilityOfElementLocated(By.className("regex-result")));
+            String result3 = driver.findElement(By.xpath(".//*[@class='regex-results-table']//td[contains(.,'1')]")).getText();
+            Boolean regex_result3;
+            if(result3.equals("1")){ regex_result3 = true;} //if true, there are zero matches
+            else{ regex_result3 = false;}
+            PreviewandExportDatapg();
+            String result_data5 = driver.findElement(By.xpath(".//*[@id='extracted-table']//td[contains(.,'Knowledge')]")).getText();
+            Boolean regex_data5;
+            if(result_data5.equals("Knowledge and awareness of different cultures")){ regex_data5 = true;}
+            else{ regex_data5 = false;}
+            Thread.sleep(600);
+            String result_data6 = driver.findElement(By.xpath(".//*[@id='extracted-table']//td[contains(.,'Self')]")).getText();
+            Boolean regex_data6;
+            if(result_data6.equals("Self competence")){ regex_data6 = true;}
+            else{ regex_data6 = false;}
+            Boolean final_results3;
+            if(regex_result3 && regex_data5 && regex_data6){ final_results3 = true;}
+            else{final_results3 = false;}
+            assertTrue("Failed, Tabula found no match/correct match for a common input for pattern after and " +
+                    "correct input for pattern after", final_results3);
+
+            driver.navigate().back();
+            driver.navigate().back();
+            Thread.sleep(500);
+            DeletePDF();
+        }catch(Exception e){
+            System.out.print(e);
+        }
+    }
+    //test of 3 different instances for including inclusiveness for one or the other or for both inputs
+    @Test
+    public void TestInclusiveInputsforPatternBeforeandPatternAfter() {
+        try{
+            UploadPDF();
+            PageRefresh();
+
+            //Tests for inclusive for pattern before and non-inclusive for pattern after
+            PatternInputStrings("European/International","International");
+            InclusiveButtons(true, false);
+            ClickRegexButton();
+            wait.until(ExpectedConditions.visibilityOfElementLocated(By.className("regex-result")));
+            String result = driver.findElement(By.xpath(".//*[@class='regex-results-table']//td[contains(.,'1')]")).getText();
+            Boolean regex_result;
+            if(result.equals("1")){ regex_result = true;} //if true, there are zero matches
+            else{ regex_result = false;}
+            PreviewandExportDatapg();
+            String result_data = driver.findElement(By.xpath(".//*[@id='extracted-table']//td[contains(.," +
+                    "'European/International')]")).getText();
+            Boolean regex_data;
+            if(result_data.equals("European/International dimension of the")){ regex_data = true;}
+            else{ regex_data = false;}
+            Thread.sleep(600);
+            String result_data2 = driver.findElement(By.xpath(".//*[@id='extracted-table']//td[contains(.,'day')]")).getText();
+            Boolean regex_data2;
+            if(result_data2.equals("day school-life")){ regex_data2 = true;}
+            else{ regex_data2 = false;}
+            Boolean final_results;
+            if(regex_result && regex_data && regex_data2){ final_results = true;}
+            else{final_results = false;}
+            assertTrue("Failed, Tabula found no match for inclusive for pattern before and non-inclusive for " +
+                    "pattern after", final_results);
+            driver.navigate().refresh();
+            PageRefresh();
+
+            //Tests for non-inclusive for pattern before and inclusive for pattern after
+            PatternInputStrings("European/International", "International");
+            InclusiveButtons(false, true);
+            ClickRegexButton();
+            wait.until(ExpectedConditions.visibilityOfElementLocated(By.className("regex-result")));
+            String result2 = driver.findElement(By.xpath(".//*[@class='regex-results-table']//td[contains(.,'1')]")).getText();
+            Boolean regex_result3;
+            if(result2.equals("1")){ regex_result3 = true;} //if true, there are zero matches
+            else{ regex_result3 = false;}
+            PreviewandExportDatapg();
+            String result_data3 = driver.findElement(By.xpath(".//*[@id='extracted-table']//td[contains(.," +
+                    "'school')]")).getText();
+            Boolean regex_data3;
+            if(result_data3.equals("school")){ regex_data3 = true;}
+            else{ regex_data3 = false;}
+            Thread.sleep(600);
+            String result_data4 = driver.findElement(By.xpath(".//*[@id='extracted-table']//td[contains(.," +
+                    "'International')]")).getText();
+            Boolean regex_data4;
+            if(result_data4.equals("International mobility of pupils")){ regex_data4 = true;}
+            else{ regex_data4 = false;}
+            Boolean final_results2;
+            if(regex_result3 && regex_data3 && regex_data4){ final_results2 = true;}
+            else{final_results2 = false;}
+            assertTrue("Failed, Tabula found no match for inclusive for pattern after and non-inclusive for " +
+                    "pattern before", final_results2);
+            driver.navigate().refresh();
+            PageRefresh();
+
+            //Tests for inclusive for pattern before and for pattern after
+            PatternInputStrings("European/International","Training");
+            InclusiveButtons(true, true);
+            Thread.sleep(500);
+            ClickRegexButton();
+            wait.until(ExpectedConditions.visibilityOfElementLocated(By.className("regex-result")));
+            String result3 = driver.findElement(By.xpath(".//*[@class='regex-results-table']//td[contains(.,'1')]")).getText();
+            Boolean regex_result4;
+            if(result3.equals("1")){ regex_result4 = true;} //if true, there are zero matches
+            else{ regex_result4 = false;}
+            PreviewandExportDatapg();
+            String result_data5 = driver.findElement(By.xpath(".//*[@id='extracted-table']//td[contains(.,'European/International')]")).getText();
+            Boolean regex_data5;
+            if(result_data5.equals("European/International dimension of the")){ regex_data5 = true;}
+            else{ regex_data5 = false;}
+            Thread.sleep(600);
+            String result_data6 = driver.findElement(By.xpath(".//*[@id='extracted-table']//td[contains(.,'Training')]"))
+                    .getText();
+            Boolean regex_data6;
+            if(result_data6.equals("Training of teachers")){ regex_data6 = true;}
+            else{ regex_data6 = false;}
+            Boolean final_results3;
+            if(regex_result4 && regex_data5 && regex_data6){ final_results3 = true;}
+            else{final_results3 = false;}
+            assertTrue("Failed, Tabula found no match for inclusive for pattern after and inclusive for " +
+                    "pattern before", final_results3);
+            driver.navigate().back();
+            driver.navigate().back();
+            Thread.sleep(500);
+            DeletePDF();
+        }catch(Exception e){
+            System.out.print(e);
+        }
+    }
+    //test of 3 instances where one or the other or both instances are inputted a correct input but with the wrong or
+    // right cause sensitivity
+    @Test
+    public void TestCaseSensitivity(){
+        try {
+            UploadPDF();
+            PageRefresh();
+
+            //Test case sensitive input for pattern before and correct input for pattern after
+            PatternInputStrings("knowledge and awareness", "Self competence");
+            ClickRegexButton();
+            wait.until(ExpectedConditions.visibilityOfElementLocated(By.className("regex-result")));
+            String result = driver.findElement(By.xpath(".//*[@class='regex-results-table']//td[contains(.,'0')]")).getText();
+            //check that there is 0 results in the regex table
+            Boolean regex_result;
+            if (result.equals("0")) {
+                regex_result = true;
+            } //if true, there are zero matches
+            else {
+                regex_result = false;
+            }
+            assertTrue("Failed, Tabula found a match for a case-sensitive search of pattern before",
+                    regex_result);
+            driver.navigate().refresh();
+            PageRefresh();
+
+            //Test case sensitive input for pattern after and correct input for pattern before
+            PatternInputStrings("Knowledge and awareness", "self competence");
+            ClickRegexButton();
+            wait.until(ExpectedConditions.visibilityOfElementLocated(By.className("regex-result")));
+
+            String result2 = driver.findElement(By.xpath(".//*[@class='regex-results-table']//td[contains(.,'0')]")).getText();
+            //check that there is 0 results in the regex table
+            Boolean regex_result2;
+            if (result2.equals("0")) {
+                regex_result2 = true;
+            } //if true, there are zero matches
+            else {
+                regex_result2 = false;
+            }
+            assertTrue("Failed, Tabula found a match for a case-sensitive search of pattern after",
+                    regex_result2);
+            driver.navigate().refresh();
+            PageRefresh();
+
+            //Test case sensitive input for both pattern before and pattern after
+            PatternInputStrings("knowledge and awareness", "self competence");
+            ClickRegexButton();
+            wait.until(ExpectedConditions.visibilityOfElementLocated(By.className("regex-result")));
+            String result3 = driver.findElement(By.xpath(".//*[@class='regex-results-table']//td[contains(.,'0')]")).getText();
+            //check that there is 0 results in the regex table
+            Boolean regex_result3;
+            if (result3.equals("0")) {
+                regex_result3 = true;
+            } //if true, there are zero matches
+            else {
+                regex_result3 = false;
+            }
+            assertTrue("Failed, Tabula found a match for a case-sensitive search of pattern after and pattern before",
+                    regex_result3);
+            driver.navigate().back();
+            Thread.sleep(500);
+            DeletePDF();
+        }catch(Exception e){
+            System.out.print(e);
+        }
+    }
+    //test of getting the text based image to display it's data in a linear form
+    @Test
+    public void TestTextBasedImage(){
+        try {
+            UploadPDF();
+            PageRefresh();
+
+            //Test to get only the text-based image to appear in the preview and export data page
+            PatternInputStrings("satisfied", "Question");
+            ClickRegexButton();
+            wait.until(ExpectedConditions.visibilityOfElementLocated(By.className("regex-result")));
+
+            String result = driver.findElement(By.xpath(".//*[@class='regex-results-table']//td[contains(.,'1')]")).getText();
+            Boolean regex_result;
+            if (result.equals("1")) { regex_result = true; } //if true, there are zero matches
+            else { regex_result = false; }
+            PreviewandExportDatapg();
+            String result_data = driver.findElement(By.xpath(".//*[@id='extracted-table']//td[contains(.,'Total')]")).getText();
+            Boolean regex_data;
+            if (result_data.equals("Total")) { regex_data = true; }
+            else { regex_data = false; }
+            Thread.sleep(600);
+            String result_data2 = driver.findElement(By.xpath(".//*[@id='extracted-table']//td[contains(.," +
+                    "'EU-25/EFTA: Middle')]")).getText();
+            Boolean regex_data2;
+            if (result_data2.equals("EU-25/EFTA: Middle (AT, BE, DE, LI, LU, NL)")) {
+                regex_data2 = true; }
+            else { regex_data2 = false; }
+            Boolean final_results;
+            if (regex_result && regex_data && regex_data2) { final_results = true; }
+            else { final_results = false; }
+            assertTrue("Failed, Tabula could not find the text-based image", final_results);
+
+            driver.navigate().back();
+            driver.navigate().back();
+            Thread.sleep(500);
+            DeletePDF();
+        }catch (Exception e){
+            System.out.print(e);
+        }
+    }
+    //test of two instances trying to get a horizontal table to appear
+    @Test
+    public void TestHorizontalTable(){
+        try {
+            UploadPDF();
+            PageRefresh();
+            //Test for vertical table
+            PatternInputStrings("Preperation", "Presentation");
+            ClickRegexButton();
+            wait.until(ExpectedConditions.visibilityOfElementLocated(By.className("regex-result")));
+
+            String result = driver.findElement(By.xpath(".//*[@class='regex-results-table']//td[contains(.,'0')]")).getText();
+            Boolean regex_result;
+            if (result.equals("0")) {
+                regex_result = true;
+            } //if true, there are zero matches
+            else {
+                regex_result = false;
+            }
+            assertTrue("Failed, Tabula found a match for a vertical table",
+                    regex_result);
+            driver.navigate().refresh();
+
+            //Test of a different vertical table
+            PageRefresh();
+            PatternInputStrings("Impacts", "Lack of interest");
+            ClickRegexButton();
+            wait.until(ExpectedConditions.visibilityOfElementLocated(By.className("regex-result")));
+            String result2 = driver.findElement(By.xpath(".//*[@class='regex-results-table']//td[contains(.,'0')]")).getText();
+            Boolean regex_result2;
+            if (result2.equals("0")) {
+                regex_result2 = true;
+            } //if true, there are zero matches
+            else {
+                regex_result2 = false;
+            }
+            assertTrue("Failed, Tabula found a match for a vertical table",
+                    regex_result2);
+            driver.navigate().back();
+            Thread.sleep(500);
+            DeletePDF();
+        }catch (Exception e){
+            System.out.print(e);
+        }
+    }
+    //test of two instances to get multiple regex results
+    @Test
+    public void TestMultipleRegexSearches(){
+        try {
+            //Tests for 2 regex search results
+            UploadPDF();
+            PageRefresh();
+
+            PatternInputStrings("Impacts", "Knowledge");
+            InclusiveButtons(true, true);
+            ClickRegexButton();
+            wait.until(ExpectedConditions.visibilityOfElementLocated(By.className("regex-result")));
+
+            String result = driver.findElement(By.xpath(".//*[@class='regex-results-table']//td[contains(.,'2')]")).getText();
+            Boolean regex_result;
+            if (result.equals("2")) {
+                regex_result = true;
+            } //if true, there are 2 matches
+            else {
+                regex_result = false;
+            }
+            PreviewandExportDatapg();
+            String result_data = driver.findElement(By.xpath(".//*[@id='extracted-table']//td[contains(.," +
+                    "'Impacts on participating pupils')]")).getText();
+            Boolean regex_data;
+            if (result_data.equals("Impacts on participating pupils")) {
+                regex_data = true;
+            } else {
+                regex_data = false;
+            }
+            Thread.sleep(600);
+            String result_data2 = driver.findElement(By.xpath(".//*[@id='extracted-table']//td[contains(.," +
+                    "'Knowledge/appreciation of school')]")).getText();
+            Boolean regex_data2;
+            if (result_data2.equals("Knowledge/appreciation of school system and")) {
+                regex_data2 = true;
+            } else {
+                regex_data2 = false;
+            }
+            Boolean final_results;
+            if (regex_result && regex_data && regex_data2) {
+                final_results = true;
+            } else {
+                final_results = false;
+            }
+            Thread.sleep(500);
+            assertTrue("Failed, Tabula didn't find the 2 regex matches", final_results);
+            driver.navigate().refresh();
+
+            //Test for 3 regex search results
+            PageRefresh();
+            PatternInputStrings("Knowledge", "Foreign");
+            InclusiveButtons(true, true);
+            ClickRegexButton();
+            wait.until(ExpectedConditions.visibilityOfElementLocated(By.className("regex-result")));
+
+            String result2 = driver.findElement(By.xpath(".//*[@class='regex-results-table']//td[contains(.,'3')]")).getText();
+            Boolean regex_result3;
+            if (result2.equals("3")) {
+                regex_result3 = true;
+            } //if true, there are 3 matches
+            else {
+                regex_result3 = false;
+            }
+            PreviewandExportDatapg();
+            String result_data3 = driver.findElement(By.xpath(".//*[@id='extracted-table']//td[contains(.," +
+                    "'Knowledge and awareness')]")).getText();
+            Boolean regex_data3;
+            if (result_data3.equals("Knowledge and awareness of different cultures")) {
+                regex_data3 = true;
+            } else {
+                regex_data3 = false;
+            }
+            Thread.sleep(600);
+            String result_data4 = driver.findElement(By.xpath(".//*[@id='extracted-table']//td[contains(.," +
+                    "'Foreign language')]")).getText();
+            Boolean regex_data4;
+            if (result_data4.equals("Foreign language competence")) {
+                regex_data4 = true;
+            } else {
+                regex_data4 = false;
+            }
+            Boolean final_results2;
+            if (regex_result3 && regex_data3 && regex_data4) {
+                final_results2 = true;
+            } else {
+                final_results2 = false;
+            }
+            Thread.sleep(500);
+            assertTrue("Failed, Tabula didn't find the 3 regex matches", final_results2);
+            driver.navigate().back();
+            Thread.sleep(500);
+            driver.navigate().back();
+            Thread.sleep(500);
+            DeletePDF();
+        }catch (Exception e){
+            System.out.print(e);
+        }
+    }
+    //test of a multipage spanning table
+    @Test
+    public void TestMultiPageTables(){
+        try {
+            //Test for a multi spanning page (2 page table)
+            UploadPDF();
+            PageRefresh();
+
+            PatternInputStrings("Table 5", "Question 4.9");
+            InclusiveButtons(false, true);
+            ClickRegexButton();
+            wait.until(ExpectedConditions.visibilityOfElementLocated(By.className("regex-result")));
+            String result = driver.findElement(By.xpath(".//*[@class='regex-results-table']//td[contains(.,'1')]")).getText();
+            Boolean regex_result;
+            if (result.equals("1")) {
+                regex_result = true;
+            } //if true, there is 1 match
+            else {
+                regex_result = false;
+            }
+            PreviewandExportDatapg();
+            String result_data = driver.findElement(By.xpath(".//*[@id='extracted-table']//td[contains(.," +
+                    "'Correlations')]")).getText();
+            Boolean regex_data;
+            if (result_data.equals("Correlations between the extent of participation of pupils in project activities and the")) {
+                regex_data = true;
+            } else {
+                regex_data = false;
+            }
+            String result_data2 = driver.findElement(By.xpath(".//*[@id='extracted-table']//td[contains(.," +
+                    "'Question')]")).getText();
+            Boolean regex_data2;
+            if (result_data2.equals("Question 4.9: Overall, how satisfied are you with the outcomes and impacts of " +
+                    "the Comenius project?")) {
+                regex_data2 = true;
+            } else {
+                regex_data2 = false;
+            }
+            Boolean final_results;
+            if (regex_result && regex_data && regex_data2) {
+                final_results = true;
+            } else {
+                final_results = false;
+            }
+            assertTrue("Failed, Tabula found no match for the multi-page table", final_results);
+
+            driver.navigate().back();
+            driver.navigate().back();
+            Thread.sleep(500);
+            DeletePDF();
+        }catch (Exception e){
+            System.out.print(e);
+        }
+    }
+    //test of an overlap attempt, and then checking that overlap was detected
+    @Test
+    public void TestOverlapRegexSearch() {
+        try{
+            //Test for overlapping regex searches
+            UploadPDF();
+            PageRefresh();
+
+            PatternInputStrings("Table 5", "Impacts on");
+            ClickRegexButton();
+            Thread.sleep(600);
+            PatternInputStrings("Table 6", "School climate");
+            InclusiveButtons(false, true);
+            ClickRegexButton();
+            Thread.sleep(600);
+            driver.switchTo().alert().accept(); //accept error pop-up window
+            //Checks that there is only one regex result, since it shouldn't had allowed for 2 results to appear since the
+            // 2nd one causes an overlap
+            String result = driver.findElement(By.xpath(".//*[@class='regex-results-table']//td[contains(.,'1')]")).getText();
+            Boolean regex_result;
+            if(result.equals("1")){ regex_result = true;} //if true, there are zero matches
+            else{ regex_result = false;}
+            assertTrue("Failed, Tabula found found more than one match for an overlap regex search",
+                    regex_result);
+
+            driver.navigate().back();
+            Thread.sleep(500);
+            DeletePDF();
+        }catch (Exception e){
+            System.out.print(e);
+        }
+    }
+    //test checking duplication of inputting the same regex searches twice to see if it will caught it
+    @Test
+    public void TestDuplicateOverlapRegexSearch(){
+        try {
+            //Test for a duplicate overlapping regex search
+            UploadPDF();
+            PageRefresh();
+            PatternInputStrings("Table 5", "Table 6");
+            InclusiveButtons(true, true);
+            ClickRegexButton();
+            Thread.sleep(600);
+            PatternInputStrings("Table 5", "Table 6");
+            InclusiveButtons(true, true);
+            ClickRegexButton();
+            Thread.sleep(600);
+            driver.switchTo().alert().accept(); //accept error pop-up window
+            //Checks that there is only one regex result, since it shouldn't had allowed for 2 results to appear since the
+            // 2nd one causes a duplicate overlap
+            String result = driver.findElement(By.xpath(".//*[@class='regex-results-table']//td[contains(.,'1')]")).getText();
+            Boolean regex_result;
+            if (result.equals("1")) {
+                regex_result = true;
+            } //if true, there are zero matches
+            else {
+                regex_result = false;
+            }
+            assertTrue("Failed, Tabula found more than one match for a duplicate overlap regex search",
+                    regex_result);
+
+            driver.navigate().back();
+            Thread.sleep(500);
+            DeletePDF();
+        }catch (Exception e){
+            System.out.print(e);
+        }
+    }
+    @AfterClass
+    public static void TearDown(){
+        driver.quit();
+    }
+}
diff --git a/src/test/java/TestExtractionPage.java b/src/test/java/TestExtractionPage.java
new file mode 100644
index 000000000..ccb232cc7
--- /dev/null
+++ b/src/test/java/TestExtractionPage.java
@@ -0,0 +1,125 @@
+import org.junit.After;
+import org.junit.Test;
+import org.openqa.selenium.By;
+import org.openqa.selenium.WebDriver;
+import org.openqa.selenium.WebElement;
+import org.openqa.selenium.chrome.ChromeDriver;
+import org.openqa.selenium.chrome.ChromeOptions;
+import org.openqa.selenium.support.ui.ExpectedConditions;
+import org.openqa.selenium.support.ui.WebDriverWait;
+import java.util.concurrent.TimeUnit;
+import static junit.framework.TestCase.assertFalse;
+import static junit.framework.TestCase.assertTrue;
+
+//Test of Tabula's extraction page, which incorporates the template, pdf outline, and regex buttons, as well as
+// the regex tabs. Prior and after each button is clicked, it checks if the element is present or not on the page.
+// What it doesn't test are the individual URL links in the regex tabs, since those same links are already tested in
+// the TestHelpPage and TestHomePage test cases, as well as the Autodetect Tables button and the Preview & Export Data
+// button are not tested since their functionality will be tested in other test cases.
+// For this test case, eu_002.pdf is utilized.
+// @author SM modified: 3/6/18
+public class TestExtractionPage {
+    WebDriver driver;
+    private void PageRefresh() throws InterruptedException {
+        //menu options did not fully load
+        Thread.sleep(1000);
+        //refresh the page
+        while(driver.findElements( By.id("restore-detected-tables")).size() == 0) {
+            driver.navigate().refresh();
+            Thread.sleep(700);
+        }
+    }
+
+    @Test
+    public void startWebDriver() throws InterruptedException{
+        System.setProperty("webdriver.chrome.driver","/usr/local/bin/chromedriver");
+        ChromeOptions options = new ChromeOptions();
+        options.addArguments("headless");
+        options.addArguments("no-sandbox");
+
+        driver = new ChromeDriver(options);
+        driver.get("http://127.0.0.1:9292/");
+        driver.manage().window().maximize();
+        WebDriverWait wait = new WebDriverWait(driver, 200);
+        String filePath = System.getProperty("user.dir") + "/src/test/pdf/eu-002.pdf";
+        WebElement chooseFile = driver.findElement(By.id("file"));
+        chooseFile.sendKeys(filePath);
+        Thread.sleep(1000);
+        WebElement import_btn = driver.findElement(By.id("import_file"));
+        import_btn.click();
+        try{
+            //navigates to the extraction page and checks that it is in the extraction page
+            By extract_name = By.linkText("Extract Data");
+            WebElement extract_button = wait.until(ExpectedConditions.elementToBeClickable(extract_name));
+            extract_button.click();
+            driver.manage().timeouts().pageLoadTimeout(300, TimeUnit.SECONDS);
+
+            //menu options did not fully load
+            PageRefresh();
+
+            String regex_options_string = "Regex Options";
+            By regex_options_title = By.id("regex_options_title");
+            WebElement regex_options = wait.until(ExpectedConditions.elementToBeClickable(regex_options_title));
+            driver.manage().timeouts().pageLoadTimeout(200, TimeUnit.SECONDS);
+            assertTrue("Failed, couldn't find Extraction page", regex_options_string.equals(regex_options.getText()));
+            //checking that the PDF outline sidebar is visible
+            By sidebar_title = By.id("sidebar");
+            driver.manage().timeouts().pageLoadTimeout(150, TimeUnit.SECONDS);
+            assertTrue("PDF sidebar is not visible in Extraction page", driver.findElement(sidebar_title).isDisplayed());
+            //clicking PDF outline button and checking if sidebar is not visible
+            By pdf_outline_id = By.id("pdf_outline_title");
+            WebElement pdf_outline_button = wait.until(ExpectedConditions.elementToBeClickable(pdf_outline_id));
+            pdf_outline_button.click();
+            By sidebar_check = By.id("sidebar");
+            driver.manage().timeouts().pageLoadTimeout(150, TimeUnit.SECONDS);
+            assertFalse("PDF sidebar is visible in Extraction page", driver.findElement(sidebar_check).isDisplayed());
+
+            //Checks regex Options bar is visible via text
+            By regex_command_title = By.id("regex_command_title");
+            WebElement regex_command = wait.until(ExpectedConditions.elementToBeClickable(regex_command_title));
+            String regex_command_string = "Regex Command";
+            driver.manage().timeouts().pageLoadTimeout(150, TimeUnit.SECONDS);
+            assertTrue("Regex Options sidebar is not visible in Extraction page", regex_command_string.equals(regex_command.getText()));
+
+            //Click on regex options button and check if regex options bar/regex guide tab is now invisible
+            By regex_guide_name = By.className("regex-guide");
+            WebElement regex_guide_tab = wait.until(ExpectedConditions.elementToBeClickable(regex_guide_name));
+            regex_guide_tab.click();
+            By regex_guide_id = By.id("regex_guide");
+            WebElement regex_guide = wait.until(ExpectedConditions.elementToBeClickable(regex_guide_id));
+            String regex_guide_string = "Regex Guide";
+            driver.manage().timeouts().pageLoadTimeout(150, TimeUnit.SECONDS);
+            assertTrue("Regex Guide tab is not visible in Extraction page", regex_guide_string.equals(regex_guide.getText()));
+            By regex_options_ttle = By.id("regex_options_title");
+            WebElement regex_options_button = wait.until(ExpectedConditions.elementToBeClickable(regex_options_ttle));
+            regex_options_button.click();
+            driver.manage().timeouts().pageLoadTimeout(150, TimeUnit.SECONDS);
+            assertFalse("Regex Options sidebar is visible in Extraction page", regex_command_string.equals(regex_command.getText()));
+
+            //waits for the templates button and then clicks on it, and checks that the templates content appears
+            driver.manage().timeouts().pageLoadTimeout(150, TimeUnit.SECONDS);
+            By templates_name = By.id("templates_title");
+            WebElement templates_button = wait.until(ExpectedConditions.elementToBeClickable(templates_name));
+            templates_button.click();
+            String templates_list_string = "Load templates:";
+            By templates_list_title = By.id("loaded_templates_title");
+            WebElement templates_list = wait.until(ExpectedConditions.elementToBeClickable(templates_list_title));
+            driver.manage().timeouts().pageLoadTimeout(150, TimeUnit.SECONDS);
+            assertTrue("Failed, couldn't find Templates List in Extraction page", templates_list_string.equals(templates_list.getText()));
+
+            //navigates back and deletes the pdf utilized
+            driver.navigate().back();
+            By delete_pdf = By.id("delete_pdf");
+            WebElement delete_btn = wait.until(ExpectedConditions.elementToBeClickable(delete_pdf));
+            delete_btn.click();
+            driver.switchTo().alert().accept();
+
+        }catch(Exception e){
+            System.out.print(e);
+        }
+    }
+    @After
+    public void TearDown(){
+        driver.quit();
+    }
+}
diff --git a/src/test/java/TestFeb_9_2016.java b/src/test/java/TestFeb_9_2016.java
new file mode 100644
index 000000000..17c7143e4
--- /dev/null
+++ b/src/test/java/TestFeb_9_2016.java
@@ -0,0 +1,299 @@
+import org.junit.AfterClass;
+import org.junit.BeforeClass;
+import org.junit.Test;
+import org.openqa.selenium.By;
+import org.openqa.selenium.WebDriver;
+import org.openqa.selenium.WebElement;
+import org.openqa.selenium.chrome.ChromeDriver;
+import org.openqa.selenium.chrome.ChromeOptions;
+import org.openqa.selenium.support.ui.ExpectedConditions;
+import org.openqa.selenium.support.ui.WebDriverWait;
+
+import java.util.List;
+
+import static junit.framework.TestCase.assertTrue;
+//Test of the Feb_9_2016 pdf file, it will go through various user scenarios to test the functionality of the regex
+// implementation (spanning pages, multiple search results, inclusive and non-inclusive, and overlap)
+// @author SM modified: 4/28/18
+
+public class TestFeb_9_2016 {
+    //Test of the Feb_9_2016 pdf file.
+    private static WebDriver driver;
+    private static String Tabula_url = "http://127.0.0.1:9292/";
+    private WebDriverWait wait = new WebDriverWait(driver, 500);
+
+    //will continue to refresh the page until it sees one of the buttons appear in the menu option of the extraction page
+    private void PageRefresh() throws InterruptedException {
+        //menu options did not fully load
+        Thread.sleep(1000);
+        //refresh the page
+        while(driver.findElements( By.id("restore-detected-tables")).size() == 0) {
+            driver.navigate().refresh();
+            Thread.sleep(700);
+        }
+    }
+    //will navigate and wait for the data to appear in the preview and export data page
+    private void PreviewandExportDatapg(){
+        By previewandexport_id = By.id("all-data");
+        WebElement previewandexport_button = wait.until(ExpectedConditions.visibilityOfElementLocated(previewandexport_id));
+        previewandexport_button.click();
+        wait.until(ExpectedConditions.visibilityOfElementLocated(By.className("detection-row")));
+    }
+    //will wait for the regex button to become clickable and then click the regex button
+    private void ClickRegexButton() throws InterruptedException {
+        By regex_search_id = By.id("regex-search");
+        WebElement regex_button = new WebDriverWait(driver, 30).until(ExpectedConditions.
+                elementToBeClickable(regex_search_id));
+        regex_button.click();
+        Thread.sleep(800);
+    }
+    //send regex inputs to the corresponding pattern type
+    private void PatternInputStrings(String pattern_before, String pattern_after){
+        By pattern_before_input = By.id("pattern_before");
+        By pattern_after_input = By.id("pattern_after");
+        driver.findElement(pattern_before_input).sendKeys(pattern_before);
+        driver.findElement(pattern_after_input).sendKeys(pattern_after);
+    }
+    //send corresponding info of inclusive to the pattern type
+    private void InclusiveButtons(boolean patternbefore, boolean patternafter){
+        WebElement inclusive_before_btn = new WebDriverWait(driver, 30).
+                until(ExpectedConditions.elementToBeClickable(driver.findElement(By.id("include_pattern_before"))));
+        WebElement inclusive_after_btn = new WebDriverWait(driver, 30).
+                until(ExpectedConditions.elementToBeClickable(driver.findElement(By.id("include_pattern_after"))));
+        if (patternbefore){
+            inclusive_before_btn.click(); }
+        if(patternafter){
+            inclusive_after_btn.click(); }
+    }
+    //go on and upload the pdf file
+    private void UploadPDF() throws InterruptedException {
+        String filePath = System.getProperty("user.dir") + "/src/test/pdf/Feb_9,_2016_1_4700_PM_ESTRE_Voters.pdf";
+        WebElement chooseFile = driver.findElement(By.id("file"));
+        chooseFile.sendKeys(filePath);
+        Thread.sleep(1000);
+        WebElement import_btn = driver.findElement(By.id("import_file"));
+        import_btn.click();
+        Thread.sleep(5000);
+        wait.until(ExpectedConditions.elementToBeClickable(By.id("templates_title")));
+    }
+    //delete the pdf file
+    private void DeletePDF(){
+        //navigates back and deletes the pdf utilized
+        driver.findElement(By.id("delete_pdf")).click();
+        driver.switchTo().alert().accept();
+    }
+    //instantiation of Tabula
+    @BeforeClass
+    public static void SetUp(){
+        //set up of chromedriver and navigation to the url, as well as uploading of the pdf file
+        System.setProperty("webdriver.chrome.driver","/usr/local/bin/chromedriver");
+        ChromeOptions options = new ChromeOptions();
+        options.addArguments("headless");
+        options.addArguments("no-sandbox");
+
+        driver = new ChromeDriver(options);
+        driver.get(Tabula_url);
+        driver.manage().window().maximize();
+    }
+    //test of 2 different instances of inputting regex to get a multi spanning table
+    @Test
+    public void TestMultiPageTables() {
+        try {
+            UploadPDF();
+            PageRefresh();
+            //Test of regex input with inclusive for pattern before for a table of 3 pages in length
+            PatternInputStrings("From:", "From:");
+            InclusiveButtons(true, false);
+            ClickRegexButton();
+            wait.until(ExpectedConditions.visibilityOfElementLocated(By.className("regex-result")));
+            //Confirm search found
+            String result = driver.findElement(By.xpath(".//*[@class='regex-results-table']//td[contains(.,'5')]")).getText();
+            Boolean regex_result;
+            if (result.equals("5")) {
+                regex_result = true;
+            } //if true, there are zero matches
+            else {
+                regex_result = false;
+            }
+            PreviewandExportDatapg();
+            //verify data extraction
+            String result_data = driver.findElement(By.xpath(".//*[@id='extracted-table']//td[contains(.," +
+                    "'From: Bucholtz, Tracy L  regex_rows = driver.findElements(By.className("regex-result"));
+            int regex_count = regex_rows.size();
+            int regex_count1 = 1;
+            assertTrue("Failed, Tabula found more than one match for an overlap regex search", (regex_count1 == regex_count ));
+            PreviewandExportDatapg();
+            String result_data = driver.findElement(By.xpath(".//*[@id='extracted-table']//td[contains(.," +
+                    "'Raleigh, NC 27699-3110')]")).getText();
+            Boolean regex_data;
+            if (result_data.equals("Raleigh, NC 27699-3110")) { regex_data = true;
+            } else { regex_data = false; }
+            String result_data2 = driver.findElement(By.xpath(".//*[@id='extracted-table']//td[contains(.," +
+                    "'Raleigh, NC 27699-3123')]")).getText();
+            Boolean regex_data2;
+            if (result_data2.equals("Raleigh, NC 27699-3123")) { regex_data2 = true;
+            } else { regex_data2 = false; }
+            Boolean final_results;
+            if (regex_data && regex_data2) { final_results = true;
+            } else { final_results = false; }
+            assertTrue("Failed, Tabula found no match for the multi-page table", final_results);
+            driver.navigate().back();
+            driver.navigate().back();
+            Thread.sleep(500);
+            DeletePDF();
+        }catch (Exception e){
+            System.out.print(e);
+        }
+    }
+    @AfterClass
+    public static void TearDown(){
+        driver.quit();
+    }
+}
diff --git a/src/test/java/TestHelpPage.java b/src/test/java/TestHelpPage.java
new file mode 100644
index 000000000..14fb77775
--- /dev/null
+++ b/src/test/java/TestHelpPage.java
@@ -0,0 +1,131 @@
+import org.junit.After;
+import org.junit.Test;
+import org.openqa.selenium.By;
+import org.openqa.selenium.WebDriver;
+import org.openqa.selenium.WebElement;
+import org.openqa.selenium.chrome.ChromeDriver;
+import org.openqa.selenium.chrome.ChromeOptions;
+import org.openqa.selenium.support.ui.ExpectedConditions;
+import org.openqa.selenium.support.ui.WebDriverWait;
+
+import java.util.concurrent.TimeUnit;
+
+import static junit.framework.TestCase.assertTrue;
+import static org.junit.Assert.assertFalse;
+
+//Test of Tabula's test page, which incorporates the hover menu per section and the links found on the page.
+// All the links are tested except for LibreOffice Calc's link due to an existing exception thrown whenever clicked.
+// The exception thrown is ElementClickInterceptedException where an element obscures the link from being clicked.
+// LibreOffice Calc's link is tested however in TestHomePage test case, so this test case does not duplicate the same
+// steps taken to test LibreOffice Calc. Additionally, the media menu is not tested for since it is already tested in
+// TestHomePage.
+//need to fix
+// @author SM modified: 2/23/18
+
+public class TestHelpPage {
+    WebDriver driver;
+    @Test
+    public void startWebDriver(){
+        System.setProperty("webdriver.chrome.driver","/usr/local/bin/chromedriver");
+        ChromeOptions options = new ChromeOptions();
+        options.addArguments("headless");
+        options.addArguments("no-sandbox");
+
+        driver = new ChromeDriver(options);
+        driver.get("http://127.0.0.1:9292/");
+        driver.manage().window().maximize();
+        WebDriverWait wait = new WebDriverWait(driver, 100);
+
+        try{
+            Thread.sleep(1000);
+            //navigates to the help tab from the homepage
+            By help_id = By.linkText("Help");
+            WebElement help_icon = wait.until(ExpectedConditions.elementToBeClickable(help_id));
+            help_icon.click();
+            WebElement help_icon2 = wait.until(ExpectedConditions.elementToBeClickable(help_id));
+            help_icon2.click();
+            Thread.sleep(2000);
+            String help_title = "How to Use Tabula";
+            By tabulahelp_id = By.id("tabulahelp");
+            WebElement helptabula = wait.until(ExpectedConditions.visibilityOfElementLocated(tabulahelp_id));
+            assertTrue("Failed, couldn't find Help page", help_title.equals(helptabula.getText()));
+
+            //the following will click to all of the links found in the help page except for LibreOffice Calc since it
+            // has been tested before in the TestHomePage
+            By tutorialspoint_text = By.className("tutorialspoint");
+            WebElement tutorialspoint_link = wait.until(ExpectedConditions.elementToBeClickable(tutorialspoint_text));
+            tutorialspoint_link.click();
+            String tutorialspoint_url = "https://www.tutorialspoint.com/java/java_regular_expressions.htm";
+            driver.manage().timeouts().pageLoadTimeout(150, TimeUnit.SECONDS);
+            assertTrue("Failed, couldn't find Tutorial's Point Regex Syntax page", driver.getCurrentUrl().equals(tutorialspoint_url));
+            driver.navigate().back();
+
+            By regex_text = By.linkText("here");
+            WebElement regex_link = wait.until(ExpectedConditions.elementToBeClickable(regex_text));
+            regex_link.click();
+            String regex_url = "https://regexr.com/";
+            driver.manage().timeouts().pageLoadTimeout(60, TimeUnit.SECONDS);
+            assertTrue("Failed, couldn't find Tutorial's Point Regex Syntax page", driver.getCurrentUrl().equals(regex_url));
+            driver.navigate().back();
+
+            By pdfsandwich_text = By.linkText("PDFSandwich");
+            WebElement pdfsandwich_link = wait.until(ExpectedConditions.elementToBeClickable(pdfsandwich_text));
+            pdfsandwich_link.click();
+            String pdfsandwich_url = "http://www.tobias-elze.de/pdfsandwich/";
+            driver.manage().timeouts().pageLoadTimeout(60, TimeUnit.SECONDS);
+            assertTrue("Failed, couldn't find PDFSandwich page", driver.getCurrentUrl().equals(pdfsandwich_url));
+            driver.navigate().back();
+
+            By limeOCR_text = By.linkText("Lime OCR");
+            WebElement limeOCR_link = wait.until(ExpectedConditions.elementToBeClickable(limeOCR_text));
+            limeOCR_link.click();
+            String limeOCR_url = "https://code.google.com/archive/p/lime-ocr/";
+            driver.manage().timeouts().pageLoadTimeout(60, TimeUnit.SECONDS);
+            assertTrue("Failed, couldn't find limeOCR page", driver.getCurrentUrl().equals(limeOCR_url));
+            driver.navigate().back();
+
+            By openrefine_text = By.linkText("OpenRefine");
+            WebElement openrefine_link = wait.until(ExpectedConditions.elementToBeClickable(openrefine_text));
+            openrefine_link.click();
+            String openrefine_url = "http://openrefine.org/";
+            driver.manage().timeouts().pageLoadTimeout(60, TimeUnit.SECONDS);
+            assertTrue("Failed, couldn't find OpenRefine page", driver.getCurrentUrl().equals(openrefine_url));
+            driver.navigate().back();
+
+            By extractor_text = By.linkText("tabula-extractor");
+            WebElement extractor_link = wait.until(ExpectedConditions.elementToBeClickable(extractor_text));
+            extractor_link.click();
+            String extractor_url = "https://github.com/tabulapdf/tabula-extractor";
+            driver.manage().timeouts().pageLoadTimeout(60, TimeUnit.SECONDS);
+            assertTrue("Failed, couldn't find tabula-extractor page", driver.getCurrentUrl().equals(extractor_url));
+            driver.navigate().back();
+
+            By report_text = By.linkText("report it to us here");
+            WebElement report_link = wait.until(ExpectedConditions.elementToBeClickable(report_text));
+            report_link.click();
+            String report_url = "https://github.com/tabulapdf/tabula/issues/new";
+            driver.manage().timeouts().pageLoadTimeout(60, TimeUnit.SECONDS);
+            assertFalse("Failed, couldn't find GitHub's sign-in page to view the issues page", driver.getCurrentUrl().equals(report_url));
+            driver.navigate().back();
+
+            By about_text = By.linkText("one of the Tabula creators.");
+            WebElement about_icon = wait.until(ExpectedConditions.visibilityOfElementLocated(about_text));
+            about_icon.click();
+            String about_title = "About Tabula";
+            By abouttabula_classname = By.className("abouttabula");
+            driver.manage().timeouts().pageLoadTimeout(60, TimeUnit.SECONDS);
+            WebElement abouttabula = wait.until(ExpectedConditions.visibilityOfElementLocated(abouttabula_classname));
+            assertTrue("Failed, couldn't find About page", about_title.equals(abouttabula.getText()));
+
+        }catch(Exception e){
+            System.out.print(e);
+
+        }
+
+    }
+    //whether the test case passes or not, the instance of the browser will close
+    @After
+    public void TearDown(){
+        driver.quit();
+    }
+}
diff --git a/src/test/java/TestHomePage.java b/src/test/java/TestHomePage.java
new file mode 100644
index 000000000..2ae0a5075
--- /dev/null
+++ b/src/test/java/TestHomePage.java
@@ -0,0 +1,129 @@
+import org.junit.After;
+import org.junit.Test;
+import org.openqa.selenium.By;
+import org.openqa.selenium.WebDriver;
+import org.openqa.selenium.WebElement;
+import org.openqa.selenium.chrome.ChromeDriver;
+import org.openqa.selenium.chrome.ChromeOptions;
+import org.openqa.selenium.support.ui.ExpectedConditions;
+import org.openqa.selenium.support.ui.WebDriverWait;
+
+import java.util.concurrent.TimeUnit;
+
+import static junit.framework.TestCase.assertTrue;
+
+// Test of Tabula's homepage, menu, media links at the bottom of the page, and button to click window explorer to upload files.
+// Test will not test for uploading a file or clicking the extracting button to navigate to the extraction page
+// Test will not test the Help and Template links located in the How to Use Tabula section, since navigating to those sections are
+//   already being done
+// Currently, this test case will not check for the Import button since the button is technically enabled but disabled to do anything
+// @author SM modified: 2/18/18
+
+public class TestHomePage {
+    WebDriver driver;
+    @Test
+    public void startWebDriver(){
+        System.setProperty("webdriver.chrome.driver","/usr/local/bin/chromedriver");
+        ChromeOptions options = new ChromeOptions();
+        options.addArguments("headless");
+        options.addArguments("no-sandbox");
+
+        driver = new ChromeDriver(options);
+        driver.get("http://127.0.0.1:9292/");
+        driver.manage().window().maximize();
+        WebDriverWait wait = new WebDriverWait(driver, 100);
+
+        try {
+            //navbar-brand and upload-nav when clicked just stay in the homepage
+            By navbar_class = By.className("navbar-brand");
+            WebElement navbar_icon = wait.until(ExpectedConditions.visibilityOfElementLocated(navbar_class));
+            navbar_icon.click();
+
+            By upload__id = By.linkText("My Files");
+            WebElement upload_icon = wait.until(ExpectedConditions.visibilityOfElementLocated(upload__id));
+            upload_icon.click();
+
+            By templates_id = By.linkText("My Templates");
+            WebElement templates_icon = wait.until(ExpectedConditions.visibilityOfElementLocated(templates_id));
+            templates_icon.click();
+
+            String text_template = "My Saved Templates";
+            By saved_template_classname = By.className("my_saved_template_title");
+            WebElement template_title = wait.until(ExpectedConditions.visibilityOfElementLocated(saved_template_classname));
+            assertTrue("Failed, couldn't find My Templates page", text_template.equals(template_title.getText()));
+            driver.navigate().back();
+
+            By about_id = By.linkText("About");
+            WebElement about_icon = wait.until(ExpectedConditions.visibilityOfElementLocated(about_id));
+            about_icon.click();
+
+            String about_title = "About Tabula";
+            By abouttabula_classname = By.className("abouttabula");
+            WebElement abouttabula = wait.until(ExpectedConditions.visibilityOfElementLocated(abouttabula_classname));
+            assertTrue("Failed, couldn't find About page", about_title.equals(abouttabula.getText()));
+            driver.navigate().back();
+
+            By help_id = By.linkText("Help");
+            WebElement help_icon = wait.until(ExpectedConditions.visibilityOfElementLocated(help_id));
+            help_icon.click();
+
+            String help_title = "How to Use Tabula";
+            By helptabula_id = By.id("tabulahelp");
+            WebElement helptabula = wait.until(ExpectedConditions.visibilityOfElementLocated(helptabula_id));
+            assertTrue("Failed, couldn't find Help page", help_title.equals(helptabula.getText()));
+            driver.navigate().back();
+
+            By source_code_id = By.linkText("Source Code");
+            WebElement source_code_icon = wait.until(ExpectedConditions.elementToBeClickable(source_code_id));
+            source_code_icon.click();
+
+            String github_url = "https://github.com/tabulapdf/tabula";
+            driver.manage().timeouts().pageLoadTimeout(150, TimeUnit.SECONDS);
+            assertTrue("Failed, couldn't find Tabula's GitHub page", driver.getCurrentUrl().equals(github_url));
+            driver.navigate().back();
+
+            //Test of home page's media links located in the bottom of the page
+            By tabulatwt_classname = By.linkText("@TabulaPDF");
+            WebElement tabula_twitter_icon = wait.until(ExpectedConditions.elementToBeClickable(tabulatwt_classname));
+            tabula_twitter_icon.click();
+            String tabula_twitter_url = "https://twitter.com/tabulapdf?lang=en";
+            driver.manage().timeouts().pageLoadTimeout(150, TimeUnit.SECONDS);
+            assertTrue("Failed, couldn't find Tabula's Twitter page", driver.getCurrentUrl().equals(tabula_twitter_url));
+            driver.navigate().back();
+
+            // https://tabula.technology's url is hard to check because of network issues causing it to not
+            // consistently load the page without a warning
+
+            By tabulapdfoc_classname = By.linkText("Tabulapdf");
+            WebElement tabulapdfoc_icon = wait.until(ExpectedConditions.elementToBeClickable(tabulapdfoc_classname));
+            tabulapdfoc_icon.click();
+            String tabulapdfoc_url = "https://opencollective.com/tabulapdf";
+            driver.manage().timeouts().pageLoadTimeout(200, TimeUnit.SECONDS);
+            assertTrue("Failed, couldn't find Tabula's Opencollective page", driver.getCurrentUrl().equals(tabulapdfoc_url));
+            driver.navigate().back();
+
+            //Checking for smaller links located in How to use Tabula steps in the home page, but not the links
+            // for templates or the help page
+            By libreoffice_text = By.linkText("LibreOffice Calc");
+            WebElement libreoffice_link = wait.until(ExpectedConditions.elementToBeClickable(libreoffice_text));
+            libreoffice_link.click();
+            String libreoffice_url = "https://www.libreoffice.org/discover/calc/";
+            driver.manage().timeouts().pageLoadTimeout(200, TimeUnit.SECONDS);
+            assertTrue("Failed, couldn't find LibreOffice Calc page", driver.getCurrentUrl().equals(libreoffice_url));
+            driver.navigate().back();
+
+            //Checking Browse button, which will open up File Explorer
+            By input_btn = By.className("input-group-btn");
+            WebElement input_browser = wait.until(ExpectedConditions.elementToBeClickable(input_btn));
+            input_browser.click();
+            Thread.sleep(1000);
+
+        }catch(Exception e){
+            System.out.print(e); }
+    }
+    //whether the test case passes or not, the instance of the browser will close
+    @After
+    public void TearDown(){
+        driver.quit();
+    }
+}
diff --git a/src/test/java/TestImageBasedPDFs.java b/src/test/java/TestImageBasedPDFs.java
new file mode 100644
index 000000000..7d4cf3344
--- /dev/null
+++ b/src/test/java/TestImageBasedPDFs.java
@@ -0,0 +1,90 @@
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import org.openqa.selenium.By;
+import org.openqa.selenium.WebDriver;
+import org.openqa.selenium.WebElement;
+import org.openqa.selenium.chrome.ChromeDriver;
+import org.openqa.selenium.chrome.ChromeOptions;
+import org.openqa.selenium.support.ui.ExpectedConditions;
+import org.openqa.selenium.support.ui.WebDriverWait;
+
+import java.util.concurrent.TimeUnit;
+//TestImageBasedPDFs contains 3 different test cases that attempt to upload 3 different types of pdf files that contain
+// an image of some sort.
+//Test cases in this file: Test4BuckCAPPart2PDF, TestAllenCSAtablePDF, and TestCliffsidePDF
+//@author SM; 4/21/18
+public class TestImageBasedPDFs {
+    private WebDriver driver;
+    private String Tabula_url = "http://127.0.0.1:9292/";
+
+    @Before
+    public void Setup() {
+        System.setProperty("webdriver.chrome.driver", "/usr/local/bin/chromedriver");
+        ChromeOptions options = new ChromeOptions();
+        options.addArguments("headless");
+        options.addArguments("no-sandbox");
+
+        //set up of chromdriver and navigation to the url, as well as uploading of the pdf file
+        driver = new ChromeDriver(options);
+        driver.get(Tabula_url);
+        driver.manage().window().maximize();
+
+    }
+    @Test
+    public void Test4BuckCAPPart2PDF(){
+        try {
+            //Attempts to upload pdf file
+            WebDriverWait wait = new WebDriverWait(driver, 500);
+            String filePath = System.getProperty("user.dir") + "/src/test/pdf/4._Buck_CAP_Part_2_Appx_A_partial.pdf";
+            WebElement chooseFile = driver.findElement(By.id("file"));
+            chooseFile.sendKeys(filePath);//sends pdf path location
+            WebElement import_btn = wait.until(ExpectedConditions.elementToBeClickable(driver.findElement(By.id("import_file"))));
+            import_btn.click();
+            Thread.sleep(15000);
+            driver.manage().timeouts().pageLoadTimeout(1500, TimeUnit.SECONDS);
+            driver.switchTo().alert().accept(); //accept error pop-up window
+            Thread.sleep(1000);
+        }
+        catch (Exception e){}
+    }
+    @Test
+    public void TestAllenCSAtablePDF(){
+        try {
+            //Attempts to upload pdf file
+            WebDriverWait wait = new WebDriverWait(driver, 500);
+            String filePath = System.getProperty("user.dir") + "/src/test/pdf/Allen_CSA_table_6-9_gradients.pdf";
+            WebElement chooseFile = driver.findElement(By.id("file"));
+            chooseFile.sendKeys(filePath); //sends pdf path location
+            WebElement import_btn = wait.until(ExpectedConditions.elementToBeClickable(driver.findElement(By.id("import_file"))));
+            import_btn.click();
+            Thread.sleep(15000);
+            driver.manage().timeouts().pageLoadTimeout(1500, TimeUnit.SECONDS);
+            driver.switchTo().alert().accept(); //accept error pop-up window
+            Thread.sleep(1000);
+        }
+        catch(Exception e){}
+    }
+    @Test
+    public void TestCliffsidePDF(){
+        try {
+            //Attempts to upload pdf file
+            WebDriverWait wait = new WebDriverWait(driver, 500);
+            String filePath = System.getProperty("user.dir") + "/src/test/pdf/Cliffside_CSA_Report_NCDENR_Submittal.pdf";
+            WebElement chooseFile = driver.findElement(By.id("file"));
+            chooseFile.sendKeys(filePath); //sends pdf path location
+            WebElement import_btn = wait.until(ExpectedConditions.elementToBeClickable(driver.findElement(By.id("import_file"))));
+            import_btn.click();
+            Thread.sleep(15000);
+            driver.manage().timeouts().pageLoadTimeout(1500, TimeUnit.SECONDS);
+            driver.switchTo().alert().accept(); //accept error pop-up window
+            Thread.sleep(1000);
+        }
+        catch(Exception e){}
+    }
+    @After
+    public void TearDown(){
+        //navigates back and deletes the pdf utilized
+        driver.quit();
+    }
+}
diff --git a/src/test/java/TestMecklenburgMajority.java b/src/test/java/TestMecklenburgMajority.java
new file mode 100644
index 000000000..9a6c4d510
--- /dev/null
+++ b/src/test/java/TestMecklenburgMajority.java
@@ -0,0 +1,337 @@
+import org.junit.AfterClass;
+import org.junit.BeforeClass;
+import org.junit.Test;
+import org.openqa.selenium.By;
+import org.openqa.selenium.WebDriver;
+import org.openqa.selenium.WebElement;
+import org.openqa.selenium.chrome.ChromeDriver;
+import org.openqa.selenium.chrome.ChromeOptions;
+import org.openqa.selenium.support.ui.ExpectedConditions;
+import org.openqa.selenium.support.ui.WebDriverWait;
+
+import java.util.List;
+
+import static junit.framework.TestCase.assertTrue;
+//Test of the Mecklenburg.Majority pdf file, it will go through various user scenarios to test the functionality of the regex
+// implementation (spanning pages, multiple search results, inclusive and non-inclusive, and overlap)
+// @author SM modified: 4/28/18
+
+public class TestMecklenburgMajority {
+    //Test of the Mecklenburg.Majority pdf file.
+    private static WebDriver driver;
+    private static String Tabula_url = "http://127.0.0.1:9292/";
+    private WebDriverWait wait = new WebDriverWait(driver, 100);
+
+    //will continue to refresh the page until it sees one of the buttons appear in the menu option of the extraction page
+    private void PageRefresh() throws InterruptedException {
+        //menu options did not fully load
+        Thread.sleep(1000);
+        //refresh the page
+        while(driver.findElements( By.id("restore-detected-tables")).size() == 0) {
+            driver.navigate().refresh();
+            Thread.sleep(700);
+        }
+    }
+    //will navigate and wait for the data to appear in the preview and export data page
+    private void PreviewandExportDatapg(){
+        By previewandexport_id = By.id("all-data");
+        WebElement previewandexport_button = wait.until(ExpectedConditions.visibilityOfElementLocated(previewandexport_id));
+        previewandexport_button.click();
+        wait.until(ExpectedConditions.visibilityOfElementLocated(By.className("detection-row")));
+    }
+    //will wait for the regex button to become clickable and then click the regex button
+    private void ClickRegexButton() throws InterruptedException {
+        By regex_search_id = By.id("regex-search");
+        WebElement regex_button = new WebDriverWait(driver, 30).until(ExpectedConditions.
+                elementToBeClickable(regex_search_id));
+        regex_button.click();
+        Thread.sleep(800);
+    }
+    //send regex inputs to the corresponding pattern type
+    private void PatternInputStrings(String pattern_before, String pattern_after){
+        By pattern_before_input = By.id("pattern_before");
+        By pattern_after_input = By.id("pattern_after");
+        driver.findElement(pattern_before_input).sendKeys(pattern_before);
+        driver.findElement(pattern_after_input).sendKeys(pattern_after);
+    }
+    //send corresponding info of inclusive to the pattern type
+    private void InclusiveButtons(boolean patternbefore, boolean patternafter){
+        WebElement inclusive_before_btn = new WebDriverWait(driver, 30).
+                until(ExpectedConditions.elementToBeClickable(driver.findElement(By.id("include_pattern_before"))));
+        WebElement inclusive_after_btn = new WebDriverWait(driver, 30).
+                until(ExpectedConditions.elementToBeClickable(driver.findElement(By.id("include_pattern_after"))));
+        if (patternbefore){
+            inclusive_before_btn.click(); }
+        if(patternafter){
+            inclusive_after_btn.click(); }
+    }
+    //go on and upload the pdf file
+    private void UploadPDF() throws InterruptedException {
+        String filePath = System.getProperty("user.dir") + "/src/test/pdf/Mecklenburg.Majority.pdf";
+        WebElement chooseFile = driver.findElement(By.id("file"));
+        chooseFile.sendKeys(filePath);
+        Thread.sleep(1000);
+        WebElement import_btn = driver.findElement(By.id("import_file"));
+        import_btn.click();
+        Thread.sleep(5000);
+        wait.until(ExpectedConditions.elementToBeClickable(By.id("restore-detected-tables")));
+    }
+    //delete the pdf file
+    private void DeletePDF(){
+        //navigates back and deletes the pdf utilized
+        driver.findElement(By.id("delete_pdf")).click();
+        driver.switchTo().alert().accept();
+    }
+    //instantiation of Tabula
+    @BeforeClass
+    public static void SetUp(){
+        //set up of chromdriver and navigation to the url, as well as uploading of the pdf file
+        System.setProperty("webdriver.chrome.driver","/usr/local/bin/chromedriver");
+        ChromeOptions options = new ChromeOptions();
+        options.addArguments("headless");
+        options.addArguments("no-sandbox");
+
+        driver = new ChromeDriver(options);
+        driver.get(Tabula_url);
+        driver.manage().window().maximize();
+    }
+    //test of 2 different instances of inputting regex to get a multi spanning table
+    @Test
+    public void TestMultiPageTables() {
+        try {
+            UploadPDF();
+            PageRefresh();
+            //Test of regex input with inclusive for pattern before for a table of 3 pages in length
+            PatternInputStrings("16", "Q38:");
+            InclusiveButtons(true, false);
+            ClickRegexButton();
+            wait.until(ExpectedConditions.visibilityOfElementLocated(By.className("regex-result")));
+            //Confirm search found
+            String result = driver.findElement(By.xpath(".//*[@class='regex-results-table']//td[contains(.,'16')]")).getText();
+            Boolean regex_result;
+            if (result.equals("16")) {
+                regex_result = true;
+            } //if true, there are zero matches
+            else {
+                regex_result = false;
+            }
+            PreviewandExportDatapg();
+            //verify data extraction
+            String result_data = driver.findElement(By.xpath(".//*[@id='extracted-table']//td[contains(.,'11/5/2016')]")).getText();
+            Boolean regex_data;
+            if (result_data.equals("11/5/2016")) {
+                regex_data = true;
+            } else {
+                regex_data = false;
+            }
+            String result_data2 = driver.findElement(By.xpath(".//*[@id='extracted-table']//td[contains(.,'PAGE 8: Privately Owned Site (Site #2)')]")).getText();
+            Boolean regex_data2;
+            if (result_data2.equals("PAGE 8: Privately Owned Site (Site #2)")) {
+                regex_data2 = true;
+            } else {
+                regex_data2 = false;
+            }
+            Boolean final_results;
+            if (regex_result && regex_data && regex_data2) {
+                final_results = true;
+            } else {
+                final_results = false;
+            }
+            assertTrue("Failed, regex found no match for inclusive input for pattern before for a 3 page length table"
+                    , final_results);
+            driver.navigate().refresh();
+            PageRefresh();
+
+            //Test of regex input with inclusive for pattern after for a table of 8 pages in length
+            PatternInputStrings("Q1:", "Q41:");
+            ClickRegexButton();
+            wait.until(ExpectedConditions.visibilityOfElementLocated(By.className("regex-result")));
+            String result3 = driver.findElement(By.xpath(".//*[@class='regex-results-table']//td[contains(.,'1')]")).getText();
+            Boolean regex_result3;
+            if (result3.equals("Q1:")) {
+                regex_result3 = true;
+            } //if true, there are zero matches
+            else {
+                regex_result3 = false;
+            }
+            PreviewandExportDatapg();
+            String result_data5 = driver.findElement(By.xpath(".//*[@id='extracted-table']//td[contains(.,'Q2: Please select the type of voting system')]")).getText();
+            Boolean regex_data5;
+            if (result_data5.equals("Q2: Please select the type of voting system used at one- Touchscreen machines")) {
+                regex_data5 = true;
+            } else {
+                regex_data5 = false;
+            }
+            String result_data6 = driver.findElement(By.xpath(".//*[@id='extracted-table']//td[contains(.,'One-stop Implementation Plans')]")).getText();
+            Boolean regex_data6;
+            if (result_data6.equals("One-stop Implementation Plans")) {
+                regex_data6 = true;
+            } else {
+                regex_data6 = false;
+            }
+            Boolean final_results3;
+            if (regex_result3 && regex_data5 && regex_data6) {
+                final_results3 = true;
+            } else {
+                final_results3 = false;
+            }
+            assertTrue("Failed, Tabula found no match for a multi page table spanning more than 5 pages", final_results3);
+
+            driver.navigate().back();
+            driver.navigate().back();
+            Thread.sleep(500);
+            DeletePDF();
+            }catch (Exception e){
+                System.out.print(e);
+            }
+        }
+    //test of 3 different instances of inputting regex searches with 3 different types of inclusive combinations to
+    // get multiple regex results
+    @Test
+    public void TestInclusivePatternswithRegexSearches() {
+        try{
+            UploadPDF();
+            PageRefresh();
+
+            //Tests for inclusive for pattern before and non-inclusive for pattern after
+            PatternInputStrings("Q","Q");
+            InclusiveButtons(true, false);
+            ClickRegexButton();
+            wait.until(ExpectedConditions.visibilityOfElementLocated(By.className("regex-result")));
+            String result = driver.findElement(By.xpath(".//*[@class='regex-results-table']//td[contains(.,'172')]")).getText();
+            Boolean regex_result;
+            if(result.equals("172")){ regex_result = true;} //if true, there are zero matches
+            else{ regex_result = false;}
+            PreviewandExportDatapg();
+            String result_data = driver.findElement(By.xpath(".//*[@id='extracted-table']//td[contains(.," +
+                    "'Q1: Please select your county.')]")).getText();
+            Boolean regex_data;
+            if(result_data.equals("Q1: Please select your county.")){ regex_data = true;}
+            else{ regex_data = false;}
+            Thread.sleep(600);
+            String result_data2 = driver.findElement(By.xpath(".//*[@id='extracted-table']//td[contains(.,'Q343: Street Address')]")).getText();
+            Boolean regex_data2;
+            if(result_data2.equals("Q343: Street Address")){ regex_data2 = true;}
+            else{ regex_data2 = false;}
+            Boolean final_results;
+            if(regex_result && regex_data && regex_data2){ final_results = true;}
+            else{final_results = false;}
+            assertTrue("Failed, Tabula found no match for inclusive for pattern before and non-inclusive for " +
+                        "pattern after", final_results);
+            driver.navigate().refresh();
+            PageRefresh();
+
+            //Tests for non-inclusive for pattern before and inclusive for pattern after
+            PatternInputStrings("PAGE", "PAGE");
+            InclusiveButtons(false, true);
+            ClickRegexButton();
+            wait.until(ExpectedConditions.visibilityOfElementLocated(By.className("regex-result")));
+            String result2 = driver.findElement(By.xpath(".//*[@class='regex-results-table']//td[contains(.,'35')]")).getText();
+            Boolean regex_result3;
+            if(result2.equals("35")){ regex_result3 = true;} //if true, there are zero matches
+            else{ regex_result3 = false;}
+            PreviewandExportDatapg();
+            String result_data3 = driver.findElement(By.xpath(".//*[@id='extracted-table']//td[contains(.," +
+                    "'Q1: Please select your county.')]")).getText();
+            Boolean regex_data3;
+            if(result_data3.equals("Q1: Please select your county.")){ regex_data3 = true;}
+            else{ regex_data3 = false;}
+            Thread.sleep(1000);
+            String result_data4 = driver.findElement(By.xpath(".//*[@id='extracted-table']//td[contains(.," +
+                    "'PAGE 70: Additional Site Information (Site #23)')]")).getText();
+            Boolean regex_data4;
+            if(result_data4.equals("PAGE 70: Additional Site Information (Site #23)")){ regex_data4 = true;}
+            else{ regex_data4 = false;}
+            Boolean final_results2;
+            if(regex_result3 && regex_data3 && regex_data4){ final_results2 = true;}
+            else{final_results2 = false;}
+            assertTrue("Failed, Tabula found no match for inclusive for pattern after and non-inclusive for " +
+                    "pattern before", final_results2);
+            driver.navigate().refresh();
+            PageRefresh();
+
+            //Tests for inclusive for pattern before and for pattern after
+            PatternInputStrings("ADA","Number of curbside");
+            InclusiveButtons(true, true);
+            ClickRegexButton();
+            wait.until(ExpectedConditions.visibilityOfElementLocated(By.className("regex-result")));
+            String result3 = driver.findElement(By.xpath(".//*[@class='regex-results-table']//td[contains(.,'22')]")).getText();
+            Boolean regex_result4;
+            if(result3.equals("22")){ regex_result4 = true;} //if true, there are zero matches
+            else{ regex_result4 = false;}
+            PreviewandExportDatapg();
+            String result_data5 = driver.findElement(By.xpath(".//*[@id='extracted-table']//td[contains(.,'Non-ADA-accessible IvoTronics')]")).getText();
+            Boolean regex_data5;
+            if(result_data5.equals("Non-ADA-accessible IvoTronics")){ regex_data5 = true;}
+            else{ regex_data5 = false;}
+            Thread.sleep(700);
+            String result_data6 = driver.findElement(By.xpath(".//*[@id='extracted-table']//td[contains(.,'Number of curbside voting spots.')]")).getText();
+            Boolean regex_data6;
+            if(result_data6.equals("Number of curbside voting spots.")){ regex_data6 = true;}
+            else{ regex_data6 = false;}
+            Boolean final_results3;
+            if(regex_result4 && regex_data5 && regex_data6){ final_results3 = true;}
+            else{final_results3 = false;}
+            assertTrue("Failed, Tabula found no match for inclusive for pattern after and inclusive for " +
+                    "pattern before", final_results3);
+            driver.navigate().back();
+            driver.navigate().back();
+            Thread.sleep(500);
+            DeletePDF();
+            }catch(Exception e){
+                System.out.print(e);
+            }
+    }
+    //test of an overlapping instance where it checks that there is only one regex result after attempting an overlap
+    @Test
+    public void TestOverlapRegexSearch() {
+        try{
+            //Test for overlapping regex searches
+            UploadPDF();
+            PageRefresh();
+
+            PatternInputStrings("Q1", "Q24");
+            InclusiveButtons(true, false);
+            ClickRegexButton();
+            wait.until(ExpectedConditions.visibilityOfElementLocated(By.className("regex-result")));
+            PatternInputStrings("Q20", "Q22");
+            InclusiveButtons(false, true);
+            ClickRegexButton();
+            Thread.sleep(5000);
+            driver.switchTo().alert().accept(); //accept error pop-up window
+            //Checks that there is only one regex result, since it shouldn't had allowed for 2 results to appear since the
+            // 2nd one causes an overlap
+            Thread.sleep(2000);
+            List regex_rows = driver.findElements(By.className("regex-result"));
+            int regex_count = regex_rows.size();
+            int regex_count1 = 1;
+            assertTrue("Failed, Tabula found more than one match for an overlap regex search", (regex_count1 == regex_count ));
+            PreviewandExportDatapg();
+            String result_data = driver.findElement(By.xpath(".//*[@id='extracted-table']//td[contains(.," +
+                    "'Q19: Please check all that apply:')]")).getText();
+            Boolean regex_data;
+            if (result_data.equals("Q19: Please check all that apply:")) { regex_data = true;
+            } else { regex_data = false; }
+            String result_data2 = driver.findElement(By.xpath(".//*[@id='extracted-table']//td[contains(.," +
+                    "'Q239: Suite/Room Name')]")).getText();
+            Boolean regex_data2;
+            if (result_data2.equals("Q239: Suite/Room Name")) { regex_data2 = true;
+            } else { regex_data2 = false; }
+            Boolean final_results;
+            if (regex_data && regex_data2) { final_results = true;
+            } else { final_results = false; }
+            assertTrue("Failed, Tabula found no match for the multi-page table", final_results);
+            driver.navigate().back();
+            driver.navigate().back();
+            Thread.sleep(500);
+            DeletePDF();
+            }catch (Exception e){
+                System.out.print(e);
+            }
+    }
+    @AfterClass
+    public static void TearDown(){
+        driver.quit();
+        }
+    }
+
diff --git a/src/test/java/TestMyTemplatesPage.java b/src/test/java/TestMyTemplatesPage.java
new file mode 100644
index 000000000..b2b86a6be
--- /dev/null
+++ b/src/test/java/TestMyTemplatesPage.java
@@ -0,0 +1,76 @@
+import org.junit.After;
+import org.junit.Test;
+import org.openqa.selenium.By;
+import org.openqa.selenium.WebDriver;
+import org.openqa.selenium.WebElement;
+import org.openqa.selenium.chrome.ChromeDriver;
+import org.openqa.selenium.chrome.ChromeOptions;
+import org.openqa.selenium.support.ui.ExpectedConditions;
+import org.openqa.selenium.support.ui.WebDriverWait;
+
+import static junit.framework.TestCase.assertTrue;
+
+// Test of Tabula's My Templates' page and it's associating links. It clicks through the navigating links and the
+//  browsing button. Additionally, the media menu is not tested for since it is already tested in TestHomePage.
+//  @author SM modified: 2/23/18
+public class TestMyTemplatesPage {
+    WebDriver driver;
+    @Test
+    public void startWebDriver(){
+        System.setProperty("webdriver.chrome.driver","/usr/local/bin/chromedriver");
+        ChromeOptions options = new ChromeOptions();
+        options.addArguments("headless");
+        options.addArguments("no-sandbox");
+
+        driver = new ChromeDriver(options);
+        driver.get("http://127.0.0.1:9292/");
+        driver.manage().window().maximize();
+        WebDriverWait wait = new WebDriverWait(driver, 100);
+        try{
+            //navigates to the My Templates tab from the homepage tab
+            By templates_id = By.linkText("My Templates");
+            WebElement templates_icon = wait.until(ExpectedConditions.visibilityOfElementLocated(templates_id));
+            templates_icon.click();
+            WebElement templates_icon2 = wait.until(ExpectedConditions.visibilityOfElementLocated(templates_id));
+            templates_icon2.click();
+            String text_template = "My Saved Templates";
+            By saved_template_classname = By.className("my_saved_template_title");
+            WebElement template_title = wait.until(ExpectedConditions.visibilityOfElementLocated(saved_template_classname));
+            assertTrue("Failed, couldn't find My Templates page", text_template.equals(template_title.getText()));
+
+            //checks links and browsing button
+            By upload_text = By.linkText("upload a file");
+            WebElement upload_link = wait.until(ExpectedConditions.visibilityOfElementLocated(upload_text));
+            upload_link.click();
+            String homepagecheck = "First time using Tabula? Welcome!";
+            By welcome_id = By.id("welcome_title");
+            WebElement welcome = wait.until(ExpectedConditions.visibilityOfElementLocated(welcome_id));
+            assertTrue("Failed, couldn't find My Upload a file in the Home page", homepagecheck.equals(welcome.getText()));
+            driver.navigate().back();
+
+            By myfiles_text = By.linkText("My Files");
+            WebElement myfiles_link = wait.until(ExpectedConditions.visibilityOfElementLocated(myfiles_text));
+            myfiles_link.click();
+            By welcome_id2 = By.id("welcome_title");
+            WebElement welcome2 = wait.until(ExpectedConditions.visibilityOfElementLocated(welcome_id2));
+            assertTrue("Failed, couldn't find My Upload a file in the Home page", homepagecheck.equals(welcome2.getText()));
+            driver.navigate().back();
+
+            //Checking Browse button, which will open up File Explorer
+            By input_btn = By.className("input-group-btn");
+            WebElement input_browser = wait.until(ExpectedConditions.elementToBeClickable(input_btn));
+            input_browser.click();
+            //utilizing thread.sleep() to give enough time for the file explorer to display correctly. 
+            Thread.sleep(1000);
+
+        }catch(Exception e){
+            System.out.print("TestMyTemplatesPage failed.");
+            System.out.print(e);
+        }
+    }
+        //whether the test case passes or not, the instance of the browser will close
+    @After
+    public void TearDown(){
+        driver.quit();
+    }
+}
diff --git a/src/test/java/TestNCHouse2017StatPack.java b/src/test/java/TestNCHouse2017StatPack.java
new file mode 100644
index 000000000..0c322249f
--- /dev/null
+++ b/src/test/java/TestNCHouse2017StatPack.java
@@ -0,0 +1,302 @@
+import org.junit.AfterClass;
+import org.junit.BeforeClass;
+import org.junit.Test;
+import org.openqa.selenium.By;
+import org.openqa.selenium.WebDriver;
+import org.openqa.selenium.WebElement;
+import org.openqa.selenium.chrome.ChromeDriver;
+import org.openqa.selenium.chrome.ChromeOptions;
+import org.openqa.selenium.support.ui.ExpectedConditions;
+import org.openqa.selenium.support.ui.WebDriverWait;
+
+import java.util.List;
+
+import static junit.framework.TestCase.assertTrue;
+
+//Test of the NCHouse2017StatPack pdf file, it will go through various user scenarios to test the functionality of the regex
+// implementation (spanning pages, multiple search results, inclusive and non-inclusive, and overlap)
+// @author SM modified: 4/28/18
+
+public class TestNCHouse2017StatPack {
+    private static WebDriver driver;
+    private static String Tabula_url = "http://127.0.0.1:9292/";
+    private WebDriverWait wait = new WebDriverWait(driver, 500);
+
+    //will continue to refresh the page until it sees one of the buttons appear in the menu option of the extraction page
+    private void PageRefresh() throws InterruptedException {
+        //menu options did not fully load
+        Thread.sleep(1000);
+        //refresh the page
+        while(driver.findElements( By.id("restore-detected-tables")).size() == 0) {
+            driver.navigate().refresh();
+            Thread.sleep(700);
+        }
+    }
+    //will navigate and wait for the data to appear in the preview and export data page
+    private void PreviewandExportDatapg(){
+        By previewandexport_id = By.id("all-data");
+        WebElement previewandexport_button = wait.until(ExpectedConditions.visibilityOfElementLocated(previewandexport_id));
+        previewandexport_button.click();
+        wait.until(ExpectedConditions.visibilityOfElementLocated(By.className("detection-row")));
+    }
+    //will wait for the regex button to become clickable and then click the regex button
+    private void ClickRegexButton() throws InterruptedException {
+        By regex_search_id = By.id("regex-search");
+        WebElement regex_button = new WebDriverWait(driver, 30).until(ExpectedConditions.
+                elementToBeClickable(regex_search_id));
+        regex_button.click();
+        Thread.sleep(800);
+    }
+    //send regex inputs to the corresponding pattern type
+    private void PatternInputStrings(String pattern_before, String pattern_after){
+        By pattern_before_input = By.id("pattern_before");
+        By pattern_after_input = By.id("pattern_after");
+        driver.findElement(pattern_before_input).sendKeys(pattern_before);
+        driver.findElement(pattern_after_input).sendKeys(pattern_after);
+    }
+    //send corresponding info of inclusive to the pattern type
+    private void InclusiveButtons(boolean patternbefore, boolean patternafter){
+        WebElement inclusive_before_btn = new WebDriverWait(driver, 30).
+                until(ExpectedConditions.elementToBeClickable(driver.findElement(By.id("include_pattern_before"))));
+        WebElement inclusive_after_btn = new WebDriverWait(driver, 30).
+                until(ExpectedConditions.elementToBeClickable(driver.findElement(By.id("include_pattern_after"))));
+        if (patternbefore){
+            inclusive_before_btn.click(); }
+        if(patternafter){
+            inclusive_after_btn.click(); }
+    }
+    //go on and upload the pdf file
+    private void UploadPDF() throws InterruptedException {
+        String filePath = System.getProperty("user.dir") + "/src/test/pdf/NC_HOUSE_2017_Stat_Pack_8.21.17.pdf";
+        WebElement chooseFile = driver.findElement(By.id("file"));
+        chooseFile.sendKeys(filePath);
+        Thread.sleep(1000);
+        WebElement import_btn = driver.findElement(By.id("import_file"));
+        import_btn.click();
+        Thread.sleep(5000);
+        wait.until(ExpectedConditions.elementToBeClickable(By.id("restore-detected-tables")));
+    }
+    //delete the pdf file
+    private void DeletePDF(){
+        //navigates back and deletes the pdf utilized
+        driver.findElement(By.id("delete_pdf")).click();
+        driver.switchTo().alert().accept();
+    }
+    //instantiation of Tabula
+    @BeforeClass
+    public static void SetUp(){
+        System.setProperty("webdriver.chrome.driver","/usr/local/bin/chromedriver");
+        ChromeOptions options = new ChromeOptions();
+        options.addArguments("headless");
+        options.addArguments("no-sandbox");
+
+        //set up of chromdriver and navigation to the url, as well as uploading of the pdf file
+        driver = new ChromeDriver(options);
+        driver.get(Tabula_url);
+        driver.manage().window().maximize();
+
+    }
+    //test of 3 different instances of inputting regex searches with 3 different types of inclusive combinations to
+    // get multiple regex results
+    @Test
+    public void TestInclusivePatternswithRegexSearches() {
+        try{
+            UploadPDF();
+            PageRefresh();
+
+            //Tests for inclusive for pattern before and non-inclusive for pattern after
+            PatternInputStrings("2017 House Redistricting","69");
+            InclusiveButtons(true, false);
+            ClickRegexButton();
+            wait.until(ExpectedConditions.visibilityOfElementLocated(By.className("regex-result")));
+            // Thread.sleep(5000);
+            String result = driver.findElement(By.xpath(".//*[@class='regex-results-table']//td[contains(.,'14')]")).getText();
+            Boolean regex_result;
+            if(result.equals("14")){ regex_result = true;} //if true, there are zero matches
+            else{ regex_result = false;}
+            PreviewandExportDatapg();
+            String result_data = driver.findElement(By.xpath(".//*[@id='extracted-table']//td[contains(.," +
+                    "'2017 House Redistricting Plan: Population Deviation')]")).getText();
+            Boolean regex_data;
+            if(result_data.equals("2017 House Redistricting Plan: Population Deviation")){ regex_data = true;}
+            else{ regex_data = false;}
+            Thread.sleep(600);
+            String result_data2 = driver.findElement(By.xpath(".//*[@id='extracted-table']//td[contains(.," +
+                    "'District')]")).getText();
+            Boolean regex_data2;
+            if(result_data2.equals("District 2010 Pop")){ regex_data2 = true;}
+            else{ regex_data2 = false;}
+            Boolean final_results;
+            if(regex_result && regex_data && regex_data2){ final_results = true;}
+            else{final_results = false;}
+            assertTrue("Failed, Tabula found no match for inclusive for pattern before and non-inclusive for " +
+                    "pattern after", final_results);
+            driver.navigate().refresh();
+            PageRefresh();
+
+            //Tests for non-inclusive for pattern before and inclusive for pattern after
+            PatternInputStrings("2017 House Redistricting", "69");
+            InclusiveButtons(false, true);
+            ClickRegexButton();
+            wait.until(ExpectedConditions.visibilityOfElementLocated(By.className("regex-result")));
+            String result2 = driver.findElement(By.xpath(".//*[@class='regex-results-table']//td[contains(.,'14')]")).getText();
+            Boolean regex_result3;
+            if(result2.equals("14")){ regex_result3 = true;} //if true, there are zero matches
+            else{ regex_result3 = false;}
+            PreviewandExportDatapg();
+            String result_data3 = driver.findElement(By.xpath(".//*[@id='extracted-table']//td[contains(.," +
+                    "'District')]")).getText();
+            Boolean regex_data3;
+            if(result_data3.equals("District")){ regex_data3 = true;}
+            else{ regex_data3 = false;}
+            Thread.sleep(600);
+            String result_data4 = driver.findElement(By.xpath(".//*[@id='extracted-table']//td[contains(.,'105')]")).getText();
+            Boolean regex_data4;
+            if(result_data4.equals("105")){ regex_data4 = true;}
+            else{ regex_data4 = false;}
+            Boolean final_results2;
+            if(regex_result3 && regex_data3 && regex_data4){ final_results2 = true;}
+            else{final_results2 = false;}
+            assertTrue("Failed, Tabula found no match for inclusive for pattern after and non-inclusive for " +
+                    "pattern before", final_results2);
+            driver.navigate().refresh();
+            PageRefresh();
+
+            //Tests for inclusive for pattern before and for pattern after
+            PatternInputStrings("2017 House Redistricting","69");
+            InclusiveButtons(true, true);
+            ClickRegexButton();
+            wait.until(ExpectedConditions.visibilityOfElementLocated(By.className("regex-result")));
+            String result3 = driver.findElement(By.xpath(".//*[@class='regex-results-table']//td[contains(.,'14')]")).getText();
+            Boolean regex_result4;
+            if(result3.equals("14")){ regex_result4 = true;} //if true, there are zero matches
+            else{ regex_result4 = false;}
+            PreviewandExportDatapg();
+            String result_data5 = driver.findElement(By.xpath(".//*[@id='extracted-table']//td[contains(.," +
+                    "'2017 House Redistricting Plan: Population Deviation')]")).getText();
+            Boolean regex_data5;
+            if(result_data5.equals("2017 House Redistricting Plan: Population Deviation")){ regex_data5 = true;}
+            else{ regex_data5 = false;}
+            Thread.sleep(600);
+            String result_data6 = driver.findElement(By.xpath(".//*[@id='extracted-table']//td[contains(.," +
+                    "'105 22,913 55.44% 17,133 41.45% 1,287 3.11%')]")).getText();
+            Boolean regex_data6;
+            if(result_data6.equals("105 22,913 55.44% 17,133 41.45% 1,287 3.11%")){ regex_data6 = true;}
+            else{ regex_data6 = false;}
+            Boolean final_results3;
+            if(regex_result4 && regex_data5 && regex_data6){ final_results3 = true;}
+            else{final_results3 = false;}
+            assertTrue("Failed, Tabula found no match for inclusive for pattern after and inclusive for " +
+                    "pattern before", final_results3);
+            driver.navigate().back();
+            driver.navigate().back();
+            Thread.sleep(500);
+            DeletePDF();
+        }catch(Exception e){
+            System.out.print(e);
+        }
+    }
+    //test of 2 different instances of inputting regex to get a multi spanning table
+    @Test
+    public void TestMultiPageTables(){
+        try {
+            //Test for a multi spanning page of 2 pages that is found 7 times in the file
+            UploadPDF();
+            PageRefresh();
+
+            PatternInputStrings("District", "District");
+            InclusiveButtons(false, true);
+            ClickRegexButton();
+            wait.until(ExpectedConditions.visibilityOfElementLocated(By.className("regex-result")));
+            String result = driver.findElement(By.xpath(".//*[@class='regex-results-table']//td[contains(.,'7')]")).getText();
+            Boolean regex_result;
+            if (result.equals("7")) {
+                regex_result = true;
+            } //if true, there is a match
+            else {
+                regex_result = false;
+            }
+            PreviewandExportDatapg();
+            String result_data = driver.findElement(By.xpath(".//*[@id='extracted-table']//td[contains(.," +
+                    "'1')]")).getText();
+            Boolean regex_data;
+            if (result_data.equals("1")) {
+                regex_data = true;
+            } else {
+                regex_data = false;
+            }
+            String result_data2 = driver.findElement(By.xpath(".//*[@id='extracted-table']//td[contains(.," +
+                    "'District Rep Rep % Dem Dem % Lib Lib %')]")).getText();
+            Boolean regex_data2;
+            if (result_data2.equals("District Rep Rep % Dem Dem % Lib Lib % Write-In Write-In %")) {
+                regex_data2 = true;
+            } else {
+                regex_data2 = false;
+            }
+            Boolean final_results;
+            if (regex_result && regex_data && regex_data2) {
+                final_results = true;
+            } else {
+                final_results = false;
+            }
+            assertTrue("Failed, Tabula found no match for the multi-page table", final_results);
+
+            driver.navigate().back();
+            driver.navigate().back();
+            Thread.sleep(500);
+            DeletePDF();
+        }catch (Exception e){
+            System.out.print(e);
+        }
+    }
+    //test of an overlapping instance where it checks that there is only one regex result after attempting an overlap
+    @Test
+    public void TestOverlapRegexSearch() {
+        try{
+            //Test for overlapping regex searches
+            UploadPDF();
+            PageRefresh();
+
+            PatternInputStrings("District", "Total");
+            ClickRegexButton();
+            Thread.sleep(5000);
+            PatternInputStrings("2017 House", "District");
+            InclusiveButtons(false, true);
+            ClickRegexButton();
+            Thread.sleep(5000);
+            driver.switchTo().alert().accept(); //accept error pop-up window
+            //Checks that there is only one regex result, since it shouldn't had allowed for 2 results to appear since the
+            // 2nd one causes an overlap
+            Thread.sleep(2000);
+            List regex_rows = driver.findElements(By.className("regex-result"));
+            int regex_count = regex_rows.size();
+            int regex_count1 = 1;
+            assertTrue("Failed, Tabula found more than one match for an overlap regex search",
+                    (regex_count1 == regex_count ));
+            PreviewandExportDatapg();
+            String result_data = driver.findElement(By.xpath(".//*[@id='extracted-table']//td[contains(.," +
+                    "'83')]")).getText();
+            Boolean regex_data;
+            if (result_data.equals("83")) { regex_data = true;
+            } else { regex_data = false; }
+            String result_data2 = driver.findElement(By.xpath(".//*[@id='extracted-table']//td[contains(.,'120')]")).getText();
+            Boolean regex_data2;
+            if (result_data2.equals("120")) { regex_data2 = true;
+            } else { regex_data2 = false; }
+            Boolean final_results;
+            if (regex_data && regex_data2) { final_results = true;
+            } else { final_results = false; }
+            assertTrue("Failed, Tabula found no match for the multi-page table", final_results);
+            driver.navigate().back();
+            driver.navigate().back();
+            Thread.sleep(500);
+            DeletePDF();
+        }catch (Exception e){
+            System.out.print(e);
+        }
+    }
+    @AfterClass
+    public static void TearDown(){
+        driver.quit();
+    }
+}
diff --git a/src/test/java/TestOneStopVotingSiteListNov2012.java b/src/test/java/TestOneStopVotingSiteListNov2012.java
new file mode 100644
index 000000000..bd7963464
--- /dev/null
+++ b/src/test/java/TestOneStopVotingSiteListNov2012.java
@@ -0,0 +1,345 @@
+import org.junit.AfterClass;
+import org.junit.BeforeClass;
+import org.junit.Test;
+import org.openqa.selenium.By;
+import org.openqa.selenium.WebDriver;
+import org.openqa.selenium.WebElement;
+import org.openqa.selenium.chrome.ChromeDriver;
+import org.openqa.selenium.chrome.ChromeOptions;
+import org.openqa.selenium.support.ui.ExpectedConditions;
+import org.openqa.selenium.support.ui.WebDriverWait;
+
+import java.util.List;
+
+import static junit.framework.TestCase.assertTrue;
+
+//Test of the OneStopVotingSiteListNov2012 pdf file, it will go through various user scenarios to test the functionality of the regex
+// implementation (spanning pages, multiple search results, inclusive and non-inclusive, and overlap)
+// @author SM modified: 4/28/18
+
+public class TestOneStopVotingSiteListNov2012 {
+    private static WebDriver driver;
+    private static String Tabula_url = "http://127.0.0.1:9292/";
+    private WebDriverWait wait = new WebDriverWait(driver, 500);
+
+    //will continue to refresh the page until it sees one of the buttons appear inthe menu option of the extraction page
+    private void PageRefresh() throws InterruptedException {
+        //menu options did not fully load
+        Thread.sleep(1000);
+        //refresh the page
+        while(driver.findElements( By.id("restore-detected-tables")).size() == 0) {
+            driver.navigate().refresh();
+            Thread.sleep(700);
+        }
+    }
+    //will navigate and wait for the data to appear in the preview and export data page
+    private void PreviewandExportDatapg(){
+        By previewandexport_id = By.id("all-data");
+        WebElement previewandexport_button = wait.until(ExpectedConditions.visibilityOfElementLocated(previewandexport_id));
+        previewandexport_button.click();
+        wait.until(ExpectedConditions.visibilityOfElementLocated(By.className("detection-row")));
+    }
+    //will wait for the regex button to become clickable and then click the regex button
+    private void ClickRegexButton() throws InterruptedException {
+        By regex_search_id = By.id("regex-search");
+        WebElement regex_button = wait.until(ExpectedConditions.elementToBeClickable(regex_search_id));
+        regex_button.click();
+        Thread.sleep(500);
+    }
+    //send regex inputs to the corresponding pattern type
+    private void PatternInputStrings(String pattern_before, String pattern_after){
+        By pattern_before_input = By.id("pattern_before");
+        By pattern_after_input = By.id("pattern_after");
+        driver.findElement(pattern_before_input).sendKeys(pattern_before);
+        driver.findElement(pattern_after_input).sendKeys(pattern_after);
+    }
+    //send corresponding info of inclusive to the pattern type
+    private void InclusiveButtons(boolean patternbefore, boolean patternafter){
+        WebElement inclusive_before_btn = new WebDriverWait(driver, 30).until(ExpectedConditions.
+                elementToBeClickable(driver.findElement(By.id("include_pattern_before"))));
+        WebElement inclusive_after_btn = new WebDriverWait(driver, 30).until(ExpectedConditions.
+                elementToBeClickable(driver.findElement(By.id("include_pattern_after"))));
+        if (patternbefore){
+            inclusive_before_btn.click(); }
+        if(patternafter){
+            inclusive_after_btn.click(); }
+    }
+    //go on and upload the pdf file
+    private void UploadPDF() throws InterruptedException {
+        String filePath = System.getProperty("user.dir") + "/src/test/pdf/One_Stop_Voting_Site_List_Nov2012.pdf";
+        WebElement chooseFile = driver.findElement(By.id("file"));
+        chooseFile.sendKeys(filePath);
+        Thread.sleep(1000);
+        WebElement import_btn = driver.findElement(By.id("import_file"));
+        import_btn.click();
+        Thread.sleep(5000);
+        wait.until(ExpectedConditions.elementToBeClickable(By.id("restore-detected-tables")));
+    }
+    //delete the pdf file
+    private void DeletePDF(){
+        //navigates back and deletes the pdf utilized
+        driver.findElement(By.id("delete_pdf")).click();
+        driver.switchTo().alert().accept();
+    }
+    //instantiation of Tabula
+    @BeforeClass
+    public static void SetUp(){
+        //set up of chromedriver and navigation to the url, as well as uploading of the pdf file
+        System.setProperty("webdriver.chrome.driver","/usr/local/bin/chromedriver");
+        ChromeOptions options = new ChromeOptions();
+        options.addArguments("headless");
+        options.addArguments("no-sandbox");
+
+        driver = new ChromeDriver(options);
+        driver.get(Tabula_url);
+        driver.manage().window().maximize();
+    }
+    //test of 2 different instances of inputting regex to get a multi spanning table
+    @Test
+    public void TestMultiPageTables() {
+        try {
+            UploadPDF();
+            PageRefresh();
+
+            //Test of regex input with inclusive for pattern before for a table of 2 pages in length
+            PatternInputStrings("JEFFERSON", "BRUNSWICK");
+            InclusiveButtons(true, false);
+            ClickRegexButton();
+            wait.until(ExpectedConditions.visibilityOfElementLocated(By.className("regex-result")));
+            //Confirm a result shows up in the regex search table
+            String result = driver.findElement(By.xpath(".//*[@class='regex-results-table']//td[contains(.,'1')]")).getText();
+            Boolean regex_result;
+            if (result.equals("1")) {
+                regex_result = true;
+            } //if true, there are zero matches
+            else {
+                regex_result = false;
+            }
+            PreviewandExportDatapg();
+            //verify data extraction
+            String result_data = driver.findElement(By.xpath(".//*[@id='extracted-table']//td[contains(.," +
+                    "'JEFFERSON')]")).getText();
+            Boolean regex_data;
+            if (result_data.equals("JEFFERSON, NC 28640")) {
+                regex_data = true;
+            } else {
+                regex_data = false;
+            }
+            String result_data2 = driver.findElement(By.xpath(".//*[@id='extracted-table']//td[contains(.,'DUBLIN')]")).getText();
+            Boolean regex_data2;
+            if (result_data2.equals("DUBLIN, NC 28332")) {
+                regex_data2 = true;
+            } else {
+                regex_data2 = false;
+            }
+            Boolean final_results;
+            if (regex_result && regex_data && regex_data2) {
+                final_results = true;
+            } else {
+                final_results = false;
+            }
+            assertTrue("Failed, regex found no match for inclusive input for pattern before for a 2 page length table"
+                    , final_results);
+            driver.navigate().refresh();
+            PageRefresh();
+
+            //Test of regex input with inclusive for pattern after for a table of 5 pages in length
+            PatternInputStrings("CHEROKEE", "CUMBERLAND");
+            InclusiveButtons(true, true);
+            ClickRegexButton();
+            wait.until(ExpectedConditions.visibilityOfElementLocated(By.className("regex-result")));
+            String result3 = driver.findElement(By.xpath(".//*[@class='regex-results-table']//td[contains(.,'1')]")).getText();
+            Boolean regex_result3;
+            if (result3.equals("1")) {
+                regex_result3 = true;
+            } //if true, there are zero matches
+            else {
+                regex_result3 = false;
+            }
+            PreviewandExportDatapg();
+            String result_data5 = driver.findElement(By.xpath(".//*[@id='extracted-table']//td[contains(.," +
+                    "'CHEROKEE')]")).getText();
+            Boolean regex_data5;
+            if (result_data5.equals("CHEROKEE COUNTY BOARD OF ELECTIONS OFFICE")) {
+                regex_data5 = true;
+            } else {
+                regex_data5 = false;
+            }
+            String result_data6 = driver.findElement(By.xpath(".//*[@id='extracted-table']//td[contains(.," +
+                    "'CUMBERLAND')]")).getText();
+            Boolean regex_data6;
+            if (result_data6.equals("CUMBERLAND")) {
+                regex_data6 = true;
+            } else {
+                regex_data6 = false;
+            }
+            Boolean final_results3;
+            if (regex_result3 && regex_data5 && regex_data6) {
+                final_results3 = true;
+            } else {
+                final_results3 = false;
+            }
+            assertTrue("Failed, Tabula found no match for a multi page table spanning more than 2 pages",
+                    final_results3);
+
+            driver.navigate().back();
+            driver.navigate().back();
+            Thread.sleep(500);
+            DeletePDF();
+        }catch (Exception e){
+            System.out.print(e);
+        }
+    }
+    //test of 3 different instances of inputting regex searches with 3 different types of inclusive combinations to
+    // get multiple regex results
+    @Test
+    public void TestInclusivePatternswithRegexSearches() {
+        try{
+            UploadPDF();
+            PageRefresh();
+
+            //Tests for inclusive for pattern before and non-inclusive for pattern after
+            PatternInputStrings("COUNTY","COUNTY");
+            InclusiveButtons(true, false);
+            ClickRegexButton();
+            wait.until(ExpectedConditions.visibilityOfElementLocated(By.className("regex-result")));
+            String result = driver.findElement(By.xpath(".//*[@class='regex-results-table']//td[contains(.,'69')]")).
+                    getText();
+            Boolean regex_result;
+            if(result.equals("69")){ regex_result = true;} //if true, there are zero matches
+            else{ regex_result = false;}
+            PreviewandExportDatapg();
+            String result_data = driver.findElement(By.xpath(".//*[@id='extracted-table']//td[contains(.," +
+                    "'County')]")).getText();
+            Boolean regex_data;
+            if(result_data.equals("County")){ regex_data = true;}
+            else{ regex_data = false;}
+            Thread.sleep(600);
+            String result_data2 = driver.findElement(By.xpath(".//*[@id='extracted-table']//td[contains(.," +
+                    "'Thursday, November 1')]")).getText();
+            Boolean regex_data2;
+            if(result_data2.equals("Thursday, November 1 - Friday, November 2")){ regex_data2 = true;}
+            else{ regex_data2 = false;}
+            Boolean final_results;
+            if(regex_result && regex_data && regex_data2){ final_results = true;}
+            else{final_results = false;}
+            assertTrue("Failed, Tabula found no match for inclusive for pattern before and non-inclusive for " +
+                    "pattern after", final_results);
+            driver.navigate().refresh();
+            PageRefresh();
+
+            //Tests for non-inclusive for pattern before and inclusive for pattern after
+            PatternInputStrings("Thursday", "Saturday");
+            InclusiveButtons(false, true);
+            ClickRegexButton();
+            wait.until(ExpectedConditions.visibilityOfElementLocated(By.className("regex-result")));
+            String result2 = driver.findElement(By.xpath(".//*[@class='regex-results-table']//td[contains(.,'326')]")).getText();
+            Boolean regex_result3;
+            if(result2.equals("326")){ regex_result3 = true;} //if true, there are zero matches
+            else{ regex_result3 = false;}
+            PreviewandExportDatapg();
+            String result_data3 = driver.findElement(By.xpath(".//*[@id='extracted-table']//td[contains(.," +
+                    "'Monday, October 22 - Friday, October 26')]")).getText();
+            Boolean regex_data3;
+            if(result_data3.equals("Monday, October 22 - Friday, October 26")){ regex_data3 = true;}
+            else{ regex_data3 = false;}
+            Thread.sleep(1000);
+            String result_data4 = driver.findElement(By.xpath(".//*[@id='extracted-table']//td[contains(.," +
+                    "'225 WEST MAIN ST')]")).getText();
+            Boolean regex_data4;
+            if(result_data4.equals("225 WEST MAIN ST")){ regex_data4 = true;}
+            else{ regex_data4 = false;}
+            Boolean final_results2;
+            if(regex_result3 && regex_data3 && regex_data4){ final_results2 = true;}
+            else{final_results2 = false;}
+            assertTrue("Failed, Tabula found no match for inclusive for pattern after and non-inclusive for " +
+                    "pattern before", final_results2);
+            driver.navigate().refresh();
+            PageRefresh();
+
+            //Tests for inclusive for pattern before and for pattern after
+            PatternInputStrings("8:00","7:00");
+            InclusiveButtons(true, true);
+            ClickRegexButton();
+            wait.until(ExpectedConditions.visibilityOfElementLocated(By.className("regex-result")));
+            String result3 = driver.findElement(By.xpath(".//*[@class='regex-results-table']//td[contains(.,'68')]")).getText();
+            Boolean regex_result4;
+            if(result3.equals("68")){ regex_result4 = true;} //if true, there are zero matches
+            else{ regex_result4 = false;}
+            PreviewandExportDatapg();
+            String result_data5 = driver.findElement(By.xpath(".//*[@id='extracted-table']//td[contains(.," +
+                    "'Friday, October 19')]")).getText();
+            Boolean regex_data5;
+            if(result_data5.equals("Friday, October 19")){ regex_data5 = true;}
+            else{ regex_data5 = false;}
+            Thread.sleep(700);
+            String result_data6 = driver.findElement(By.xpath(".//*[@id='extracted-table']//td[contains(.,'YANCEY')]")).getText();
+            Boolean regex_data6;
+            if(result_data6.equals("YANCEY")){ regex_data6 = true;}
+            else{ regex_data6 = false;}
+            Boolean final_results3;
+            if(regex_result4 && regex_data5 && regex_data6){ final_results3 = true;}
+            else{final_results3 = false;}
+            assertTrue("Failed, Tabula found no match for inclusive for pattern after and inclusive for " +
+                    "pattern before", final_results3);
+            driver.navigate().back();
+            driver.navigate().back();
+            Thread.sleep(500);
+            DeletePDF();
+        }catch(Exception e){
+            System.out.print(e);
+        }
+    }
+    //test of an overlapping instance where it checks that there is only one regex result after attempting an overlap
+    @Test
+    public void TestOverlapRegexSearch() {
+        try{
+            //Test for overlapping regex searches
+            UploadPDF();
+            PageRefresh();
+
+            PatternInputStrings("BERTIE", "CABARRUS");
+            InclusiveButtons(true, false);
+            ClickRegexButton();
+            Thread.sleep(5000);
+            PatternInputStrings("ANSON", "BUNCOMBE");
+            InclusiveButtons(false, true);
+            ClickRegexButton();
+            Thread.sleep(5000);
+            driver.switchTo().alert().accept(); //accept error pop-up window
+            //Checks that there is only one regex result, since it shouldn't had allowed for 2 results to appear since the
+            // 2nd one causes an overlap
+            Thread.sleep(2000);
+            List regex_rows = driver.findElements(By.className("regex-result"));
+            int regex_count = regex_rows.size();
+            int regex_count1 = 1;
+            assertTrue("Failed, Tabula found more than one match for an overlap regex search",
+                    (regex_count1 == regex_count ));
+            PreviewandExportDatapg();
+            String result_data = driver.findElement(By.xpath(".//*[@id='extracted-table']//td[contains(.," +
+                    "'MORGANTON, NC 28655')]")).getText();
+            Boolean regex_data;
+            if (result_data.equals("MORGANTON, NC 28655")) { regex_data = true;
+            } else { regex_data = false; }
+            String result_data2 = driver.findElement(By.xpath(".//*[@id='extracted-table']//td[contains(.," +
+                    "'BERTIE COUNTY BOARD OF')]")).getText();
+            Boolean regex_data2;
+            if (result_data2.equals("BERTIE COUNTY BOARD OF ELECTIONS OFFICE")) { regex_data2 = true;
+            } else { regex_data2 = false; }
+            Boolean final_results;
+            if (regex_data && regex_data2) { final_results = true;
+            } else { final_results = false; }
+            assertTrue("Failed, Tabula found no match for the multi-page table", final_results);
+            driver.navigate().back();
+            driver.navigate().back();
+            Thread.sleep(500);
+            DeletePDF();
+        }catch (Exception e){
+            System.out.print(e);
+        }
+    }
+    @AfterClass
+    public static void TearDown(){
+        driver.quit();
+    }
+}
diff --git a/src/test/java/TestPreviewandExportData.java b/src/test/java/TestPreviewandExportData.java
new file mode 100644
index 000000000..4b32e7658
--- /dev/null
+++ b/src/test/java/TestPreviewandExportData.java
@@ -0,0 +1,117 @@
+import org.junit.After;
+import org.junit.Test;
+import org.openqa.selenium.By;
+import org.openqa.selenium.WebDriver;
+import org.openqa.selenium.WebElement;
+import org.openqa.selenium.chrome.ChromeDriver;
+import org.openqa.selenium.chrome.ChromeOptions;
+import org.openqa.selenium.support.ui.ExpectedConditions;
+import org.openqa.selenium.support.ui.WebDriverWait;
+
+import java.util.List;
+import java.util.concurrent.TimeUnit;
+
+import static junit.framework.TestCase.assertTrue;
+import static org.junit.Assert.assertFalse;
+
+//Test of Tabula's Preview and Export Data page, including the links and buttons on both pages
+// that it navigates. For the preview page it toggles between the two different types to display data and
+// doesn't go into testing the preview's menu due to testing done already in the back-end on the different functionality.
+// For this test case, eu_002.pdf is utilized.
+// @author SM modified: 4/29/18
+public class TestPreviewandExportData {
+    private void PageRefresh() throws InterruptedException {
+        //menu options did not fully load
+        Thread.sleep(1000);
+        //refresh the page
+        while(driver.findElements( By.id("restore-detected-tables")).size() == 0) {
+            driver.navigate().refresh();
+            Thread.sleep(700);
+        }
+    }
+    WebDriver driver;
+    @Test
+    public void startWebDriver() throws InterruptedException {
+        System.setProperty("webdriver.chrome.driver","/usr/local/bin/chromedriver");
+        ChromeOptions options = new ChromeOptions();
+        options.addArguments("headless");
+        options.addArguments("no-sandbox");
+
+        driver = new ChromeDriver(options);
+        driver.get("http://127.0.0.1:9292/");
+        driver.manage().window().maximize();
+        WebDriverWait wait = new WebDriverWait(driver, 500);
+        String filePath = System.getProperty("user.dir") + "/src/test/pdf/eu-002.pdf";
+        WebElement chooseFile = driver.findElement(By.id("file"));
+        chooseFile.sendKeys(filePath);
+        WebElement import_btn = driver.findElement(By.id("import_file"));
+        import_btn.click();
+        Thread.sleep(5000);
+        try{
+            //navigates to the extraction page and checks that it is in the extraction page
+            PageRefresh();
+            //clicks on the Autodetect Tables and waits for Tabula to detect something (this will not be extensively tested
+            // for the sake that this is just a component test) then it wait and click the Preview & Export Data button
+            By autodetect_id = By.id("restore-detected-tables");
+            WebElement autodetect_button = wait.until(ExpectedConditions.elementToBeClickable(autodetect_id));
+            autodetect_button.click();
+            Thread.sleep(600);
+            By previewandexport_id = By.id("all-data");
+            WebElement previewandexport_button = driver.findElement(previewandexport_id);
+            previewandexport_button.click();
+            wait.until(ExpectedConditions.visibilityOfElementLocated(By.className("detection-row")));
+
+            By revise_selections_id = By.id("revise-selections");
+            WebElement revise_selections_button = wait.until(ExpectedConditions.elementToBeClickable(revise_selections_id));
+            revise_selections_button.click();
+            driver.manage().timeouts().pageLoadTimeout(150, TimeUnit.SECONDS);
+            //checks that it navigated back to the extraction page
+            String regex_options_string = "Regex Options";
+            By regex_options_title = By.id("regex_options_title");
+            WebElement regex_options = wait.until(ExpectedConditions.elementToBeClickable(regex_options_title));
+            driver.manage().timeouts().pageLoadTimeout(150, TimeUnit.SECONDS);
+            assertTrue("Failed, couldn't find Extraction page", regex_options_string.equals(regex_options.getText()));
+            driver.navigate().back();
+            //counts the number of rows displayed when the stream button is set to default and compares the row count
+            //Thread.sleep(1000);
+            driver.manage().timeouts().pageLoadTimeout(150, TimeUnit.SECONDS);
+            List stream_rows = driver.findElements(By.className("detection-row"));
+            int stream_count = stream_rows.size();
+            int stream_hc_count = 38;
+            assertTrue("Failed, number of rows, from the Stream option, did not match", (stream_hc_count == stream_count ));
+
+            By lattice_id = By.id("spreadsheet-method-btn");
+            WebElement lattice_button = wait.until(ExpectedConditions.elementToBeClickable(lattice_id));
+            driver.manage().timeouts().pageLoadTimeout(150, TimeUnit.SECONDS);
+            lattice_button.click();
+            wait.until(ExpectedConditions.visibilityOfElementLocated(By.className("detection-row")));
+            driver.manage().timeouts().pageLoadTimeout(150, TimeUnit.SECONDS);
+            List lattice_rows = driver.findElements(By.className("detection-row"));
+            int lattice_count = lattice_rows.size();
+            int lattice_hc_count = 7;
+            assertTrue("Failed, number of rows, from the Lattice option, did not match", (lattice_hc_count == lattice_count ));
+
+            By contact_name = By.linkText("Contact the developers");
+            WebElement contact_button = wait.until(ExpectedConditions.elementToBeClickable(contact_name));
+            contact_button.click();
+            String contact_url = "http://www.github.com/tabulapdf/tabula/issues/new";
+            driver.manage().timeouts().pageLoadTimeout(150, TimeUnit.SECONDS);
+            assertFalse("Failed, couldn't find GitHub's sign-in page to view the report an issue page", driver.getCurrentUrl().equals(contact_url));
+            driver.navigate().back();
+            By navbar_class = By.className("navbar-brand");
+            WebElement navbar_icon = wait.until(ExpectedConditions.visibilityOfElementLocated(navbar_class));
+            navbar_icon.click();
+            By delete_pdf = By.id("delete_pdf");
+            WebElement delete_btn = wait.until(ExpectedConditions.elementToBeClickable(delete_pdf));
+            delete_btn.click();
+            driver.switchTo().alert().accept();
+
+        }catch(Exception e){
+            System.out.print(e);
+        }
+    }
+    @After
+    public void TearDown(){
+        driver.quit();
+    }
+}
diff --git a/src/test/java/Testboron_isotopic.java b/src/test/java/Testboron_isotopic.java
new file mode 100644
index 000000000..e4ab2d421
--- /dev/null
+++ b/src/test/java/Testboron_isotopic.java
@@ -0,0 +1,303 @@
+import org.junit.AfterClass;
+import org.junit.BeforeClass;
+import org.junit.Test;
+import org.openqa.selenium.By;
+import org.openqa.selenium.WebDriver;
+import org.openqa.selenium.WebElement;
+import org.openqa.selenium.chrome.ChromeDriver;
+import org.openqa.selenium.chrome.ChromeOptions;
+import org.openqa.selenium.support.ui.ExpectedConditions;
+import org.openqa.selenium.support.ui.WebDriverWait;
+
+import java.util.List;
+
+import static junit.framework.TestCase.assertTrue;
+//Test of the boron_isotopic pdf file, it will go through various user scenarios to test the functionality of the regex
+// implementation (spanning pages, multiple search results, inclusive and non-inclusive, and overlap)
+// @author SM modified: 4/29/18
+public class Testboron_isotopic {
+    //Test of the boron_isotopic pdf file.
+    private static WebDriver driver;
+    private static String Tabula_url = "http://127.0.0.1:9292/";
+    private WebDriverWait wait = new WebDriverWait(driver, 500);
+
+    //will continue to refresh the page until it sees one of the buttons appear in the menu option of the extraction page
+    private void PageRefresh() throws InterruptedException {
+        //menu options did not fully load
+        Thread.sleep(1000);
+        //refresh the page
+        while(driver.findElements( By.id("restore-detected-tables")).size() == 0) {
+            driver.navigate().refresh();
+            Thread.sleep(700);
+        }
+    }
+    //will navigate and wait for the data to appear in the preview and export data page
+    private void PreviewandExportDatapg(){
+        By previewandexport_id = By.id("all-data");
+        WebElement previewandexport_button = wait.until(ExpectedConditions.visibilityOfElementLocated(previewandexport_id));
+        previewandexport_button.click();
+        wait.until(ExpectedConditions.visibilityOfElementLocated(By.className("detection-row")));
+    }
+    //will wait for the regex button to become clickable and then click the regex button
+    private void ClickRegexButton() throws InterruptedException {
+        By regex_search_id = By.id("regex-search");
+        WebElement regex_button = new WebDriverWait(driver, 30).until(ExpectedConditions.
+                elementToBeClickable(regex_search_id));
+        regex_button.click();
+        Thread.sleep(800);
+    }
+    //send regex inputs to the corresponding pattern type
+    private void PatternInputStrings(String pattern_before, String pattern_after){
+        By pattern_before_input = By.id("pattern_before");
+        By pattern_after_input = By.id("pattern_after");
+        driver.findElement(pattern_before_input).sendKeys(pattern_before);
+        driver.findElement(pattern_after_input).sendKeys(pattern_after);
+    }
+    //send corresponding info of inclusive to the pattern type
+    private void InclusiveButtons(boolean patternbefore, boolean patternafter){
+        WebElement inclusive_before_btn = new WebDriverWait(driver, 30).
+                until(ExpectedConditions.elementToBeClickable(driver.findElement(By.id("include_pattern_before"))));
+        WebElement inclusive_after_btn = new WebDriverWait(driver, 30).
+                until(ExpectedConditions.elementToBeClickable(driver.findElement(By.id("include_pattern_after"))));
+        if (patternbefore){
+            inclusive_before_btn.click(); }
+        if(patternafter){
+            inclusive_after_btn.click(); }
+    }
+    //go on and upload the pdf file
+    private void UploadPDF() throws InterruptedException {
+        String filePath = System.getProperty("user.dir") + "/src/test/pdf/boron_isotopic_anal.pdf";
+        WebElement chooseFile = driver.findElement(By.id("file"));
+        chooseFile.sendKeys(filePath);
+        Thread.sleep(1000);
+        WebElement import_btn = driver.findElement(By.id("import_file"));
+        import_btn.click();
+        Thread.sleep(5000);
+        wait.until(ExpectedConditions.elementToBeClickable(By.id("templates_title")));
+    }
+    //delete the pdf file
+    private void DeletePDF(){
+        //navigates back and deletes the pdf utilized
+        driver.findElement(By.id("delete_pdf")).click();
+        driver.switchTo().alert().accept();
+    }
+    //instantiation of Tabula
+    @BeforeClass
+    public static void SetUp(){
+        //set up of chromdriver and navigation to the url, as well as uploading of the pdf file
+        System.setProperty("webdriver.chrome.driver","/usr/local/bin/chromedriver");
+        ChromeOptions options = new ChromeOptions();
+        options.addArguments("headless");
+        options.addArguments("no-sandbox");
+
+        driver = new ChromeDriver(options);
+        driver.get(Tabula_url);
+        driver.manage().window().maximize();
+    }
+    //test of 2 different instances of inputting regex to get a multi spanning table
+    @Test
+    public void TestMultiPageTables() {
+        try {
+            UploadPDF();
+            PageRefresh();
+
+            //Test of regex input with inclusive for pattern before for a table of 3 pages in length
+            PatternInputStrings("ABSTRACT", "VibeCore");
+            InclusiveButtons(true, false);
+            ClickRegexButton();
+            wait.until(ExpectedConditions.visibilityOfElementLocated(By.className("regex-result")));
+            //Confirm search found
+            String result = driver.findElement(By.xpath(".//*[@class='regex-results-table']//td[contains(.,'1')]")).getText();
+            Boolean regex_result;
+            if (result.equals("1")) {
+                regex_result = true;
+            } //if true, there are zero matches
+            else {
+                regex_result = false;
+            }
+            PreviewandExportDatapg();
+            //verify data extraction
+            String result_data = driver.findElement(By.xpath(".//*[@id='extracted-table']//td[contains(.," +
+                    "'ABSTRACT: In the U.S., coal fired power plants produce over 136 million')]")).getText();
+            Boolean regex_data;
+            if (result_data.equals("ABSTRACT: In the U.S., coal fired power plants produce over 136 million")) {
+                regex_data = true;
+            } else {
+                regex_data = false;
+            }
+            String result_data2 = driver.findElement(By.xpath(".//*[@id='extracted-table']//td[contains(.," +
+                    "'slower.24,26 Another consideration would be the addition of')]")).getText();
+            Boolean regex_data2;
+            if (result_data2.equals("slower.24,26 Another consideration would be the addition of")) {
+                regex_data2 = true;
+            } else {
+                regex_data2 = false;
+            }
+            Boolean final_results;
+            if (regex_result && regex_data && regex_data2) {
+                final_results = true;
+            } else {
+                final_results = false;
+            }
+            assertTrue("Failed, regex found no match for inclusive input for pattern before for a 3 page length table"
+                    , final_results);
+            driver.navigate().back();
+            driver.navigate().back();
+            Thread.sleep(500);
+            DeletePDF();
+        }catch (Exception e){
+            System.out.print(e);
+        }
+    }
+    //test of 3 different instances of inputting regex searches with 3 different types of inclusive combinations to
+    // get multiple regex results
+    @Test
+    public void TestInclusivePatternswithRegexSearches() {
+        try{
+            UploadPDF();
+            PageRefresh();
+
+            //Tests for inclusive for pattern before and non-inclusive for pattern after
+            PatternInputStrings("Coal","CCRs");
+            InclusiveButtons(true, false);
+            ClickRegexButton();
+            wait.until(ExpectedConditions.visibilityOfElementLocated(By.className("regex-result")));
+            String result = driver.findElement(By.xpath(".//*[@class='regex-results-table']//td[contains(.,'9')]")).getText();
+            Boolean regex_result;
+            if(result.equals("9")){ regex_result = true;} //if true, there are zero matches
+            else{ regex_result = false;}
+            PreviewandExportDatapg();
+            String result_data = driver.findElement(By.xpath(".//*[@id='extracted-table']//td[contains(.," +
+                    "'Boron and Strontium Isotopic Characterization of Coal Combustion')]")).getText();
+            Boolean regex_data;
+            if(result_data.equals("Boron and Strontium Isotopic Characterization of Coal Combustion")){ regex_data = true;}
+            else{ regex_data = false;}
+            Thread.sleep(600);
+            String result_data2 = driver.findElement(By.xpath(".//*[@id='extracted-table']//td[contains(.," +
+                    "'post treatment such as FGD, the boron and strontium isotopic')]")).getText();
+            Boolean regex_data2;
+            if(result_data2.equals("post treatment such as FGD, the boron and strontium isotopic")){ regex_data2 = true;}
+            else{ regex_data2 = false;}
+            Boolean final_results;
+            if(regex_result && regex_data && regex_data2){ final_results = true;}
+            else{final_results = false;}
+            assertTrue("Failed, Tabula found no match for inclusive for pattern before and non-inclusive for " +
+                    "pattern after", final_results);
+            driver.navigate().refresh();
+            PageRefresh();
+
+            //Tests for non-inclusive for pattern before and inclusive for pattern after
+            PatternInputStrings("Boron", "Strontium");
+            InclusiveButtons(false, true);
+            ClickRegexButton();
+            wait.until(ExpectedConditions.visibilityOfElementLocated(By.className("regex-result")));
+            String result2 = driver.findElement(By.xpath(".//*[@class='regex-results-table']//td[contains(.,'7')]")).getText();
+            Boolean regex_result3;
+            if(result2.equals("7")){ regex_result3 = true;} //if true, there are zero matches
+            else{ regex_result3 = false;}
+            PreviewandExportDatapg();
+            String result_data3 = driver.findElement(By.xpath(".//*[@id='extracted-table']//td[contains(.," +
+                    "'elements20 that adsorbed onto the fly ash particles during')]")).getText();
+            Boolean regex_data3;
+            if(result_data3.equals("elements20 that adsorbed onto the fly ash particles during")){ regex_data3 = true;}
+            else{ regex_data3 = false;}
+            Thread.sleep(1000);
+            String result_data4 = driver.findElement(By.xpath(".//*[@id='extracted-table']//td[contains(.," +
+                    "'C.; Schroeder, K. T.; Brubaker, T. M. Strontium isotope study of coal')]")).getText();
+            Boolean regex_data4;
+            if(result_data4.equals("C.; Schroeder, K. T.; Brubaker, T. M. Strontium isotope study of coal")){ regex_data4 = true;}
+            else{ regex_data4 = false;}
+            Boolean final_results2;
+            if(regex_result3 && regex_data3 && regex_data4){ final_results2 = true;}
+            else{final_results2 = false;}
+            assertTrue("Failed, Tabula found no match for inclusive for pattern after and non-inclusive for " +
+                    "pattern before", final_results2);
+            driver.navigate().refresh();
+            PageRefresh();
+
+            //Tests for inclusive for pattern before and for pattern after
+            PatternInputStrings("CCRs","Boron");
+            InclusiveButtons(true, true);
+            ClickRegexButton();
+            wait.until(ExpectedConditions.visibilityOfElementLocated(By.className("regex-result")));
+            String result3 = driver.findElement(By.xpath(".//*[@class='regex-results-table']//td[contains(.,'4')]")).getText();
+            Boolean regex_result4;
+            if(result3.equals("4")){ regex_result4 = true;} //if true, there are zero matches
+            else{ regex_result4 = false;}
+            PreviewandExportDatapg();
+            String result_data5 = driver.findElement(By.xpath(".//*[@id='extracted-table']//td[contains(.," +
+                    "'composition of leachates generated from CCRs in coal-fired')]")).getText();
+            Boolean regex_data5;
+            if(result_data5.equals("composition of leachates generated from CCRs in coal-fired")){ regex_data5 = true;}
+            else{ regex_data5 = false;}
+            Thread.sleep(700);
+            String result_data6 = driver.findElement(By.xpath(".//*[@id='extracted-table']//td[contains(.," +
+                    "'and quantifying their impact on the environment.')]")).getText();
+            Boolean regex_data6;
+            if(result_data6.equals("and quantifying their impact on the environment.")){ regex_data6 = true;}
+            else{ regex_data6 = false;}
+            Boolean final_results3;
+            if(regex_result4 && regex_data5 && regex_data6){ final_results3 = true;}
+            else{final_results3 = false;}
+            assertTrue("Failed, Tabula found no match for inclusive for pattern after and inclusive for " +
+                    "pattern before", final_results3);
+            driver.navigate().back();
+            driver.navigate().back();
+            Thread.sleep(500);
+            DeletePDF();
+        }catch(Exception e){
+            System.out.print(e);
+        }
+    }
+    //test of an overlapping instance where it checks that there is only one regex result after attempting an overlap
+    @Test
+    public void TestOverlapRegexSearch() {
+        try{
+            //Test for overlapping regex searches
+            UploadPDF();
+            PageRefresh();
+
+            PatternInputStrings("(17)", "(26)");
+            InclusiveButtons(true, false);
+            ClickRegexButton();
+            wait.until(ExpectedConditions.visibilityOfElementLocated(By.className("regex-result")));
+            PatternInputStrings("(25)", "10041");
+            InclusiveButtons(false, true);
+            ClickRegexButton();
+            Thread.sleep(5000);
+            driver.switchTo().alert().accept(); //accept error pop-up window
+            //Checks that there is only one regex result, since it shouldn't had allowed for 2 results to appear since the
+            // 2nd one causes an overlap
+            Thread.sleep(2000);
+            List regex_rows = driver.findElements(By.className("regex-result"));
+            int regex_count = regex_rows.size();
+            int regex_count1 = 1;
+            assertTrue("Failed, Tabula found more than one match for an overlap regex search", (regex_count1 == regex_count ));
+            PreviewandExportDatapg();
+            String result_data = driver.findElement(By.xpath(".//*[@id='extracted-table']//td[contains(.," +
+                    "'Plant 1')]")).getText();
+            Boolean regex_data;
+            if (result_data.equals("Plant 1")) { regex_data = true;
+            } else { regex_data = false; }
+            String result_data2 = driver.findElement(By.xpath(".//*[@id='extracted-table']//td[contains(.," +
+                    "'10041−10048.')]")).getText();
+            Boolean regex_data2;
+            if (result_data2.equals("10041−10048.")) { regex_data2 = true;
+            } else { regex_data2 = false; }
+            Boolean final_results;
+            if (regex_data && regex_data2) { final_results = true;
+            } else { final_results = false; }
+            assertTrue("Failed, Tabula found no match for the multi-page table", final_results);
+            driver.navigate().back();
+            driver.navigate().back();
+            Thread.sleep(500);
+            DeletePDF();
+        }catch (Exception e){
+            System.out.print(e);
+        }
+    }
+    @AfterClass
+    public static void TearDown(){
+        driver.quit();
+    }
+}
diff --git a/src/test/pdf/4._Buck_CAP_Part_2_Appx_A_partial.pdf b/src/test/pdf/4._Buck_CAP_Part_2_Appx_A_partial.pdf
new file mode 100644
index 000000000..14a24ffdd
Binary files /dev/null and b/src/test/pdf/4._Buck_CAP_Part_2_Appx_A_partial.pdf differ
diff --git a/src/test/pdf/Allen_CSA_table_6-9_gradients.pdf b/src/test/pdf/Allen_CSA_table_6-9_gradients.pdf
new file mode 100644
index 000000000..a897ff853
Binary files /dev/null and b/src/test/pdf/Allen_CSA_table_6-9_gradients.pdf differ
diff --git a/src/test/pdf/Cliffside_CSA_Report_NCDENR_Submittal.pdf b/src/test/pdf/Cliffside_CSA_Report_NCDENR_Submittal.pdf
new file mode 100644
index 000000000..9e0d1e502
Binary files /dev/null and b/src/test/pdf/Cliffside_CSA_Report_NCDENR_Submittal.pdf differ
diff --git a/src/test/pdf/Correspondence_FINAL_SBE_one-stop_plans_adopted_for_non-unanimous_countiespdf.pdf b/src/test/pdf/Correspondence_FINAL_SBE_one-stop_plans_adopted_for_non-unanimous_countiespdf.pdf
new file mode 100644
index 000000000..56182de2a
Binary files /dev/null and b/src/test/pdf/Correspondence_FINAL_SBE_one-stop_plans_adopted_for_non-unanimous_countiespdf.pdf differ
diff --git a/src/test/pdf/Feb_9,_2016_1_4700_PM_ESTRE_Voters.pdf b/src/test/pdf/Feb_9,_2016_1_4700_PM_ESTRE_Voters.pdf
new file mode 100644
index 000000000..70bec34ad
Binary files /dev/null and b/src/test/pdf/Feb_9,_2016_1_4700_PM_ESTRE_Voters.pdf differ
diff --git a/src/test/pdf/Mecklenburg.Majority.pdf b/src/test/pdf/Mecklenburg.Majority.pdf
new file mode 100644
index 000000000..78cee3de8
Binary files /dev/null and b/src/test/pdf/Mecklenburg.Majority.pdf differ
diff --git a/src/test/pdf/NC_HOUSE_2017_Stat_Pack_8.21.17.pdf b/src/test/pdf/NC_HOUSE_2017_Stat_Pack_8.21.17.pdf
new file mode 100644
index 000000000..391b2bbcb
Binary files /dev/null and b/src/test/pdf/NC_HOUSE_2017_Stat_Pack_8.21.17.pdf differ
diff --git a/src/test/pdf/One_Stop_Voting_Site_List_Nov2012.pdf b/src/test/pdf/One_Stop_Voting_Site_List_Nov2012.pdf
new file mode 100644
index 000000000..353bb34df
Binary files /dev/null and b/src/test/pdf/One_Stop_Voting_Site_List_Nov2012.pdf differ
diff --git a/src/test/pdf/boron_isotopic_anal.pdf b/src/test/pdf/boron_isotopic_anal.pdf
new file mode 100644
index 000000000..e6abb7fed
Binary files /dev/null and b/src/test/pdf/boron_isotopic_anal.pdf differ
diff --git a/src/test/pdf/eu-002.pdf b/src/test/pdf/eu-002.pdf
new file mode 100644
index 000000000..adf49dc01
Binary files /dev/null and b/src/test/pdf/eu-002.pdf differ
diff --git a/src/test/test.iml b/src/test/test.iml
new file mode 100644
index 000000000..a0e49a3ba
--- /dev/null
+++ b/src/test/test.iml
@@ -0,0 +1,11 @@
+
+
+  
+    
+    
+      
+    
+    
+    
+  
+
\ No newline at end of file
diff --git a/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst b/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst
new file mode 100644
index 000000000..e69de29bb
diff --git a/waitForServerLoad.sh b/waitForServerLoad.sh
new file mode 100644
index 000000000..82ff5a6c8
--- /dev/null
+++ b/waitForServerLoad.sh
@@ -0,0 +1,24 @@
+#!/usr/bin/env bash
+gem update --system
+res=1;
+num_iter=20
+iter="$num_iter";
+while [[ "$res" -ne 0 ]] && [[ "$iter" -gt 0 ]]
+do
+ sleep 1m #Sleep for a minute in between curl calls...
+ iter=$((iter-1));
+ printf "Iteration #%d\n" "$(($num_iter-$iter))"
+ curl -s http://localhost:9292/
+ res=$?
+ printf "Return value of curl:%d\n" "$res"
+done
+
+if [[ "$res" -ne 0 ]]
+then
+  printf "CONNECTION COULD NOT BE MADE TO SERVER...\n"
+else
+  printf "CONNECTION MADE TO SERVER: BEGINNING TEST CASES...\n"
+fi
+
+exit $res
+
diff --git a/webapp/index.html b/webapp/index.html
index 4c47eaabb..165ea12db 100644
--- a/webapp/index.html
+++ b/webapp/index.html
@@ -1,3 +1,13 @@
+
 
 
 
@@ -47,10 +57,7 @@
             
  • My Templates
  • About
  • Help
  • -
  • Source Code
  • - - @@ -69,16 +76,16 @@ @@ -87,15 +94,17 @@
    + +
    - <%= original_filename %> + <%= original_filename %> - class="form-control format"> + + + + @@ -114,40 +123,44 @@ - + + + @@ -386,9 +506,11 @@

    Upload Error

    + + + @@ -498,7 +680,7 @@

    Having trouble with Tabula?

    ================================================== --> - + diff --git a/webapp/static/css/selectors.css b/webapp/static/css/selectors.css index 5794fb920..2aa1791ef 100644 --- a/webapp/static/css/selectors.css +++ b/webapp/static/css/selectors.css @@ -34,6 +34,7 @@ top: 0; left: 0; z-index: 21; + } div.table-region .resize-handle { diff --git a/webapp/static/css/styles.css b/webapp/static/css/styles.css index c46f6c183..11304e859 100644 --- a/webapp/static/css/styles.css +++ b/webapp/static/css/styles.css @@ -1144,7 +1144,6 @@ html { body { font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; - font-size: 14px; line-height: 1.428571429; color: #333333; background-color: #fff; @@ -1285,7 +1284,7 @@ h3 .small, .h3 small, h4, .h4, h5, .h5, h6, .h6 { - margin-top: 10px; + margin-top: 0px; margin-bottom: 10px; } h4 small, @@ -1484,7 +1483,7 @@ a.bg-danger:hover { ul, ol { margin-top: 0; - margin-bottom: 10px; + margin-bottom: 0px; } ul ul, ul ol, @@ -1703,7 +1702,6 @@ pre code { width: 1170px; } } - .container-fluid { margin-right: auto; margin-left: auto; @@ -3430,9 +3428,11 @@ select[multiple].input-lg, .btn-success:active, .btn-success.active, .open > .btn-success.dropdown-toggle { background-image: none; } + + .btn-success.disabled, .btn-success.disabled:hover, .btn-success.disabled:focus, .btn-success.disabled:active, .btn-success.disabled.active, .btn-success[disabled], .btn-success[disabled]:hover, .btn-success[disabled]:focus, .btn-success[disabled]:active, .btn-success[disabled].active, fieldset[disabled] .btn-success, fieldset[disabled] .btn-success:hover, fieldset[disabled] .btn-success:focus, fieldset[disabled] .btn-success:active, fieldset[disabled] .btn-success.active { - background-color: #5cb85c; - border-color: #4cae4c; + background-color: #b82a4f; + border-color: #ae5437; } .btn-success .badge { color: #5cb85c; @@ -4979,7 +4979,7 @@ a.badge:hover, a.badge:focus { color: inherit; } .jumbotron p { - margin-bottom: 15px; + margin-bottom: 0px; font-size: 21px; font-weight: 200; } @@ -7133,6 +7133,24 @@ button.close { bottom: -35px; } +.header-region{ + position: absolute; + border: 3px solid rgba(41, 255, 52, 0.8); + background: rgba(31, 255, 32, 0.2); + box-sizing: border-box; +} + +.footer-region{ + position: absolute; + border: 3px solid rgba(19, 248, 255, 0.8); + background: rgba(15, 183, 255, 0.2); + box-sizing: border-box; +} + +.header-region:hover, .footer-region:hover{ + cursor: row-resize; +} + /* rectangularSelector.js classes */ .selection-box, .table-region { position: absolute; @@ -7140,6 +7158,14 @@ button.close { background: rgba(255, 87, 0, 0.2); box-sizing: border-box; } + +.regex-table-region { + position: absolute; + border: 1px dashed rgba(255, 172, 23, 0.8); + background: rgba(255, 150, 11, 0.2); + box-sizing: border-box; +} + .selection-box:hover, .table-region:hover { cursor: pointer; } @@ -7151,66 +7177,70 @@ button.close { visibility: hidden; } -.table-region { +.table-region, .regex-table-region { top: 0; left: 0; z-index: 21; } -div.table-region .resize-handle { +div.table-region .fixed-handle, div.regex-table-region.fixed-handle { + position: absolute; +} + +div.table-region .resize-handle, div.regex-table-region.resize-handle { position: absolute; } -div.table-region .n-border { +div.table-region .n-border, div.regex-table-region.n-border { width: calc(100% - 10px); top: -5px; left: 5px; height: 10px; } -div.table-region .s-border { +div.table-region .s-border, div.regex-table-region.s-border { width: calc(100% - 10px); bottom: -5px; left: 5px; height: 10px; } -div.table-region .w-border { +div.table-region .w-border, div.regex-table-region.w-border { height: calc(100% - 10px); left: -5px; top: 5px; width: 10px; } -div.table-region .e-border { +div.table-region .e-border, div.regex-table-region.e-border { height: calc(100% - 10px); top: 5px; right: -5px; width: 10px; } -div.table-region .nw-border { +div.table-region .nw-border, div.regex-table-region.nw-border { width: 10px; height: 10px; top: -5px; left: -5px; } -div.table-region .ne-border { +div.table-region .ne-border, div.regex-table-region.ne-border { width: 10px; height: 10px; top: -5px; right: -5px; } -div.table-region .sw-border { +div.table-region .sw-border, div.regex-table-region.sw-border { width: 10px; height: 10px; bottom: -5px; left: -5px; } -div.table-region .se-border { +div.table-region .se-border, div.regex-table-region.se-border { width: 10px; height: 10px; bottom: -5px; @@ -7294,6 +7324,7 @@ body { color: #333333; } + .navbar-default a.navbar-brand { padding-left: 30px; position: relative; @@ -7340,7 +7371,7 @@ body { } form { - margin-bottom: 3em; + margin-bottom: 1em; } #file-list-container { @@ -7424,17 +7455,18 @@ form { #sidebar { background: #eeeeee; width: 195px; - padding: 1em 0 0; + padding: 0em 0 0; height: calc(100% - 51px); text-align: center; overflow-y: scroll; overflow-x: hidden; position: fixed; left: 0; - top: 51px; + top: 104px; z-index: 2; -webkit-box-shadow: inset -0.25em 0 0.5em -0.25em rgba(0, 0, 0, 0.1); box-shadow: inset -0.25em 0 0.5em -0.25em rgba(0, 0, 0, 0.1); + height: 87%; } #sidebar h5 { border-top: 1px solid #777777; @@ -7455,7 +7487,9 @@ form { margin: 0 auto 1.25em; display: block; width: 90%; - padding: 1em .5em .5em 1em; + padding-left: .5em; + padding-right: .5em; +/* padding: 1em .5em .5em 1em; */ position: relative; } #sidebar .thumbnail-list .page img { @@ -7492,14 +7526,16 @@ form { #control-panel { position: fixed; top: 50px; - left: 195px; - width: calc(100% - 200px); + left: 0px; + width: 100%; z-index: 101; /* gotta be >100, which is the max z-index for selections */ background: #d9edf7; padding: 1em; -webkit-box-shadow: 0 1px 5px rgba(0, 0, 0, 0.075); box-shadow: 0 1px 5px rgba(0, 0, 0, 0.075); + padding-left: 5%; + padding-right: 5%; } #control-panel button { margin-right: 1.25em; @@ -7541,6 +7577,20 @@ form { width: calc(100% - 200px); z-index: 1; } + +/* +#pages-container { + width: 100%; + height: auto; + margin: 0 auto; + padding: 3px; + position: relative; + padding-right: 20%; +} +*/ + +html.wait, html.wait * { cursor: wait !important; } + #main-pane .pdf-page { position: relative; } @@ -7550,9 +7600,7 @@ form { #main-pane .page { width: 100%; max-width: 800px; - min-width: 560px; - -webkit-box-shadow: 0 0 2em rgba(0, 0, 0, 0.4); - box-shadow: 0 0 2em rgba(0, 0, 0, 0.4); + min-width: 179px; position: relative; margin: 0 auto; } @@ -7561,7 +7609,7 @@ form { display: block; width: 100%; max-width: 800px; - min-width: 560px; + min-width: 0px; user-select: none; -moz-user-select: none; -webkit-user-select: none; @@ -7767,3 +7815,38 @@ div.spinner { top: 6px; margin-right: 5px; } +.social_media_nav { + display: block; + margin: 0 auto; + text-align: center; + width: 70%; + padding-bottom: 5px; +} +.navbar_1 .navbar-nav_1 { + display: inline-block; + float: none; +} + +.navbar_1 .navbar-collapse_1 { + text-align: center; +} +#regex-container { + background: #eeeeee; + float: right; + right: 0px; + position: fixed; + top: 104px; + height:90%; + width: 230px; + display: inline; + overflow-y: scroll; + padding-bottom: 40px; +} + +.regex-result:hover { + background: #ffc314; +} + +.regex-result:hover { + background: #ffc314; +} diff --git a/webapp/static/img/Twitter_Logo_Blue.png b/webapp/static/img/Twitter_Logo_Blue.png new file mode 100755 index 000000000..b5eebc812 Binary files /dev/null and b/webapp/static/img/Twitter_Logo_Blue.png differ diff --git a/webapp/static/img/open_collective.png b/webapp/static/img/open_collective.png new file mode 100644 index 000000000..278b26a7c Binary files /dev/null and b/webapp/static/img/open_collective.png differ diff --git a/webapp/static/js/FooterView.js b/webapp/static/js/FooterView.js new file mode 100644 index 000000000..e96c562b4 --- /dev/null +++ b/webapp/static/js/FooterView.js @@ -0,0 +1,140 @@ +/* jshint undef: true, unused: true */ +//FooterView +// Backbone View extension for managing user-defined footers. +// +// Allows user to define an area at the bottom of a page that should not be considered content when performing a regex +// search +// +// +// 2/21/2018 REM; created +// +/* global $, paper, Backbone, _, console */ +(function (name, context, definition) { + if (typeof module != 'undefined' && module.exports) module.exports = definition(); + else if (typeof define == 'function' && define.amd) define(definition); + else context[name] = definition(); +})('FooterView', this, function (name, context) { + return Backbone.View.extend({ + tagName: 'div', + className:'footer-region', + template:"", + events:{'mousedown': 'enableFooterResize', + 'mouseup': 'endFooterResize', + 'mousemove': 'resizeFooter'}, + previous_y: 0, //Record of mouse height (relative to page) updated in between resize operations + gui_page_height: null, //Set when the corresponding image of page has been loaded + gui_page_top_offset: null, //Set when parent element has been loaded + BUFFER:10, //TODO: make a prototype include buffer as a const to reduce object overhead... + height_on_start_of_resize: 0, //Footer height before the user begins resize operation + resizing: false, + + enableFooterResize: function(event){ + console.log("In enableFooterResize:"); + + if(this.resizing == false) { + this.height_on_start_of_resize = parseInt(this.$el.css('height')); + this.resizing = true; + + if(this.gui_page_top_offset==null){ + this.gui_page_top_offset = this.$el['0'].parentElement.offsetTop; + } + + + console.log("Height at start:"+this.height_on_start_of_resize); + this.previous_y = (event.pageY - this.gui_page_top_offset); + + //NOTE: gui_page_height will be undefined if the corresponding page image is not loaded before enableFooterResize is called + if(this.gui_page_height==null) { + this.gui_page_height = $(this.$el['0'].parentElement).find('img').height(); + } + + + //So that the user can more easily drag the footer area up when it is initially at the bottom of the page + if(this.BUFFER>=(this.gui_page_height-this.previous_y)){ + this.$el.css({'top': this.gui_page_height-this.BUFFER, + 'height': this.BUFFER}); + } + } + + }, + + endFooterResize: function(event){ + if(this.resizing===true){ + this.resizing = false; + console.log("In endFooterResize:"); + console.log(this.$el); + sendback={}; + sendback['footer_height'] =parseInt(this.$el.css('height')); + console.log("Height at finish:"+sendback['footer_height']); + this.trigger('footer_resized',sendback); + } + }, + + resizeFooter: function(event){ + + if(this.resizing===true){ + console.log("In resizeFooter:"); + var mouseLocation = event.pageY - this.gui_page_top_offset; + var new_height = this.gui_page_height - mouseLocation; + + var new_top = parseInt(this.$el.css('top')); + + if((this.previous_ydata.new_top) + + }, + + initialize: function(data){ + + this.id = String.fromCharCode(65 + Math.floor(Math.random() * 26)) + Date.now(); + this.$el.css({ + "top": data.top, + "left": data.left, + "width": data.width, + "height": 0 + }); + + this.$el.attr('title','Drag up to define footer area'); + + + //Detect when user moves mouse/release mouse outside of the area + $(document).on({ + mousemove: _.bind(this.resizeFooter,this), + mouseup: _.bind(this.endFooterResize, this) + }); + }}); +}); diff --git a/webapp/static/js/HeaderView.js b/webapp/static/js/HeaderView.js new file mode 100644 index 000000000..5ffa14859 --- /dev/null +++ b/webapp/static/js/HeaderView.js @@ -0,0 +1,109 @@ +/* jshint undef: true, unused: true */ +//HeaderView +// Backbone View extension for managing user-defined headers. +// +// Allows user to define an area at the top of a page that should not be considered content when performing a regex +// search +// +// +// 1/18/2018 REM; created +// 1/30/2018 REM; updated UI to reduce mouse flicker, increase intuitiveness +// 2/1/2018 REM; adding state so that it can be determined if header is being enlarged or shrunk on a resize event +// 2/21/2018 REM; updated resize methods so that enableHeaderResize is only activated once per drag operation. Also +// updated the data sent back on the header-resize event +// +/* global $, paper, Backbone, _, console */ +(function (name, context, definition) { + if (typeof module != 'undefined' && module.exports) module.exports = definition(); + else if (typeof define == 'function' && define.amd) define(definition); + else context[name] = definition(); +})('HeaderView', this, function (name, context) { + return Backbone.View.extend({ + tagName: 'div', + className:'header-region', + template:"", + events:{'mousedown': 'enableHeaderResize', + 'mouseup': 'endHeaderResize', + 'mousemove': 'resizeHeader'}, + previous_y: 0, //Record of mouse height (relative to page) updated in between resize operations + BUFFER:10, //TODO: make a prototype include buffer as a const to reduce object overhead... + height_on_start_of_resize: 0, //Header height before the user begins resize operation + resizing: false, + + enableHeaderResize: function(event){ + console.log("In enableHeaderResize:"); + if(this.resizing == false) { + this.height_on_start_of_resize = parseInt(this.$el.css('height')); + this.resizing = true; + + console.log("Height at start:"+this.height_on_start_of_resize); + this.previous_y = (event.pageY - this.$el['0'].parentElement.offsetTop); + + //So that the user can more easily drag the header area when it is up at the top of the page + if(this.BUFFER>=this.previous_y){ + this.$el.css({'height': this.BUFFER}); + } + } + }, + + endHeaderResize: function(event){ + //console.log("In endHeaderResize:"); + if(this.resizing===true){ + this.resizing = false; + console.log(this.$el); + sendback={}; + sendback['header_height'] =parseInt(this.$el.css('height')); + console.log("Height at finish:"+sendback['header_height']); + this.trigger('header_resized',sendback); + } + }, + + resizeHeader: function(event){ + if(this.resizing===true){ + var mouseLocation = event.pageY - this.$el['0'].parentElement.offsetTop; + var new_height = mouseLocation; + if((this.previous_y>new_height) && (new_height<=this.BUFFER)){ + //When the user is shrinking the size of the header + new_height=0; + this.$el.css({'height': new_height }); + } + if(this.checkFooterOverlap({'new_height':new_height})){ + while(this.checkFooterOverlap(--new_height)){} //Resize to borderline + this.$el.css({'height':new_height}); + this.endHeaderResize(event); + } + else{ + new_height+=this.BUFFER; //buffer added to reduce cursor flicker; + this.$el.css({'height': new_height }); + } + this.previous_y = mouseLocation; //Updating status variables for next mousemove... + } + }, + + checkFooterOverlap: function(data){ + //Returns true if an overlap is detected + //console.log("In checkFooterOverlap:"); + var footer_el = $(this.$el['0'].parentElement).find('.footer-region'); + return ((parseInt(footer_el.css('top')))<=data.new_height) + + }, + + initialize: function(data){ + + this.id = String.fromCharCode(65 + Math.floor(Math.random() * 26)) + Date.now(); + this.$el.css({ + "top": data.top, + "left": data.left, + "width": data.width, + "height": 0 + }); + + this.$el.attr('title','Drag down to define header area'); + + //Detect when user moves mouse/release mouse outside of the area + $(document).on({ + mousemove: _.bind(this.resizeHeader,this), + mouseup: _.bind(this.endHeaderResize, this) + }); + }}); + }); diff --git a/webapp/static/js/SelectionPrototypes.js b/webapp/static/js/SelectionPrototypes.js new file mode 100644 index 000000000..a9e962c08 --- /dev/null +++ b/webapp/static/js/SelectionPrototypes.js @@ -0,0 +1,79 @@ +//SelectionPrototypes.js +// File containing the prototypes for resizableSelection and regexSelection +// +// The file was created with the intent to to limit code redundancies between RegexSelection and ResizableSelection +// in a manner that favors composition over inheritance such that future developments will not be +// constrained by past hierarchical decisions. +// +// 1/11/2018 REM; created by pulling from regexSelection.js and resizableSelection.js +// + + +// returns true if this tableView does not overlap +// with any other on the same page +var checkOverlaps = function() { + var thisDims = this.getDims().absolutePos; + return _.every( + _.reject(this.areas(this.pageView), function(s) { + return s.id === this.id; + }, this), + function(s) { + var sDims = s.getDims().absolutePos; + return thisDims.left + thisDims.width < sDims.left || + sDims.left + sDims.width < thisDims.left || + thisDims.top + thisDims.height < sDims.top || + sDims.top + sDims.height < thisDims.top; + }, this); +}; + +var remove = function(){ + this.trigger('remove', this); + Backbone.View.prototype.remove.call(this); +}; + +var render = function() { + this.$el.append(this.template); + return this; +}; + +var getDims = function() { + if((!$(this.pageView).is(':visible') || !this.$el.is(':visible')) && this.cachedDims){ + return this.cachedDims; + } + var o = { top: parseFloat(this.$el.css('top')), + left: parseFloat(this.$el.css('left')) }; + var targetPos = $(this.pageView).offset(); + // console.log($(this.pageView).is(':visible'), this.$el.is(':visible')); + this.cachedDims = { + id: this.id, + "$el": this.$el, + absolutePos: { + top: o.top, + left: o.left, + width: this.$el.css('box-sizing') == "border-box" ? this.$el.outerWidth() : this.$el.width(), + height: this.$el.css('box-sizing') == "border-box" ? this.$el.outerHeight(): this.$el.height() + }, + relativePos: { + top: o.top - targetPos.top, + left: o.left - targetPos.left, + width: this.$el.css('box-sizing') == "border-box" ? this.$el.outerWidth() : this.$el.width(), + height: this.$el.css('box-sizing') == "border-box" ? this.$el.outerHeight() : this.$el.height() + } + }; + return this.cachedDims; +}; + + +var regex_select_proto = { + checkOverlaps: checkOverlaps, + remove: remove, + render: render, + getDims: getDims +}; + +var resizable_select_proto = {checkOverlaps: checkOverlaps, + remove: remove, + render: render, + getDims: getDims +}; + diff --git a/webapp/static/js/debug_pdf_view.js b/webapp/static/js/debug_pdf_view.js index 69c1e7f05..8c1007c38 100644 --- a/webapp/static/js/debug_pdf_view.js +++ b/webapp/static/js/debug_pdf_view.js @@ -134,4 +134,4 @@ Tabula.DebugPDFView = { debugTextChunks: function(image) { return this._debugRectangularShapes(image, '/debug/' + PDF_ID + '/text_chunks'); }, -}) \ No newline at end of file +}) diff --git a/webapp/static/js/library.js b/webapp/static/js/library.js index d7e0fb473..a4806c94b 100644 --- a/webapp/static/js/library.js +++ b/webapp/static/js/library.js @@ -154,7 +154,7 @@ Tabula.Library = Backbone.View.extend({ _.bindAll(this, 'uploadPDF', 'render', 'renderFileLibrary'); this.files_collection = new Tabula.UploadedFilesCollection([]); this.files_collection.fetch({silent: true, complete: _.bind(function(){ this.render(); }, this) }); - + this.listenTo(this.files_collection, 'add', this.renderFileLibrary); this.uploads_collection = new Tabula.FileUploadsCollection([]); @@ -198,6 +198,8 @@ Tabula.Library = Backbone.View.extend({ },this)); var formdata = new FormData($('form#upload')[0]); + console.log("URL"); + console.log($('form#upload').attr('action')); $.ajax({ url: $('form#upload').attr('action'), type: 'POST', @@ -271,8 +273,8 @@ Tabula.Library = Backbone.View.extend({ }else{ $('#library-container').hide(); $('#library-container'). - after(_.template( $('#help-template').html().replace(/nestedscript/g, 'script') )({})). - after('

    First time using Tabula? Welcome!

    '); +// after(_.template( $('#help-template').html().replace(/nestedscript/g, 'script') )({})). +// after('

    First time using Tabula? Welcome!

    '); $('.jumbotron.help').css('padding-top', '10px'); } }, diff --git a/webapp/static/js/pdf_view.js b/webapp/static/js/pdf_view.js index e91b169e8..9af0d935f 100644 --- a/webapp/static/js/pdf_view.js +++ b/webapp/static/js/pdf_view.js @@ -1,9 +1,10 @@ Tabula = Tabula || {}; - +"use strict"; var clip = null; var base_uri = $('base').attr("href"); PDF_ID = window.location.pathname.replace(base_uri, '').split('/')[1]; + Tabula.LazyLoad = 10; // max number of pages around the cursor to show (2x Tabula.LazyLoad pages are shown) Tabula.HideOnLazyLoad = false; // ideally, set to true, but this requires differently positioned selections, see https://github.com/tabulapdf/tabula/issues/245#issuecomment-75182061 @@ -23,7 +24,7 @@ Tabula.escapeHtml = function(string) { return String(string).replace(/[&<>"'`=\/]/g, function (s) { return Tabula.entityMap[s]; }); -} +}; Tabula.Page = Backbone.Model.extend({ @@ -64,18 +65,22 @@ Tabula.Document = Backbone.Model.extend({ this.set('original_filename', ''); this.set('new_filename', false); - }, + } }); Tabula.Selection = Backbone.Model.extend({ pdf_id: PDF_ID, - initialize: function(){ + initialize: function(data){ _.bindAll(this, 'repeatLassos', 'toCoords'); + + + }, updateCoords: function(){ - var page = Tabula.pdf_view.pdf_document.page_collection.findWhere({number: this.get('page_number')}); + + var page = Tabula.pdf_view.pdf_document.page_collection.at(this.get('page_number') - 1); var imageWidth = this.get('imageWidth'); var original_pdf_width = page.get('width'); @@ -84,13 +89,14 @@ Tabula.Selection = Backbone.Model.extend({ var scale = original_pdf_width / imageWidth; var rp = this.attributes.getDims().relativePos; + this.set({ x1: rp.left * scale, x2: (rp.left + rp.width) * scale, y1: rp.top * scale, y2: (rp.top + rp.height) * scale, width: rp.width * scale, // not used by Tabula right now, but used in the UI elsewhere - height: rp.height * scale, // not used by Tabula right now, but used in the UI elsewhere + height: rp.height * scale // not used by Tabula right now, but used in the UI elsewhere }); }, @@ -100,7 +106,7 @@ Tabula.Selection = Backbone.Model.extend({ } var selection_coords = { page: this.get('page_number'), - extraction_method: this.get('extractionMethod') || 'guess', + extraction_method: this.get('extractionMethod') || 'stream',//'guess', selection_id: this.id, x1: this.get('x1'), x2: this.get('x2'), @@ -158,34 +164,43 @@ Tabula.Options = Backbone.Model.extend({ */ Tabula.Selections = Backbone.Collection.extend({ - // model: Tabula.Selection, + model: Tabula.Selection, comparator: 'page_number', - updateOrCreateByVendorSelectorId: function(vendorSelection, pageNumber, imageWidth){ + + + updateOrCreateByVendorSelectorId: function(vendorSelection, pageNumber, imageDims){ + //console.log("In updateOrCreateByVendorSelectorId:"); + //console.log("VendorSelection:"); + //console.log(vendorSelection); var selection = this.get(vendorSelection.id); if (selection) { // if it already exists + //console.log("Selection already in the collection"); selection.set(_.omit(vendorSelection, 'id')); } else { - new_selection_args = _.extend({'page_number': pageNumber, - 'imageWidth': imageWidth, + //console.log("Selection was not already in the collection"); + var new_selection_args = _.extend({'page_number': pageNumber, + 'imageWidth': imageDims.width, + 'imageHeight': imageDims.height, 'extraction_method': Tabula.pdf_view.options.extraction_method, 'hidden': false, 'pdf_document': this.pdf_document}, vendorSelection); selection = new Tabula.Selection(new_selection_args); + //console.log(selection.toJSON()); this.add(selection); } return selection; }, createHiddenSelection: function(sel){ - new_selection_args = _.extend({'page_number': sel.page, + var new_selection_args = _.extend({'page_number': sel.page, 'extraction_method': 'spreadsheet', 'id': Math.random().toString(), 'hidden': true, 'pdf_document': this.pdf_document}, sel); - selection = new Tabula.Selection(new_selection_args); + var selection = new Tabula.Selection(new_selection_args); this.add(selection); return selection; } @@ -197,7 +212,8 @@ Tabula.AutodetectedSelections = Tabula.Selections.extend({ url: null, //set on init initialize: function(){ this.url = (base_uri || '/') + 'pdfs/' + PDF_ID + '/tables.json?_=' + Math.round(+new Date()).toString(); - _.bindAll(this, 'updateOrCreateByVendorSelectorId'); + // _.bindAll(this, 'updateOrCreateByVendorSelectorId'); What is this line doing?? + }, parse: function(response){ @@ -217,8 +233,8 @@ Tabula.AutodetectedSelections = Tabula.Selections.extend({ y2: tableCoords[1] + tableCoords[3], width: tableCoords[2], height: tableCoords[3], - page: pageIndex, - extraction_method: 'spreadsheet', + page_number: pageIndex, + extraction_method: 'stream',//'spreadsheet', selection_id: null }; }, this)); @@ -269,7 +285,7 @@ Tabula.Query = Backbone.Model.extend({ var delimiter = typeof delimiter_maybe_undef == "undefined" ? ',' : delimiter_maybe_undef var csv = _(this.get('data')).chain().pluck('data').map(function(table){ return _(table).chain().map(function(row){ - return _.map(row, function(cell){ + return _.map(row, function(cell){ var text = cell.text; text = text.replace("\"", "\\\""); //escape quotes text = text.indexOf(delimiter) > -1 ? "\"" + text + "\"" : text; //enquote cells containing the delimiter. @@ -295,29 +311,41 @@ Tabula.Query = Backbone.Model.extend({ }, doQuery: function(options) { + this.query_data = { 'coords': JSON.stringify(this.get('list_of_coords')), - 'new_filename': null, + 'extraction_method': JSON.stringify(this.get('extraction_method')), + 'new_filename': null }; // print selection coordinates to the console // way easier FOR NOW than downloading the script/JSON + console.log("List of coordinates:"); console.log(_.map(this.get('list_of_coords'), function(l){ return [l.y1, l.x1, l.y2, l.x2].join(', '); }).join("\n") ); // shallow copy the selections collection - // so if hte user somehow changes the selections between starting the query and it finishing, + // so if the user somehow changes the selections between starting the query and it finishing, // there isn't an error var stashed_selections = new Tabula.Selections(Tabula.pdf_view.pdf_document.selections.models.slice()); this.trigger("tabula:query-start"); window.tabula_router.navigate('pdf/' + PDF_ID + '/extract'); // TODO: this should probably go in a view!! -JBM + + console.log("Query Data:"); + console.log(this.query_data); + $.ajax({ type: 'POST', url: (base_uri || '/') + 'pdf/' + PDF_ID + '/data', data: this.query_data, success: _.bind(function(resp) { + console.log("Response on success:"); + console.log(resp); this.set('data', resp); + console.log("Get data:"); + console.log(this.get('data')); + // this only needs to happen on the first select, when we don't know what the extraction method is yet // (because it's set by the heuristic on the server-side). // TODO: only execute it when one of the list_of_coords has guess or undefined as its extraction_method @@ -327,7 +355,7 @@ Tabula.Query = Backbone.Model.extend({ // var coord_set = stuff[0]; // var resp_item = stuff[1]; // if(!coord_set) return; // DIRTY HACK, see https://github.com/tabulapdf/tabula/issues/497 - // // if one set of coords returns 2+ tables, + // // if one set of coords returns 2+ tables, // // then this zip won't work. if (stashed_selections.get(coord_set.selection_id)){ stashed_selections.get(coord_set.selection_id). @@ -406,8 +434,11 @@ Tabula.DataView = Backbone.View.extend({ // one per query object. initialize: function(stuff){ + console.log("In initialize of Tabula.DataView..."); _.bindAll(this, 'render', 'renderFlashClipboardNonsense', 'updateFilename', 'queryWithToggledExtractionMethod', 'closeAndRenderSelectionView', 'setFormAction'); this.pdf_view = stuff.pdf_view; + console.log("Model to Tabula.DataView:"); + console.log(this.model); this.listenTo(this.model, 'tabula:query-start', this.render); this.listenTo(this.model, 'tabula:query-success', this.render); this.listenTo(this.model, 'tabula:query-error', this.render); @@ -427,22 +458,95 @@ Tabula.DataView = Backbone.View.extend({ // one per query object. } }, closeAndRenderSelectionView: function(){ + window.tabula_router.navigate('pdf/' + PDF_ID); this.$el.empty(); + this.undelegateEvents(); + this.pdf_view.$el.show(); this.pdf_view.render(); $('body').removeClass('page-export'); $('body').addClass('page-selections'); + + var regex_search_collection = Tabula.pdf_view.components['sidebar_view'].regex_handler.regex_results_handler.collection.models; + + /* + * The rectangular coordinate areas associated with regex searches are stored in 2 areas (as of 1/30/2018): + * 1) this.pdf_view.pdf_document.selections.models + * 2) Tabula.pdf_view.components['sidebar_view'].regex_handler.regex_results_handler.collection.models + * + * Therefore, when destroying one of these coordinate areas, its reference must be removed from both collections + * Also: When creating one of these coordinate areas, renderSelection must be called only once + * Note: In a perfect world, this complexity would be better baked into the design. Given the time constraints + * of the project at hand as well as the largely ambiguous project scope, such a refactoring is not possible. + */ + var already_rendered_selections = []; + + regex_search_collection.forEach(function(regex_result){ + var refreshed_selections_rendered = new Map(); + console.log("regex_result"); + console.log(regex_result); + + + var selections_rendered = regex_result.attributes.selections_rendered; + + console.log(selections_rendered); + + selections_rendered.forEach(function(rendered_sels,matching_area){ + console.log("Rendered_sels:"); + console.log(rendered_sels); + + var refreshed_sels = new Tabula.Selections(); + + rendered_sels.forEach(function(rendered_sel){ + var refreshed_sel = Tabula.pdf_view.renderSelection(rendered_sel.attributes); + rendered_sel.attributes.remove(); + refreshed_sels.add(refreshed_sel); + already_rendered_selections.push(refreshed_sel); + }); + + refreshed_selections_rendered.set(matching_area,refreshed_sels); + + regex_result.attributes.selections_rendered = refreshed_selections_rendered; + }); + + }); + + console.log("Already_rendered_selections:"); + console.log(already_rendered_selections); + var oldSelections = this.pdf_view.pdf_document.selections.models.map(function(sel){ - var selection = Tabula.pdf_view.renderSelection(sel.toCoords()); - // selection.attributes.rebind(); // o. m. g. - return selection; - }); + console.log("Selection:"); + console.log(sel.attributes); + + console.log("Already_rendered_selections:"); + console.log(already_rendered_selections); + + if($.inArray(sel,already_rendered_selections)!=-1){ + console.log('Selection has already been rendered'); + return sel; + } + else{ + console.log('Selection has not already been rendered...'); + return Tabula.pdf_view.renderSelection(sel['attributes']); + } + }); + + console.log("Old Selections:"); + console.log(oldSelections); + this.pdf_view.pdf_document.selections.reset(oldSelections); - _(this.pdf_view.components["sidebar_view"].thumbnail_list_view.thumbnail_views).each(function(v){ v.delegateEvents() }); + + console.log("Selection Array after:"); + console.log(this.pdf_view.pdf_document.selections.toArray()); + + + _(this.pdf_view.components["sidebar_view"].thumbnail_list_view.thumbnail_views).each(function(v){ + console.log("V:",v); + v.delegateEvents() }); }, setFormAction: function(e){ @@ -472,6 +576,38 @@ Tabula.DataView = Backbone.View.extend({ // one per query object. $('.table-region').remove(); $('.selection-show').remove(); // nuke thumbs, we'll put 'em back in a second + + //Short-hand variable... + var regex_collection = Tabula.pdf_view.components['sidebar_view'].regex_handler.regex_results_handler.collection.models; + + var regex_selection_ids = []; + + regex_collection.forEach(function(regex_search){ + regex_search.attributes.selections_rendered.forEach(function(sub_sections){ + return sub_sections.models.map(function(sub_section){ + console.log("Sub_Section:"); + console.log(sub_section); + console.log(sub_section.id); + regex_selection_ids.push(sub_section.id); + }); + }); + }); + + var header_scale = Tabula.pdf_view.components['document_view'].header_scale; + var footer_scale = Tabula.pdf_view.components['document_view'].footer_scale; + + + console.log(Tabula.pdf_view.components['document_view']); + + var user_drawn_selections = this.model.attributes.list_of_coords.filter(function(selection){ + return regex_selection_ids.every(function(regex_id){ + return regex_id != selection.selection_id; + }); + }); + + console.log("NEW_ARGS"); + console.log(JSON.stringify(user_drawn_selections)); + this.$el.html(this.template({ pdf_id: PDF_ID, data: this.model.getDataArray(), @@ -482,7 +618,9 @@ Tabula.DataView = Backbone.View.extend({ // one per query object. _.template($('#templates #export-control-panel-template').html().replace(/nestedscript/g, 'script'))( _(this.pdf_view.pdf_document.attributes).extend({ pdf_id: PDF_ID, - list_of_coords: JSON.stringify(this.model.get('list_of_coords')), + list_of_coords: JSON.stringify(this.model.attributes.list_of_coords), + user_drawn_selections: JSON.stringify(user_drawn_selections), //selections not user_drawn were regex... + margin_scale: JSON.stringify({'header_scale':header_scale,'footer_scale':footer_scale}), copyDisabled: Tabula.pdf_view.flash_borked ? 'disabled="disabled" data-toggle="tooltip" title="'+Tabula.pdf_view.flash_borken_message+'"' : '', disableIfNoData: (_.isNull(this.model.get('data')) || typeof(this.model.get('data')) === "undefined") ? 'disabled="disabled"' : '' }) @@ -587,25 +725,26 @@ Tabula.DataView = Backbone.View.extend({ // one per query object. this.pdf_view.options.set('extraction_method', extractionMethod); Tabula.pdf_view.query.setExtractionMethod(extractionMethod); Tabula.pdf_view.query.doQuery(); - }, + } }); + Tabula.DocumentView = Backbone.View.extend({ // Singleton - events: { - }, + events: {}, pdf_view: null, //added on create page_views: {}, rectangular_selector: null, - + header_height: 0, + header_scale: 0, + footer_height: 0, + footer_scale: 0, _selectionsGetter: function(target) { return _(Tabula.pdf_view.pdf_document.selections.where({page_number: $(target).data('page')})).map(function(i){ return i.attributes; }); }, - initialize: function(stuff){ - _.bindAll(this, 'render', 'removePage', 'addSelection', '_onRectangularSelectorEnd', '_selectionsGetter'); + _.bindAll(this, 'render', 'removePage', 'addSelection', '_onRectangularSelectorEnd', '_selectionsGetter'); this.pdf_view = stuff.pdf_view; this.listenTo(this.collection, 'remove', this.removePage); - // attach rectangularSelector to main page container this.rectangular_selector = new RectangularSelector( this.$el, @@ -619,8 +758,8 @@ Tabula.DocumentView = Backbone.View.extend({ // Singleton } } ); - }, + }, addSelection: function (d) { var page_number = $(d.pageView).data('page') || d.pageNumber; var pv = this.page_views[page_number]; @@ -636,6 +775,7 @@ Tabula.DocumentView = Backbone.View.extend({ // Singleton pv._onSelectEnd(rs); this.$el.append(rs.el); rs.$el.css('z-index', 100 - this._selectionsGetter($(d.pageView)).length); + }, // listens to mouseup of RectangularSelector @@ -653,21 +793,74 @@ Tabula.DocumentView = Backbone.View.extend({ // Singleton }); }, + update_filter_specs: function(data){ + + var return_vals={'previous_header_height':this.header_height, + 'previous_footer_height':this.footer_height, + 'previous_header_scale':this.header_scale, + 'previous_footer_scale':this.footer_scale}; + + if(data['header_height']!=undefined){ + console.log('header height was defined...'); + return_vals['header_height']=this.header_height = data['header_height']; + return_vals['header_scale']=this.header_scale = data['header_scale']; + return_vals['footer_height']=this.footer_height; + return_vals['footer_scale']=this.footer_scale; + } + if(data['footer_height']!=undefined){ + console.log('footer height was defined...'); + return_vals['footer_height']=this.footer_height = data['footer_height']; + return_vals['footer_scale']=this.footer_scale = data['footer_scale']; + return_vals['header_height']=this.header_height; + return_vals['header_scale']=this.header_scale; + } + + Object.keys(this.page_views).forEach(function(key){ + var page_view = Tabula.pdf_view.components['document_view'].page_views[key]; + if(page_view.imageIsLoaded){ + page_view.header_view.$el.css({ + top: 0, + left: page_view.$el.find('.page')['0'].offsetLeft, + width: $(page_view.image).width(), + height: Tabula.pdf_view.components['document_view'].header_height + }); + + page_view.footer_view.$el.css({ + top: $(page_view.image).height() - Tabula.pdf_view.components['document_view'].footer_height, + left: page_view.$el.find('.page')['0'].offsetLeft, + width: $(page_view.image).width(), + height: Tabula.pdf_view.components['document_view'].footer_height + }); + } + }); + + + return return_vals; + }, + render: function(){ if(!Tabula.LazyLoad){ // old-style, non-lazyload behavior + console.log("if not Tabula.LazyLoad"); _(this.page_views).each(_.bind(function(page_view, index){ + console.log("Page:"); + console.log($('#page-'+parseInt(index)+1)); var already_on_page = $('#page-' + parseInt(index)+1).length; - if(!already_on_page) this.$el.append(page_view.render().el); + if(!already_on_page){ + this.$el.append(page_view.render().el); + } }, this)); }else{ - //useful in the console for debugging: + //useful in the console for debugging: // $('.pdf-page:visible').map(function(i, el){ return $(el).find('img').data('page') }).get(); // just so pages end up in the right order, we have to loop AWAY FROM the cursor in both directions // so if the cursor is at 1. for (var number=Tabula.pdf_view.lazyLoadCursor;number>0;number--){ + + var page_view = this.page_views[number]; + if(!page_view) continue; // this is the first render, and there are no pages (probably!) var page_el = $('#page-' + number); var visible_on_page = page_el.filter(':visible').length; @@ -703,12 +896,13 @@ Tabula.DocumentView = Backbone.View.extend({ // Singleton // console.log('show ' + number); }else{ this.$el.append(page_view.render().el); - } } } } + } + // should remove the "hidden" selections // then should render the selections for this page from autodetectedSelections the "normal" way. Tabula.pdf_view.pdf_document.selections.filter(function(sel){ return sel.get('hidden') && sel.get('page') <= number}).map(function(hidden_selection){ @@ -716,16 +910,29 @@ Tabula.DocumentView = Backbone.View.extend({ // Singleton var new_selection = Tabula.pdf_view.renderSelection(hidden_selection.attributes); // adds it to Tabula.pdf_view.pdf_document.selections return new_selection; }); + + + return this; } }); +//Tabula.PageView +// Backbone View extension responsible for rendering each page of a document +// +// Serves as the Controller in the Model-View-Controller pattern enforced by Backbone. Creates the ReqgexQueryHandler +// and RegexCollectionView objects resposible for displaying the regex search information. Controls the AJAX request +// and the processing of information returned from the server. +// +// 1/19/2018 REM; added header_view and renderHeader to support user-defined header operations Tabula.PageView = Backbone.View.extend({ // one per page of the PDF document_view: null, //added on create + header_view: null, + footer_view: null, className: 'pdf-page', iasAlreadyInited: false, + imageIsLoaded:false, selections: null, - id: function(){ return 'page-' + this.model.get('number'); }, @@ -740,23 +947,126 @@ Tabula.PageView = Backbone.View.extend({ // one per page of the PDF this.pdf_view = stuff.pdf_view; _.bindAll(this, 'rotate_page', 'createTables', '_onSelectStart', '_onSelectChange', '_onSelectEnd', '_onSelectCancel', 'render'); - this.listenTo(Tabula.pdf_view.pdf_document, 'change', function(){ this.render(); }); - this.listenTo(Tabula.pdf_view.pdf_document, 'change', function(){ this.render(); }); + this.listenTo(Tabula.pdf_view.pdf_document, 'change', function(){ + this.render(); }); + + + //Set header_view to zeroed out values until image has been loaded + this.header_view = new HeaderView({'top':0, + 'left':0, + 'width':0, + 'height':0}); + + this.footer_view = new FooterView({'top':0, + 'left':0, + 'width':0, + 'height':0}); + + this.listenTo(this.header_view,'header_resized',this.detect_filter_resize); + this.listenTo(this.footer_view,'footer_resized',this.detect_filter_resize); }, + detect_filter_resize: function(data){ + + data['footer_scale'] = data['footer_height']/parseFloat(this.$el.css('height')); + data['header_scale'] = data['header_height']/parseFloat(this.$el.css('height')); + var filter_data = Tabula.pdf_view.components['document_view'].update_filter_specs(data); + + Tabula.pdf_view.components['sidebar_view'].regex_handler.regex_results_handler.update_regex_search_properties_on_resize(filter_data); + }, + + + render: function(){ + this.$el.html(this.template({ 'number': this.model.get('number'), 'image_url': this.model.imageUrl() })); + + this.image = new Image(); + this.image.src = this.model.imageUrl(); + this.image.draggable = false; + this.image.ondrag = function(ev){ return false;}; + this.image['user-drag']="none"; + this.image['user-select']="none"; + this.image.selectable = "on"; + + this.$el.find('.page').append(this.image); + this.$el.append(this.header_view.el); + this.$el.append(this.footer_view.el); + this.$el.find('img').attr('data-page', this.model.get('number')) - .attr('data-original-width', this.model.get('width')) - .attr('data-original-height', this.model.get('height')); - // .attr('data-rotation', this.model.get('rotation')); - this.$image = this.$el.find('img'); + .attr('data-original-width', this.model.get('width')) + .attr('data-original-height', this.model.get('height')); + // .attr('data-rotation', this.model.get('rotation')); + + if(this.imageIsLoaded){ + + if(this.header_view==undefined || this.header_view==null){ + this.header_view = new HeaderView({'top':0, + 'left':0, + 'width':0, + 'height':0}); + } + + if(this.footer_view==undefined || this.footer_view==null){ + this.footer_view = new FooterView({'top':0, + 'left':0, + 'width':0, + 'height':0}); + } + + this.header_view.$el.show(); + this.footer_view.$el.show(); + + this.header_view.$el.css({ + top: 0, + left: this.$el.find('.page')['0'].offsetLeft, + width: $(this.image).width(), + height: Tabula.pdf_view.components['document_view'].header_height + }); + + this.footer_view.$el.show(); + this.footer_view.$el.css({ + top: $(this.image).height() - Tabula.pdf_view.components['document_view'].footer_height, + left: this.$el.find('.page')['0'].offsetLeft, + width: $(this.image).width(), + height: Tabula.pdf_view.components['document_view'].footer_height + }); + } + else{ + this.header_view.$el.hide(); + this.footer_view.$el.hide(); + } + + var self = this; + this.image.onload = function(data) { + + self.imageIsLoaded = true; + + $(this).data('loaded', 'loaded'); + self.header_view.$el.show(); + self.header_view.$el.css({ + top: 0, + left: self.$el.find('.page')['0'].offsetLeft, + width: $(self.image).width(), + height: Tabula.pdf_view.components['document_view'].header_height + }); + + self.footer_view.$el.show(); + self.footer_view.$el.css({ + top: $(self.image).height() - Tabula.pdf_view.components['document_view'].footer_height, + left: self.$el.find('.page')['0'].offsetLeft, + width: $(self.image).width(), + height: Tabula.pdf_view.components['document_view'].footer_height + }); + }; + // console.log(this.$el.find('.page').find('img')); + + return this; }, - createTables: function(asfd){ this.iasAlreadyInited = true; }, @@ -764,28 +1074,43 @@ Tabula.PageView = Backbone.View.extend({ // one per page of the PDF _onSelectStart: function(selection) { Tabula.pdf_view.pdf_document.selections.updateOrCreateByVendorSelectorId(selection, this.model.get('number'), - this.$image.width()); + {'width': this.image.width(), + 'height': this.image.height}); }, _onSelectChange: function(selection) { Tabula.pdf_view.pdf_document.selections.updateOrCreateByVendorSelectorId(selection, this.model.get('number'), - this.$image.width()); + {'width': this.image.width(), + 'height': this.image.height()}); }, _onSelectEnd: function(selection) { - var sel = Tabula.pdf_view.pdf_document.selections.updateOrCreateByVendorSelectorId(selection, - this.model.get('number'), - this.$image.width()); + + console.log("In _onSelectEnd:"); + console.log("selection:"); + console.log(selection); + + + + var selections = Tabula.pdf_view.pdf_document.selections; + + var sel = selections.updateOrCreateByVendorSelectorId(selection,this.model.get('number'), + {'width':$(this.image).width(), + 'height':$(this.image).height()}); + // deal with invalid/too-small selections somehow (including thumbnails) if (selection.width === 0 && selection.height === 0) { - $('#thumb-' + this.$image.attr('id') + ' #vendorSelection-show-' + selection.id).css('display', 'none'); + $('#thumb-' + this.image.attr('id') + ' #vendorSelection-show-' + selection.id).css('display', 'none'); selection.remove(); } + + // if this is not the last pager - if(this.model != this.model.collection.last()) { + + if((this.model != this.model.collection.last()) && (selection.el.className!=="regex-table-region")) { var but_id = this.model.get('number') + '-' + selection.id; //create a "Repeat this Selection" button var button = $('
    \ \ @@ -808,13 +1133,18 @@ Tabula.PageView = Backbone.View.extend({ // one per page of the PDF // vendorSelection _onSelectCancel: function(selection) { + + console.log("In _onSelectCancel:"); + console.log("Parameter passed to _onSelectCancel:"); + console.log(selection); + // remove repeat lassos button - var but_id = this.$image.attr('id') + '-' + selection.id; + var but_id = $(this.image).attr('id') + '-' + selection.id; $('button#' + but_id).remove(); // find and remove the canceled selection from the collection of selections. (triggering remove events). var sel = Tabula.pdf_view.pdf_document.selections.get(selection.id); - removed_selection = Tabula.pdf_view.pdf_document.selections.remove(sel); + var removed_selection = Tabula.pdf_view.pdf_document.selections.remove(sel); Tabula.pdf_view.components['control_panel'].render(); // deal with buttons that need blurred out if there's zero selections, etc. }, @@ -831,6 +1161,7 @@ Tabula.ControlPanelView = Backbone.View.extend({ // only one 'click #all-data': 'queryAllData', 'click #repeat-lassos': 'repeatLassos', 'click #save-template': 'saveTemplate', + }, template: _.template($('#templates #select-control-panel-template').html().replace(/nestedscript/g, 'script')), @@ -850,8 +1181,12 @@ Tabula.ControlPanelView = Backbone.View.extend({ // only one }, clearAllSelections: function(){ - _(Tabula.pdf_view.pdf_document.selections.models.slice()).each(function(i){ if(typeof i.attributes.remove !== "undefined") i.attributes.remove(); }); // call remove() on the vendorSelection of each seleciton; except for "hidden" selections that don't have one. + Tabula.pdf_view.components['sidebar_view'].regex_handler.regex_results_handler.reset(); + Tabula.pdf_view.components['sidebar_view'].regex_handler.regex_results_handler.render(); + _(Tabula.pdf_view.pdf_document.selections.models.slice()).each(function(i){ + if(typeof i.attributes.remove !== "undefined") i.attributes.remove(); }); // call remove() on the vendorSelection of each seleciton; except for "hidden" selections that don't have one. Tabula.pdf_view.pdf_document.selections.reset([]); + Tabula.pdf_view.components['control_panel'].render(); // deal with buttons that need blurred out if there's zero selections, etc. // reset doesn't trigger the right events because we have to remove from the collection and from the page (with selection.remove()) // we can't use _.each because we're mutating the collection that we're iterating over @@ -864,7 +1199,7 @@ Tabula.ControlPanelView = Backbone.View.extend({ // only one var oldButtonText = $btnText.text(); $btn.attr("disabled", "disabled"); $btnText.text("Saving..."); - this.pdf_view.saveTemplate(function(){ + this.pdf_view.saveTemplate(function(){ $btnText.text("Saved!"); window.setTimeout( function(){ $btn.removeAttr("disabled"); @@ -881,9 +1216,10 @@ Tabula.ControlPanelView = Backbone.View.extend({ // only one this.pdf_view.pdf_document.selections.reset(autodetected_selections); }, - queryAllData : function(){ + queryAllData: function(){ + console.log("In queryAllData:"); + console.log(Tabula.pdf_view.pdf_document.selections); var list_of_all_coords = Tabula.pdf_view.pdf_document.selections.invoke("toCoords"); - //TODO: figure out how to handle extraction methods when there are multiple selections // should it be set globally, or per selection? // actually, how to handle extraction method is a bit of an open question. @@ -896,7 +1232,7 @@ Tabula.ControlPanelView = Backbone.View.extend({ // only one // when you finish a query, then still pop up its data. // when you click or move an already-selected query, then you're "editing" it? // hmm. - Tabula.pdf_view.query = new Tabula.Query({list_of_coords: list_of_all_coords, extraction_method: 'guess'}); + Tabula.pdf_view.query = new Tabula.Query({list_of_coords: list_of_all_coords, extraction_method: 'stream'}); Tabula.pdf_view.createDataView(); Tabula.pdf_view.query.doQuery(); }, @@ -916,17 +1252,490 @@ Tabula.ControlPanelView = Backbone.View.extend({ // only one 'disable_load_template': numOfSelectionsOnPage > 0 ? 'disabled="disabled"' : '' }))); - + this.$el.find("#template-dropdown-templates-list-container").html(this.saved_template_library_view.render().el); + return this; + } +}); + +//Tabula.RegexHandler +// Backbone View extension for handling the UI regarding regex searches. +// +// Serves as the Controller in the Model-View-Controller pattern enforced by Backbone. Creates the ReqgexQueryHandler +// and RegexCollectionView objects resposible for displaying the regex search information. Controls the AJAX request +// and the processing of information returned from the server. +// +// 11/23/2017 REM; created +// +Tabula.RegexHandler = Backbone.View.extend({ + el: "#regex-container", + className: 'regex-handler', + events: {'click #regex-search': 'perform_regex_search'}, + regex_results_handler: null, + regex_query_handler: null, + initialize: function(){ + this.regex_query_handler = new Tabula.RegexQueryHandler(); + this.regex_results_handler= new Tabula.RegexCollectionView(); + }, + //Event handler called when the Set Regex button is pushed + perform_regex_search: function() { + /* + *Determine if regex pattern has already been previously searched for + */ + + //console.log("In perform_regex_search:"); + + + if (this.regex_results_handler.has_same_query(this.regex_query_handler.model.toJSON()) == false) { + $('html').addClass("wait"); + $.ajax({ + type: 'POST', + url: '/regex/search', + data: this.regex_query_handler.model.toJSON(), + dataType: 'json', + complete: function(){ + $('html').removeClass("wait"); + }, + success: _.bind(function (data) { + + this.regex_results_handler.process_result(data); + + }, this), + error: function (xhr, status, err) { + alert('Error in regex search: ' + JSON.stringify(err)); + console.log('Error in regex search: ', err); + console.log(xhr); + console.log(status); + } + }); + } + else { + alert('The requested search has already been performed. Please try a different search pattern.') + } + this.regex_query_handler.reset_inputs(); + } +}); + +//Tabula.RegexResultCollection +// Backbone Collection extension for storing all created Tabula.RegexResultModel +// +// 11/23/2017 REM; created +// +Tabula.RegexResultCollection= Backbone.Collection.extend({ + model: Tabula.RegexResultModel, + initialize: function () {} +}); + + +//Tabula.RegexCollectionView +// Backbone View extension for all generated Tabula.RegexResultView objects. +// +// Processes the regex result information returning from the server and oversees the rendering of all the +// Tabula.RegexResultView objects. +// +// 11/23/2017 REM; created +// +Tabula.RegexCollectionView = Backbone.View.extend({ + el : '.regex-results-list', + events: {'remove_element': 'remove_regex_search'}, + collection : Tabula.RegexResultCollection, + initialize: function(){ + //Make the render function get called any time a model is added + console.log('In initialize function of Tabula.RegexCollectionView:'); + console.log(this.el); + this.collection = new Tabula.RegexResultCollection(); + this.collection.on('add',this.render,this); + }, + update_regex_search_properties_on_resize: function(filter_data){ + console.log("In update_regex_search_properties_on_resize..."); + console.log(filter_data); + var new_subsections=new Tabula.Selections(); + $('html').addClass("wait"); + $.ajax({ + type: 'POST', + url: '/regex/check-on-resize', + data: filter_data, + complete: function () { + $('html').removeClass("wait"); + }, + success: _.bind(function (data) { + + var query_models = this.collection.models; + JSON.parse(data).forEach(function (element) { + var query_to_update = _.find(query_models, function (model) { + return (model.attributes.pattern_before == element.updated_regex_search._regex_before_table.pattern) && + (model.attributes.pattern_after == element.updated_regex_search._regex_after_table.pattern) + }); + + var match_count_change = 0; + + //TODO: Refactor below to remove code redundancies if time permits... + + element.areas_removed.forEach(function (matching_area_to_remove) { + console.log("Matching Area To Remove:"); + console.log(matching_area_to_remove); + var front_end_match = _.find(Array.from(query_to_update.attributes.selections_rendered.keys()), function (key_match) { + return _.isEqual(key_match, matching_area_to_remove); + }); + query_to_update.attributes.selections_rendered.get(front_end_match).forEach(function (subsection) { + console.log("Subsection attributes:"); + console.log(subsection.attributes); + if(subsection.attributes.hasOwnProperty('remove')){ + subsection.attributes.remove(); + } + }); + query_to_update.attributes.matching_areas.splice(front_end_match, 1); + query_to_update.attributes.selections_rendered.delete(front_end_match); + match_count_change--; + }); + + element.areas_added.forEach(function (matching_area_to_add) { + //console.log("Matching Area to Add:"); + //console.log(matching_area_to_add); + var created_subsections = new Tabula.Selections(); + Object.keys(matching_area_to_add).forEach(function (page_number) { + console.log("Page Number:" + page_number); + matching_area_to_add[page_number].forEach(function (subsection) { + console.log('SUBSECTION:'); + console.log(subsection); + var new_subsection = Tabula.pdf_view.renderSelection({ + x1: subsection._area['x'], + y1: subsection._area['y'], + x2: subsection._area['x']+subsection._area['width'], + y2: subsection._area['y']+subsection._area['height'], + width: subsection._area['width'], + height: subsection._area['height'], + page_number: subsection._page_num, + extraction_method: 'stream',//'spreadsheet', + selection_id: null, + selection_type: 'regex' + }); + created_subsections.add(new_subsection); + new_subsections.add(new_subsection); + }); + }); + match_count_change++; + query_to_update.attributes.selections_rendered.set(matching_area_to_add, created_subsections); + }); + + query_to_update.set({ + matching_areas: query_to_update.attributes.matching_areas, + num_matches: (query_to_update.attributes.num_matches + match_count_change) + }); + + }); + + + console.log("New Subsections:"); + if(new_subsections.models.every(function(subsection){ + console.log("New Subsection:"); + if(subsection.attributes.hasOwnProperty('checkOverlaps')){ + return subsection.attributes.checkOverlaps(); + } + else{ + return true; + } + })===false){ + + //Resetting the header,footer info to previous state, as current state violates desired behavior + //(regex searches that overlap one another) + + filter_data['header_height']=filter_data['previous_header_height']; + filter_data['footer_height']=filter_data['previous_footer_height']; + filter_data['header_scale'] =filter_data['previous_header_scale']; + filter_data['footer_scale']=filter_data['previous_footer_scale']; + alert('Request resive event will lead to overlap in regex searches. Restructure regex searches and try again...'); + Tabula.pdf_view.components['document_view'].update_filter_specs(filter_data); + this.update_regex_search_properties_on_resize(filter_data); + } + }, this), + error: function (xhr, status, err) { + alert('Error in regex-check-on-resize event: ' + JSON.stringify(err)); + console.log('Error in regex check: ', err); + console.log(xhr); + console.log(status); + } + }); + + }, + remove_regex_search: function(event_data,search_to_remove){ + console.log("Search to remove:"); + console.log(search_to_remove.attributes); + $.ajax({ + type: 'POST', + url: '/regex/remove-search-data', + data: {'pattern_before': search_to_remove.attributes.pattern_before, + 'pattern_after': search_to_remove.attributes.pattern_after }, + dataType: 'json', + success: _.bind(function (data) { + console.log("Back end removal successful:"); + console.log(data) + + }, this), + error: function (xhr, status, err) { + alert('Error removing back-end data for: ' +search_to_remove + 'Error message: ' + JSON.stringify(err)); + console.log('Error message: ' + JSON.stringify(err)); + console.log(xhr); + console.log(status); + } + }); + this.collection.remove(search_to_remove); + }, + reset : function(){ + _.each(this.collection.toArray(),function(regex_search){ + //Removing all the drawn regex rectangles: + _.each(regex_search.toJSON()['selections_rendered']['models'],function(matching_area){ + matching_area.forEach(function(subsection){ + subsection.attributes.remove(); + }); + }) + }); + //Remove all the entries in regex table in the side bar + this.collection.reset(); + }, + + render: function(){ + var self = this; + this.$el.html(''); + _.each(this.collection.toArray(),function(regex_result){ + self.$el.append((new Tabula.RegexResultView({model:regex_result})).render().$el); + }); + + return this; + }, + has_same_query: function(current_query){ + return !this.collection.toArray().every(function(prev_query){ + return ( (prev_query['attributes']['pattern_before']!=current_query['pattern_before']) && + (prev_query['attributes']['pattern_after']!=current_query['pattern_after']) ); + }); + }, + process_result: function (search_results) { + + console.log("In process_result:"); + console.log(search_results); + + var selections_rendered = new Map(); + search_results["_matching_areas"].forEach(function(matching_area){ + selections_rendered.set(matching_area,new Tabula.Selections()); + Object.keys(matching_area).forEach(function(page_with_match){ + matching_area[page_with_match].forEach(function(regex_rect){ + selections_rendered.get(matching_area).add(Tabula.pdf_view.renderSelection({ + x1: regex_rect._area['x'], + y1: regex_rect._area['y'], + x2: regex_rect._area['x']+regex_rect._area['width'], + y2: regex_rect._area['y']+regex_rect._area['height'], + width: regex_rect._area['width'], + height: regex_rect._area['height'], + page_number: regex_rect._page_num, + extraction_method: 'stream',//'spreadsheet', + selection_id: null, + selection_type: 'regex' + })); + }); + }); + }); + + //Check for overlapping queries + + if(Array.from(selections_rendered.keys()).every(function(matching_area){ + return selections_rendered.get(matching_area).every(function(subsection){ + if(subsection.attributes.hasOwnProperty('checkOverlaps')){ + return subsection.attributes.checkOverlaps(); + } + else{ + return true; + } + })})) + { + this.collection.add(new Tabula.RegexResultModel({ + pattern_before: search_results["_regex_before_table"]["pattern"], + pattern_after: search_results["_regex_after_table"]["pattern"], + num_matches: search_results["_matching_areas"].length, + matching_areas: search_results["_matching_areas"], + selections_rendered: selections_rendered + })); + } + else{ + alert('Requested regex search will overlap with an already performed search. Please restructure your search' + + ' and try again'); + selections_rendered.forEach(function(matching_area){ + matching_area.forEach(function(subsection){ + subsection.attributes.remove(); + }); + }) + } + + + }}); + +//Tabula.RegexResultView +// Backbone View extension for displaying the results of the regex search sent back from the server. +// +// Creates the model storing the data returned from the server and renders the summarized info in the side pane. +// +// 11/23/2017 REM; created +// +Tabula.RegexResultView = Backbone.View.extend({ + className: 'regex-result', + model: Tabula.RegexResultModel, + tagName: 'tr', + events: {'click':'remove_element_request'}, + initialize: function(data){ + //console.log('In Tabula.RegexResultView.initialize:'); + //console.log(data.model); + this.model = data.model; +// console.log(JSON.stringify($('#regex-result').html())); + this.template = _.template($('#regex-result').html()); + + this.listenTo(this.model,'change',this.render); + }, + render: function(){ + //console.log("In render of Tabula.RegexResultView:"); + //console.log("this.model:"); + //console.log(this.model); + this.$el.html(this.template(this.model.attributes)); return this; }, + remove_element_request: function(event){ + //Removing the RegexSelection objects associated with the RegexResult + this.model.attributes.selections_rendered.forEach(function(matching_area){ + + matching_area.forEach(function(subsection){ + if(subsection.attributes.hasOwnProperty('remove')){ + subsection.attributes.remove(); + } + }); + }); + //Removing the reference to the corresponding RegexResultModel + this.$el.trigger('remove_element',this.model); + //Removing the table entry + this.remove(); + } + +}); + +//Tabula.RegexResultModel +// Backbone Model extension for retaining the information sent back from the server for a given regex search. +// +// Stores the patterns used in the regex search and the number of matching tables, along with the coordinates +// of the matching areas. +// +// 11/23/2017 REM; created +// +Tabula.RegexResultModel = Backbone.Model.extend({ + + pattern_before: null, //set on initialize + pattern_after: null, //set on initialize + num_matches: null, //set on initialize + matching_areas: null, //set on initialize + + initialize: function(data) { + + this.set({ + pattern_before: data["pattern_before"], + pattern_after: data["pattern_after"], + num_matches: data["num_matches"], + matching_areas: data["matching_areas"] + }); + + + } +}); + + +//Tabula.RegexQueryHandler +// Backbone View extension for the detection of UI regex searches. +// +// Handles user requests for regex searches of tables within a document; oversees the AJAX call to the server. Updates +// the regex input form to facilitate correct user interaction (search button is enabled only when all data provided). +// +// 11/14/2017 REM; created +// 11/23/2017 ReM; refactored to accommodate new design. +// + +Tabula.RegexQueryHandler = Backbone.View.extend({ +// el: "#regex-container", + el: "#regex_input_form", + model: null, + events: {'keyup' : 'update_regex_inputs', + 'click [type="checkbox"]':'update_regex_inputs'}, + className: 'regex-query', + initialize: function(){ + this.model = new Tabula.RegexQueryModel(); + }, + + update_regex_inputs: function(event) { + var target_id = event['target']['id']; + var jQ_target_id = "#"+target_id; + var input_map = {}; + if($(jQ_target_id).is(':checkbox')===true){ + input_map[target_id] = $(jQ_target_id).is(':checked'); + } + else{ + input_map[target_id] = $(jQ_target_id).val(); + } + this.model.set(input_map); + + if(this.model.isFilledOut()){ + $('#regex-search').removeAttr('disabled'); + } + else{ + $('#regex-search').attr('disabled','disabled'); + } + }, + + reset_inputs: function(){ + this.el.reset(); + $('#regex-search').attr('disabled', 'disabled'); + this.model.reset(); + } + +}); + + +//Tabula.RegexQueryModel +// Backbone Model extension for data storage regarding user-defined regex searches (queries). +// +// Form that retains the parameters outlining regex table searches within the PDF. Passed to the server via AJAX call. +// +// 11/14/2017 REM; created +// +Tabula.RegexQueryModel = Backbone.Model.extend({ //Singleton + + initialize: function(){ + this.set({ + 'file_path':PDF_ID, + 'pattern_before':"", + 'include_pattern_before':false, + 'pattern_after':"", + 'include_pattern_after':false}); + }, + //determines if user has provided all values necessary to perform regex search <--TODO:move error checking to back-end or strengthen disable + isFilledOut: function(){ + var key_array = this.keys(); + // console.log(key_array); + var key_array_length = key_array.length; + for(i=0; i', { class: 'selection-show'})); }, - 'click .delete-page': 'deletePage', + //'click i.delete-page': 'deletePage', 'click a': 'scrollToPage' }, tagName: 'li', @@ -1071,10 +1881,12 @@ Tabula.ThumbnailView = Backbone.View.extend({ // one per page e.preventDefault(); }, - deletePage: function(){ +/* deletePage: function(){ + // this.model('number'); + confirm("hello"); if (!confirm('Delete page ' + this.model.get('number') + '?')) return; Tabula.pdf_view.pdf_document.page_collection.remove( this.model ); - }, + }, */ render: function(){ this.$el.html(this.template({ @@ -1100,9 +1912,14 @@ Tabula.ThumbnailView = Backbone.View.extend({ // one per page var $sshow = this.$el.find('#selection-show-' + selection.cid); // don't break everything if the sidebar happens to be broken. - var thumbScale = this.$img ? this.$img.width() / selection.get('imageWidth') : 0; + var thumbScaleWidth = this.$img ? this.$img.width() / selection.get('imageWidth') : 0; + var thumbScaleHeight = this.$img? this.$img.height()/ selection.get('imageHeight') : 0; + + var left = parseFloat(this.$el.css('padding-left')); - var top = parseFloat(this.$el.css('padding-top')); + var top = parseFloat(this.$el.css('padding-top')); //the padding-top of this element is acting strange... + + // if data has gotten messed up somewhere if(!selection.attributes) return; @@ -1111,11 +1928,10 @@ Tabula.ThumbnailView = Backbone.View.extend({ // one per page if(!selection.attributes.getDims) return; var s = selection.attributes.getDims().relativePos; - - $sshow.css('top', (top + (s.top * thumbScale)) + 'px') - .css('left', (left + (s.left * thumbScale)) + 'px') - .css('width', (s.width * thumbScale) + 'px') - .css('height', (s.height * thumbScale) + 'px'); + $sshow.css('top', (top + (s.top * thumbScaleHeight)) + 'px') + .css('left', (left + (s.left * thumbScaleWidth)) + 'px') + .css('width', (s.width * thumbScaleWidth) + 'px') + .css('height', (s.height * thumbScaleHeight) + 'px') }, removeSelectionThumbnail: function(selection){ @@ -1127,9 +1943,7 @@ Tabula.ThumbnailView = Backbone.View.extend({ // one per page Tabula.PDFView = Backbone.View.extend( _.extend({ el : '#tabula-app', - - events : { - }, + events : {}, lastQuery: [{}], pageCount: undefined, lazyLoadCursor: parseInt(window.location.hash.replace("#page-", '')) || 1, // 0 is invalid, because pages are one-indexed @@ -1143,14 +1957,41 @@ Tabula.PDFView = Backbone.View.extend( 'createDataView', 'checkForAutodetectedTables', 'getData', 'handleScroll', 'loadSavedTemplate', 'saveTemplate', 'saveTemplateAs'); + + + + this.pdf_document = new Tabula.Document({ - pdf_id: PDF_ID, + pdf_id: PDF_ID }); this.pdf_document.fetch({ - success: function(m){ }, + success: function(m){ console.log("WHAT WAS FETCHED:"); + console.log(m)}, error: function(m, r, o){ console.log("error", m, r, o) } - }); + }).then( function(meta_data){ + console.log(meta_data); + $.ajax({ + type: 'POST', + url: '/regex/reset', + data: { file_path: meta_data.id}, + dataType: 'json', + + success: _.bind(function() { + console.log("Reset back-end book-keeping for regex queries") + }, this), + error: function (xhr, status, err) { + alert('Error in reset: ' + JSON.stringify(err)); + console.log('Error in reset...: ', err); + console.log(xhr); + console.log(status); + } + })}); //see if this works... + + + + + this.options = new Tabula.Options(); this.listenTo(this.options, 'change', this.options.write); @@ -1159,6 +2000,7 @@ Tabula.PDFView = Backbone.View.extend( this.listenTo(this.pdf_document.page_collection, 'sync', this.addAll); this.listenTo(this.pdf_document.page_collection, 'reset', this.addAll); this.listenTo(this.pdf_document.page_collection, 'remove', this.removePage); + // this caused page ordering issues. Makes me wonder if pdf_view rendering is not idempotent. // anyways, I don't remember why I had this. probably you shouldn't reenable it. // this.listenTo(this.pdf_document.page_collection, 'all', _.bind(function(){ console.log('pdfview render page all'); this.render()}, this)); @@ -1169,10 +2011,14 @@ Tabula.PDFView = Backbone.View.extend( this.components['control_panel'] = new Tabula.ControlPanelView({pdf_view: this, saved_template_collection: this.saved_template_collection}); this.components['sidebar_view'] = new Tabula.SidebarView({pdf_view: this, collection: this.pdf_document.page_collection}); + $(document).on('scroll', _.throttle(this.handleScroll, 100, {leading: false})); $('#sidebar').on('scroll', _.throttle(this.handleScroll, 100, {leading: false})); + + + $('body'). on("click", ".repeat-lassos", function(e){ var selectionId = $(e.currentTarget).data('selectionId'); @@ -1224,7 +2070,7 @@ Tabula.PDFView = Backbone.View.extend( } Tabula.pdf_view.lazyLoadCursor = new_cursor; - this.components['document_view'].render(); + this.components['document_view'].render(); this.components['sidebar_view'].thumbnail_list_view.render(); // console.log("cursor", Tabula.pdf_view.lazyLoadCursor) }, @@ -1260,13 +2106,15 @@ Tabula.PDFView = Backbone.View.extend( // for a Tabula.Selection object's toCoords output (presumably taken out of the selection collection) // cause it to be rendered onto the page, and as a thumbnail // and causes it to get an 'id' attr. - console.log("sel.page", sel); - var pageView = Tabula.pdf_view.components['document_view'].page_views[sel.page]; - var page = Tabula.pdf_view.pdf_document.page_collection.findWhere({number: sel.page}); + console.log("In renderSelection:"); + console.log("Sel:"); + console.log(sel); + var pageView = Tabula.pdf_view.components['document_view'].page_views[sel.page_number]; + var page = Tabula.pdf_view.pdf_document.page_collection.findWhere({number: sel.page_number}); if(!page){ // the page we're trying to render a selection on might have been deleted. // or, we may be trying to load a template with more pages on it than this PDF has. - console.log("can't render selection on page " + sel.page + " because that page can't be found", sel) + console.log("can't render selection on page " + sel.page + " because that page can't be found", sel); return; } var original_pdf_width = page.get('width'); @@ -1278,15 +2126,19 @@ Tabula.PDFView = Backbone.View.extend( return []; } + // mimics drawing the selection onto the page var $img = pageView.$el.find('img'); var image_width = $img.width(); + + var image_height = $img.height(); if (!$img.length || $img.data('loaded') !== 'loaded' || !$img.height() ){ // if this page isn't shown currently or the image hasn't been rendered yet, then create a hidden selectionx return this.pdf_document.selections.createHiddenSelection(sel); } var scale = image_width / original_pdf_width; var offset = $img.offset(); - var absolutePos = _.extend({}, offset, + + var relativePos = _.extend({}, offset, { 'top': offset.top + (sel.y1 * scale), 'left': offset.left + (sel.x1 * scale), @@ -1294,22 +2146,45 @@ Tabula.PDFView = Backbone.View.extend( 'height': (sel.height * scale) }); // TODO: refactor to only have this ResizableSelection logic in one place. - var vendorSelection = new ResizableSelection({ - position: absolutePos, - target: pageView.$el.find('img'), - areas: function(){ return Tabula.pdf_view.components['document_view']._selectionsGetter($img) } - }); - vendorSelection.on({ - resize: _.debounce(pageView._onSelectChange, 100), - remove: pageView._onSelectCancel - }); + + var vendorSelection; + + + if(sel.selection_type==='regex'){ + console.log("Selection type is regex"); + vendorSelection = new RegexSelection({ + position: relativePos, + target: pageView.$el.find('img'), + areas: function(){ return Tabula.pdf_view.components['document_view']._selectionsGetter($img) } + }); + vendorSelection.on({ + remove: pageView._onSelectCancel + }); + } + else{ + vendorSelection = new ResizableSelection({ + position: relativePos, + target: pageView.$el.find('img'), + areas: function(){ return Tabula.pdf_view.components['document_view']._selectionsGetter($img) } + }); + vendorSelection.on({ + resize: _.debounce(pageView._onSelectChange, 100), + remove: pageView._onSelectCancel + }); + } + Tabula.pdf_view.components['document_view'].$el.append(vendorSelection.el); pageView._onSelectEnd(vendorSelection); // draws the thumbnail + // put the selection into the selections collection - selection = this.pdf_document.selections.updateOrCreateByVendorSelectorId(vendorSelection, sel.page, image_width); + + var selection = this.pdf_document.selections.updateOrCreateByVendorSelectorId(vendorSelection, sel.page, + {'width':image_width, + 'height':image_height}); + return selection; }, @@ -1340,6 +2215,8 @@ Tabula.PDFView = Backbone.View.extend( var thumbnail_view = new Tabula.ThumbnailView({model: page, collection: this.pdf_document.page_collection}); + //voila + this.components['document_view'].page_views[ page.get('number') ] = page_view; this.components['sidebar_view'].thumbnail_list_view.thumbnail_views[ page.get('number') ] = thumbnail_view; }, @@ -1349,6 +2226,7 @@ Tabula.PDFView = Backbone.View.extend( // if(Tabula.LazyLoad){ // _(this.pdf_document.page_collection.slice(0, Tabula.LazyLoad)).each(this.addOne, this); // }else{ + this.pdf_document.page_collection.each(this.addOne, this); // } }, @@ -1390,6 +2268,7 @@ Tabula.PDFView = Backbone.View.extend( }, render : function(){ + document.title="Select Tables | Tabula"; this.components['document_view'].render(); @@ -1517,3 +2396,22 @@ function isElementInViewport (el) { function roundTo(num, fancymathwordforthenumberofdigitsafterthedecimal){ return Math.round(num * Math.pow(10, fancymathwordforthenumberofdigitsafterthedecimal)) / Math.pow(10, fancymathwordforthenumberofdigitsafterthedecimal); } + +function PDF_Outline_btn(){ + var y = document.getElementById("sidebar"); + if(y.style.display == "none"){ + y.style.display = "inline"; + } + else{ + y.style.display = "none"; + } +} +function Regex_Options_btn(){ + var x = document.getElementById("regex-container"); + if(x.style.display == "none"){ + x.style.display = "inline"; + } + else{ + x.style.display = "none"; + } +} diff --git a/webapp/static/js/rectangularSelector.js b/webapp/static/js/rectangularSelector.js index 306a88541..2c15e5c04 100644 --- a/webapp/static/js/rectangularSelector.js +++ b/webapp/static/js/rectangularSelector.js @@ -39,6 +39,8 @@ var self = this; this.box = $('
    ').addClass('selection-box').appendTo($('body')); + + var _mousedown = function(event) { if (event.which !== 1) return false; target = this; @@ -51,14 +53,16 @@ 'height': 0, 'visibility': 'visible' }); - options.start(event); - return false; + options.start(event); // Right now this line doesn't do anything + return false; //??Why return false?? to prevent bubbling up?? }; var _mousemove = function(event) { if (!isDragging || ($(event.target).is(options.selector) && event.target !== target)) { return; } + var top_offset = Tabula.pdf_view.components.document_view.$el.offset().top; + var left_offset = Tabula.pdf_view.components.document_view.$el.offset().left; var ds = { 'left': Math.min(start.x, event.pageX), 'top': Math.min(start.y, event.pageY), @@ -97,8 +101,8 @@ var d = { 'absolutePos': _.extend(cOffset, { - 'top': top, - 'left': left, + 'top': top, //- 92.5, //hard-coded for now, will fix later + 'left': left,// - 215,//hard-coded for now, will fix later 'width': width, 'height': height }), @@ -106,10 +110,11 @@ 'width': width, 'height': height, 'top': top - cOffset.top, - 'left': left - cOffset.left + 'left': left -cOffset.left }, 'pageView': targetPageView }; + if (options.validSelection(d)) { options.end(d); } diff --git a/webapp/static/js/regexSelection.js b/webapp/static/js/regexSelection.js new file mode 100644 index 000000000..70d51685d --- /dev/null +++ b/webapp/static/js/regexSelection.js @@ -0,0 +1,31 @@ +/* jshint undef: true, unused: true */ +/* global $, paper, Backbone, _, console */ +(function (name, context, definition) { + if (typeof module != 'undefined' && module.exports) module.exports = definition(); + else if (typeof define == 'function' && define.amd) define(definition); + else context[name] = definition(); +})('RegexSelection', this, function (name, context) { + _.extend(regex_select_proto,{ + selection_type : 'regex', + tagName: 'div', + className: 'regex-table-region', + template: "
    " + + "
    " + + "
    " + + "
    " + + "
    " + + "
    " + + "
    " + + "
    ", + initialize: function(options) { + this.bounds = options.bounds; + this.pageView = options.target; + this.areas = options.areas; + this.id = String.fromCharCode(65 + Math.floor(Math.random() * 26)) + Date.now(); + + _.bindAll(this, 'remove'); + this.render(); + this.$el.css(options.position); + }}); + return Backbone.View.extend(regex_select_proto); +}); diff --git a/webapp/static/js/resizableSelection.js b/webapp/static/js/resizableSelection.js index 058772e28..bee88bc12 100644 --- a/webapp/static/js/resizableSelection.js +++ b/webapp/static/js/resizableSelection.js @@ -6,118 +6,52 @@ else if (typeof define == 'function' && define.amd) define(definition); else context[name] = definition(); })('ResizableSelection', this, function (name, context) { - - - var resizeDirectionMatch = /(n|s|w|e|ne|nw|se|sw)-border/; - - var ResizableSelection = Backbone.View.extend({ - + _.extend(resizable_select_proto,{ tagName: 'div', - className: 'table-region', - + className:'table-region', + template:"
    " + + "
    " + + "
    " + + "
    " + + "
    " + + "
    " + + "
    " + + "
    " + + "", events: { 'mousedown .resize-handle': 'mouseDownResize', 'mousemove': 'mouseMoveResize', 'mouseup': 'mouseUpResize', 'click button[name=close]': 'remove' }, - - template: - "
    " + - "
    " + - "
    " + - "
    " + - "
    " + - "
    " + - "
    " + - "
    " + - "", - - initialize: function(options) { - this.bounds = options.bounds; - this.pageView = options.target; - this.areas = options.areas; - - this.id = String.fromCharCode(65 + Math.floor(Math.random() * 26)) + Date.now(); - - this.render(); - this.$el.css(options.position); - - $(options.target).on({ - mousemove: _.bind(this.mouseMoveResize, this), - mouseup: _.bind(this.mouseUpResize, this) - }); - - /* like rectangularSelector, we need to bind a global event - * to watch if the user mouses-up outside the target element. */ - $(document).on({ - mouseup: _.bind(this.mouseUpResize, this) - }); - }, - - render: function() { - this.$el.append(this.template); - return this; - }, - - remove: function() { - this.trigger('remove', this); - Backbone.View.prototype.remove.call(this); - }, - - - getDims: function() { - if((!$(this.pageView).is(':visible') || !this.$el.is(':visible')) && this.cachedDims){ - return this.cachedDims; - } - var o = { top: parseFloat(this.$el.css('top')), - left: parseFloat(this.$el.css('left')) }; - var targetPos = $(this.pageView).offset(); - // console.log($(this.pageView).is(':visible'), this.$el.is(':visible')); - this.cachedDims = { - id: this.id, - "$el": this.$el, - absolutePos: { - top: o.top, - left: o.left, - width: this.$el.css('box-sizing') == "border-box" ? this.$el.outerWidth() : this.$el.width(), - height: this.$el.css('box-sizing') == "border-box" ? this.$el.outerHeight(): this.$el.height() - }, - relativePos: { - top: o.top - targetPos.top, - left: o.left - targetPos.left, - width: this.$el.css('box-sizing') == "border-box" ? this.$el.outerWidth() : this.$el.width(), - height: this.$el.css('box-sizing') == "border-box" ? this.$el.outerHeight() : this.$el.height() - } - }; - return this.cachedDims; - }, - - mouseDownResize: function(event) { - var d = resizeDirectionMatch.exec($(event.target).attr('class')); + resizeDirectionMatch : /(n|s|w|e|ne|nw|se|sw)-border/, + mouseDownResize : function(event) { + console.log("In mouseDownResize:"); + var d = this.resizeDirectionMatch.exec($(event.target).attr('class')); if (!d || d.length < 2) { this.resizing = false; } else { this.resizing = d[1]; this.trigger('start', this); - } - }, - - mouseMoveResize: function(event) { + }}, + mouseMoveResize : function(event) { + console.log("In mouseMoveResize:"); if (!this.resizing) return; var ev = event; var css = {}; var oldDims = this.getDims().absolutePos; - if (this.resizing.indexOf('n') !== -1) { css.height = oldDims.height + oldDims.top - ev.pageY; css.top = ev.pageY; } else if (this.resizing.indexOf('s') !== -1) { + console.log("ev.pageY:"); + console.log(ev.pageY); + console.log("oldDims.top"); + console.log(oldDims.top); css.height = ev.pageY - oldDims.top; } - if (this.resizing.indexOf('w') !== -1) { css.width = oldDims.width + oldDims.left - ev.pageX; css.left = ev.pageX; @@ -125,38 +59,34 @@ else if (this.resizing.indexOf('e') !== -1) { css.width = ev.pageX - oldDims.left; } - this.$el.css(css); this.trigger('resize', this.getDims()); if (!this.checkOverlaps()) { this.$el.css(oldDims); - } - }, - - mouseUpResize: function(event) { + }}, + mouseUpResize : function(event) { if (this.resizing) { this.trigger('resize', this.getDims()); } this.resizing = false; }, - - // returns true if this tableView does not overlap - // with any other on the same page - checkOverlaps: function() { - var thisDims = this.getDims().absolutePos; - return _.every( - _.reject(this.areas(this.pageView), function(s) { - return s.id === this.id; - }, this), - function(s) { - var sDims = s.getDims().absolutePos; - return thisDims.left + thisDims.width < sDims.left || - sDims.left + sDims.width < thisDims.left || - thisDims.top + thisDims.height < sDims.top || - sDims.top + sDims.height < thisDims.top; - }, this); - } - }); - + initialize: function(options) { + this.bounds = options.bounds; + this.pageView = options.target; + this.areas = options.areas; + this.id = String.fromCharCode(65 + Math.floor(Math.random() * 26)) + Date.now(); + this.$el.css(options.position); + this.render(); + $(options.target).on({ + mousemove: _.bind(this.mouseMoveResize, this), + mouseup: _.bind(this.mouseUpResize, this) + }); + /* like rectangularSelector, we need to bind a global event + * to watch if the user mouses-up outside the target element. */ + $(document).on({ + mouseup: _.bind(this.mouseUpResize, this) + }); + }}); + var ResizableSelection = Backbone.View.extend( resizable_select_proto); return ResizableSelection; }); diff --git a/webapp/static/js/tabula.js b/webapp/static/js/tabula.js index cb33b3cc7..f38bd0705 100644 --- a/webapp/static/js/tabula.js +++ b/webapp/static/js/tabula.js @@ -20,7 +20,7 @@ var TabulaRouter = Backbone.Router.extend({ "pdf/:file_id/extract": "view", // you have to make selections first, so going directly to /extract doesn't work. "queue/:file_id": 'status', "error": 'uploadError', - "help": 'help', + "help": 'help', "about": 'about', "mytemplates": 'templates' }, diff --git a/webapp/tabula_web.rb b/webapp/tabula_web.rb index 152c21998..8bcf5be43 100644 --- a/webapp/tabula_web.rb +++ b/webapp/tabula_web.rb @@ -2,17 +2,25 @@ require 'cuba' require 'cuba/render' +require 'rubygems' +require 'json' require 'digest/sha1' require 'json' require 'csv' require 'tempfile' require 'fileutils' require 'securerandom' +require 'java' +require 'singleton' + require_relative '../lib/tabula_java_wrapper.rb' java_import 'java.io.ByteArrayOutputStream' java_import 'java.util.zip.ZipEntry' java_import 'java.util.zip.ZipOutputStream' +java_import org.apache.pdfbox.pdmodel.PDDocument +java_import org.apache.pdfbox.cos.COSDictionary +java_import org.apache.pdfbox.cos.COSName require_relative './tabula_settings.rb' @@ -28,18 +36,60 @@ require_relative '../lib/tabula_job_executor/jobs/generate_thumbnails.rb' require_relative '../lib/tabula_job_executor/jobs/detect_tables.rb' +class RegexQueryMetaData + + attr_accessor :regex_searches,:filter_area,:doc_ID + attr_reader :file + + include Singleton + + def initialize + @doc_ID=String.new() + @regex_searches=[] + @file = nil + @filter_area = nil + end + + def is_new_doc(docID) + puts !(@doc_ID == docID) + return !(@doc_ID == docID) + end + + def reset_for_new_doc(docID) + + @doc_ID=docID + @regex_searches=[] + + @filter_area = nil #Page margins are initially not set + + unless @file.nil? + @file.close() #TODO: figure out if a warning should be thrown here.... + end + + output_dir = File.join(TabulaSettings::DOCUMENTS_BASEPATH, @doc_ID) + @file = PDDocument.load(Java::JavaIO::File.new(File.join(output_dir,'document.pdf'))) + + + + end +end + + def is_valid_pdf?(path) File.open(path, 'r') { |f| f.read(4) } == '%PDF' end +regex_query_meta_data = RegexQueryMetaData.instance() + STATIC_ROOT = if defined?($servlet_context) File.join($servlet_context.getRealPath('/'), 'WEB-INF/webapp/static') else File.join(File.dirname(__FILE__), 'static') end + Cuba.plugin Cuba::Render Cuba.settings[:render].store(:views, File.expand_path("views", File.dirname(__FILE__))) Cuba.use Rack::MethodOverride @@ -104,10 +154,10 @@ def upload_template(template_file) selection_count = template_data.size # write to file and to workspace - Tabula::Workspace.instance.add_template({ "id" => template_id, + Tabula::Workspace.instance.add_template({ "id" => template_id, "template" => template_data, - "name" => template_name, - "page_count" => page_count, + "name" => template_name, + "page_count" => page_count, "time" => Time.now.to_i, "selection_count" => selection_count}) return template_id @@ -127,14 +177,14 @@ def upload_template(template_file) run TabulaJobProgress end - on "templates" do + on "templates" do # GET /books/ .... collection.fetch(); # POST /books/ .... collection.create(); # GET /books/1 ... model.fetch(); # PUT /books/1 ... model.save(); # DEL /books/1 ... model.destroy(); - on root do + on root do # list them all on get do res.status = 200 @@ -143,22 +193,22 @@ def upload_template(template_file) end # create a template from the GUI - on post do + on post do template_info = JSON.parse(req.params["model"]) template_name = template_info["name"] || "Unnamed Template #{Time.now.to_s}" template_id = Digest::SHA1.hexdigest(Time.now.to_s + template_name) # just SHA1 of time isn't unique with multiple uploads template_filename = template_id + ".tabula-template.json" file_path = File.join(TabulaSettings::DOCUMENTS_BASEPATH, "..", "templates") - # write to file + # write to file FileUtils.mkdir_p(file_path) open(File.join(file_path, template_filename), 'w'){|f| f << JSON.dump(template_info["template"])} page_count = template_info.has_key?("page_count") ? template_info["page_count"] : template_info["template"].map{|f| f["page"]}.uniq.count selection_count = template_info.has_key?("selection_count") ? template_info["selection_count"] : template_info["template"].count Tabula::Workspace.instance.add_template({ - "id" => template_id, - "name" => template_name, - "page_count" => page_count, - "time" => Time.now.to_i, + "id" => template_id, + "name" => template_name, + "page_count" => page_count, + "time" => Time.now.to_i, "selection_count" => selection_count, "template" => template_info["template"] }) @@ -239,12 +289,12 @@ def upload_template(template_file) end end - on get do on 'pdfs' do run Rack::File.new(TabulaSettings::DOCUMENTS_BASEPATH) end + on 'documents' do res.status = 200 res['Content-Type'] = 'application/json' @@ -273,6 +323,89 @@ def upload_template(template_file) end # /get on post do + + + on 'regex' do + + on 'reset' do + puts req.params + puts "In regex/reset..." + regex_query_meta_data.reset_for_new_doc(req.params['file_path']) + res.write '' + end + + on 'search' do + puts req.params + puts "In regex/search..." + + puts regex_query_meta_data.filter_area + + regex_search = Java::TechnologyTabulaDetectors::RegexSearch.new(req.params['pattern_before'], + req.params['include_pattern_before'], + req.params['pattern_after'], + req.params['include_pattern_after'], + regex_query_meta_data.file, + regex_query_meta_data.filter_area) + + regex_query_meta_data.regex_searches.push(regex_search) + + puts regex_query_meta_data.regex_searches + + gson = Gson::GsonBuilder.new.setFieldNamingPolicy(Gson::FieldNamingPolicy::LOWER_CASE_WITH_UNDERSCORES).create() + res.write(gson.to_json(regex_search)) + end + + on 'check-on-resize' do + puts 'In regex/check-on-resize' + puts req.params + + regex_query_meta_data.filter_area = Java::TechnologyTabulaDetectors::RegexSearch::FilteredArea.new(req.params['header_scale'].to_f, + req.params['footer_scale'].to_f) + + + puts regex_query_meta_data.filter_area + + changedQueries = [] + + unless regex_query_meta_data.regex_searches.nil? || regex_query_meta_data.regex_searches.empty? + changedQueries = Java::TechnologyTabulaDetectors:: + RegexSearch.checkSearchesOnFilterResize(regex_query_meta_data.file, + regex_query_meta_data.filter_area, + regex_query_meta_data.regex_searches) + end + + puts 'Changed Queries:'; + puts changedQueries.length + gson = Gson::GsonBuilder.new.setFieldNamingPolicy(Gson::FieldNamingPolicy::LOWER_CASE_WITH_UNDERSCORES).create() + + res.write(gson.to_json(changedQueries)) + end + + on 'remove-search-data' do + puts req.params + puts regex_query_meta_data.regex_searches + puts 'In remove-search-data' + removed_searches, regex_query_meta_data.regex_searches = regex_query_meta_data.regex_searches.partition { + |search| search.getRegexBeforeTable() == req.params['pattern_before'] && + search.getRegexAfterTable() == req.params['pattern_after'] + } + if removed_searches.length > 1 || removed_searches.length==0 + res.status =500 + puts removed_searches.length + res.write('Incorrect number of searches removed:') + else + puts 'Removed Regex search:' + puts removed_searches[0] + + puts 'Remaining Regex searches:' + + gson = Gson::GsonBuilder.new.setFieldNamingPolicy(Gson::FieldNamingPolicy::LOWER_CASE_WITH_UNDERSCORES).create() + res.write(gson.to_json(removed_searches)) + end + res.write '' + end + end + on 'upload.json' do # Make sure this is a PDF, before doing anything @@ -327,8 +460,16 @@ def upload_template(template_file) on "pdf/:file_id/data" do |file_id| pdf_path = Tabula::Workspace.instance.get_document_path(file_id) + puts 'DO I GET HERE BEFORE THE CRASH??' + coords = JSON.load(req.params['coords']) + + puts 'COORDS:' + puts coords + coords.sort_by! do |coord_set| + puts 'coord_set:' + puts coord_set [ coord_set['page'], [coord_set['y1'], coord_set['y2']].min.to_i / 10, @@ -336,7 +477,14 @@ def upload_template(template_file) ] end - tables = Tabula.extract_tables(pdf_path, coords) + extraction_method = JSON.load(req.params['extraction_method']) + + options = {"extraction_method" => extraction_method} + + + puts req.params + + tables = Tabula.extract_tables(pdf_path, coords, options) filename = if req.params['new_filename'] && req.params['new_filename'].strip.size basename = File.basename(req.params['new_filename'], File.extname(req.params['new_filename'])) @@ -346,12 +494,15 @@ def upload_template(template_file) end case req.params['format'] - when 'csv' - res['Content-Type'] = 'text/csv' - res['Content-Disposition'] = "attachment; filename=\"#{filename}.csv\"" - tables.each do |table| - res.write table.to_csv - end + when 'csv' + res['Content-Type'] = 'text/csv' + res['Content-Disposition'] = "attachment; filename=\"#{filename}.csv\"" + puts 'TABLES' + puts tables + tables.each do |table| + res.write table.to_csv + puts table.to_csv + end when 'tsv' res['Content-Type'] = 'text/tab-separated-values' res['Content-Disposition'] = "attachment; filename=\"#{filename}.tsv\"" @@ -385,22 +536,88 @@ def upload_template(template_file) # ahahaha. I get the last laugh now. res.write String.from_java_bytes(baos.to_byte_array) - when 'script' - # Write shell script of tabula-extractor commands. $1 takes + when 'script' + + puts 'USER DRAWN SELECTIONS...' + puts req.params['user_drawn_selections'] + puts 'COORDS' + puts req.params['coords'] + + gson = Gson::GsonBuilder.new.setFieldNamingPolicy(Gson::FieldNamingPolicy::LOWER_CASE_WITH_UNDERSCORES).create() + + sanitized_query_data = Array.new + + regex_query_meta_data.regex_searches.each{ |x| + + raw_search_data =JSON.parse(gson.to_json(x)) + + sanitized_query_data.push({pattern_before: raw_search_data["_regex_before_table"]["pattern"], + include_pattern_before: raw_search_data["_include_regex_before_table"], + pattern_after: raw_search_data["_regex_after_table"]["pattern"], + include_pattern_after: raw_search_data["_include_regex_after_table"]}) + } + + puts sanitized_query_data + + regex_cli_option = JSON.generate({queries: sanitized_query_data}); + + puts regex_cli_option.to_json + + regex_cli_string = "" + if !regex_query_meta_data.regex_searches.empty? + regex_cli_string="-x '#{regex_cli_option}'" + end + + drawn_boxes_cli_string="" + + user_drawn_selections = JSON.load(req.params['user_drawn_selections']) + + if user_drawn_selections.nil? + user_drawn_selections = [] + end + + user_drawn_selections.sort_by! do |sel_set| + [ + sel_set['page'], + [sel_set['y1'], sel_set['y2']].min.to_i / 10, + [sel_set['x1'], sel_set['x2']].min + ] + end + + user_drawn_selections.each do |s| + drawn_boxes_cli_string = drawn_boxes_cli_string + + " -a #{s['y1'].round(3)},#{s['x1'].round(3)},#{s['y2'].round(3)},#{s['x2'].round(3)} -p #{s['page']}" + end + + extraction_cli_string = '' + + coords.each do |c| + extraction_cli_string = if c['extraction_method'] == "original" + "--no-spreadsheet" + elsif c['extraction_method'] == "spreadsheet" + "--spreadsheet" + elsif c['extraction_method'] == "stream" + "--stream" + elsif c['extraction_method'] == "lattice" + "--lattice" + else + ' ' #Non-empty string + end + break + end + + + margins = JSON.load(req.params['margin_scale']) + + margin_cli_string ="-m '#{margins}'" + # Write shell script of tabula-extractor commands. $1 takes # the name of a file from the command line and passes it # to tabula-extractor so the script can be reused on similar pdfs. res['Content-Type'] = 'application/x-sh' res['Content-Disposition'] = "attachment; filename=\"#{filename}.sh\"" - coords.each do |c| - extraction_method_switch = if c['extraction_method'] == "original" - "--no-spreadsheet" - elsif c['extraction_method'] == "spreadsheet" - "--spreadsheet" - else - "" - end - res.write "java -jar tabula-java.jar #{extraction_method_switch} -a #{c['y1'].round(3)},#{c['x1'].round(3)},#{c['y2'].round(3)},#{c['x2'].round(3)} -p #{c['page']} \"$1\" \n" - end + + res.write "java -jar tabula-java.jar #{extraction_cli_string} #{regex_cli_string} #{drawn_boxes_cli_string} #{margin_cli_string} \"$1\" \n" + when 'bbox' # Write json representation of bounding boxes and pages for # use in OCR and other back ends.