Julio Montoya il y a 6 ans
Parent
commit
4ce910d8f3
100 fichiers modifiés avec 3594 ajouts et 4325 suppressions
  1. 52 10
      .codeclimate.yml
  2. 7 0
      .gitattributes
  3. 0 1
      .gitignore
  4. 9 0
      .htaccess
  5. 3 0
      .php_cs
  6. 4 2
      .php_cs.dist
  7. 26 122
      .scrutinizer.yml
  8. 18 14
      .travis.yml
  9. 80 67
      LICENSE
  10. 2 1
      README.md
  11. 4 2
      app/Migrations/Schema/V110/Version110.php
  12. 6 3
      app/Migrations/Schema/V110/Version20150609113500.php
  13. 6 3
      app/Migrations/Schema/V110/Version20150616093200.php
  14. 6 3
      app/Migrations/Schema/V110/Version20150624164100.php
  15. 6 3
      app/Migrations/Schema/V110/Version20150625155000.php
  16. 7 2
      app/Migrations/Schema/V111/Version111.php
  17. 3 1
      app/Migrations/Schema/V111/Version20160330103045.php
  18. 5 0
      app/Migrations/Schema/V111/Version20160405112100.php
  19. 12 12
      app/Migrations/Schema/V111/Version20160610142700.php
  20. 6 1
      app/Migrations/Schema/V111/Version20160706145000.php
  21. 0 1
      app/Migrations/Schema/V111/Version20160713180000.php
  22. 2 3
      app/Migrations/Schema/V111/Version20160727122700.php
  23. 2 2
      app/Migrations/Schema/V111/Version20160727155600.php
  24. 2 2
      app/Migrations/Schema/V111/Version20160804174600.php
  25. 2 2
      app/Migrations/Schema/V111/Version20160808154200.php
  26. 2 3
      app/Migrations/Schema/V111/Version20160808160000.php
  27. 0 1
      app/Migrations/Schema/V111/Version20160907140300.php
  28. 0 1
      app/Migrations/Schema/V111/Version20160907150300.php
  29. 1 1
      app/Migrations/Schema/V111/Version20160929120000.php
  30. 1 0
      app/Migrations/Schema/V111/Version20160930144400.php
  31. 10 2
      app/Migrations/Schema/V111/Version20161028123400.php
  32. 1 0
      app/Migrations/Schema/V111/Version20170522120000.php
  33. 6 5
      app/Migrations/Schema/V111/Version20170608164500.php
  34. 0 34
      app/Migrations/Schema/V111/Version20171002154600.php
  35. 58 0
      app/Migrations/Schema/V111/Version20171213092400.php
  36. 87 0
      app/Migrations/Schema/V111/Version20171227120000.php
  37. 14 0
      app/Resources/public/assets/bootstrap-year-calendar/.bower.json
  38. 202 0
      app/Resources/public/assets/bootstrap-year-calendar/LICENSE
  39. 27 0
      app/Resources/public/assets/bootstrap-year-calendar/README.md
  40. 253 0
      app/Resources/public/assets/bootstrap-year-calendar/css/bootstrap-year-calendar.css
  41. 6 0
      app/Resources/public/assets/bootstrap-year-calendar/css/bootstrap-year-calendar.min.css
  42. 1110 0
      app/Resources/public/assets/bootstrap-year-calendar/js/bootstrap-year-calendar.js
  43. 19 0
      app/Resources/public/assets/bootstrap-year-calendar/js/languages/bootstrap-year-calendar.de.js
  44. 19 0
      app/Resources/public/assets/bootstrap-year-calendar/js/languages/bootstrap-year-calendar.es.js
  45. 19 0
      app/Resources/public/assets/bootstrap-year-calendar/js/languages/bootstrap-year-calendar.fr.js
  46. 19 0
      app/Resources/public/assets/bootstrap-year-calendar/js/languages/bootstrap-year-calendar.it.js
  47. 19 0
      app/Resources/public/assets/bootstrap-year-calendar/js/languages/bootstrap-year-calendar.ja.js
  48. 19 0
      app/Resources/public/assets/bootstrap-year-calendar/js/languages/bootstrap-year-calendar.nl.js
  49. 20 0
      app/Resources/public/assets/bootstrap-year-calendar/js/languages/bootstrap-year-calendar.pt.js
  50. 19 0
      app/Resources/public/assets/bootstrap-year-calendar/js/languages/bootstrap-year-calendar.ru.js
  51. 20 0
      app/Resources/public/assets/bootstrap-year-calendar/js/languages/bootstrap-year-calendar.tr.js
  52. 0 6
      app/Resources/public/assets/bootstrap/Gemfile
  53. 0 43
      app/Resources/public/assets/bootstrap/Gemfile.lock
  54. 0 511
      app/Resources/public/assets/bootstrap/Gruntfile.js
  55. 0 7
      app/Resources/public/assets/bootstrap/grunt/.jshintrc
  56. 0 30
      app/Resources/public/assets/bootstrap/grunt/bs-commonjs-generator.js
  57. 0 42
      app/Resources/public/assets/bootstrap/grunt/bs-glyphicons-data-generator.js
  58. 0 237
      app/Resources/public/assets/bootstrap/grunt/bs-lessdoc-parser.js
  59. 0 44
      app/Resources/public/assets/bootstrap/grunt/bs-raw-files-generator.js
  60. 0 109
      app/Resources/public/assets/bootstrap/grunt/change-version.js
  61. 0 46
      app/Resources/public/assets/bootstrap/grunt/configBridge.json
  62. 0 2679
      app/Resources/public/assets/bootstrap/grunt/npm-shrinkwrap.json
  63. 0 82
      app/Resources/public/assets/bootstrap/grunt/sauce_browsers.yml
  64. 0 8
      app/Resources/public/assets/bootstrap/nuget/MyGet.ps1
  65. 0 28
      app/Resources/public/assets/bootstrap/nuget/bootstrap.less.nuspec
  66. 0 28
      app/Resources/public/assets/bootstrap/nuget/bootstrap.nuspec
  67. 0 32
      app/Resources/public/assets/bootstrap/package.js
  68. 0 89
      app/Resources/public/assets/bootstrap/package.json
  69. 0 0
      app/Resources/public/assets/ckeditor/skins/kama/dialog.css
  70. 0 0
      app/Resources/public/assets/ckeditor/skins/kama/dialog_ie.css
  71. 0 0
      app/Resources/public/assets/ckeditor/skins/kama/dialog_ie7.css
  72. 0 0
      app/Resources/public/assets/ckeditor/skins/kama/dialog_ie8.css
  73. 0 0
      app/Resources/public/assets/ckeditor/skins/kama/dialog_iequirks.css
  74. 0 0
      app/Resources/public/assets/ckeditor/skins/kama/editor.css
  75. 0 0
      app/Resources/public/assets/ckeditor/skins/kama/editor_ie.css
  76. 0 0
      app/Resources/public/assets/ckeditor/skins/kama/editor_ie7.css
  77. 0 0
      app/Resources/public/assets/ckeditor/skins/kama/editor_ie8.css
  78. 0 0
      app/Resources/public/assets/ckeditor/skins/kama/editor_iequirks.css
  79. 0 0
      app/Resources/public/assets/ckeditor/skins/moono/dialog.css
  80. 0 0
      app/Resources/public/assets/ckeditor/skins/moono/dialog_ie.css
  81. 0 0
      app/Resources/public/assets/ckeditor/skins/moono/dialog_ie7.css
  82. 0 0
      app/Resources/public/assets/ckeditor/skins/moono/dialog_ie8.css
  83. 0 0
      app/Resources/public/assets/ckeditor/skins/moono/dialog_iequirks.css
  84. 0 0
      app/Resources/public/assets/ckeditor/skins/moono/editor.css
  85. 0 0
      app/Resources/public/assets/ckeditor/skins/moono/editor_gecko.css
  86. 0 0
      app/Resources/public/assets/ckeditor/skins/moono/editor_ie.css
  87. 0 0
      app/Resources/public/assets/ckeditor/skins/moono/editor_ie7.css
  88. 0 0
      app/Resources/public/assets/ckeditor/skins/moono/editor_ie8.css
  89. 0 0
      app/Resources/public/assets/ckeditor/skins/moono/editor_iequirks.css
  90. 30 0
      app/Resources/public/assets/jquery.easy-pie-chart/.bower.json
  91. 4 0
      app/Resources/public/assets/jquery.easy-pie-chart/.gitignore
  92. 7 0
      app/Resources/public/assets/jquery.easy-pie-chart/.travis.yml
  93. 188 0
      app/Resources/public/assets/jquery.easy-pie-chart/Gruntfile.js
  94. 21 0
      app/Resources/public/assets/jquery.easy-pie-chart/LICENSE
  95. 268 0
      app/Resources/public/assets/jquery.easy-pie-chart/Readme.md
  96. 19 0
      app/Resources/public/assets/jquery.easy-pie-chart/bower.json
  97. 80 0
      app/Resources/public/assets/jquery.easy-pie-chart/changelog.md
  98. 397 0
      app/Resources/public/assets/jquery.easy-pie-chart/dist/angular.easypiechart.js
  99. 8 0
      app/Resources/public/assets/jquery.easy-pie-chart/dist/angular.easypiechart.min.js
  100. 351 0
      app/Resources/public/assets/jquery.easy-pie-chart/dist/easypiechart.js

+ 52 - 10
.codeclimate.yml

@@ -1,30 +1,67 @@
-engines:
+version: "2"
+checks:
+  argument-count:
+    enabled: false
+  complex-logic:
+    enabled: false
+  file-lines:
+    enabled: false
+  method-complexity:
+    enabled: true
+    config:
+      threshold: 20
+  method-count:
+    enabled: false
+  method-lines:
+    enabled: false
+  nested-control-flow:
+    config:
+      threshold: 20
+  return-statements:
+    enabled: false
+
+plugins:
+  phan:
+    enabled: true
+    config:
+      file_extensions: "php"
+
   fixme:
     enabled: true
     config:
       strings:
       - FIXME
       - BUG
+
   phpcodesniffer:
     enabled: true
     config:
-    standard: "PSR1,PSR2"
+      standard: "Symfony2"
+      file_extensions: "php"
     checks:
       PSR1 Classes ClassDeclaration MissingNamespace:
         enabled: false
       PSR1 Files SideEffects FoundWithSymbols:
         enabled: false
+      Squiz Strings ConcatenationSpacing PaddingFound:
+        enabled: false
 
-  duplication:
+  phpmd:
+    enabled: true
+    config:
+      file_extensions: "php"
+      rulesets: "codesize.xml"
+
+  sonar-php:
     enabled: false
+    checks:
+      php:S1192:
+        enabled: false
 
-ratings:
-  paths:
-  - '**.php'
-  - '**.js'
-  - '**.css'
+  duplication:
+    enabled: false
 
-exclude_paths:
+exclude_patterns:
 - cli-config.php
 - app/cache/
 - app/logs/
@@ -50,11 +87,12 @@ exclude_paths:
 - main/inc/lib/mimetex/
 - main/inc/lib/nanogong/
 - main/inc/lib/nusoap/
+- main/inc/lib/opengraph/*
 - main/inc/lib/ppt2png/
+- main/inc/lib/phpseclib
 - main/inc/lib/pear/
 - main/inc/lib/phpmailer/
 - main/inc/lib/phpseclib/
-- main/inc/lib/portfolio.class.php
 - main/inc/lib/svg-edit/
 - main/inc/lib/swfobject/
 - main/inc/lib/wami-recorder/
@@ -67,12 +105,16 @@ exclude_paths:
 - plugin/buycourses/src/Requests/
 - plugin/buycourses/src/Requests.php
 - plugin/buycourses/src/paypalfunctions.php
+- plugin/vchamilo/cli/
 - plugin/kannelsms/vendor/
 - plugin/clockworksms/vendor/
 - plugin/pens/lib
 - plugin/bbb/lib/bbb_api.php
 - plugin/ims_lti/OAuthSimple.php
 - plugin/sepe/src/wsse/
+- plugin/test2pdf/class/
+- plugin/jcapture/lib/
+- plugin/jcapture/src/
 - tests/
 - vendor/
 - web/

+ 7 - 0
.gitattributes

@@ -2,9 +2,16 @@
 .gitattributes export-ignore
 .gitignore export-ignore
 .codeclimate.yml export-ignore
+.flintci.yml export-ignore
 .scrutinizer.yml export-ignore
 .styleci.yml export-ignore
 .travis.yml export-ignore
+.yamllint_config export-ignore
+.php_cs.dist export-ignore
+.php_cs export-ignore
+codesize.xml export-ignore
+phpcs.xml export-ignore
+
 /tests export-ignore
 .editorconfig export-ignore
 

+ 0 - 1
.gitignore

@@ -13,7 +13,6 @@ app/logs/*
 /app/config/course_info.conf.php
 /app/config/events.conf.php
 /app/config/mail.conf.php
-/app/config/portfolio.conf.php
 /app/config/profile.conf.php
 /app/config/configuration.php
 

+ 9 - 0
.htaccess

@@ -8,6 +8,12 @@
 
 RewriteEngine on
 
+# Prevent execution of PHP from directories used for different types of uploads
+RedirectMatch 403 ^/app/(cache|courses|home|logs|upload|Resources/public/css)/.*\.ph(p[3457]?|t|tml|ar)$
+RedirectMatch 403 ^/main/default_course_document/images/.*\.ph(p[3457]?|t|tml|ar)$
+RedirectMatch 403 ^/main/lang/.*\.ph(p[3457]?|t|tml|ar)$
+RedirectMatch 403 ^/web/css/.*\.ph(p[3457]?|t|tml|ar)$
+
 # http://my.chamilo.net/certificates/?id=123 to http://my.chamilo.net/certificates/index.php?id=123
 RewriteCond %{QUERY_STRING} ^id=(.*)$
 RewriteRule ^certificates/$ certificates/index.php?id=%1 [L]
@@ -39,6 +45,9 @@ RewriteRule ^courses/([^/]+)/(.*)$ app/courses/$1/$2 [QSA,L]
 # About session
 RewriteRule ^session/(\d{1,})/about/?$ main/session/about.php?session_id=$1 [L]
 
+# About course
+RewriteRule ^course/(\d{1,})/about/?$ main/course_info/about.php?course_id=$1 [L]
+
 # Issued individual badge friendly URL
 RewriteRule ^badge/(\d{1,}) main/badge/issued.php?issue=$1 [L]
 

+ 3 - 0
.php_cs

@@ -0,0 +1,3 @@
+<?php
+
+return require_once __DIR__.'/.php_cs.dist';

+ 4 - 2
.php_cs.dist

@@ -17,7 +17,7 @@ $rules = [
     'yoda_style' => false,
     'phpdoc_to_comment' => false,
     'phpdoc_no_package' => false,
-    'increment_style' => false,
+    'increment_style' => ['style' => 'post'],
     'no_useless_else' => false,
     //'no_php4_constructor' => true,
     'single_quote' => false,
@@ -76,6 +76,8 @@ $finder = PhpCsFixer\Finder::create()
     ->exclude('plugin/ims_lti')
     ->exclude('plugin/sepe/src/wsse')
     ->exclude('plugin/test2pdf/class')
+    ->exclude('plugin/jcapture/src')
+    ->exclude('plugin/jcapture/lib')
     ->exclude('tests')
     ->exclude('var')
     ->exclude('vendor')
@@ -91,4 +93,4 @@ return PhpCsFixer\Config::create()
     ->setRules(
         $rules
     )
-    ->setFinder($finder);
+    ->setFinder($finder);

+ 26 - 122
.scrutinizer.yml

@@ -1,131 +1,31 @@
-# .scrutinizer.yml - see https://scrutinizer-ci.com/docs/guides/php/continuous-integration-deployment for doc
-# Excludes go for things do not contain code, are not managed well by Scrutinizer or are external libraries that
-# Chamilo includes but that we cannot update without patching upstream.
 build:
+    nodes:
+        analysis:
+            project_setup:
+                override: true
+            tests:
+                override:
+                    - php-scrutinizer-run
+    tests:
+        override:
+            command: "php -v"
+    dependencies:
+        override:
+            - "php -v"
+    resources:
+        cpus: 1
     environment:
-        mysql: 5.5
         php:
-            version: 5.6.0
+            version: 7.1
             ini:
-                'date.timezone': 'US/Pacific'
-                'phar.readonly': false
-        hosts:
-            my.chamilodev.net: '127.0.0.1'
-checks:
-    php:
-        no_trailing_whitespace: true
-        code_rating: true
-        duplication: true
-        fix_php_opening_tag: false
-        remove_php_closing_tag: true
-        one_class_per_file: true
-        side_effects_or_types: false
-        no_mixed_inline_html: false
-        require_braces_around_control_structures: true
-        php5_style_constructor: true
-        no_global_keyword: false
-        avoid_usage_of_logical_operators: false
-        psr2_class_declaration: true
-        no_underscore_prefix_in_properties: false
-        no_underscore_prefix_in_methods: false
-        blank_line_after_namespace_declaration: true
-        single_namespace_per_use: false
-        psr2_switch_declaration: true
-        psr2_control_structure_declaration: true
-        avoid_superglobals: false
-        security_vulnerabilities: false
-        no_exit: false
-        uppercase_constants: true
-        prefer_while_loop_over_for_loop: true
-        newline_at_end_of_file: true
-        line_length:
-            max_length: '120'
-        parameter_doc_comments: true
-        parameters_in_camelcaps: true
-        return_doc_comments: true
-        use_self_instead_of_fqcn: true
-        overriding_parameter: false
-        avoid_entity_manager_injection: false
-
-coding_style:
-    php:
-        indentation:
-            general:
-                use_tabs: false
-                size: 4
-            switch:
-                indent_case: true
-        spaces:
-            general:
-                linefeed_character: newline
-            around_operators:
-                concatenation: false
-        braces:
-            classes_functions:
-                class: new-line
-                function: new-line
-                closure: end-of-line
-            if:
-                opening: end-of-line
-            for:
-                opening: end-of-line
-            while:
-                opening: end-of-line
-            do_while:
-                opening: end-of-line
-            switch:
-                opening: end-of-line
-            try:
-                opening: end-of-line
-
-        upper_lower_casing:
-            keywords:
-                general: lower
-            constants:
-                true_false_null: lower
+                memory_limit: "-1"
 
-#tools:
-#    php_mess_detector:
-#        enabled: true
-#        extensions:
-#            - php
-#        command: phpmd
-#        config:
-#            rulesets:
-#                - codesize
 
-#    php_analyzer:
-#        enabled: true
-#        filter:
-#            excluded_paths:
-#                - 'tests/*'
-#        extensions:
-#            - php
-#    php_code_sniffer:
-#        enabled: true
-#        config:
-#            standard: PSR2
-#        extensions:
-#            - php
-#        command: phpcs
-#        filter:
-#            excluded_paths:
-#                - 'tests/*'
-#    sensiolabs_security_checker:
-#        enabled: true
-#    php_pdepend:
-#        command: pdepend
-#        configuration_file:   ~
-#        suffixes:
-#            - php
-#        excluded_dirs:
-#            - 'vendor'
-#            - 'tests/*'
-#        enabled: true
-#    php_code_coverage: true
+checks:
+    php: true
 
 filter:
-      excluded_paths:
+    excluded_paths:
         - 'cli-config.php'
         - 'app/cache/*'
         - 'app/logs/*'
@@ -141,7 +41,9 @@ filter:
         - 'main/auth/openid/*'
         - 'main/chat/emoji_strategy.php'
         - 'main/default_course_document'
+        - 'main/document/Wami.swf'
         - 'main/fonts/*'
+        - 'main/inc/ajax/Wami.swf'
         - 'main/inc/lib/browser/*'
         - 'main/inc/lib/freemindflashbrowser/*'
         - 'main/inc/lib/internationalization_database/*'
@@ -156,7 +58,6 @@ filter:
         - 'main/inc/lib/pear/*'
         - 'main/inc/lib/phpmailer/*'
         - 'main/inc/lib/phpseclib/*'
-        - 'main/inc/lib/portfolio.class.php'
         - 'main/inc/lib/svg-edit/*'
         - 'main/inc/lib/swfobject/*'
         - 'main/inc/lib/wami-recorder/*'
@@ -165,17 +66,20 @@ filter:
         - 'main/template/*'
         - 'main/img/*'
         - 'main/lang/*'
-        - 'main/default_course_document'
         - 'plugin/buycourses/src/Culqi/*'
         - 'plugin/buycourses/src/Requests/*'
         - 'plugin/buycourses/src/paypalfunctions.php'
         - 'plugin/buycourses/src/Requests.php'
+        - 'plugin/vchamilo/cli/*'
         - 'plugin/kannelsms/vendor/*'
         - 'plugin/clockworksms/vendor/*'
         - 'plugin/pens/lib/'
         - 'plugin/bbb/lib/bbb_api.php'
         - 'plugin/ims_lti/OAuthSimple.php'
         - 'plugin/sepe/src/wsse/*'
+        - 'plugin/test2pdf/class/*'
+        - 'plugin/jcapture/lib/*'
+        - 'plugin/jcapture/src/*'
         - 'tests/*'
         - 'vendor/*'
         - 'web/*'

+ 18 - 14
.travis.yml

@@ -1,3 +1,5 @@
+dist: trusty
+sudo: required
 language: php
 
 addons:
@@ -8,19 +10,14 @@ addons:
         - libapache2-mod-fastcgi
         - libappindicator1
         - fonts-liberation
-    chrome: stable
 
 services:
     - mysql
 
-sudo: required
-dist: trusty
 cache:
   directories:
     - $HOME/.composer/cache/files
-
 php:
-  #- 5.4 // Removed because of Chash dependencies on PHP 5.5
   - 5.5
   - 5.6
   - 7.0
@@ -33,6 +30,8 @@ env:
     - CHAMILO_VERSION=1.11.x
 
 before_install:
+  #- sudo apt-get update
+  #- sudo apt-get install apache2 libapache2-mod-fastcgi
   # Fix travis error https://github.com/travis-ci/travis-ci/issues/8607
   - sudo rm -vf /etc/apt/sources.list.d/*riak*
   # Get Chrome
@@ -41,7 +40,7 @@ before_install:
   #- sudo apt-get install google-chrome-stable
   - google-chrome-stable --headless --disable-gpu --remote-debugging-port=9222 http://localhost &
   # Get Chrome driver
-  - wget https://chromedriver.storage.googleapis.com/2.32/chromedriver_linux64.zip && unzip chromedriver_linux64.zip
+  - wget https://chromedriver.storage.googleapis.com/2.34/chromedriver_linux64.zip && unzip chromedriver_linux64.zip
   - sudo mv chromedriver /usr/bin
   - sudo chmod +x /usr/bin/chromedriver
   # Setup display for Selenium
@@ -54,7 +53,6 @@ before_install:
   - java -version
   - sudo apt-get install oracle-java8-installer
   - java -version
-  #- java -jar selenium-server-standalone-3.7.1.jar -log selenium.log > /dev/null &
   - java -jar selenium-server-standalone-3.1.0.jar -log selenium.log  > /dev/null &
   - nohup bash -c "webdriver-manager start 2>&1 &"
   - sleep 10
@@ -66,14 +64,14 @@ before_install:
   - mysqld --version
   - apache2 -v
   - php -v
+  - php -ini | grep memory_limit
   - sudo cat /etc/hosts
 
-  - phpenv config-add tests/travis/php-config.ini
-
   # Install Chash, a database, and then install Chamilo
   - git clone https://github.com/chamilo/chash
   - cd chash
-  - composer update
+  - git checkout v0.1.1
+  - composer install
   - php -d phar.readonly=0 createPhar.php
   - chmod +x chash.phar
   - sudo mv chash.phar /usr/local/bin/chash
@@ -82,30 +80,36 @@ before_install:
   - cd $TRAVIS_BUILD_DIR
   - pwd
   # Install vendors
-  - composer update
+  - travis_wait 30 composer install
   # Install chamilo
   - php -d date.timezone="Europe/Paris" $TRAVIS_BUILD_DIR/chash/chash.php chash:chamilo_install $CHAMILO_VERSION $TRAVIS_BUILD_DIR --no-interaction --sitename="Chamilo" --site_url="http://$VHOST_URL/" --institution="Chamilo" --institution_url="https://chamilo.org" --encrypt_method="sha1" --firstname="John" --lastname="Doe" --language="english" --driver="pdo_mysql" --host="localhost" --port="3306" --dbname="chamilo" --dbuser="root" --permissions_for_new_directories="0777" --permissions_for_new_files="0666" --linux-user="www-data" --linux-group="www-data" --username="admin" --password="admin" --email="admin@example.com" --phone="555-5555"
-  - sudo chmod -R 777 app/cache app/logs app/courses app/upload
+  - sudo chmod -R 777 app/cache app/logs app/courses app/upload web
   # Check chamilo status
   - php -d date.timezone="Europe/Paris" $TRAVIS_BUILD_DIR/chash/chash.php chash:chamilo_status
   - ls -la
-  - ls -la /var/www
   # Permissions
   - sudo chown -R www-data:www-data $TRAVIS_BUILD_DIR
   - sudo chown -R 775 $TRAVIS_BUILD_DIR
   - sudo chmod +x /home/travis/build
   - sudo service apache2 restart
+  # Check the result of index.php and check if main.js is build in travis
   - curl $VHOST_URL
+  - ls -la web/build
 
 script:
   - whereis google-chrome-stable
+  - google-chrome-stable --version
   - whereis chromedriver
+  - chromedriver --version
   - cd tests/behat
   - pwd
   - travis_wait 45 ../../vendor/behat/behat/bin/behat -v
-  # - sudo cat /var/log/apache2/$VHOST_URL-error.log
+
   # - sudo cat /var/log/apache2/$VHOST_URL-access.log
 
+after_failure:
+  - sudo apache2ctl -M
+  - sudo cat /var/log/apache2/error.log
 
 # configure notifications (email, IRC, campfire etc)
 notifications:

+ 80 - 67
main/inc/lib/javascript/ViewerJS/AGPL-3.0.txt → LICENSE

@@ -1,5 +1,5 @@
-                    GNU AFFERO GENERAL PUBLIC LICENSE
-                       Version 3, 19 November 2007
+                    GNU GENERAL PUBLIC LICENSE
+                       Version 3, 29 June 2007
 
  Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
  Everyone is permitted to copy and distribute verbatim copies
@@ -7,15 +7,17 @@
 
                             Preamble
 
-  The GNU Affero General Public License is a free, copyleft license for
-software and other kinds of works, specifically designed to ensure
-cooperation with the community in the case of network server software.
+  The GNU General Public License is a free, copyleft license for
+software and other kinds of works.
 
   The licenses for most software and other practical works are designed
 to take away your freedom to share and change the works.  By contrast,
-our General Public Licenses are intended to guarantee your freedom to
+the GNU General Public License is intended to guarantee your freedom to
 share and change all versions of a program--to make sure it remains free
-software for all its users.
+software for all its users.  We, the Free Software Foundation, use the
+GNU General Public License for most of our software; it applies also to
+any other work released this way by its authors.  You can apply it to
+your programs, too.
 
   When we speak of free software, we are referring to freedom, not
 price.  Our General Public Licenses are designed to make sure that you
@@ -24,34 +26,44 @@ them if you wish), that you receive source code or can get it if you
 want it, that you can change the software or use pieces of it in new
 free programs, and that you know you can do these things.
 
-  Developers that use our General Public Licenses protect your rights
-with two steps: (1) assert copyright on the software, and (2) offer
-you this License which gives you legal permission to copy, distribute
-and/or modify the software.
-
-  A secondary benefit of defending all users' freedom is that
-improvements made in alternate versions of the program, if they
-receive widespread use, become available for other developers to
-incorporate.  Many developers of free software are heartened and
-encouraged by the resulting cooperation.  However, in the case of
-software used on network servers, this result may fail to come about.
-The GNU General Public License permits making a modified version and
-letting the public access it on a server without ever releasing its
-source code to the public.
-
-  The GNU Affero General Public License is designed specifically to
-ensure that, in such cases, the modified source code becomes available
-to the community.  It requires the operator of a network server to
-provide the source code of the modified version running there to the
-users of that server.  Therefore, public use of a modified version, on
-a publicly accessible server, gives the public access to the source
-code of the modified version.
-
-  An older license, called the Affero General Public License and
-published by Affero, was designed to accomplish similar goals.  This is
-a different license, not a version of the Affero GPL, but Affero has
-released a new version of the Affero GPL which permits relicensing under
-this license.
+  To protect your rights, we need to prevent others from denying you
+these rights or asking you to surrender the rights.  Therefore, you have
+certain responsibilities if you distribute copies of the software, or if
+you modify it: responsibilities to respect the freedom of others.
+
+  For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must pass on to the recipients the same
+freedoms that you received.  You must make sure that they, too, receive
+or can get the source code.  And you must show them these terms so they
+know their rights.
+
+  Developers that use the GNU GPL protect your rights with two steps:
+(1) assert copyright on the software, and (2) offer you this License
+giving you legal permission to copy, distribute and/or modify it.
+
+  For the developers' and authors' protection, the GPL clearly explains
+that there is no warranty for this free software.  For both users' and
+authors' sake, the GPL requires that modified versions be marked as
+changed, so that their problems will not be attributed erroneously to
+authors of previous versions.
+
+  Some devices are designed to deny users access to install or run
+modified versions of the software inside them, although the manufacturer
+can do so.  This is fundamentally incompatible with the aim of
+protecting users' freedom to change the software.  The systematic
+pattern of such abuse occurs in the area of products for individuals to
+use, which is precisely where it is most unacceptable.  Therefore, we
+have designed this version of the GPL to prohibit the practice for those
+products.  If such problems arise substantially in other domains, we
+stand ready to extend this provision to those domains in future versions
+of the GPL, as needed to protect the freedom of users.
+
+  Finally, every program is threatened constantly by software patents.
+States should not allow patents to restrict development and use of
+software on general-purpose computers, but in those that do, we wish to
+avoid the special danger that patents applied to a free program could
+make it effectively proprietary.  To prevent this, the GPL assures that
+patents cannot be used to render the program non-free.
 
   The precise terms and conditions for copying, distribution and
 modification follow.
@@ -60,7 +72,7 @@ modification follow.
 
   0. Definitions.
 
-  "This License" refers to version 3 of the GNU Affero General Public License.
+  "This License" refers to version 3 of the GNU General Public License.
 
   "Copyright" also means copyright-like laws that apply to other kinds of
 works, such as semiconductor masks.
@@ -537,45 +549,35 @@ to collect a royalty for further conveying from those to whom you convey
 the Program, the only way you could satisfy both those terms and this
 License would be to refrain entirely from conveying the Program.
 
-  13. Remote Network Interaction; Use with the GNU General Public License.
-
-  Notwithstanding any other provision of this License, if you modify the
-Program, your modified version must prominently offer all users
-interacting with it remotely through a computer network (if your version
-supports such interaction) an opportunity to receive the Corresponding
-Source of your version by providing access to the Corresponding Source
-from a network server at no charge, through some standard or customary
-means of facilitating copying of software.  This Corresponding Source
-shall include the Corresponding Source for any work covered by version 3
-of the GNU General Public License that is incorporated pursuant to the
-following paragraph.
+  13. Use with the GNU Affero General Public License.
 
   Notwithstanding any other provision of this License, you have
 permission to link or combine any covered work with a work licensed
-under version 3 of the GNU General Public License into a single
+under version 3 of the GNU Affero General Public License into a single
 combined work, and to convey the resulting work.  The terms of this
 License will continue to apply to the part which is the covered work,
-but the work with which it is combined will remain governed by version
-3 of the GNU General Public License.
+but the special requirements of the GNU Affero General Public License,
+section 13, concerning interaction through a network will apply to the
+combination as such.
 
   14. Revised Versions of this License.
 
   The Free Software Foundation may publish revised and/or new versions of
-the GNU Affero General Public License from time to time.  Such new versions
-will be similar in spirit to the present version, but may differ in detail to
+the GNU General Public License from time to time.  Such new versions will
+be similar in spirit to the present version, but may differ in detail to
 address new problems or concerns.
 
   Each version is given a distinguishing version number.  If the
-Program specifies that a certain numbered version of the GNU Affero General
+Program specifies that a certain numbered version of the GNU General
 Public License "or any later version" applies to it, you have the
 option of following the terms and conditions either of that numbered
 version or of any later version published by the Free Software
 Foundation.  If the Program does not specify a version number of the
-GNU Affero General Public License, you may choose any version ever published
+GNU General Public License, you may choose any version ever published
 by the Free Software Foundation.
 
   If the Program specifies that a proxy can decide which future
-versions of the GNU Affero General Public License can be used, that proxy's
+versions of the GNU General Public License can be used, that proxy's
 public statement of acceptance of a version permanently authorizes you
 to choose that version for the Program.
 
@@ -633,29 +635,40 @@ the "copyright" line and a pointer to where the full notice is found.
     Copyright (C) <year>  <name of author>
 
     This program is free software: you can redistribute it and/or modify
-    it under the terms of the GNU Affero General Public License as published by
+    it under the terms of the GNU General Public License as published by
     the Free Software Foundation, either version 3 of the License, or
     (at your option) any later version.
 
     This program is distributed in the hope that it will be useful,
     but WITHOUT ANY WARRANTY; without even the implied warranty of
     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-    GNU Affero General Public License for more details.
+    GNU General Public License for more details.
 
-    You should have received a copy of the GNU Affero General Public License
+    You should have received a copy of the GNU General Public License
     along with this program.  If not, see <http://www.gnu.org/licenses/>.
 
 Also add information on how to contact you by electronic and paper mail.
 
-  If your software can interact with users remotely through a computer
-network, you should also make sure that it provides a way for users to
-get its source.  For example, if your program is a web application, its
-interface could display a "Source" link that leads users to an archive
-of the code.  There are many ways you could offer source, and different
-solutions will be better for different programs; see section 13 for the
-specific requirements.
+  If the program does terminal interaction, make it output a short
+notice like this when it starts in an interactive mode:
+
+    <program>  Copyright (C) <year>  <name of author>
+    This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+    This is free software, and you are welcome to redistribute it
+    under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License.  Of course, your program's commands
+might be different; for a GUI interface, you would use an "about box".
 
   You should also get your employer (if you work as a programmer) or school,
 if any, to sign a "copyright disclaimer" for the program, if necessary.
-For more information on this, and how to apply and follow the GNU AGPL, see
+For more information on this, and how to apply and follow the GNU GPL, see
 <http://www.gnu.org/licenses/>.
+
+  The GNU General Public License does not permit incorporating your program
+into proprietary programs.  If your program is a subroutine library, you
+may consider it more useful to permit linking proprietary applications with
+the library.  If this is what you want to do, use the GNU Lesser General
+Public License instead of this License.  But first, please read
+<http://www.gnu.org/philosophy/why-not-lgpl.html>.

+ 2 - 1
README.md

@@ -6,6 +6,7 @@
 [![Bountysource](https://www.bountysource.com/badge/team?team_id=12439&style=raised)](https://www.bountysource.com/teams/chamilo?utm_source=chamilo&utm_medium=shield&utm_campaign=raised)
 [![Code Consistency](https://squizlabs.github.io/PHP_CodeSniffer/analysis/chamilo/chamilo-lms/grade.svg)](http://squizlabs.github.io/PHP_CodeSniffer/analysis/chamilo/chamilo-lms/)
 [![CII Best Practices](https://bestpractices.coreinfrastructure.org/projects/166/badge)](https://bestpractices.coreinfrastructure.org/projects/166)
+[![Codacy Badge](https://api.codacy.com/project/badge/Grade/88e934aab2f34bb7a0397a6f62b078b2)](https://www.codacy.com/app/chamilo/chamilo-lms?utm_source=github.com&utm_medium=referral&utm_content=chamilo/chamilo-lms&utm_campaign=badger)
 
 ## Installation
 
@@ -16,7 +17,7 @@ This installation guide is for development environments only.
 To run Chamilo, you will need at least a web server (we recommend Apache2 for commodity reasons), a database server (we recommend MariaDB but will explain MySQL for commodity reasons) and a PHP interpreter (and a series of libraries for it). If you are working on a Debian-based system (Debian, Ubuntu, Mint, etc), just
 type
 ```
-sudo apt-get install libapache2-mod-php mysql-server php5-gd php5-intl php5-curl php5-json
+sudo apt-get install apache2 mysql-server php libapache2-mod-php php-gd php-intl php-curl php-json php-mysql
 ```
 
 ### Install Git

+ 4 - 2
app/Migrations/Schema/V110/Version110.php

@@ -34,8 +34,10 @@ class Version110 extends AbstractMigrationChamilo
      */
     public function up(Schema $schema)
     {
-        // Use $schema->createTable
-        $this->addSql('set sql_mode=""');
+        // Needed to update 0000-00-00 00:00:00 values
+        $this->addSql('SET sql_mode = ""');
+        // In case this one didn't work, also try this
+        $this->addSql('SET SESSION sql_mode = ""');
 
         $connection = $this->connection;
 

+ 6 - 3
app/Migrations/Schema/V110/Version20150609113500.php

@@ -16,9 +16,12 @@ class Version20150609113500 extends AbstractMigrationChamilo
      */
     public function up(Schema $schema)
     {
-        $this->addSql("INSERT INTO extra_field
-            (extra_field_type, field_type, variable, display_text, visible, changeable, created_at)
-            VALUES (2, 10, 'tags', 'Tags', 1, 1, NOW())");
+        $connection = $this->connection;
+        $sql = "SELECT id FROM extra_field WHERE variable = 'tags'";
+        $result = $connection->executeQuery($sql)->fetchAll();
+        if (empty($result)) {
+            $this->addSql("INSERT INTO extra_field (extra_field_type, field_type, variable, display_text, visible, changeable, created_at) VALUES (2, 10, 'tags', 'Tags', 1, 1, NOW())");
+        }
     }
 
     /**

+ 6 - 3
app/Migrations/Schema/V110/Version20150616093200.php

@@ -16,9 +16,12 @@ class Version20150616093200 extends AbstractMigrationChamilo
      */
     public function up(Schema $schema)
     {
-        $this->addSql("INSERT INTO extra_field (
-            extra_field_type, field_type, variable, display_text, visible, changeable, created_at)
-            VALUES (2, 19, 'video_url', 'VideoUrl', 1, 1, NOW())");
+        $connection = $this->connection;
+        $sql = "SELECT id FROM extra_field WHERE variable = 'video_url'";
+        $result = $connection->executeQuery($sql)->fetchAll();
+        if (empty($result)) {
+            $this->addSql("INSERT INTO extra_field (extra_field_type, field_type, variable, display_text, visible, changeable, created_at) VALUES (2, 19, 'video_url', 'VideoUrl', 1, 1, NOW())");
+        }
     }
 
     /**

+ 6 - 3
app/Migrations/Schema/V110/Version20150624164100.php

@@ -16,9 +16,12 @@ class Version20150624164100 extends AbstractMigrationChamilo
      */
     public function up(Schema $schema)
     {
-        $this->addSql("INSERT INTO extra_field
-            (extra_field_type, field_type, variable, display_text, visible, changeable, created_at)
-            VALUES (3, 16, 'image', 'Image', 1, 1, NOW())");
+        $connection = $this->connection;
+        $sql = "SELECT id FROM extra_field WHERE variable = 'image'";
+        $result = $connection->executeQuery($sql)->fetchAll();
+        if (empty($result)) {
+            $this->addSql("INSERT INTO extra_field (extra_field_type, field_type, variable, display_text, visible, changeable, created_at) VALUES (3, 16, 'image', 'Image', 1, 1, NOW())");
+        }
     }
 
     /**

+ 6 - 3
app/Migrations/Schema/V110/Version20150625155000.php

@@ -16,9 +16,12 @@ class Version20150625155000 extends AbstractMigrationChamilo
      */
     public function up(Schema $schema)
     {
-        $this->addSql("INSERT INTO extra_field
-            (extra_field_type, field_type, variable, display_text, visible, changeable, created_at)
-            VALUES (1, 1, 'captcha_blocked_until_date', 'Account locked until', 0, 0, NOW())");
+        $connection = $this->connection;
+        $sql = "SELECT id FROM extra_field WHERE variable = 'captcha_blocked_until_date'";
+        $result = $connection->executeQuery($sql)->fetchAll();
+        if (empty($result)) {
+            $this->addSql("INSERT INTO extra_field (extra_field_type, field_type, variable, display_text, visible, changeable, created_at) VALUES (1, 1, 'captcha_blocked_until_date', 'Account locked until', 0, 0, NOW())" );
+        }
     }
 
     /**

+ 7 - 2
app/Migrations/Schema/V111/Version111.php

@@ -6,7 +6,6 @@ namespace Application\Migrations\Schema\V111;
 use Application\Migrations\AbstractMigrationChamilo;
 use Doctrine\DBAL\Schema\Schema;
 
-
 /**
  * Class Version111
  * Migrate file to updated to Chamilo 1.11
@@ -370,7 +369,13 @@ class Version111 extends AbstractMigrationChamilo
         $this->addSql("INSERT INTO settings_current (variable, subkey, type, category, selected_value, title, comment, scope, subkeytext, access_url_changeable) VALUES ('load_term_conditions_section', NULL, 'radio','Platform', 'login','LoadTermConditionsSectionTitle','LoadTermConditionsSectionDescription',NULL,NULL, 0)");
         $this->addSql("INSERT INTO settings_current (variable, subkey, type, category, selected_value, title, comment, scope, subkeytext, access_url_changeable) VALUES ('show_terms_if_profile_completed', NULL, 'radio','Ticket', 'false','ShowTermsIfProfileCompletedTitle','ShowTermsIfProfileCompletedComment',NULL,NULL, 0)");
         $this->addSql("INSERT INTO settings_current (variable, subkey, type, category, selected_value, title, comment, scope, subkeytext, access_url_changeable) VALUES ('show_link_ticket_notification', NULL, 'radio', 'Platform', 'false', 'ShowLinkTicketNotificationTitle', 'ShowLinkTicketNotificationComment', NULL, NULL, 0)");
-        $this->addSql("INSERT INTO settings_current (variable, subkey, type, category, selected_value, title, comment, access_url) VALUES ('sso_authentication_subclass', NULL, 'textfield', 'Security', '', 'SSOSubclassTitle', 'SSOSubclassComment', 1)");
+
+        // Make sure there isn't already an sso_authentication_subclass before adding an empty one
+        $stmt = $this->connection->query('SELECT id FROM settings_current WHERE variable = "sso_authentication_subclass" AND access_url = 1');
+        $results = $stmt->fetchAll();
+        if (empty($results)) {
+            $this->addSql("INSERT INTO settings_current (variable, subkey, type, category, selected_value, title, comment, access_url) VALUES ('sso_authentication_subclass', NULL, 'textfield', 'Security', '', 'SSOSubclassTitle', 'SSOSubclassComment', 1)");
+        }
 
         $this->addSql("INSERT INTO settings_options (variable, value, display_text) VALUES ('ticket_allow_student_add', 'true', 'Yes'), ('ticket_allow_student_add', 'false', 'No')");
         $this->addSql("INSERT INTO settings_options (variable, value, display_text) VALUES ('ticket_allow_category_edition', 'true', 'Yes'), ('ticket_allow_category_edition', 'false', 'No')");

+ 3 - 1
app/Migrations/Schema/V111/Version20160330103045.php

@@ -1,4 +1,5 @@
 <?php
+/* For licensing terms, see /license.txt */
 
 namespace Application\Migrations\Schema\V111;
 
@@ -6,7 +7,8 @@ use Application\Migrations\AbstractMigrationChamilo;
 use Doctrine\DBAL\Schema\Schema;
 
 /**
- * Auto-generated Migration: Please modify to your needs!
+ * Class Version20160330103045
+ * @package Application\Migrations\Schema\V111
  */
 class Version20160330103045 extends AbstractMigrationChamilo
 {

+ 5 - 0
app/Migrations/Schema/V111/Version20160405112100.php

@@ -1,10 +1,15 @@
 <?php
+/* For licensing terms, see /license.txt */
 
 namespace Application\Migrations\Schema\V111;
 
 use Application\Migrations\AbstractMigrationChamilo;
 use Doctrine\DBAL\Schema\Schema;
 
+/**
+ * Class Version20160405112100
+ * @package Application\Migrations\Schema\V111
+ */
 class Version20160405112100 extends AbstractMigrationChamilo
 {
     /**

+ 12 - 12
app/Migrations/Schema/V111/Version20160610142700.php

@@ -21,25 +21,25 @@ class Version20160610142700 extends AbstractMigrationChamilo
      */
     public function up(Schema $schema)
     {
-        $dataList = $this
-            ->connection
-            ->executeQuery("
-                SELECT id FROM extra_field
-                WHERE variable = 'skype' AND extra_field_type = 1 
-            ")
-            ->fetchAll();
+        $connection = $this->connection;
+        $sql = "SELECT id FROM extra_field WHERE variable = 'skype' AND extra_field_type = 1";
+        $result = $connection->executeQuery($sql)->fetchAll();
 
-        if (empty($dataList)) {
+        if (empty($result)) {
             $this->addSql("
                 INSERT INTO extra_field (extra_field_type, field_type, variable, display_text, visible, changeable, created_at)
-                VALUES (1, 1, 'skype', 'Skype', 1, 1, now())
+                VALUES (1, 1, 'skype', 'Skype', 1, 1, NOW())
             ");
         }
 
-        $this->addSql("
+        $sql = "SELECT id FROM extra_field WHERE variable = 'skype' AND extra_field_type = 1";
+        $result = $connection->executeQuery($sql)->fetchAll();
+        if (empty($result)) {
+            $this->addSql("
             INSERT INTO extra_field (extra_field_type, field_type, variable, display_text, visible, changeable, created_at)
-            VALUES (1, 1, 'linkedin_url', 'LinkedInUrl', 1, 1, now())
-        ");
+            VALUES (1, 1, 'linkedin_url', 'LinkedInUrl', 1, 1, NOW())"
+            );
+        }
 
         $this->addSettingCurrent(
             'allow_show_skype_account',

+ 6 - 1
app/Migrations/Schema/V111/Version20160706145000.php

@@ -21,7 +21,12 @@ class Version20160706145000 extends AbstractMigrationChamilo
      */
     public function up(Schema $schema)
     {
-        $this->addSql("INSERT INTO extra_field (extra_field_type, field_type, variable, display_text, visible, changeable, created_at) VALUES (8, 10, 'tags', 'Tags', 1, 1, NOW())");
+        $connection = $this->connection;
+        $sql = "SELECT id FROM extra_field WHERE variable = 'tags'";
+        $result = $connection->executeQuery($sql)->fetchAll();
+        if (empty($result)) {
+            $this->addSql("INSERT INTO extra_field (extra_field_type, field_type, variable, display_text, visible, changeable, created_at) VALUES (8, 10, 'tags', 'Tags', 1, 1, NOW())");
+        }
     }
 
     /**

+ 0 - 1
app/Migrations/Schema/V111/Version20160713180000.php

@@ -5,7 +5,6 @@ namespace Application\Migrations\Schema\V111;
 
 use Application\Migrations\AbstractMigrationChamilo;
 use Doctrine\DBAL\Schema\Schema;
-use Doctrine\DBAL\Types\Type;
 
 /**
  * Class Version20160713180000

+ 2 - 3
app/Migrations/Schema/V111/Version20160727122700.php

@@ -3,8 +3,8 @@
 
 namespace Application\Migrations\Schema\V111;
 
-use Application\Migrations\AbstractMigrationChamilo,
-    Doctrine\DBAL\Schema\Schema;
+use Application\Migrations\AbstractMigrationChamilo;
+use Doctrine\DBAL\Schema\Schema;
 
 /**
  * Class Version20160727122700
@@ -13,7 +13,6 @@ use Application\Migrations\AbstractMigrationChamilo,
  */
 class Version20160727122700 extends AbstractMigrationChamilo
 {
-
     /**
      * @param Schema $schema
      */

+ 2 - 2
app/Migrations/Schema/V111/Version20160727155600.php

@@ -3,8 +3,8 @@
 
 namespace Application\Migrations\Schema\V111;
 
-use Application\Migrations\AbstractMigrationChamilo,
-    Doctrine\DBAL\Schema\Schema;
+use Application\Migrations\AbstractMigrationChamilo;
+use Doctrine\DBAL\Schema\Schema;
 use Chamilo\CoreBundle\Entity\BranchSync;
 
 /**

+ 2 - 2
app/Migrations/Schema/V111/Version20160804174600.php

@@ -3,8 +3,8 @@
 
 namespace Application\Migrations\Schema\V111;
 
-use Application\Migrations\AbstractMigrationChamilo,
-    Doctrine\DBAL\Schema\Schema;
+use Application\Migrations\AbstractMigrationChamilo;
+use Doctrine\DBAL\Schema\Schema;
 use Chamilo\CoreBundle\Entity\SystemTemplate;
 
 /**

+ 2 - 2
app/Migrations/Schema/V111/Version20160808154200.php

@@ -3,8 +3,8 @@
 
 namespace Application\Migrations\Schema\V111;
 
-use Application\Migrations\AbstractMigrationChamilo,
-    Doctrine\DBAL\Schema\Schema;
+use Application\Migrations\AbstractMigrationChamilo;
+use Doctrine\DBAL\Schema\Schema;
 
 /**
  * Class Version20160808154200

+ 2 - 3
app/Migrations/Schema/V111/Version20160808160000.php

@@ -3,8 +3,8 @@
 
 namespace Application\Migrations\Schema\V111;
 
-use Application\Migrations\AbstractMigrationChamilo,
-    Doctrine\DBAL\Schema\Schema;
+use Application\Migrations\AbstractMigrationChamilo;
+use Doctrine\DBAL\Schema\Schema;
 
 /**
  * Class Version20160808160000
@@ -13,7 +13,6 @@ use Application\Migrations\AbstractMigrationChamilo,
  */
 class Version20160808160000 extends AbstractMigrationChamilo
 {
-
     /**
      * @param Schema $schema
      */

+ 0 - 1
app/Migrations/Schema/V111/Version20160907140300.php

@@ -5,7 +5,6 @@ namespace Application\Migrations\Schema\V111;
 
 use Application\Migrations\AbstractMigrationChamilo;
 use Doctrine\DBAL\Schema\Schema;
-use Doctrine\DBAL\Types\Type;
 
 /**
  * Class Version20160907140300

+ 0 - 1
app/Migrations/Schema/V111/Version20160907150300.php

@@ -5,7 +5,6 @@ namespace Application\Migrations\Schema\V111;
 
 use Application\Migrations\AbstractMigrationChamilo;
 use Doctrine\DBAL\Schema\Schema;
-use Doctrine\DBAL\Types\Type;
 
 /**
  * Class Version20160907150300

+ 1 - 1
app/Migrations/Schema/V111/Version20160929120000.php

@@ -5,7 +5,6 @@ namespace Application\Migrations\Schema\V111;
 
 use Application\Migrations\AbstractMigrationChamilo;
 use Doctrine\DBAL\Schema\Schema;
-use Doctrine\DBAL\Types\Type;
 
 /**
  * Class Version20160929120000
@@ -21,6 +20,7 @@ class Version20160929120000 extends AbstractMigrationChamilo
      */
     public function up(Schema $schema)
     {
+        error_log('Version20160929120000');
         $this->addSql("ALTER TABLE c_tool ADD INDEX idx_ctool_name (name(20))");
     }
 

+ 1 - 0
app/Migrations/Schema/V111/Version20160930144400.php

@@ -18,6 +18,7 @@ class Version20160930144400 extends AbstractMigrationChamilo
      */
     public function up(Schema $schema)
     {
+        error_log('Version20160930144400');
         $this->addSql('
             UPDATE track_e_hotspot h 
             SET h.hotspot_answer_id = (

+ 10 - 2
app/Migrations/Schema/V111/Version20161028123400.php

@@ -18,6 +18,7 @@ class Version20161028123400 extends AbstractMigrationChamilo
      */
     public function up(Schema $schema)
     {
+        error_log('Version20161028123400');
         $iidColumn = $schema
             ->getTable('c_student_publication_comment')
             ->getColumn('iid');
@@ -32,10 +33,17 @@ class Version20161028123400 extends AbstractMigrationChamilo
 
         $table = $schema->getTable('personal_agenda');
         if ($table->hasIndex('id')) {
+            $this->addSql('ALTER TABLE personal_agenda DROP INDEX id');
+            $this->addSql('ALTER TABLE personal_agenda DROP INDEX idx_personal_agenda_user');
+            $this->addSql('ALTER TABLE personal_agenda DROP INDEX idx_personal_agenda_parent');
             $this->addSql('ALTER TABLE personal_agenda modify id INT NOT NULL');
-            $this->addSql('ALTER TABLE personal_agenda DROP index id');
-            $this->addSql('ALTER TABLE personal_agenda DROP PRIMARY KEY');
+            if ($table->hasPrimaryKey()) {
+                $this->addSql('ALTER TABLE personal_agenda drop primary key ');
+            }
+
             $this->addSql('ALTER TABLE personal_agenda CHANGE id id INT AUTO_INCREMENT NOT NULL PRIMARY KEY');
+            $this->addSql('CREATE INDEX idx_personal_agenda_user ON personal_agenda (user)');
+            $this->addSql('CREATE INDEX idx_personal_agenda_parent ON personal_agenda (parent_event_id)');
         }
     }
 

+ 1 - 0
app/Migrations/Schema/V111/Version20170522120000.php

@@ -20,6 +20,7 @@ class Version20170522120000 extends AbstractMigrationChamilo
      */
     public function up(Schema $schema)
     {
+        error_log('Version20170522120000');
         $trackEAttempt = $schema->getTable('track_e_attempt');
         if ($trackEAttempt->hasColumn('course_code')) {
             $this->addSql("ALTER TABLE track_e_attempt DROP COLUMN course_code");

+ 6 - 5
app/Migrations/Schema/V111/Version20170608164500.php

@@ -3,9 +3,9 @@
 
 namespace Application\Migrations\Schema\V111;
 
-use Application\Migrations\AbstractMigrationChamilo,
-    Doctrine\DBAL\Schema\Schema,
-    Doctrine\DBAL\Types\Type;
+use Application\Migrations\AbstractMigrationChamilo;
+use Doctrine\DBAL\Schema\Schema;
+use Doctrine\DBAL\Types\Type;
 
 /**
  * Class Version20170608164500
@@ -17,10 +17,11 @@ use Application\Migrations\AbstractMigrationChamilo,
 class Version20170608164500 extends AbstractMigrationChamilo
 {
     /**
-     * @param \Doctrine\DBAL\Schema\Schema $schema
+     * @param Schema $schema
      */
     public function up(Schema $schema)
     {
+        error_log('Version20170608164500');
         $schema
             ->getTable('c_quiz_question')
             ->getColumn('type')
@@ -28,7 +29,7 @@ class Version20170608164500 extends AbstractMigrationChamilo
     }
 
     /**
-     * @param \Doctrine\DBAL\Schema\Schema $schema
+     * @param Schema $schema
      */
     public function down(Schema $schema)
     {

+ 0 - 34
app/Migrations/Schema/V111/Version20171002154600.php

@@ -1,34 +0,0 @@
-<?php
-/* For licensing terms, see /license.txt */
-
-namespace Application\Migrations\Schema\V111;
-
-use Application\Migrations\AbstractMigrationChamilo;
-use Doctrine\DBAL\Schema\Schema;
-
-/**
- * Class Version20171002154600
- *
- * Added a new option in registration settings called "confirmation"
- * This option prevents the new user to login in the platform if your account is not
- * confirmed via email.
- * @package Application\Migrations\Schema\V111
- */
-class Version20171002154600 extends AbstractMigrationChamilo
-{
-    /**
-     * @param Schema $schema
-     */
-    public function up(Schema $schema)
-    {
-        $this->addSql("INSERT INTO settings_options (variable, value, display_text) VALUES ('allow_registration', 'confirmation', 'MailConfirmation')");
-    }
-
-    /**
-     * @param Schema $schema
-     */
-    public function down(Schema $schema)
-    {
-        $this->addSql("DELETE settings_options WHERE variable='allow_registration' AND value='confirmation' AND display_text='MailConfirmation'");
-    }
-}

+ 58 - 0
app/Migrations/Schema/V111/Version20171213092400.php

@@ -0,0 +1,58 @@
+<?php
+/* For licensing terms, see /license.txt */
+
+namespace Application\Migrations\Schema\V111;
+
+use Application\Migrations\AbstractMigrationChamilo;
+use Doctrine\DBAL\Schema\Schema;
+
+/**
+ * Class Version20171213092400
+ *
+ * Fix some missing queries for migration from 1.10 to 1.11 (GH#2214)
+ * These are minor changes caused by the move from static SQL to ORM entities
+ *
+ * @package Application\Migrations\Schema\V111
+ */
+class Version20171213092400 extends AbstractMigrationChamilo
+{
+    /**
+     * @param Schema $schema
+     */
+    public function up(Schema $schema)
+    {
+        error_log('Version20171213092400');
+        $table = $schema->getTable('extra_field_values');
+        $hasIndex = $table->hasIndex('idx_efv_fiii');
+        if (!$hasIndex) {
+            $this->addSql('CREATE INDEX idx_efv_fiii ON extra_field_values (field_id, item_id)');
+        }
+        $this->addSql('ALTER TABLE language CHANGE parent_id parent_id INT DEFAULT NULL');
+        $table = $schema->getTable('c_quiz_answer');
+        $hasIndex = $table->hasIndex('idx_cqa_q');
+        if (!$hasIndex) {
+            $this->addSql('CREATE INDEX idx_cqa_q ON c_quiz_answer (question_id)');
+        }
+        $this->addSql('ALTER TABLE c_quiz CHANGE start_time start_time DATETIME DEFAULT NULL');
+        $this->addSql('ALTER TABLE c_quiz CHANGE end_time end_time DATETIME DEFAULT NULL');
+    }
+
+    /**
+     * @param Schema $schema
+     */
+    public function down(Schema $schema)
+    {
+        $table = $schema->getTable('c_quiz_answer');
+        $hasIndex = $table->hasIndex('idx_cqa_q');
+        if ($hasIndex) {
+            $this->addSql('DROP INDEX idx_cqa_q ON c_quiz_answer');
+        }
+        $table = $schema->getTable('language');
+        $this->addSql('ALTER TABLE language CHANGE parent_id parent_id TINYINT DEFAULT NULL');
+        $table = $schema->getTable('extra_field_values');
+        $hasIndex = $table->hasIndex('idx_efv_fiii');
+        if ($hasIndex) {
+            $this->addSql('DROP INDEX idx_efv_fiii ON extra_field_values');
+        }
+    }
+}

+ 87 - 0
app/Migrations/Schema/V111/Version20171227120000.php

@@ -0,0 +1,87 @@
+<?php
+/* For licensing terms, see /license.txt */
+
+namespace Application\Migrations\Schema\V111;
+
+use Application\Migrations\AbstractMigrationChamilo;
+use Doctrine\DBAL\Schema\Schema;
+
+/**
+ * Class Version20171227120000
+ *
+ * Fix more missing queries for migration from 1.10 to 1.11 (GH#2214)
+ * These are minor changes caused by the move from static SQL to ORM entities
+ *
+ * @package Application\Migrations\Schema\V111
+ */
+class Version20171227120000 extends AbstractMigrationChamilo
+{
+    /**
+     * @param Schema $schema
+     */
+    public function up(Schema $schema)
+    {
+        error_log('Version20171227120000');
+        $this->addSql('ALTER TABLE access_url CHANGE description description LONGTEXT NOT NULL');
+        $this->addSql('ALTER TABLE career CHANGE created_at created_at DATETIME NOT NULL, CHANGE updated_at updated_at DATETIME NOT NULL');
+        $this->addSql('ALTER TABLE chat CHANGE sent sent DATETIME NOT NULL');
+        $this->addSql('ALTER TABLE course_category CHANGE auth_course_child auth_course_child VARCHAR(40) DEFAULT NULL');
+        $this->addSql('ALTER TABLE course_request CHANGE request_date request_date DATETIME NOT NULL');
+        $this->addSql('ALTER TABLE extra_field CHANGE visible_to_self visible_to_self TINYINT DEFAULT NULL, CHANGE visible_to_others visible_to_others TINYINT DEFAULT NULL');
+        $this->addSql('ALTER TABLE gradebook_certificate CHANGE created_at created_at DATETIME NOT NULL');
+        $this->addSql('ALTER TABLE gradebook_evaluation CHANGE created_at created_at DATETIME NOT NULL');
+        $this->addSql('ALTER TABLE gradebook_link CHANGE created_at created_at DATETIME NOT NULL');
+        $this->addSql('ALTER TABLE gradebook_linkeval_log CHANGE created_at created_at DATETIME NOT NULL');
+        $this->addSql('ALTER TABLE gradebook_result CHANGE created_at created_at DATETIME NOT NULL');
+        $this->addSql('ALTER TABLE gradebook_result_log CHANGE created_at created_at DATETIME NOT NULL');
+        // Fails because of FK on id field
+        //$this->addSql('ALTER TABLE language CHANGE id id INT AUTO_INCREMENT NOT NULL');
+        $this->addSql('ALTER TABLE message CHANGE send_date send_date DATETIME NOT NULL');
+        $this->addSql('ALTER TABLE promotion CHANGE status status INT NOT NULL, CHANGE created_at created_at DATETIME NOT NULL, CHANGE updated_at updated_at DATETIME NOT NULL');
+        $this->addSql('ALTER TABLE session CHANGE name name VARCHAR(150) NOT NULL');
+        $this->addSql('ALTER TABLE session_rel_user CHANGE registered_at registered_at DATETIME NOT NULL');
+        $this->addSql('ALTER TABLE shared_survey CHANGE creation_date creation_date DATETIME NOT NULL');
+        $this->addSql('ALTER TABLE skill CHANGE updated_at updated_at DATETIME NOT NULL');
+        $this->addSql('ALTER TABLE skill_rel_user_comment CHANGE skill_rel_user_id skill_rel_user_id INT DEFAULT NULL, CHANGE feedback_giver_id feedback_giver_id INT DEFAULT NULL, CHANGE feedback_text feedback_text LONGTEXT NOT NULL, CHANGE feedback_value feedback_value INT DEFAULT 1, CHANGE feedback_datetime feedback_datetime DATETIME NOT NULL');
+        $this->addSql('ALTER TABLE sys_announcement CHANGE date_start date_start DATETIME NOT NULL, CHANGE date_end date_end DATETIME NOT NULL');
+        $this->addSql('ALTER TABLE track_e_attempt_recording CHANGE insert_date insert_date DATETIME NOT NULL');
+        $this->addSql('ALTER TABLE track_e_course_access CHANGE login_course_date login_course_date DATETIME NOT NULL');
+        $this->addSql('ALTER TABLE track_e_downloads CHANGE down_date down_date DATETIME NOT NULL');
+        $this->addSql('ALTER TABLE track_e_exercises CHANGE exe_date exe_date DATETIME NOT NULL, CHANGE start_date start_date DATETIME NOT NULL');
+        $this->addSql('ALTER TABLE track_e_hotpotatoes CHANGE exe_date exe_date DATETIME NOT NULL');
+        $this->addSql('ALTER TABLE track_e_item_property CHANGE lastedit_date lastedit_date DATETIME NOT NULL');
+        $this->addSql('ALTER TABLE track_e_links CHANGE links_date links_date DATETIME NOT NULL');
+        $this->addSql('ALTER TABLE track_e_online CHANGE login_date login_date DATETIME NOT NULL');
+        $this->addSql('ALTER TABLE track_e_open CHANGE open_date open_date DATETIME NOT NULL');
+        $this->addSql('ALTER TABLE track_e_uploads CHANGE upload_date upload_date DATETIME NOT NULL');
+        $this->addSql('ALTER TABLE user CHANGE email_canonical email_canonical VARCHAR(100) NOT NULL, CHANGE credentials_expired credentials_expired TINYINT(1) NOT NULL');
+        $this->addSql('ALTER TABLE c_attendance_calendar CHANGE date_time date_time DATETIME NOT NULL');
+        $this->addSql('ALTER TABLE c_blog CHANGE date_creation date_creation DATETIME NOT NULL');
+        $this->addSql('ALTER TABLE c_blog_comment CHANGE date_creation date_creation DATETIME NOT NULL');
+        $this->addSql('ALTER TABLE c_blog_post CHANGE date_creation date_creation DATETIME NOT NULL');
+        $this->addSql('ALTER TABLE c_blog_task_rel_user CHANGE target_date target_date DATE NOT NULL');
+        $this->addSql('ALTER TABLE c_chat_connected CHANGE last_connection last_connection DATETIME NOT NULL');
+        $this->addSql('ALTER TABLE c_dropbox_feedback CHANGE feedback_date feedback_date DATETIME NOT NULL');
+        $this->addSql('ALTER TABLE c_dropbox_file CHANGE upload_date upload_date DATETIME NOT NULL, CHANGE last_upload_date last_upload_date DATETIME NOT NULL');
+        $this->addSql('ALTER TABLE c_dropbox_post CHANGE feedback_date feedback_date DATETIME NOT NULL');
+        $this->addSql('ALTER TABLE c_item_property CHANGE visibility visibility INT NOT NULL');
+        $this->addSql('ALTER TABLE c_lp CHANGE created_on created_on DATETIME NOT NULL, CHANGE modified_on modified_on DATETIME NOT NULL');
+        $this->addSql('ALTER TABLE c_notebook CHANGE creation_date creation_date DATETIME NOT NULL, CHANGE update_date update_date DATETIME NOT NULL');
+        $this->addSql('ALTER TABLE c_online_connected CHANGE last_connection last_connection DATETIME NOT NULL');
+        $this->addSql('ALTER TABLE c_quiz CHANGE hide_question_title hide_question_title TINYINT(1) DEFAULT NULL');
+        $this->addSql('ALTER TABLE c_quiz_rel_category CHANGE category_id category_id INT DEFAULT NULL, CHANGE count_questions count_questions INT DEFAULT NULL');
+        $this->addSql('ALTER TABLE c_survey CHANGE creation_date creation_date DATETIME NOT NULL');
+        $this->addSql('ALTER TABLE c_survey_invitation CHANGE invitation_date invitation_date DATETIME NOT NULL, CHANGE reminder_date reminder_date DATETIME NOT NULL');
+        $this->addSql('ALTER TABLE c_wiki_discuss CHANGE dtime dtime DATETIME NOT NULL');
+        $this->addSql('ALTER TABLE skill_level CHANGE profile_id profile_id INT DEFAULT NULL, CHANGE position position INT NOT NULL, CHANGE short_name short_name VARCHAR(255) NOT NULL');
+    }
+
+    /**
+     * @param Schema $schema
+     */
+    public function down(Schema $schema)
+    {
+        // No need to revert those database changes as they are minor.
+        // There would be no real use to that
+    }
+}

+ 14 - 0
app/Resources/public/assets/bootstrap-year-calendar/.bower.json

@@ -0,0 +1,14 @@
+{
+  "name": "bootstrap-year-calendar",
+  "homepage": "https://github.com/Paul-DS/bootstrap-year-calendar",
+  "version": "1.1.0",
+  "_release": "1.1.0",
+  "_resolution": {
+    "type": "version",
+    "tag": "v1.1.0",
+    "commit": "48ef9450d47c63fce8b0d7628bc313ad279a66e0"
+  },
+  "_source": "https://github.com/Paul-DS/bootstrap-year-calendar.git",
+  "_target": "1.1.*",
+  "_originalSource": "bootstrap-year-calendar"
+}

+ 202 - 0
app/Resources/public/assets/bootstrap-year-calendar/LICENSE

@@ -0,0 +1,202 @@
+                                 Apache License
+                           Version 2.0, January 2004
+                        http://www.apache.org/licenses/
+
+   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+   1. Definitions.
+
+      "License" shall mean the terms and conditions for use, reproduction,
+      and distribution as defined by Sections 1 through 9 of this document.
+
+      "Licensor" shall mean the copyright owner or entity authorized by
+      the copyright owner that is granting the License.
+
+      "Legal Entity" shall mean the union of the acting entity and all
+      other entities that control, are controlled by, or are under common
+      control with that entity. For the purposes of this definition,
+      "control" means (i) the power, direct or indirect, to cause the
+      direction or management of such entity, whether by contract or
+      otherwise, or (ii) ownership of fifty percent (50%) or more of the
+      outstanding shares, or (iii) beneficial ownership of such entity.
+
+      "You" (or "Your") shall mean an individual or Legal Entity
+      exercising permissions granted by this License.
+
+      "Source" form shall mean the preferred form for making modifications,
+      including but not limited to software source code, documentation
+      source, and configuration files.
+
+      "Object" form shall mean any form resulting from mechanical
+      transformation or translation of a Source form, including but
+      not limited to compiled object code, generated documentation,
+      and conversions to other media types.
+
+      "Work" shall mean the work of authorship, whether in Source or
+      Object form, made available under the License, as indicated by a
+      copyright notice that is included in or attached to the work
+      (an example is provided in the Appendix below).
+
+      "Derivative Works" shall mean any work, whether in Source or Object
+      form, that is based on (or derived from) the Work and for which the
+      editorial revisions, annotations, elaborations, or other modifications
+      represent, as a whole, an original work of authorship. For the purposes
+      of this License, Derivative Works shall not include works that remain
+      separable from, or merely link (or bind by name) to the interfaces of,
+      the Work and Derivative Works thereof.
+
+      "Contribution" shall mean any work of authorship, including
+      the original version of the Work and any modifications or additions
+      to that Work or Derivative Works thereof, that is intentionally
+      submitted to Licensor for inclusion in the Work by the copyright owner
+      or by an individual or Legal Entity authorized to submit on behalf of
+      the copyright owner. For the purposes of this definition, "submitted"
+      means any form of electronic, verbal, or written communication sent
+      to the Licensor or its representatives, including but not limited to
+      communication on electronic mailing lists, source code control systems,
+      and issue tracking systems that are managed by, or on behalf of, the
+      Licensor for the purpose of discussing and improving the Work, but
+      excluding communication that is conspicuously marked or otherwise
+      designated in writing by the copyright owner as "Not a Contribution."
+
+      "Contributor" shall mean Licensor and any individual or Legal Entity
+      on behalf of whom a Contribution has been received by Licensor and
+      subsequently incorporated within the Work.
+
+   2. Grant of Copyright License. Subject to the terms and conditions of
+      this License, each Contributor hereby grants to You a perpetual,
+      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+      copyright license to reproduce, prepare Derivative Works of,
+      publicly display, publicly perform, sublicense, and distribute the
+      Work and such Derivative Works in Source or Object form.
+
+   3. Grant of Patent License. Subject to the terms and conditions of
+      this License, each Contributor hereby grants to You a perpetual,
+      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+      (except as stated in this section) patent license to make, have made,
+      use, offer to sell, sell, import, and otherwise transfer the Work,
+      where such license applies only to those patent claims licensable
+      by such Contributor that are necessarily infringed by their
+      Contribution(s) alone or by combination of their Contribution(s)
+      with the Work to which such Contribution(s) was submitted. If You
+      institute patent litigation against any entity (including a
+      cross-claim or counterclaim in a lawsuit) alleging that the Work
+      or a Contribution incorporated within the Work constitutes direct
+      or contributory patent infringement, then any patent licenses
+      granted to You under this License for that Work shall terminate
+      as of the date such litigation is filed.
+
+   4. Redistribution. You may reproduce and distribute copies of the
+      Work or Derivative Works thereof in any medium, with or without
+      modifications, and in Source or Object form, provided that You
+      meet the following conditions:
+
+      (a) You must give any other recipients of the Work or
+          Derivative Works a copy of this License; and
+
+      (b) You must cause any modified files to carry prominent notices
+          stating that You changed the files; and
+
+      (c) You must retain, in the Source form of any Derivative Works
+          that You distribute, all copyright, patent, trademark, and
+          attribution notices from the Source form of the Work,
+          excluding those notices that do not pertain to any part of
+          the Derivative Works; and
+
+      (d) If the Work includes a "NOTICE" text file as part of its
+          distribution, then any Derivative Works that You distribute must
+          include a readable copy of the attribution notices contained
+          within such NOTICE file, excluding those notices that do not
+          pertain to any part of the Derivative Works, in at least one
+          of the following places: within a NOTICE text file distributed
+          as part of the Derivative Works; within the Source form or
+          documentation, if provided along with the Derivative Works; or,
+          within a display generated by the Derivative Works, if and
+          wherever such third-party notices normally appear. The contents
+          of the NOTICE file are for informational purposes only and
+          do not modify the License. You may add Your own attribution
+          notices within Derivative Works that You distribute, alongside
+          or as an addendum to the NOTICE text from the Work, provided
+          that such additional attribution notices cannot be construed
+          as modifying the License.
+
+      You may add Your own copyright statement to Your modifications and
+      may provide additional or different license terms and conditions
+      for use, reproduction, or distribution of Your modifications, or
+      for any such Derivative Works as a whole, provided Your use,
+      reproduction, and distribution of the Work otherwise complies with
+      the conditions stated in this License.
+
+   5. Submission of Contributions. Unless You explicitly state otherwise,
+      any Contribution intentionally submitted for inclusion in the Work
+      by You to the Licensor shall be under the terms and conditions of
+      this License, without any additional terms or conditions.
+      Notwithstanding the above, nothing herein shall supersede or modify
+      the terms of any separate license agreement you may have executed
+      with Licensor regarding such Contributions.
+
+   6. Trademarks. This License does not grant permission to use the trade
+      names, trademarks, service marks, or product names of the Licensor,
+      except as required for reasonable and customary use in describing the
+      origin of the Work and reproducing the content of the NOTICE file.
+
+   7. Disclaimer of Warranty. Unless required by applicable law or
+      agreed to in writing, Licensor provides the Work (and each
+      Contributor provides its Contributions) on an "AS IS" BASIS,
+      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+      implied, including, without limitation, any warranties or conditions
+      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+      PARTICULAR PURPOSE. You are solely responsible for determining the
+      appropriateness of using or redistributing the Work and assume any
+      risks associated with Your exercise of permissions under this License.
+
+   8. Limitation of Liability. In no event and under no legal theory,
+      whether in tort (including negligence), contract, or otherwise,
+      unless required by applicable law (such as deliberate and grossly
+      negligent acts) or agreed to in writing, shall any Contributor be
+      liable to You for damages, including any direct, indirect, special,
+      incidental, or consequential damages of any character arising as a
+      result of this License or out of the use or inability to use the
+      Work (including but not limited to damages for loss of goodwill,
+      work stoppage, computer failure or malfunction, or any and all
+      other commercial damages or losses), even if such Contributor
+      has been advised of the possibility of such damages.
+
+   9. Accepting Warranty or Additional Liability. While redistributing
+      the Work or Derivative Works thereof, You may choose to offer,
+      and charge a fee for, acceptance of support, warranty, indemnity,
+      or other liability obligations and/or rights consistent with this
+      License. However, in accepting such obligations, You may act only
+      on Your own behalf and on Your sole responsibility, not on behalf
+      of any other Contributor, and only if You agree to indemnify,
+      defend, and hold each Contributor harmless for any liability
+      incurred by, or claims asserted against, such Contributor by reason
+      of your accepting any such warranty or additional liability.
+
+   END OF TERMS AND CONDITIONS
+
+   APPENDIX: How to apply the Apache License to your work.
+
+      To apply the Apache License to your work, attach the following
+      boilerplate notice, with the fields enclosed by brackets "{}"
+      replaced with your own identifying information. (Don't include
+      the brackets!)  The text should be enclosed in the appropriate
+      comment syntax for the file format. We also recommend that a
+      file or class name and description of purpose be included on the
+      same "printed page" as the copyright notice for easier
+      identification within third-party archives.
+
+   Copyright {yyyy} {name of copyright owner}
+
+   Licensed under the Apache License, Version 2.0 (the "License");
+   you may not use this file except in compliance with the License.
+   You may obtain a copy of the License at
+
+       http://www.apache.org/licenses/LICENSE-2.0
+
+   Unless required by applicable law or agreed to in writing, software
+   distributed under the License is distributed on an "AS IS" BASIS,
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+   See the License for the specific language governing permissions and
+   limitations under the License.
+

+ 27 - 0
app/Resources/public/assets/bootstrap-year-calendar/README.md

@@ -0,0 +1,27 @@
+# bootstrap-year-calendar
+A fully customizable year calendar widget, for boostrap !
+You can find all details on the [official website](http://www.bootstrap-year-calendar.com/).
+
+
+![alt tag](http://www.bootstrap-year-calendar.com/img/calendar.png)
+
+## Requirements
+
+This plugin requires the following libraries :
+- Bootstrap v3.0.0 or later
+- jQuery v1.8.0 or later
+
+## Usage
+
+You can create a calendar using the following javascript code :
+```
+$('.calendar').calendar()
+```
+or
+```
+$('.calendar').calendar(options)
+```
+or with the `data-provide` html attribute 
+```
+<div data-provide="calendar"></div>
+```

+ 253 - 0
app/Resources/public/assets/bootstrap-year-calendar/css/bootstrap-year-calendar.css

@@ -0,0 +1,253 @@
+/* =========================================================
+ * Bootstrap year calendar v1.1.0
+ * Repo: https://github.com/Paul-DS/bootstrap-year-calendar
+ * =========================================================
+ * Created by Paul David-Sivelle
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ========================================================= */
+
+/* Main */
+.calendar {
+  padding: 4px;
+  -webkit-border-radius: 4px;
+  -moz-border-radius: 4px;
+  border-radius: 4px;
+  overflow: auto;
+  direction: ltr;
+  
+  -webkit-touch-callout: none;
+  -webkit-user-select: none;
+  -khtml-user-select: none;
+  -moz-user-select: none;
+  -ms-user-select: none;
+  user-select: none;
+}
+
+.calendar.calendar-rtl {
+  direction: rtl;
+}
+.calendar.calendar-rtl table tr td span {
+  float: right;
+}
+
+.calendar table {
+  margin: auto;
+}
+
+.calendar table td,
+.calendar table th {
+  text-align: center;
+  width: 20px;
+  height: 20px;
+  border: none;
+  padding: 4px 5px;
+  font-size:12px;
+}
+
+/* Header */
+.calendar .calendar-header
+{
+	width:100%;
+	margin-bottom:20px;
+}
+
+.calendar .calendar-header table
+{
+	width:100%;
+}
+
+.calendar .calendar-header table th
+{
+	font-size:22px;
+	padding:5px 10px;
+}
+
+.calendar .calendar-header table th:hover {
+  background: #eeeeee;
+  cursor: pointer;
+}
+
+.calendar .calendar-header table th.disabled,
+.calendar .calendar-header table th.disabled:hover {
+  background: none;
+  cursor: default;
+  color:white;
+}
+
+.calendar .calendar-header table th.prev,
+.calendar .calendar-header table th.next
+{
+	width:20px;
+}
+
+.calendar .year-title {
+	font-weight:bold;
+	text-align:center;
+	height:20px;
+	width:auto;
+}
+
+.calendar .year-neighbor
+{
+	color:#aaaaaa;
+}
+
+.calendar .year-neighbor2
+{
+	color:#dddddd;
+}
+
+/* Months */
+.calendar .months-container {
+	width:100%;
+	display:none;
+}
+
+.calendar .month-container {
+	min-width:180px;
+	text-align:center;
+	height:200px;
+	padding:0;
+}
+
+.calendar table.month th.month-title
+{
+	font-size:16px;
+	padding-bottom: 5px;
+}
+
+.calendar table.month th.day-header
+{
+	font-size:14px;
+}
+
+
+.calendar table.month tr td,
+.calendar table.month tr th
+{
+	padding:0;
+}
+
+.calendar table.month td.week-number {
+	cursor: default;
+	font-weight:bold;
+	border-right:1px solid #eee;
+	padding:5px;
+}
+
+.calendar .round-left {
+	-webkit-border-radius: 8px 0 0 8px;
+	-moz-border-radius: 8px 0 0 8px;
+	border-radius: 8px 0 0 8px;
+}
+
+.calendar .round-right {
+	webkit-border-radius: 0 8px 8px 0 ;
+	-moz-border-radius: 0 8px 8px 0;
+	border-radius: 0 8px 8px 0;
+}
+
+.calendar table.month tr td .day-content {
+	-webkit-border-radius: 4px;
+	-moz-border-radius: 4px;
+	border-radius: 4px;
+	padding: 5px 6px;
+}
+
+.table-striped .calendar table.month tr td,
+.table-striped .calendar table.month tr th {
+  background-color: transparent;
+}
+
+.calendar table.month td.day .day-content:hover {
+  background: rgba(0, 0, 0, 0.2);
+  cursor: pointer;
+}
+.calendar table.month tr td.old,
+.calendar table.month tr td.new,
+.calendar table.month tr td.old:hover,
+.calendar table.month tr td.new:hover {
+  background: none;
+  cursor: default;
+}
+.calendar table.month tr td.disabled,
+.calendar table.month tr td.disabled:hover {
+  color: #dddddd;
+}
+
+.calendar table.month td.day.disabled .day-content:hover {
+	background: none;
+	cursor: default;
+}
+
+.calendar table.month tr td.range .day-content {
+   background: rgba(0, 0, 0, 0.2);
+  -webkit-border-radius: 0;
+  -moz-border-radius: 0;
+  border-radius: 0;
+}
+
+.calendar table.month tr td.range.range-start .day-content  {
+  border-top-left-radius:4px;
+  border-bottom-left-radius:4px;
+}
+
+.calendar table.month tr td.range.range-end .day-content  {
+  border-top-right-radius:4px;
+  border-bottom-right-radius:4px;
+}
+
+.calendar-context-menu,
+.calendar-context-menu  .submenu {
+	border: 1px solid #ddd;
+	background-color: white;
+	box-shadow: 2px 2px 5px rgba(0, 0, 0, .2);
+	-webkit-box-shadow: 2px 2px 5px rgba(0, 0, 0, .2);
+	position:absolute;
+	display:none;
+}
+
+.calendar-context-menu .item {
+	padding:5px 10px;
+	cursor:pointer;
+	display:table;
+	width:100%;
+}
+
+.calendar-context-menu .item:hover {
+	background:#eee;
+}
+
+.calendar-context-menu .item .content {
+	display:table-cell;
+}
+
+.calendar-context-menu .item span {
+	display:table-cell;
+	padding-left:10px;
+	text-align:right;
+}
+
+.calendar-context-menu .item span:last-child {
+	display:none;
+}
+
+.calendar-context-menu  .submenu {
+	left: 100%;
+	margin-top: -6px;
+}
+
+.calendar-context-menu  .item:hover > .submenu {
+	display:block;
+}

Fichier diff supprimé car celui-ci est trop grand
+ 6 - 0
app/Resources/public/assets/bootstrap-year-calendar/css/bootstrap-year-calendar.min.css


+ 1110 - 0
app/Resources/public/assets/bootstrap-year-calendar/js/bootstrap-year-calendar.js

@@ -0,0 +1,1110 @@
+/* =========================================================
+ * Bootstrap year calendar v1.1.0
+ * Repo: https://github.com/Paul-DS/bootstrap-year-calendar
+ * =========================================================
+ * Created by Paul David-Sivelle
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ========================================================= */
+
+(function($) {
+    var Calendar = function(element, options) {
+        this.element = element;
+        this.element.addClass('calendar');
+
+        this._initializeEvents(options);
+        this._initializeOptions(options);
+        this.setYear(this.options.startYear);
+    };
+
+    Calendar.prototype = {
+        constructor: Calendar,
+        _initializeOptions: function(opt) {
+            if(opt == null) {
+                opt = [];
+            }
+
+            this.options = {
+                startYear: !isNaN(parseInt(opt.startYear)) ? parseInt(opt.startYear) : new Date().getFullYear(),
+                minDate: opt.minDate instanceof Date ? opt.minDate : null,
+                maxDate: opt.maxDate instanceof Date ? opt.maxDate : null,
+                language: (opt.language != null && dates[opt.language] != null) ? opt.language : 'en',
+                allowOverlap: opt.allowOverlap != null ? opt.allowOverlap : true,
+                displayWeekNumber: opt.displayWeekNumber != null ? opt.displayWeekNumber : false,
+                displayDisabledDataSource: opt.displayDisabledDataSource != null ? opt.displayDisabledDataSource : false,
+                displayHeader: opt.displayHeader != null ? opt.displayHeader : true,
+                alwaysHalfDay: opt.alwaysHalfDay != null ? opt.alwaysHalfDay : false,
+                enableRangeSelection: opt.enableRangeSelection != null ? opt.enableRangeSelection : false,
+                disabledDays: opt.disabledDays instanceof Array ? opt.disabledDays : [],
+                disabledWeekDays: opt.disabledWeekDays instanceof Array ? opt.disabledWeekDays : [],
+                hiddenWeekDays: opt.hiddenWeekDays instanceof Array ? opt.hiddenWeekDays : [],
+                roundRangeLimits: opt.roundRangeLimits != null ? opt.roundRangeLimits : false,
+                dataSource: opt.dataSource instanceof Array ? opt.dataSource : [],
+                style: opt.style == 'background' || opt.style == 'border' || opt.style == 'custom' ? opt.style : 'border',
+                enableContextMenu: opt.enableContextMenu != null ? opt.enableContextMenu : false,
+                contextMenuItems: opt.contextMenuItems instanceof Array ? opt.contextMenuItems : [],
+                customDayRenderer : $.isFunction(opt.customDayRenderer) ? opt.customDayRenderer : null,
+                customDataSourceRenderer : $.isFunction(opt.customDataSourceRenderer) ? opt.customDataSourceRenderer : null,
+                weekStart: !isNaN(parseInt(opt.weekStart)) ? parseInt(opt.weekStart) : null
+            };
+
+            this._initializeDatasourceColors();
+        },
+        _initializeEvents: function(opt) {
+            if(opt == null) {
+                opt = [];
+            }
+
+            if(opt.yearChanged) { this.element.bind('yearChanged', opt.yearChanged); }
+            if(opt.renderEnd) { this.element.bind('renderEnd', opt.renderEnd); }
+            if(opt.clickDay) { this.element.bind('clickDay', opt.clickDay); }
+            if(opt.dayContextMenu) { this.element.bind('dayContextMenu', opt.dayContextMenu); }
+            if(opt.selectRange) { this.element.bind('selectRange', opt.selectRange); }
+            if(opt.mouseOnDay) { this.element.bind('mouseOnDay', opt.mouseOnDay); }
+            if(opt.mouseOutDay) { this.element.bind('mouseOutDay', opt.mouseOutDay); }
+        },
+        _initializeDatasourceColors: function() {
+            for(var i = 0; i < this.options.dataSource.length; i++) {
+                if(this.options.dataSource[i].color == null) {
+                    this.options.dataSource[i].color = colors[i % colors.length];
+                }
+            }
+        },
+        render: function() {
+            this.element.empty();
+
+            if(this.options.displayHeader) {
+                this._renderHeader();
+            }
+
+            this._renderBody();
+            this._renderDataSource();
+
+            this._applyEvents();
+            this.element.find('.months-container').fadeIn(500);
+
+            this._triggerEvent('renderEnd', { currentYear: this.options.startYear });
+        },
+        _renderHeader: function() {
+            var header = $(document.createElement('div'));
+            header.addClass('calendar-header panel panel-default');
+
+            var headerTable = $(document.createElement('table'));
+
+            var prevDiv = $(document.createElement('th'));
+            prevDiv.addClass('prev');
+
+            if(this.options.minDate != null && this.options.minDate > new Date(this.options.startYear - 1, 11, 31)) {
+                prevDiv.addClass('disabled');
+            }
+
+            var prevIcon = $(document.createElement('span'));
+            prevIcon.addClass('glyphicon glyphicon-chevron-left');
+
+            prevDiv.append(prevIcon);
+
+            headerTable.append(prevDiv);
+
+            var prev2YearDiv = $(document.createElement('th'));
+            prev2YearDiv.addClass('year-title year-neighbor2 hidden-sm hidden-xs');
+            prev2YearDiv.text(this.options.startYear - 2);
+
+            if(this.options.minDate != null && this.options.minDate > new Date(this.options.startYear - 2, 11, 31)) {
+                prev2YearDiv.addClass('disabled');
+            }
+
+            headerTable.append(prev2YearDiv);
+
+            var prevYearDiv = $(document.createElement('th'));
+            prevYearDiv.addClass('year-title year-neighbor hidden-xs');
+            prevYearDiv.text(this.options.startYear - 1);
+
+            if(this.options.minDate != null && this.options.minDate > new Date(this.options.startYear - 1, 11, 31)) {
+                prevYearDiv.addClass('disabled');
+            }
+
+            headerTable.append(prevYearDiv);
+
+            var yearDiv = $(document.createElement('th'));
+            yearDiv.addClass('year-title');
+            yearDiv.text(this.options.startYear);
+
+            headerTable.append(yearDiv);
+
+            var nextYearDiv = $(document.createElement('th'));
+            nextYearDiv.addClass('year-title year-neighbor hidden-xs');
+            nextYearDiv.text(this.options.startYear + 1);
+
+            if(this.options.maxDate != null && this.options.maxDate < new Date(this.options.startYear + 1, 0, 1)) {
+                nextYearDiv.addClass('disabled');
+            }
+
+            headerTable.append(nextYearDiv);
+
+            var next2YearDiv = $(document.createElement('th'));
+            next2YearDiv.addClass('year-title year-neighbor2 hidden-sm hidden-xs');
+            next2YearDiv.text(this.options.startYear + 2);
+
+            if(this.options.maxDate != null && this.options.maxDate < new Date(this.options.startYear + 2, 0, 1)) {
+                next2YearDiv.addClass('disabled');
+            }
+
+            headerTable.append(next2YearDiv);
+
+            var nextDiv = $(document.createElement('th'));
+            nextDiv.addClass('next');
+
+            if(this.options.maxDate != null && this.options.maxDate < new Date(this.options.startYear + 1, 0, 1)) {
+                nextDiv.addClass('disabled');
+            }
+
+            var nextIcon = $(document.createElement('span'));
+            nextIcon.addClass('glyphicon glyphicon-chevron-right');
+
+            nextDiv.append(nextIcon);
+
+            headerTable.append(nextDiv);
+
+            header.append(headerTable);
+
+            this.element.append(header);
+        },
+        _renderBody: function() {
+            var monthsDiv = $(document.createElement('div'));
+            monthsDiv.addClass('months-container');
+
+            for(var m = 0; m < 12; m++) {
+                /* Container */
+                var monthDiv = $(document.createElement('div'));
+                monthDiv.addClass('month-container');
+                monthDiv.data('month-id', m);
+
+                var firstDate = new Date(this.options.startYear, m, 1);
+
+                var table = $(document.createElement('table'));
+                table.addClass('month');
+
+                /* Month header */
+                var thead = $(document.createElement('thead'));
+
+                var titleRow = $(document.createElement('tr'));
+
+                var titleCell = $(document.createElement('th'));
+                titleCell.addClass('month-title');
+                titleCell.attr('colspan', this.options.displayWeekNumber ? 8 : 7);
+                titleCell.text(dates[this.options.language].months[m]);
+
+                titleRow.append(titleCell);
+                thead.append(titleRow);
+
+                var headerRow = $(document.createElement('tr'));
+
+                if(this.options.displayWeekNumber) {
+                    var weekNumberCell = $(document.createElement('th'));
+                    weekNumberCell.addClass('week-number');
+                    weekNumberCell.text(dates[this.options.language].weekShort);
+                    headerRow.append(weekNumberCell);
+                }
+
+                var weekStart = this.options.weekStart ? this.options.weekStart : dates[this.options.language].weekStart;
+                var d = weekStart;
+                do
+                {
+                    var headerCell = $(document.createElement('th'));
+                    headerCell.addClass('day-header');
+                    headerCell.text(dates[this.options.language].daysMin[d]);
+
+                    if(this._isHidden(d)) {
+                        headerCell.addClass('hidden');
+                    }
+
+                    headerRow.append(headerCell);
+
+                    d++;
+                    if(d >= 7)
+                        d = 0;
+                }
+                while(d != weekStart)
+
+                thead.append(headerRow);
+                table.append(thead);
+
+                /* Days */
+                var currentDate = new Date(firstDate.getTime());
+                var lastDate = new Date(this.options.startYear, m + 1, 0);
+
+                while(currentDate.getDay() != weekStart)
+                {
+                    currentDate.setDate(currentDate.getDate() - 1);
+                }
+
+                while(currentDate <= lastDate)
+                {
+                    var row = $(document.createElement('tr'));
+
+                    if(this.options.displayWeekNumber) {
+                        var weekNumberCell = $(document.createElement('td'));
+                        weekNumberCell.addClass('week-number');
+                        weekNumberCell.text(this.getWeekNumber(currentDate));
+                        row.append(weekNumberCell);
+                    }
+
+                    do
+                    {
+                        var cell = $(document.createElement('td'));
+                        cell.addClass('day');
+
+                        if(this._isHidden(currentDate.getDay())) {
+                            cell.addClass('hidden');
+                        }
+
+                        if(currentDate < firstDate) {
+                            cell.addClass('old');
+                        }
+                        else if(currentDate > lastDate) {
+                            cell.addClass('new');
+                        }
+                        else {
+                            if(this._isDisabled(currentDate)) {
+                                cell.addClass('disabled');
+                            }
+
+                            var cellContent = $(document.createElement('div'));
+                            cellContent.addClass('day-content');
+                            cellContent.text(currentDate.getDate());
+                            cell.append(cellContent);
+
+                            if(this.options.customDayRenderer) {
+                                this.options.customDayRenderer(cellContent, currentDate);
+                            }
+                        }
+
+                        row.append(cell);
+
+                        currentDate.setDate(currentDate.getDate() + 1);
+                    }
+                    while(currentDate.getDay() != weekStart)
+
+                    table.append(row);
+                }
+
+                monthDiv.append(table);
+
+                monthsDiv.append(monthDiv);
+            }
+
+            this.element.append(monthsDiv);
+        },
+        _renderDataSource: function() {
+            var _this = this;
+            if(this.options.dataSource != null && this.options.dataSource.length > 0) {
+                this.element.find('.month-container').each(function() {
+                    var month = $(this).data('month-id');
+
+                    var firstDate = new Date(_this.options.startYear, month, 1);
+                    var lastDate = new Date(_this.options.startYear, month + 1, 1);
+
+                    if((_this.options.minDate == null || lastDate > _this.options.minDate) && (_this.options.maxDate == null || firstDate <= _this.options.maxDate))
+                    {
+                        var monthData = [];
+
+                        for(var i = 0; i < _this.options.dataSource.length; i++) {
+                            if(!(_this.options.dataSource[i].startDate >= lastDate) || (_this.options.dataSource[i].endDate < firstDate)) {
+                                monthData.push(_this.options.dataSource[i]);
+                            }
+                        }
+
+                        if(monthData.length > 0) {
+                            $(this).find('.day-content').each(function() {
+                                var currentDate = new Date(_this.options.startYear, month, $(this).text());
+                                var nextDate = new Date(_this.options.startYear, month, currentDate.getDate() + 1);
+
+                                var dayData = [];
+
+                                if((_this.options.minDate == null || currentDate >= _this.options.minDate) && (_this.options.maxDate == null || currentDate <= _this.options.maxDate))
+                                {
+                                    for(var i = 0; i < monthData.length; i++) {
+                                        if(monthData[i].startDate < nextDate && monthData[i].endDate >= currentDate) {
+                                            dayData.push(monthData[i]);
+                                        }
+                                    }
+
+                                    if(dayData.length > 0 && (_this.options.displayDisabledDataSource || !_this._isDisabled(currentDate)))
+                                    {
+                                        _this._renderDataSourceDay($(this), currentDate, dayData);
+                                    }
+                                }
+                            });
+                        }
+                    }
+                });
+            }
+        },
+        _renderDataSourceDay: function(elt, currentDate, events) {
+            switch(this.options.style)
+            {
+                case 'border':
+                    var weight = 0;
+
+                    if(events.length == 1) {
+                        weight = 4;
+                    }
+                    else if(events.length <= 3) {
+                        weight = 2;
+                    }
+                    else {
+                        elt.parent().css('box-shadow', 'inset 0 -4px 0 0 black');
+                    }
+
+                    if(weight > 0)
+                    {
+                        var boxShadow = '';
+
+                        for (var i = 0; i < events.length; i++)
+                        {
+                            if(boxShadow != '') {
+                                boxShadow += ",";
+                            }
+
+                            boxShadow += 'inset 0 -' + (parseInt(i) + 1) * weight + 'px 0 0 ' + events[i].color;
+                        }
+
+                        elt.parent().css('box-shadow', boxShadow);
+                    }
+                    break;
+
+                case 'background':
+                    elt.parent().css('background-color', events[events.length - 1].color);
+
+                    var currentTime = currentDate.getTime();
+
+                    if(events[events.length - 1].startDate.getTime() == currentTime)
+                    {
+                        elt.parent().addClass('day-start');
+
+                        if(events[events.length - 1].startHalfDay || this.options.alwaysHalfDay) {
+                            elt.parent().addClass('day-half');
+
+                            // Find color for other half
+                            var otherColor = 'transparent';
+                            for(var i = events.length - 2; i >= 0; i--) {
+                                if(events[i].startDate.getTime() != currentTime || (!events[i].startHalfDay && !this.options.alwaysHalfDay)) {
+                                    otherColor = events[i].color;
+                                    break;
+                                }
+                            }
+
+                            elt.parent().css('background', 'linear-gradient(-45deg, ' + events[events.length - 1].color + ', ' + events[events.length - 1].color + ' 49%, ' + otherColor + ' 51%, ' + otherColor + ')');
+                        }
+                        else if(this.options.roundRangeLimits) {
+                            elt.parent().addClass('round-left');
+                        }
+                    }
+                    else if(events[events.length - 1].endDate.getTime() == currentTime)
+                    {
+                        elt.parent().addClass('day-end');
+
+                        if(events[events.length - 1].endHalfDay || this.options.alwaysHalfDay) {
+                            elt.parent().addClass('day-half');
+
+                            // Find color for other half
+                            var otherColor = 'transparent';
+                            for(var i = events.length - 2; i >= 0; i--) {
+                                if(events[i].endDate.getTime() != currentTime || (!events[i].endHalfDay &&  !this.options.alwaysHalfDay)) {
+                                    otherColor = events[i].color;
+                                    break;
+                                }
+                            }
+
+                            elt.parent().css('background', 'linear-gradient(135deg, ' + events[events.length - 1].color + ', ' + events[events.length - 1].color + ' 49%, ' + otherColor + ' 51%, ' + otherColor + ')');
+                        }
+                        else if(this.options.roundRangeLimits) {
+                            elt.parent().addClass('round-right');
+                        }
+                    }
+                    break;
+
+                case 'custom':
+                    if(this.options.customDataSourceRenderer) {
+                        this.options.customDataSourceRenderer.call(this, elt, currentDate, events);
+                    }
+                    break;
+            }
+        },
+        _applyEvents: function () {
+            var _this = this;
+
+            /* Header buttons */
+            this.element.find('.year-neighbor, .year-neighbor2').click(function() {
+                if(!$(this).hasClass('disabled')) {
+                    _this.setYear(parseInt($(this).text()));
+                }
+            });
+
+            this.element.find('.calendar-header .prev').click(function() {
+                if(!$(this).hasClass('disabled')) {
+                    _this.element.find('.months-container').animate({'margin-left':'100%'},100, function() {
+                        _this.element.find('.months-container').css('visibility', 'hidden');
+                        _this.element.find('.months-container').css('margin-left', '0');
+
+                        setTimeout(function() {
+                            _this.setYear(_this.options.startYear - 1);
+                        }, 50);
+                    });
+                }
+            });
+
+            this.element.find('.calendar-header .next').click(function() {
+                if(!$(this).hasClass('disabled')) {
+                    _this.element.find('.months-container').animate({'margin-left':'-100%'},100, function() {
+                        _this.element.find('.months-container').css('visibility', 'hidden');
+                        _this.element.find('.months-container').css('margin-left', '0');
+
+                        setTimeout(function() {
+                            _this.setYear(_this.options.startYear + 1);
+                        }, 50);
+                    });
+                }
+            });
+
+            var cells = this.element.find('.day:not(.old, .new, .disabled)');
+
+            /* Click on date */
+            cells.click(function(e) {
+                e.stopPropagation();
+                var date = _this._getDate($(this));
+                _this._triggerEvent('clickDay', {
+                    element: $(this),
+                    which: e.which,
+                    date: date,
+                    events: _this.getEvents(date)
+                });
+            });
+
+            /* Click right on date */
+
+            cells.bind('contextmenu', function(e) {
+                if(_this.options.enableContextMenu)
+                {
+                    e.preventDefault();
+                    if(_this.options.contextMenuItems.length > 0)
+                    {
+                        _this._openContextMenu($(this));
+                    }
+                }
+
+                var date = _this._getDate($(this));
+                _this._triggerEvent('dayContextMenu', {
+                    element: $(this),
+                    date: date,
+                    events: _this.getEvents(date)
+                });
+            });
+
+            /* Range selection */
+            if(this.options.enableRangeSelection) {
+                cells.mousedown(function (e) {
+                    if(e.which == 1) {
+                        var currentDate = _this._getDate($(this));
+
+                        if(_this.options.allowOverlap || _this.getEvents(currentDate).length == 0)
+                        {
+                            _this._mouseDown = true;
+                            _this._rangeStart = _this._rangeEnd = currentDate;
+                            _this._refreshRange();
+                        }
+                    }
+                });
+
+                cells.mouseenter(function (e) {
+                    if (_this._mouseDown) {
+                        var currentDate = _this._getDate($(this));
+
+                        if(!_this.options.allowOverlap)
+                        {
+                            var newDate =  new Date(_this._rangeStart.getTime());
+
+                            if(newDate < currentDate) {
+                                var nextDate = new Date(newDate.getFullYear(), newDate.getMonth(), newDate.getDate() + 1);
+                                while(newDate < currentDate) {
+                                    if(_this.getEvents(nextDate).length > 0)
+                                    {
+                                        break;
+                                    }
+
+                                    newDate.setDate(newDate.getDate() + 1);
+                                    nextDate.setDate(nextDate.getDate() + 1);
+                                }
+                            }
+                            else {
+                                var nextDate = new Date(newDate.getFullYear(), newDate.getMonth(), newDate.getDate() - 1);
+                                while(newDate > currentDate) {
+                                    if(_this.getEvents(nextDate).length > 0)
+                                    {
+                                        break;
+                                    }
+
+                                    newDate.setDate(newDate.getDate() - 1);
+                                    nextDate.setDate(nextDate.getDate() - 1);
+                                }
+                            }
+
+                            currentDate = newDate;
+                        }
+
+                        var oldValue = _this._rangeEnd;
+                        _this._rangeEnd = currentDate;
+
+                        if (oldValue.getTime() != _this._rangeEnd.getTime()) {
+                            _this._refreshRange();
+                        }
+                    }
+                });
+
+                $(window).mouseup(function (e) {
+                    if (_this._mouseDown) {
+                        _this._mouseDown = false;
+                        _this._refreshRange();
+
+                        var minDate = _this._rangeStart < _this._rangeEnd ? _this._rangeStart : _this._rangeEnd;
+                        var maxDate = _this._rangeEnd > _this._rangeStart ? _this._rangeEnd : _this._rangeStart;
+
+                        _this._triggerEvent('selectRange', {
+                            startDate: minDate,
+                            endDate: maxDate,
+                            events: _this.getEventsOnRange(minDate, new Date(maxDate.getFullYear(), maxDate.getMonth(), maxDate.getDate() + 1))
+                        });
+                    }
+                });
+            }
+
+            /* Hover date */
+            cells.mouseenter(function(e) {
+                if(!_this._mouseDown)
+                {
+                    var date = _this._getDate($(this));
+                    _this._triggerEvent('mouseOnDay', {
+                        element: $(this),
+                        date: date,
+                        events: _this.getEvents(date)
+                    });
+                }
+            });
+
+            cells.mouseleave(function(e) {
+                var date = _this._getDate($(this));
+                _this._triggerEvent('mouseOutDay', {
+                    element: $(this),
+                    date: date,
+                    events: _this.getEvents(date)
+                });
+            });
+
+            /* Responsive management */
+
+            setInterval(function() {
+                var calendarSize = $(_this.element).width();
+                var monthSize = $(_this.element).find('.month').first().width() + 10;
+                var monthContainerClass = 'month-container';
+
+                if(monthSize * 6 < calendarSize) {
+                    monthContainerClass += ' col-xs-2';
+                }
+                else if(monthSize * 4 < calendarSize) {
+                    monthContainerClass += ' col-xs-3';
+                }
+                else if(monthSize * 3 < calendarSize) {
+                    monthContainerClass += ' col-xs-4';
+                }
+                else if(monthSize * 2 < calendarSize) {
+                    monthContainerClass += ' col-xs-6';
+                }
+                else {
+                    monthContainerClass += ' col-xs-12';
+                }
+
+                $(_this.element).find('.month-container').attr('class', monthContainerClass);
+            }, 300);
+        },
+        _refreshRange: function () {
+            var _this = this;
+
+            this.element.find('td.day.range').removeClass('range')
+            this.element.find('td.day.range-start').removeClass('range-start');
+            this.element.find('td.day.range-end').removeClass('range-end');
+
+            if (this._mouseDown) {
+                var beforeRange = true;
+                var afterRange = false;
+                var minDate = _this._rangeStart < _this._rangeEnd ? _this._rangeStart : _this._rangeEnd;
+                var maxDate = _this._rangeEnd > _this._rangeStart ? _this._rangeEnd : _this._rangeStart;
+
+                this.element.find('.month-container').each(function () {
+                    var monthId = $(this).data('month-id');
+                    if (minDate.getMonth() <= monthId && maxDate.getMonth() >= monthId) {
+                        $(this).find('td.day:not(.old, .new)').each(function () {
+                            var date = _this._getDate($(this));
+                            if (date >= minDate && date <= maxDate) {
+                                $(this).addClass('range');
+
+                                if (date.getTime() == minDate.getTime()) {
+                                    $(this).addClass('range-start');
+                                }
+
+                                if (date.getTime() == maxDate.getTime()) {
+                                    $(this).addClass('range-end');
+                                }
+                            }
+                        });
+                    }
+                });
+            }
+        },
+        _openContextMenu: function(elt) {
+            var contextMenu = $('.calendar-context-menu');
+
+            if(contextMenu.length > 0) {
+                contextMenu.hide();
+                contextMenu.empty();
+            }
+            else {
+                contextMenu = $(document.createElement('div'));
+                contextMenu.addClass('calendar-context-menu');
+                $('body').append(contextMenu);
+            }
+
+            var date = this._getDate(elt);
+            var events = this.getEvents(date);
+
+            for(var i = 0; i < events.length; i++) {
+                var eventItem = $(document.createElement('div'));
+                eventItem.addClass('item');
+                eventItem.css('border-left', '4px solid ' + events[i].color);
+
+                var eventItemContent = $(document.createElement('div'));
+                eventItemContent.addClass('content');
+                eventItemContent.text(events[i].name);
+
+                eventItem.append(eventItemContent);
+
+                var icon = $(document.createElement('span'));
+                icon.addClass('glyphicon glyphicon-chevron-right');
+
+                eventItem.append(icon);
+
+                this._renderContextMenuItems(eventItem, this.options.contextMenuItems, events[i]);
+
+                contextMenu.append(eventItem);
+            }
+
+            if(contextMenu.children().length > 0)
+            {
+                contextMenu.css('left', elt.offset().left + 25 + 'px');
+                contextMenu.css('top', elt.offset().top + 25 + 'px');
+                contextMenu.show();
+
+                $(window).one('mouseup', function() {
+                    contextMenu.hide();
+                });
+            }
+        },
+        _renderContextMenuItems: function(parent, items, evt) {
+            var subMenu = $(document.createElement('div'));
+            subMenu.addClass('submenu');
+
+            for(var i = 0; i < items.length; i++) {
+                if(!items[i].visible || items[i].visible(evt)) {
+                    var menuItem = $(document.createElement('div'));
+                    menuItem.addClass('item');
+
+                    var menuItemContent = $(document.createElement('div'));
+                    menuItemContent.addClass('content');
+                    menuItemContent.text(items[i].text);
+
+                    menuItem.append(menuItemContent);
+
+                    if(items[i].click) {
+                        (function(index) {
+                            menuItem.click(function() {
+                                items[index].click(evt);
+                            });
+                        })(i);
+                    }
+
+                    var icon = $(document.createElement('span'));
+                    icon.addClass('glyphicon glyphicon-chevron-right');
+
+                    menuItem.append(icon);
+
+                    if(items[i].items && items[i].items.length > 0) {
+                        this._renderContextMenuItems(menuItem, items[i].items, evt);
+                    }
+
+                    subMenu.append(menuItem);
+                }
+            }
+
+            if(subMenu.children().length > 0)
+            {
+                parent.append(subMenu);
+            }
+        },
+        _getColor: function(colorString) {
+            var div = $('<div />');
+            div.css('color', colorString);
+
+        },
+        _getDate: function(elt) {
+            var day = elt.children('.day-content').text();
+            var month = elt.closest('.month-container').data('month-id');
+            var year = this.options.startYear;
+
+            return new Date(year, month, day);
+        },
+        _triggerEvent: function(eventName, parameters) {
+            var event = $.Event(eventName);
+
+            for(var i in parameters) {
+                event[i] = parameters[i];
+            }
+
+            this.element.trigger(event);
+
+            return event;
+        },
+        _isDisabled: function(date) {
+            if((this.options.minDate != null && date < this.options.minDate) || (this.options.maxDate != null && date > this.options.maxDate))
+            {
+                return true;
+            }
+
+            if(this.options.disabledWeekDays.length > 0) {
+                for(var d = 0; d < this.options.disabledWeekDays.length; d++){
+                    if(date.getDay() == this.options.disabledWeekDays[d]) {
+                        return true;
+                    }
+                }
+            }
+
+            if(this.options.disabledDays.length > 0) {
+                for(var d = 0; d < this.options.disabledDays.length; d++){
+                    if(date.getTime() == this.options.disabledDays[d].getTime()) {
+                        return true;
+                    }
+                }
+            }
+
+            return false;
+        },
+        _isHidden: function(day) {
+            if(this.options.hiddenWeekDays.length > 0) {
+                for(var d = 0; d < this.options.hiddenWeekDays.length; d++) {
+                    if(day == this.options.hiddenWeekDays[d]) {
+                        return true;
+                    }
+                }
+            }
+
+            return false;
+        },
+        getWeekNumber: function(date) {
+            var tempDate = new Date(date.getTime());
+            tempDate.setHours(0, 0, 0, 0);
+            tempDate.setDate(tempDate.getDate() + 3 - (tempDate.getDay() + 6) % 7);
+            var week1 = new Date(tempDate.getFullYear(), 0, 4);
+            return 1 + Math.round(((tempDate.getTime() - week1.getTime()) / 86400000 - 3 + (week1.getDay() + 6) % 7) / 7);
+        },
+        getEvents: function(date) {
+            return this.getEventsOnRange(date, new Date(date.getFullYear(), date.getMonth(), date.getDate() + 1));
+        },
+        getEventsOnRange: function(startDate, endDate) {
+            var events = [];
+
+            if(this.options.dataSource && startDate && endDate) {
+                for(var i = 0; i < this.options.dataSource.length; i++) {
+                    if(this.options.dataSource[i].startDate < endDate && this.options.dataSource[i].endDate >= startDate) {
+                        events.push(this.options.dataSource[i]);
+                    }
+                }
+            }
+
+            return events;
+        },
+        getYear: function() {
+            return this.options.startYear;
+        },
+        setYear: function(year) {
+            var parsedYear = parseInt(year);
+            if(!isNaN(parsedYear)) {
+                this.options.startYear = parsedYear;
+
+                this.element.empty();
+
+                if(this.options.displayHeader) {
+                    this._renderHeader();
+                }
+
+                var eventResult = this._triggerEvent('yearChanged', { currentYear: this.options.startYear, preventRendering: false });
+
+                if(!eventResult.preventRendering) {
+                    this.render();
+                }
+            }
+        },
+        getMinDate: function() {
+            return this.options.minDate;
+        },
+        setMinDate: function(date, preventRendering) {
+            if(date instanceof Date) {
+                this.options.minDate = date;
+
+                if(!preventRendering) {
+                    this.render();
+                }
+            }
+        },
+        getMaxDate: function() {
+            return this.options.maxDate;
+        },
+        setMaxDate: function(date, preventRendering) {
+            if(date instanceof Date) {
+                this.options.maxDate = date;
+
+                if(!preventRendering) {
+                    this.render();
+                }
+            }
+        },
+        getStyle: function() {
+            return this.options.style;
+        },
+        setStyle: function(style, preventRendering) {
+            this.options.style = style == 'background' || style == 'border' || style == 'custom' ? style : 'border';
+
+            if(!preventRendering) {
+                this.render();
+            }
+        },
+        getAllowOverlap: function() {
+            return this.options.allowOverlap;
+        },
+        setAllowOverlap: function(allowOverlap) {
+            this.options.allowOverlap = allowOverlap;
+        },
+        getDisplayWeekNumber: function() {
+            return this.options.displayWeekNumber;
+        },
+        setDisplayWeekNumber: function(displayWeekNumber, preventRendering) {
+            this.options.displayWeekNumber = displayWeekNumber;
+
+            if(!preventRendering) {
+                this.render();
+            }
+        },
+        getDisplayHeader: function() {
+            return this.options.displayHeader;
+        },
+        setDisplayHeader: function(displayHeader, preventRendering) {
+            this.options.displayHeader = displayHeader;
+
+            if(!preventRendering) {
+                this.render();
+            }
+        },
+        getDisplayDisabledDataSource: function() {
+            return this.options.displayDisabledDataSource;
+        },
+        setDisplayDisabledDataSource: function(displayDisabledDataSource, preventRendering) {
+            this.options.displayDisabledDataSource = displayDisabledDataSource;
+
+            if(!preventRendering) {
+                this.render();
+            }
+        },
+        getAlwaysHalfDay: function() {
+            return this.options.alwaysHalfDay;
+        },
+        setAlwaysHalfDay: function(alwaysHalfDay, preventRendering) {
+            this.options.alwaysHalfDay = alwaysHalfDay;
+
+            if(!preventRendering) {
+                this.render();
+            }
+        },
+        getEnableRangeSelection: function() {
+            return this.options.enableRangeSelection;
+        },
+        setEnableRangeSelection: function(enableRangeSelection, preventRendering) {
+            this.options.enableRangeSelection = enableRangeSelection;
+
+            if(!preventRendering) {
+                this.render();
+            }
+        },
+        getDisabledDays: function() {
+            return this.options.disabledDays;
+        },
+        setDisabledDays: function(disabledDays, preventRendering) {
+            this.options.disabledDays = disabledDays instanceof Array ? disabledDays : [];
+
+            if(!preventRendering) {
+                this.render();
+            }
+        },
+        getDisabledWeekDays: function() {
+            return this.options.disabledWeekDays;
+        },
+        setDisabledWeekDays: function(disabledWeekDays, preventRendering) {
+            this.options.disabledWeekDays = disabledWeekDays instanceof Array ? disabledWeekDays : [];
+
+            if(!preventRendering) {
+                this.render();
+            }
+        },
+        getHiddenWeekDays: function() {
+            return this.options.hiddenWeekDays;
+        },
+        setHiddenWeekDays: function(hiddenWeekDays, preventRendering) {
+            this.options.hiddenWeekDays = hiddenWeekDays instanceof Array ? hiddenWeekDays : [];
+
+            if(!preventRendering) {
+                this.render();
+            }
+        },
+        getRoundRangeLimits: function() {
+            return this.options.roundRangeLimits;
+        },
+        setRoundRangeLimits: function(roundRangeLimits, preventRendering) {
+            this.options.roundRangeLimits = roundRangeLimits;
+
+            if(!preventRendering) {
+                this.render();
+            }
+        },
+        getEnableContextMenu: function() {
+            return this.options.enableContextMenu;
+        },
+        setEnableContextMenu: function(enableContextMenu, preventRendering) {
+            this.options.enableContextMenu = enableContextMenu;
+
+            if(!preventRendering) {
+                this.render();
+            }
+        },
+        getContextMenuItems: function() {
+            return this.options.contextMenuItems;
+        },
+        setContextMenuItems: function(contextMenuItems, preventRendering) {
+            this.options.contextMenuItems = contextMenuItems instanceof Array ? contextMenuItems : [];
+
+            if(!preventRendering) {
+                this.render();
+            }
+        },
+        getCustomDayRenderer: function() {
+            return this.options.customDayRenderer;
+        },
+        setCustomDayRenderer: function(customDayRenderer, preventRendering) {
+            this.options.customDayRenderer = $.isFunction(customDayRenderer) ? customDayRenderer : null;
+
+            if(!preventRendering) {
+                this.render();
+            }
+        },
+        getCustomDataSourceRenderer: function() {
+            return this.options.customDataSourceRenderer;
+        },
+        setCustomDataSourceRenderer: function(customDataSourceRenderer, preventRendering) {
+            this.options.customDataSourceRenderer = $.isFunction(customDataSourceRenderer) ? customDataSourceRenderer : null;
+
+            if(!preventRendering) {
+                this.render();
+            }
+        },
+        getLanguage: function() {
+            return this.options.language;
+        },
+        setLanguage: function(language, preventRendering) {
+            if(language != null && dates[language] != null) {
+                this.options.language = language;
+
+                if(!preventRendering) {
+                    this.render();
+                }
+            }
+        },
+        getDataSource: function() {
+            return this.options.dataSource;
+        },
+        setDataSource: function(dataSource, preventRendering) {
+            this.options.dataSource = dataSource instanceof Array ? dataSource : [];
+            this._initializeDatasourceColors();
+
+            if(!preventRendering) {
+                this.render();
+            }
+        },
+        getWeekStart: function() {
+            return this.options.weekStart ? this.options.weekStart : dates[this.options.language].weekStart;
+        },
+        setWeekStart: function(weekStart, preventRendering) {
+            this.options.weekStart = !isNaN(parseInt(weekStart)) ? parseInt(weekStart) : null;
+
+            if(!preventRendering) {
+                this.render();
+            }
+        },
+        addEvent: function(evt, preventRendering) {
+            this.options.dataSource.push(evt);
+
+            if(!preventRendering) {
+                this.render();
+            }
+        }
+    }
+
+    $.fn.calendar = function (options) {
+        var calendar = new Calendar($(this) ,options);
+        $(this).data('calendar', calendar);
+        return calendar;
+    }
+
+    /* Events binding management */
+    $.fn.yearChanged = function(fct) { $(this).bind('yearChanged', fct); }
+    $.fn.renderEnd = function(fct) { $(this).bind('renderEnd', fct); }
+    $.fn.clickDay = function(fct) { $(this).bind('clickDay', fct); }
+    $.fn.dayContextMenu = function(fct) { $(this).bind('dayContextMenu', fct); }
+    $.fn.selectRange = function(fct) { $(this).bind('selectRange', fct); }
+    $.fn.mouseOnDay = function(fct) { $(this).bind('mouseOnDay', fct); }
+    $.fn.mouseOutDay = function(fct) { $(this).bind('mouseOutDay', fct); }
+
+    var dates = $.fn.calendar.dates = {
+        en: {
+            days: ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday"],
+            daysShort: ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun"],
+            daysMin: ["Su", "Mo", "Tu", "We", "Th", "Fr", "Sa", "Su"],
+            months: ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"],
+            monthsShort: ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"],
+            weekShort: 'W',
+            weekStart:0
+        }
+    };
+
+    var colors = $.fn.calendar.colors = ['#2C8FC9', '#9CB703', '#F5BB00', '#FF4A32', '#B56CE2', '#45A597'];
+
+    $(function(){
+        $('[data-provide="calendar"]').each(function() {
+            $(this).calendar();
+        });
+    });
+}(window.jQuery));

+ 19 - 0
app/Resources/public/assets/bootstrap-year-calendar/js/languages/bootstrap-year-calendar.de.js

@@ -0,0 +1,19 @@
+/**
+ * German translation for bootstrap-year-calendar
+ * Paul DAVID-SIVELLE
+ * Based on 
+ * German translation for bootstrap-datepicker
+ * Sam Zurcher <sam@orelias.ch>
+ */
+ 
+;(function($){
+	$.fn.calendar.dates['de'] = {
+		days: ["Sonntag", "Montag", "Dienstag", "Mittwoch", "Donnerstag", "Freitag", "Samstag"],
+		daysShort: ["Son", "Mon", "Die", "Mit", "Don", "Fre", "Sam"],
+		daysMin: ["So", "Mo", "Di", "Mi", "Do", "Fr", "Sa"],
+		months: ["Januar", "Februar", "März", "April", "Mai", "Juni", "Juli", "August", "September", "Oktober", "November", "Dezember"],
+		monthsShort: ["Jan", "Feb", "Mär", "Apr", "Mai", "Jun", "Jul", "Aug", "Sep", "Okt", "Nov", "Dez"],
+		weekShort: 'W',
+		weekStart: 1
+	};
+}(jQuery));

+ 19 - 0
app/Resources/public/assets/bootstrap-year-calendar/js/languages/bootstrap-year-calendar.es.js

@@ -0,0 +1,19 @@
+/**
+ * Spanish translation for bootstrap-year-calendar
+ * Paul DAVID-SIVELLE
+ * Based on 
+ * Spanish translation for bootstrap-datepicker
+ * Bruno Bonamin <bruno.bonamin@gmail.com>
+ */
+ 
+;(function($){
+	$.fn.calendar.dates['es'] = {
+		days: ["Domingo", "Lunes", "Martes", "Miércoles", "Jueves", "Viernes", "Sábado"],
+		daysShort: ["Dom", "Lun", "Mar", "Mié", "Jue", "Vie", "Sáb"],
+		daysMin: ["Do", "Lu", "Ma", "Mi", "Ju", "Vi", "Sa"],
+		months: ["Enero", "Febrero", "Marzo", "Abril", "Mayo", "Junio", "Julio", "Agosto", "Septiembre", "Octubre", "Noviembre", "Diciembre"],
+		monthsShort: ["Ene", "Feb", "Mar", "Abr", "May", "Jun", "Jul", "Ago", "Sep", "Oct", "Nov", "Dic"],
+		weekShort: 'S',
+		weekStart: 1
+	};
+}(jQuery));

+ 19 - 0
app/Resources/public/assets/bootstrap-year-calendar/js/languages/bootstrap-year-calendar.fr.js

@@ -0,0 +1,19 @@
+/**
+ * French translation for bootstrap-year-calendar
+ * Paul DAVID-SIVELLE
+ * Based on 
+ * French translation for bootstrap-datepicker
+ * Nico Mollet <nico.mollet@gmail.com>
+ */
+ 
+;(function($){
+	$.fn.calendar.dates['fr'] = {
+		days: ["Dimanche", "Lundi", "Mardi", "Mercredi", "Jeudi", "Vendredi", "Samedi", "Dimanche"],
+		daysShort: ["Dim", "Lun", "Mar", "Mer", "Jeu", "Ven", "Sam", "Dim"],
+		daysMin: ["D", "L", "Ma", "Me", "J", "V", "S", "D"],
+		months: ["Janvier", "Février", "Mars", "Avril", "Mai", "Juin", "Juillet", "Août", "Septembre", "Octobre", "Novembre", "Décembre"],
+		monthsShort: ["Jan", "Fév", "Mar", "Avr", "Mai", "Jui", "Jul", "Aou", "Sep", "Oct", "Nov", "Déc"],
+		weekShort:'S',
+		weekStart: 1
+	};
+}(jQuery));

+ 19 - 0
app/Resources/public/assets/bootstrap-year-calendar/js/languages/bootstrap-year-calendar.it.js

@@ -0,0 +1,19 @@
+/**
+ * Italian translation for bootstrap-year-calendar
+ * Paul DAVID-SIVELLE
+ * Based on 
+ * Italian translation for bootstrap-datepicker
+ * Enrico Rubboli <rubboli@gmail.com>
+ */
+ 
+;(function($){
+	$.fn.calendar.dates['it'] = {
+		days: ["Domenica", "Lunedì", "Martedì", "Mercoledì", "Giovedì", "Venerdì", "Sabato"],
+		daysShort: ["Dom", "Lun", "Mar", "Mer", "Gio", "Ven", "Sab"],
+		daysMin: ["Do", "Lu", "Ma", "Me", "Gi", "Ve", "Sa"],
+		months: ["Gennaio", "Febbraio", "Marzo", "Aprile", "Maggio", "Giugno", "Luglio", "Agosto", "Settembre", "Ottobre", "Novembre", "Dicembre"],
+		monthsShort: ["Gen", "Feb", "Mar", "Apr", "Mag", "Giu", "Lug", "Ago", "Set", "Ott", "Nov", "Dic"],
+		weekShort: 'S',
+		weekStart: 1,
+	};
+}(jQuery));

+ 19 - 0
app/Resources/public/assets/bootstrap-year-calendar/js/languages/bootstrap-year-calendar.ja.js

@@ -0,0 +1,19 @@
+/**
+ * Japanese translation for bootstrap-year-calendar
+ * Paul DAVID-SIVELLE
+ * Based on 
+ * Japanese translation for bootstrap-datepicker
+ * Norio Suzuki <https://github.com/suzuki/>
+ */
+ 
+;(function($){
+	$.fn.calendar.dates['ja'] = {
+		days: ["日曜", "月曜", "火曜", "水曜", "木曜", "金曜", "土曜"],
+		daysShort: ["日", "月", "火", "水", "木", "金", "土"],
+		daysMin: ["日", "月", "火", "水", "木", "金", "土"],
+		months: ["1月", "2月", "3月", "4月", "5月", "6月", "7月", "8月", "9月", "10月", "11月", "12月"],
+		monthsShort: ["1月", "2月", "3月", "4月", "5月", "6月", "7月", "8月", "9月", "10月", "11月", "12月"],
+		weekShort: '週',
+		weekStart:0
+	};
+}(jQuery));

+ 19 - 0
app/Resources/public/assets/bootstrap-year-calendar/js/languages/bootstrap-year-calendar.nl.js

@@ -0,0 +1,19 @@
+/**
+ * Dutch translation for bootstrap-year-calendar
+ * Paul DAVID-SIVELLE
+ * Based on 
+ * Dutch translation for bootstrap-datepicker
+ * Reinier Goltstein <mrgoltstein@gmail.com>
+ */
+ 
+;(function($){
+	$.fn.calendar.dates['nl'] = {
+		days: ["zondag", "maandag", "dinsdag", "woensdag", "donderdag", "vrijdag", "zaterdag"],
+		daysShort: ["zo", "ma", "di", "wo", "do", "vr", "za"],
+		daysMin: ["zo", "ma", "di", "wo", "do", "vr", "za"],
+		months: ["januari", "februari", "maart", "april", "mei", "juni", "juli", "augustus", "september", "oktober", "november", "december"],
+		monthsShort: ["jan", "feb", "mrt", "apr", "mei", "jun", "jul", "aug", "sep", "okt", "nov", "dec"],
+		weekShort: 'w',
+		weekStart: 1
+	};
+}(jQuery));

+ 20 - 0
app/Resources/public/assets/bootstrap-year-calendar/js/languages/bootstrap-year-calendar.pt.js

@@ -0,0 +1,20 @@
+/**
+ * Portuguese translation for bootstrap-year-calendar
+ * Paul DAVID-SIVELLE
+ * Based on 
+ * Portuguese translation for bootstrap-datepicker
+ * Original code: Cauan Cabral <cauan@radig.com.br>
+ * Tiago Melo <tiago.blackcode@gmail.com>
+ */
+ 
+;(function($){
+	$.fn.calendar.dates['pt'] = {
+		days: ["Domingo", "Segunda", "Terça", "Quarta", "Quinta", "Sexta", "Sábado"],
+		daysShort: ["Dom", "Seg", "Ter", "Qua", "Qui", "Sex", "Sáb"],
+		daysMin: ["Do", "Se", "Te", "Qu", "Qu", "Se", "Sa"],
+		months: ["Janeiro", "Fevereiro", "Março", "Abril", "Maio", "Junho", "Julho", "Agosto", "Setembro", "Outubro", "Novembro", "Dezembro"],
+		monthsShort: ["Jan", "Fev", "Mar", "Abr", "Mai", "Jun", "Jul", "Ago", "Set", "Out", "Nov", "Dez"],
+		weekShort: 'S',
+		weekStart:0
+	};
+}(jQuery));

+ 19 - 0
app/Resources/public/assets/bootstrap-year-calendar/js/languages/bootstrap-year-calendar.ru.js

@@ -0,0 +1,19 @@
+/**
+ * Russian translation for bootstrap-year-calendar
+ * Paul DAVID-SIVELLE
+ * Based on 
+ * Russian translation for bootstrap-datepicker
+ * Victor Taranenko <darwin@snowdale.com>
+ */
+ 
+;(function($){
+	$.fn.calendar.dates['ru'] = {
+		days: ["Воскресенье", "Понедельник", "Вторник", "Среда", "Четверг", "Пятница", "Суббота"],
+		daysShort: ["Вск", "Пнд", "Втр", "Срд", "Чтв", "Птн", "Суб"],
+		daysMin: ["Вс", "Пн", "Вт", "Ср", "Чт", "Пт", "Сб"],
+		months: ["Январь", "Февраль", "Март", "Апрель", "Май", "Июнь", "Июль", "Август", "Сентябрь", "Октябрь", "Ноябрь", "Декабрь"],
+		monthsShort: ["Янв", "Фев", "Мар", "Апр", "Май", "Июн", "Июл", "Авг", "Сен", "Окт", "Ноя", "Дек"],
+		weekShort: 'н',
+		weekStart: 1
+	};
+}(jQuery));

+ 20 - 0
app/Resources/public/assets/bootstrap-year-calendar/js/languages/bootstrap-year-calendar.tr.js

@@ -0,0 +1,20 @@
+/**
+ * Turkish translation for bootstrap-year-calendar
+ * Paul DAVID-SIVELLE
+ * Based on 
+ * Turkish translation for bootstrap-datepicker
+ * Serkan Algur <kaisercrazy_2@hotmail.com>
+ */
+ 
+;(function($){
+	$.fn.calendar.dates['tr'] = {
+		days: ["Pazar", "Pazartesi", "Salı", "Çarşamba", "Perşembe", "Cuma", "Cumartesi"],
+		daysShort: ["Pz", "Pzt", "Sal", "Çrş", "Prş", "Cu", "Cts"],
+		daysMin: ["Pz", "Pzt", "Sa", "Çr", "Pr", "Cu", "Ct"],
+		months: ["Ocak", "Şubat", "Mart", "Nisan", "Mayıs", "Haziran", "Temmuz", "Ağustos", "Eylül", "Ekim", "Kasım", "Aralık"],
+		monthsShort: ["Oca", "Şub", "Mar", "Nis", "May", "Haz", "Tem", "Ağu", "Eyl", "Eki", "Kas", "Ara"],
+		weekShort: 'H',
+		weekStart: 1
+	};
+}(jQuery));
+

+ 0 - 6
app/Resources/public/assets/bootstrap/Gemfile

@@ -1,6 +0,0 @@
-source 'https://rubygems.org'
-
-group :development, :test do
-  gem 'jekyll', '~> 3.1.2'
-  gem 'jekyll-sitemap', '~> 0.11.0'
-end

+ 0 - 43
app/Resources/public/assets/bootstrap/Gemfile.lock

@@ -1,43 +0,0 @@
-GEM
-  remote: https://rubygems.org/
-  specs:
-    addressable (2.4.0)
-    colorator (0.1)
-    ffi (1.9.14-x64-mingw32)
-    jekyll (3.1.6)
-      colorator (~> 0.1)
-      jekyll-sass-converter (~> 1.0)
-      jekyll-watch (~> 1.1)
-      kramdown (~> 1.3)
-      liquid (~> 3.0)
-      mercenary (~> 0.3.3)
-      rouge (~> 1.7)
-      safe_yaml (~> 1.0)
-    jekyll-sass-converter (1.4.0)
-      sass (~> 3.4)
-    jekyll-sitemap (0.11.0)
-      addressable (~> 2.4.0)
-    jekyll-watch (1.4.0)
-      listen (~> 3.0, < 3.1)
-    kramdown (1.11.1)
-    liquid (3.0.6)
-    listen (3.0.8)
-      rb-fsevent (~> 0.9, >= 0.9.4)
-      rb-inotify (~> 0.9, >= 0.9.7)
-    mercenary (0.3.6)
-    rb-fsevent (0.9.7)
-    rb-inotify (0.9.7)
-      ffi (>= 0.5.0)
-    rouge (1.11.1)
-    safe_yaml (1.0.4)
-    sass (3.4.22)
-
-PLATFORMS
-  x64-mingw32
-
-DEPENDENCIES
-  jekyll (~> 3.1.2)
-  jekyll-sitemap (~> 0.11.0)
-
-BUNDLED WITH
-   1.12.5

+ 0 - 511
app/Resources/public/assets/bootstrap/Gruntfile.js

@@ -1,511 +0,0 @@
-/*!
- * Bootstrap's Gruntfile
- * http://getbootstrap.com
- * Copyright 2013-2016 Twitter, Inc.
- * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
- */
-
-module.exports = function (grunt) {
-  'use strict';
-
-  // Force use of Unix newlines
-  grunt.util.linefeed = '\n';
-
-  RegExp.quote = function (string) {
-    return string.replace(/[-\\^$*+?.()|[\]{}]/g, '\\$&');
-  };
-
-  var fs = require('fs');
-  var path = require('path');
-  var generateGlyphiconsData = require('./grunt/bs-glyphicons-data-generator.js');
-  var BsLessdocParser = require('./grunt/bs-lessdoc-parser.js');
-  var getLessVarsData = function () {
-    var filePath = path.join(__dirname, 'less/variables.less');
-    var fileContent = fs.readFileSync(filePath, { encoding: 'utf8' });
-    var parser = new BsLessdocParser(fileContent);
-    return { sections: parser.parseFile() };
-  };
-  var generateRawFiles = require('./grunt/bs-raw-files-generator.js');
-  var generateCommonJSModule = require('./grunt/bs-commonjs-generator.js');
-  var configBridge = grunt.file.readJSON('./grunt/configBridge.json', { encoding: 'utf8' });
-
-  Object.keys(configBridge.paths).forEach(function (key) {
-    configBridge.paths[key].forEach(function (val, i, arr) {
-      arr[i] = path.join('./docs/assets', val);
-    });
-  });
-
-  // Project configuration.
-  grunt.initConfig({
-
-    // Metadata.
-    pkg: grunt.file.readJSON('package.json'),
-    banner: '/*!\n' +
-            ' * Bootstrap v<%= pkg.version %> (<%= pkg.homepage %>)\n' +
-            ' * Copyright 2011-<%= grunt.template.today("yyyy") %> <%= pkg.author %>\n' +
-            ' * Licensed under the <%= pkg.license %> license\n' +
-            ' */\n',
-    jqueryCheck: configBridge.config.jqueryCheck.join('\n'),
-    jqueryVersionCheck: configBridge.config.jqueryVersionCheck.join('\n'),
-
-    // Task configuration.
-    clean: {
-      dist: 'dist',
-      docs: 'docs/dist'
-    },
-
-    jshint: {
-      options: {
-        jshintrc: 'js/.jshintrc'
-      },
-      grunt: {
-        options: {
-          jshintrc: 'grunt/.jshintrc'
-        },
-        src: ['Gruntfile.js', 'package.js', 'grunt/*.js']
-      },
-      core: {
-        src: 'js/*.js'
-      },
-      test: {
-        options: {
-          jshintrc: 'js/tests/unit/.jshintrc'
-        },
-        src: 'js/tests/unit/*.js'
-      },
-      assets: {
-        src: ['docs/assets/js/src/*.js', 'docs/assets/js/*.js', '!docs/assets/js/*.min.js']
-      }
-    },
-
-    jscs: {
-      options: {
-        config: 'js/.jscsrc'
-      },
-      grunt: {
-        src: '<%= jshint.grunt.src %>'
-      },
-      core: {
-        src: '<%= jshint.core.src %>'
-      },
-      test: {
-        src: '<%= jshint.test.src %>'
-      },
-      assets: {
-        options: {
-          requireCamelCaseOrUpperCaseIdentifiers: null
-        },
-        src: '<%= jshint.assets.src %>'
-      }
-    },
-
-    concat: {
-      options: {
-        banner: '<%= banner %>\n<%= jqueryCheck %>\n<%= jqueryVersionCheck %>',
-        stripBanners: false
-      },
-      bootstrap: {
-        src: [
-          'js/transition.js',
-          'js/alert.js',
-          'js/button.js',
-          'js/carousel.js',
-          'js/collapse.js',
-          'js/dropdown.js',
-          'js/modal.js',
-          'js/tooltip.js',
-          'js/popover.js',
-          'js/scrollspy.js',
-          'js/tab.js',
-          'js/affix.js'
-        ],
-        dest: 'dist/js/<%= pkg.name %>.js'
-      }
-    },
-
-    uglify: {
-      options: {
-        compress: {
-          warnings: false
-        },
-        mangle: true,
-        preserveComments: /^!|@preserve|@license|@cc_on/i
-      },
-      core: {
-        src: '<%= concat.bootstrap.dest %>',
-        dest: 'dist/js/<%= pkg.name %>.min.js'
-      },
-      customize: {
-        src: configBridge.paths.customizerJs,
-        dest: 'docs/assets/js/customize.min.js'
-      },
-      docsJs: {
-        src: configBridge.paths.docsJs,
-        dest: 'docs/assets/js/docs.min.js'
-      }
-    },
-
-    qunit: {
-      options: {
-        inject: 'js/tests/unit/phantom.js'
-      },
-      files: 'js/tests/index.html'
-    },
-
-    less: {
-      compileCore: {
-        options: {
-          strictMath: true,
-          sourceMap: true,
-          outputSourceFiles: true,
-          sourceMapURL: '<%= pkg.name %>.css.map',
-          sourceMapFilename: 'dist/css/<%= pkg.name %>.css.map'
-        },
-        src: 'less/bootstrap.less',
-        dest: 'dist/css/<%= pkg.name %>.css'
-      },
-      compileTheme: {
-        options: {
-          strictMath: true,
-          sourceMap: true,
-          outputSourceFiles: true,
-          sourceMapURL: '<%= pkg.name %>-theme.css.map',
-          sourceMapFilename: 'dist/css/<%= pkg.name %>-theme.css.map'
-        },
-        src: 'less/theme.less',
-        dest: 'dist/css/<%= pkg.name %>-theme.css'
-      }
-    },
-
-    autoprefixer: {
-      options: {
-        browsers: configBridge.config.autoprefixerBrowsers
-      },
-      core: {
-        options: {
-          map: true
-        },
-        src: 'dist/css/<%= pkg.name %>.css'
-      },
-      theme: {
-        options: {
-          map: true
-        },
-        src: 'dist/css/<%= pkg.name %>-theme.css'
-      },
-      docs: {
-        src: ['docs/assets/css/src/docs.css']
-      },
-      examples: {
-        expand: true,
-        cwd: 'docs/examples/',
-        src: ['**/*.css'],
-        dest: 'docs/examples/'
-      }
-    },
-
-    csslint: {
-      options: {
-        csslintrc: 'less/.csslintrc'
-      },
-      dist: [
-        'dist/css/bootstrap.css',
-        'dist/css/bootstrap-theme.css'
-      ],
-      examples: [
-        'docs/examples/**/*.css'
-      ],
-      docs: {
-        options: {
-          ids: false,
-          'overqualified-elements': false
-        },
-        src: 'docs/assets/css/src/docs.css'
-      }
-    },
-
-    cssmin: {
-      options: {
-        // TODO: disable `zeroUnits` optimization once clean-css 3.2 is released
-        //    and then simplify the fix for https://github.com/twbs/bootstrap/issues/14837 accordingly
-        compatibility: 'ie8',
-        keepSpecialComments: '*',
-        sourceMap: true,
-        sourceMapInlineSources: true,
-        advanced: false
-      },
-      minifyCore: {
-        src: 'dist/css/<%= pkg.name %>.css',
-        dest: 'dist/css/<%= pkg.name %>.min.css'
-      },
-      minifyTheme: {
-        src: 'dist/css/<%= pkg.name %>-theme.css',
-        dest: 'dist/css/<%= pkg.name %>-theme.min.css'
-      },
-      docs: {
-        src: [
-          'docs/assets/css/ie10-viewport-bug-workaround.css',
-          'docs/assets/css/src/pygments-manni.css',
-          'docs/assets/css/src/docs.css'
-        ],
-        dest: 'docs/assets/css/docs.min.css'
-      }
-    },
-
-    csscomb: {
-      options: {
-        config: 'less/.csscomb.json'
-      },
-      dist: {
-        expand: true,
-        cwd: 'dist/css/',
-        src: ['*.css', '!*.min.css'],
-        dest: 'dist/css/'
-      },
-      examples: {
-        expand: true,
-        cwd: 'docs/examples/',
-        src: '**/*.css',
-        dest: 'docs/examples/'
-      },
-      docs: {
-        src: 'docs/assets/css/src/docs.css',
-        dest: 'docs/assets/css/src/docs.css'
-      }
-    },
-
-    copy: {
-      fonts: {
-        expand: true,
-        src: 'fonts/**',
-        dest: 'dist/'
-      },
-      docs: {
-        expand: true,
-        cwd: 'dist/',
-        src: [
-          '**/*'
-        ],
-        dest: 'docs/dist/'
-      }
-    },
-
-    connect: {
-      server: {
-        options: {
-          port: 3000,
-          base: '.'
-        }
-      }
-    },
-
-    jekyll: {
-      options: {
-        bundleExec: true,
-        config: '_config.yml',
-        incremental: false
-      },
-      docs: {},
-      github: {
-        options: {
-          raw: 'github: true'
-        }
-      }
-    },
-
-    htmlmin: {
-      dist: {
-        options: {
-          collapseBooleanAttributes: true,
-          collapseWhitespace: true,
-          conservativeCollapse: true,
-          decodeEntities: false,
-          minifyCSS: {
-            compatibility: 'ie8',
-            keepSpecialComments: 0
-          },
-          minifyJS: true,
-          minifyURLs: false,
-          processConditionalComments: true,
-          removeAttributeQuotes: true,
-          removeComments: true,
-          removeOptionalAttributes: true,
-          removeOptionalTags: true,
-          removeRedundantAttributes: true,
-          removeScriptTypeAttributes: true,
-          removeStyleLinkTypeAttributes: true,
-          removeTagWhitespace: false,
-          sortAttributes: true,
-          sortClassName: true
-        },
-        expand: true,
-        cwd: '_gh_pages',
-        dest: '_gh_pages',
-        src: [
-          '**/*.html',
-          '!examples/**/*.html'
-        ]
-      }
-    },
-
-    pug: {
-      options: {
-        pretty: true,
-        data: getLessVarsData
-      },
-      customizerVars: {
-        src: 'docs/_pug/customizer-variables.pug',
-        dest: 'docs/_includes/customizer-variables.html'
-      },
-      customizerNav: {
-        src: 'docs/_pug/customizer-nav.pug',
-        dest: 'docs/_includes/nav/customize.html'
-      }
-    },
-
-    htmllint: {
-      options: {
-        ignore: [
-          'Attribute "autocomplete" not allowed on element "button" at this point.',
-          'Attribute "autocomplete" is only allowed when the input type is "color", "date", "datetime", "datetime-local", "email", "hidden", "month", "number", "password", "range", "search", "tel", "text", "time", "url", or "week".',
-          'Element "img" is missing required attribute "src".'
-        ]
-      },
-      src: '_gh_pages/**/*.html'
-    },
-
-    watch: {
-      src: {
-        files: '<%= jshint.core.src %>',
-        tasks: ['jshint:core', 'qunit', 'concat']
-      },
-      test: {
-        files: '<%= jshint.test.src %>',
-        tasks: ['jshint:test', 'qunit']
-      },
-      less: {
-        files: 'less/**/*.less',
-        tasks: 'less'
-      }
-    },
-
-    'saucelabs-qunit': {
-      all: {
-        options: {
-          build: process.env.TRAVIS_JOB_ID,
-          throttled: 10,
-          maxRetries: 3,
-          maxPollRetries: 4,
-          urls: ['http://127.0.0.1:3000/js/tests/index.html?hidepassed'],
-          browsers: grunt.file.readYAML('grunt/sauce_browsers.yml')
-        }
-      }
-    },
-
-    exec: {
-      npmUpdate: {
-        command: 'npm update'
-      }
-    },
-
-    compress: {
-      main: {
-        options: {
-          archive: 'bootstrap-<%= pkg.version %>-dist.zip',
-          mode: 'zip',
-          level: 9,
-          pretty: true
-        },
-        files: [
-          {
-            expand: true,
-            cwd: 'dist/',
-            src: ['**'],
-            dest: 'bootstrap-<%= pkg.version %>-dist'
-          }
-        ]
-      }
-    }
-
-  });
-
-
-  // These plugins provide necessary tasks.
-  require('load-grunt-tasks')(grunt, { scope: 'devDependencies' });
-  require('time-grunt')(grunt);
-
-  // Docs HTML validation task
-  grunt.registerTask('validate-html', ['jekyll:docs', 'htmllint']);
-
-  var runSubset = function (subset) {
-    return !process.env.TWBS_TEST || process.env.TWBS_TEST === subset;
-  };
-  var isUndefOrNonZero = function (val) {
-    return val === undefined || val !== '0';
-  };
-
-  // Test task.
-  var testSubtasks = [];
-  // Skip core tests if running a different subset of the test suite
-  if (runSubset('core') &&
-      // Skip core tests if this is a Savage build
-      process.env.TRAVIS_REPO_SLUG !== 'twbs-savage/bootstrap') {
-    testSubtasks = testSubtasks.concat(['dist-css', 'dist-js', 'csslint:dist', 'test-js', 'docs']);
-  }
-  // Skip HTML validation if running a different subset of the test suite
-  if (runSubset('validate-html') &&
-      // Skip HTML5 validator on Travis when [skip validator] is in the commit message
-      isUndefOrNonZero(process.env.TWBS_DO_VALIDATOR)) {
-    testSubtasks.push('validate-html');
-  }
-  // Only run Sauce Labs tests if there's a Sauce access key
-  if (typeof process.env.SAUCE_ACCESS_KEY !== 'undefined' &&
-      // Skip Sauce if running a different subset of the test suite
-      runSubset('sauce-js-unit') &&
-      // Skip Sauce on Travis when [skip sauce] is in the commit message
-      isUndefOrNonZero(process.env.TWBS_DO_SAUCE)) {
-    testSubtasks.push('connect');
-    testSubtasks.push('saucelabs-qunit');
-  }
-  grunt.registerTask('test', testSubtasks);
-  grunt.registerTask('test-js', ['jshint:core', 'jshint:test', 'jshint:grunt', 'jscs:core', 'jscs:test', 'jscs:grunt', 'qunit']);
-
-  // JS distribution task.
-  grunt.registerTask('dist-js', ['concat', 'uglify:core', 'commonjs']);
-
-  // CSS distribution task.
-  grunt.registerTask('less-compile', ['less:compileCore', 'less:compileTheme']);
-  grunt.registerTask('dist-css', ['less-compile', 'autoprefixer:core', 'autoprefixer:theme', 'csscomb:dist', 'cssmin:minifyCore', 'cssmin:minifyTheme']);
-
-  // Full distribution task.
-  grunt.registerTask('dist', ['clean:dist', 'dist-css', 'copy:fonts', 'dist-js']);
-
-  // Default task.
-  grunt.registerTask('default', ['clean:dist', 'copy:fonts', 'test']);
-
-  grunt.registerTask('build-glyphicons-data', function () { generateGlyphiconsData.call(this, grunt); });
-
-  // task for building customizer
-  grunt.registerTask('build-customizer', ['build-customizer-html', 'build-raw-files']);
-  grunt.registerTask('build-customizer-html', 'pug');
-  grunt.registerTask('build-raw-files', 'Add scripts/less files to customizer.', function () {
-    var banner = grunt.template.process('<%= banner %>');
-    generateRawFiles(grunt, banner);
-  });
-
-  grunt.registerTask('commonjs', 'Generate CommonJS entrypoint module in dist dir.', function () {
-    var srcFiles = grunt.config.get('concat.bootstrap.src');
-    var destFilepath = 'dist/js/npm.js';
-    generateCommonJSModule(grunt, srcFiles, destFilepath);
-  });
-
-  // Docs task.
-  grunt.registerTask('docs-css', ['autoprefixer:docs', 'autoprefixer:examples', 'csscomb:docs', 'csscomb:examples', 'cssmin:docs']);
-  grunt.registerTask('lint-docs-css', ['csslint:docs', 'csslint:examples']);
-  grunt.registerTask('docs-js', ['uglify:docsJs', 'uglify:customize']);
-  grunt.registerTask('lint-docs-js', ['jshint:assets', 'jscs:assets']);
-  grunt.registerTask('docs', ['docs-css', 'lint-docs-css', 'docs-js', 'lint-docs-js', 'clean:docs', 'copy:docs', 'build-glyphicons-data', 'build-customizer']);
-  grunt.registerTask('docs-github', ['jekyll:github', 'htmlmin']);
-
-  grunt.registerTask('prep-release', ['dist', 'docs', 'docs-github', 'compress']);
-};

+ 0 - 7
app/Resources/public/assets/bootstrap/grunt/.jshintrc

@@ -1,7 +0,0 @@
-{
-  "extends" : "../js/.jshintrc",
-  "asi"     : false,
-  "browser" : false,
-  "es3"     : false,
-  "node"    : true
-}

+ 0 - 30
app/Resources/public/assets/bootstrap/grunt/bs-commonjs-generator.js

@@ -1,30 +0,0 @@
-/*!
- * Bootstrap Grunt task for the CommonJS module generation
- * http://getbootstrap.com
- * Copyright 2014-2015 Twitter, Inc.
- * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
- */
-
-'use strict';
-
-var fs = require('fs');
-var path = require('path');
-
-var COMMONJS_BANNER = '// This file is autogenerated via the `commonjs` Grunt task. You can require() this file in a CommonJS environment.\n';
-
-module.exports = function generateCommonJSModule(grunt, srcFiles, destFilepath) {
-  var destDir = path.dirname(destFilepath);
-
-  function srcPathToDestRequire(srcFilepath) {
-    var requirePath = path.relative(destDir, srcFilepath).replace(/\\/g, '/');
-    return 'require(\'' + requirePath + '\')';
-  }
-
-  var moduleOutputJs = COMMONJS_BANNER + srcFiles.map(srcPathToDestRequire).join('\n');
-  try {
-    fs.writeFileSync(destFilepath, moduleOutputJs);
-  } catch (err) {
-    grunt.fail.warn(err);
-  }
-  grunt.log.writeln('File ' + destFilepath.cyan + ' created.');
-};

+ 0 - 42
app/Resources/public/assets/bootstrap/grunt/bs-glyphicons-data-generator.js

@@ -1,42 +0,0 @@
-/*!
- * Bootstrap Grunt task for Glyphicons data generation
- * http://getbootstrap.com
- * Copyright 2014-2015 Twitter, Inc.
- * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
- */
-
-'use strict';
-
-var fs = require('fs');
-
-module.exports = function generateGlyphiconsData(grunt) {
-  // Pass encoding, utf8, so `readFileSync` will return a string instead of a
-  // buffer
-  var glyphiconsFile = fs.readFileSync('less/glyphicons.less', 'utf8');
-  var glyphiconsLines = glyphiconsFile.split('\n');
-
-  // Use any line that starts with ".glyphicon-" and capture the class name
-  var iconClassName = /^\.(glyphicon-[a-zA-Z0-9-]+)/;
-  var glyphiconsData = '# This file is generated via Grunt task. **Do not edit directly.**\n' +
-                       '# See the \'build-glyphicons-data\' task in Gruntfile.js.\n\n';
-  var glyphiconsYml = 'docs/_data/glyphicons.yml';
-  for (var i = 0, len = glyphiconsLines.length; i < len; i++) {
-    var match = glyphiconsLines[i].match(iconClassName);
-
-    if (match !== null) {
-      glyphiconsData += '- ' + match[1] + '\n';
-    }
-  }
-
-  // Create the `_data` directory if it doesn't already exist
-  if (!fs.existsSync('docs/_data')) {
-    fs.mkdirSync('docs/_data');
-  }
-
-  try {
-    fs.writeFileSync(glyphiconsYml, glyphiconsData);
-  } catch (err) {
-    grunt.fail.warn(err);
-  }
-  grunt.log.writeln('File ' + glyphiconsYml.cyan + ' created.');
-};

+ 0 - 237
app/Resources/public/assets/bootstrap/grunt/bs-lessdoc-parser.js

@@ -1,237 +0,0 @@
-/*!
- * Bootstrap Grunt task for parsing Less docstrings
- * http://getbootstrap.com
- * Copyright 2014-2015 Twitter, Inc.
- * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
- */
-
-'use strict';
-
-var Markdown = require('markdown-it');
-
-function markdown2html(markdownString) {
-  var md = new Markdown();
-
-  // the slice removes the <p>...</p> wrapper output by Markdown processor
-  return md.render(markdownString.trim()).slice(3, -5);
-}
-
-
-/*
-Mini-language:
-  //== This is a normal heading, which starts a section. Sections group variables together.
-  //## Optional description for the heading
-
-  //=== This is a subheading.
-
-  //** Optional description for the following variable. You **can** use Markdown in descriptions to discuss `<html>` stuff.
-  @foo: #fff;
-
-  //-- This is a heading for a section whose variables shouldn't be customizable
-
-  All other lines are ignored completely.
-*/
-
-
-var CUSTOMIZABLE_HEADING = /^[/]{2}={2}(.*)$/;
-var UNCUSTOMIZABLE_HEADING = /^[/]{2}-{2}(.*)$/;
-var SUBSECTION_HEADING = /^[/]{2}={3}(.*)$/;
-var SECTION_DOCSTRING = /^[/]{2}#{2}(.+)$/;
-var VAR_ASSIGNMENT = /^(@[a-zA-Z0-9_-]+):[ ]*([^ ;][^;]*);[ ]*$/;
-var VAR_DOCSTRING = /^[/]{2}[*]{2}(.+)$/;
-
-function Section(heading, customizable) {
-  this.heading = heading.trim();
-  this.id = this.heading.replace(/\s+/g, '-').toLowerCase();
-  this.customizable = customizable;
-  this.docstring = null;
-  this.subsections = [];
-}
-
-Section.prototype.addSubSection = function (subsection) {
-  this.subsections.push(subsection);
-};
-
-function SubSection(heading) {
-  this.heading = heading.trim();
-  this.id = this.heading.replace(/\s+/g, '-').toLowerCase();
-  this.variables = [];
-}
-
-SubSection.prototype.addVar = function (variable) {
-  this.variables.push(variable);
-};
-
-function VarDocstring(markdownString) {
-  this.html = markdown2html(markdownString);
-}
-
-function SectionDocstring(markdownString) {
-  this.html = markdown2html(markdownString);
-}
-
-function Variable(name, defaultValue) {
-  this.name = name;
-  this.defaultValue = defaultValue;
-  this.docstring = null;
-}
-
-function Tokenizer(fileContent) {
-  this._lines = fileContent.split('\n');
-  this._next = undefined;
-}
-
-Tokenizer.prototype.unshift = function (token) {
-  if (this._next !== undefined) {
-    throw new Error('Attempted to unshift twice!');
-  }
-  this._next = token;
-};
-
-Tokenizer.prototype._shift = function () {
-  // returning null signals EOF
-  // returning undefined means the line was ignored
-  if (this._next !== undefined) {
-    var result = this._next;
-    this._next = undefined;
-    return result;
-  }
-  if (this._lines.length <= 0) {
-    return null;
-  }
-  var line = this._lines.shift();
-  var match = null;
-  match = SUBSECTION_HEADING.exec(line);
-  if (match !== null) {
-    return new SubSection(match[1]);
-  }
-  match = CUSTOMIZABLE_HEADING.exec(line);
-  if (match !== null) {
-    return new Section(match[1], true);
-  }
-  match = UNCUSTOMIZABLE_HEADING.exec(line);
-  if (match !== null) {
-    return new Section(match[1], false);
-  }
-  match = SECTION_DOCSTRING.exec(line);
-  if (match !== null) {
-    return new SectionDocstring(match[1]);
-  }
-  match = VAR_DOCSTRING.exec(line);
-  if (match !== null) {
-    return new VarDocstring(match[1]);
-  }
-  var commentStart = line.lastIndexOf('//');
-  var varLine = commentStart === -1 ? line : line.slice(0, commentStart);
-  match = VAR_ASSIGNMENT.exec(varLine);
-  if (match !== null) {
-    return new Variable(match[1], match[2]);
-  }
-  return undefined;
-};
-
-Tokenizer.prototype.shift = function () {
-  while (true) {
-    var result = this._shift();
-    if (result === undefined) {
-      continue;
-    }
-    return result;
-  }
-};
-
-function Parser(fileContent) {
-  this._tokenizer = new Tokenizer(fileContent);
-}
-
-Parser.prototype.parseFile = function () {
-  var sections = [];
-  while (true) {
-    var section = this.parseSection();
-    if (section === null) {
-      if (this._tokenizer.shift() !== null) {
-        throw new Error('Unexpected unparsed section of file remains!');
-      }
-      return sections;
-    }
-    sections.push(section);
-  }
-};
-
-Parser.prototype.parseSection = function () {
-  var section = this._tokenizer.shift();
-  if (section === null) {
-    return null;
-  }
-  if (!(section instanceof Section)) {
-    throw new Error('Expected section heading; got: ' + JSON.stringify(section));
-  }
-  var docstring = this._tokenizer.shift();
-  if (docstring instanceof SectionDocstring) {
-    section.docstring = docstring;
-  } else {
-    this._tokenizer.unshift(docstring);
-  }
-  this.parseSubSections(section);
-
-  return section;
-};
-
-Parser.prototype.parseSubSections = function (section) {
-  while (true) {
-    var subsection = this.parseSubSection();
-    if (subsection === null) {
-      if (section.subsections.length === 0) {
-        // Presume an implicit initial subsection
-        subsection = new SubSection('');
-        this.parseVars(subsection);
-      } else {
-        break;
-      }
-    }
-    section.addSubSection(subsection);
-  }
-
-  if (section.subsections.length === 1 && !section.subsections[0].heading && section.subsections[0].variables.length === 0) {
-    // Ignore lone empty implicit subsection
-    section.subsections = [];
-  }
-};
-
-Parser.prototype.parseSubSection = function () {
-  var subsection = this._tokenizer.shift();
-  if (subsection instanceof SubSection) {
-    this.parseVars(subsection);
-    return subsection;
-  }
-  this._tokenizer.unshift(subsection);
-  return null;
-};
-
-Parser.prototype.parseVars = function (subsection) {
-  while (true) {
-    var variable = this.parseVar();
-    if (variable === null) {
-      return;
-    }
-    subsection.addVar(variable);
-  }
-};
-
-Parser.prototype.parseVar = function () {
-  var docstring = this._tokenizer.shift();
-  if (!(docstring instanceof VarDocstring)) {
-    this._tokenizer.unshift(docstring);
-    docstring = null;
-  }
-  var variable = this._tokenizer.shift();
-  if (variable instanceof Variable) {
-    variable.docstring = docstring;
-    return variable;
-  }
-  this._tokenizer.unshift(variable);
-  return null;
-};
-
-
-module.exports = Parser;

+ 0 - 44
app/Resources/public/assets/bootstrap/grunt/bs-raw-files-generator.js

@@ -1,44 +0,0 @@
-/*!
- * Bootstrap Grunt task for generating raw-files.min.js for the Customizer
- * http://getbootstrap.com
- * Copyright 2014-2015 Twitter, Inc.
- * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
- */
-
-'use strict';
-
-var fs = require('fs');
-var btoa = require('btoa');
-var glob = require('glob');
-
-function getFiles(type) {
-  var files = {};
-  var recursive = type === 'less';
-  var globExpr = recursive ? '/**/*' : '/*';
-  glob.sync(type + globExpr)
-    .filter(function (path) {
-      return type === 'fonts' ? true : new RegExp('\\.' + type + '$').test(path);
-    })
-    .forEach(function (fullPath) {
-      var relativePath = fullPath.replace(/^[^/]+\//, '');
-      files[relativePath] = type === 'fonts' ? btoa(fs.readFileSync(fullPath)) : fs.readFileSync(fullPath, 'utf8');
-    });
-  return 'var __' + type + ' = ' + JSON.stringify(files) + '\n';
-}
-
-module.exports = function generateRawFilesJs(grunt, banner) {
-  if (!banner) {
-    banner = '';
-  }
-  var dirs = ['js', 'less', 'fonts'];
-  var files = banner + dirs.map(getFiles).reduce(function (combined, file) {
-    return combined + file;
-  }, '');
-  var rawFilesJs = 'docs/assets/js/raw-files.min.js';
-  try {
-    fs.writeFileSync(rawFilesJs, files);
-  } catch (err) {
-    grunt.fail.warn(err);
-  }
-  grunt.log.writeln('File ' + rawFilesJs.cyan + ' created.');
-};

+ 0 - 109
app/Resources/public/assets/bootstrap/grunt/change-version.js

@@ -1,109 +0,0 @@
-#!/usr/bin/env node
-'use strict';
-
-/* globals Set */
-/*!
- * Script to update version number references in the project.
- * Copyright 2015 Twitter, Inc.
- * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
- */
-var fs = require('fs');
-var path = require('path');
-var sh = require('shelljs');
-sh.config.fatal = true;
-var sed = sh.sed;
-
-// Blame TC39... https://github.com/benjamingr/RegExp.escape/issues/37
-RegExp.quote = function (string) {
-  return string.replace(/[-\\^$*+?.()|[\]{}]/g, '\\$&');
-};
-RegExp.quoteReplacement = function (string) {
-  return string.replace(/[$]/g, '$$');
-};
-
-var DRY_RUN = false;
-
-function walkAsync(directory, excludedDirectories, fileCallback, errback) {
-  if (excludedDirectories.has(path.parse(directory).base)) {
-    return;
-  }
-  fs.readdir(directory, function (err, names) {
-    if (err) {
-      errback(err);
-      return;
-    }
-    names.forEach(function (name) {
-      var filepath = path.join(directory, name);
-      fs.lstat(filepath, function (err, stats) {
-        if (err) {
-          process.nextTick(errback, err);
-          return;
-        }
-        if (stats.isSymbolicLink()) {
-          return;
-        }
-        else if (stats.isDirectory()) {
-          process.nextTick(walkAsync, filepath, excludedDirectories, fileCallback, errback);
-        }
-        else if (stats.isFile()) {
-          process.nextTick(fileCallback, filepath);
-        }
-      });
-    });
-  });
-}
-
-function replaceRecursively(directory, excludedDirectories, allowedExtensions, original, replacement) {
-  original = new RegExp(RegExp.quote(original), 'g');
-  replacement = RegExp.quoteReplacement(replacement);
-  var updateFile = !DRY_RUN ? function (filepath) {
-    if (allowedExtensions.has(path.parse(filepath).ext)) {
-      sed('-i', original, replacement, filepath);
-    }
-  } : function (filepath) {
-    if (allowedExtensions.has(path.parse(filepath).ext)) {
-      console.log('FILE: ' + filepath);
-    }
-    else {
-      console.log('EXCLUDED:' + filepath);
-    }
-  };
-  walkAsync(directory, excludedDirectories, updateFile, function (err) {
-    console.error('ERROR while traversing directory!:');
-    console.error(err);
-    process.exit(1);
-  });
-}
-
-function main(args) {
-  if (args.length !== 2) {
-    console.error('USAGE: change-version old_version new_version');
-    console.error('Got arguments:', args);
-    process.exit(1);
-  }
-  var oldVersion = args[0];
-  var newVersion = args[1];
-  var EXCLUDED_DIRS = new Set([
-    '.git',
-    'node_modules',
-    'vendor'
-  ]);
-  var INCLUDED_EXTENSIONS = new Set([
-    // This extension whitelist is how we avoid modifying binary files
-    '',
-    '.css',
-    '.html',
-    '.js',
-    '.json',
-    '.less',
-    '.md',
-    '.nuspec',
-    '.ps1',
-    '.scss',
-    '.txt',
-    '.yml'
-  ]);
-  replaceRecursively('.', EXCLUDED_DIRS, INCLUDED_EXTENSIONS, oldVersion, newVersion);
-}
-
-main(process.argv.slice(2));

+ 0 - 46
app/Resources/public/assets/bootstrap/grunt/configBridge.json

@@ -1,46 +0,0 @@
-{
-  "paths": {
-    "customizerJs": [
-      "../assets/js/vendor/autoprefixer.js",
-      "../assets/js/vendor/less.min.js",
-      "../assets/js/vendor/jszip.min.js",
-      "../assets/js/vendor/uglify.min.js",
-      "../assets/js/vendor/Blob.js",
-      "../assets/js/vendor/FileSaver.js",
-      "../assets/js/raw-files.min.js",
-      "../assets/js/src/customizer.js"
-    ],
-    "docsJs": [
-      "../assets/js/vendor/holder.min.js",
-      "../assets/js/vendor/ZeroClipboard.min.js",
-      "../assets/js/vendor/anchor.min.js",
-      "../assets/js/src/application.js"
-    ]
-  },
-  "config": {
-    "autoprefixerBrowsers": [
-      "Android 2.3",
-      "Android >= 4",
-      "Chrome >= 20",
-      "Firefox >= 24",
-      "Explorer >= 8",
-      "iOS >= 6",
-      "Opera >= 12",
-      "Safari >= 6"
-    ],
-    "jqueryCheck": [
-      "if (typeof jQuery === 'undefined') {",
-      "  throw new Error('Bootstrap\\'s JavaScript requires jQuery')",
-      "}\n"
-    ],
-    "jqueryVersionCheck": [
-      "+function ($) {",
-      "  'use strict';",
-      "  var version = $.fn.jquery.split(' ')[0].split('.')",
-      "  if ((version[0] < 2 && version[1] < 9) || (version[0] == 1 && version[1] == 9 && version[2] < 1) || (version[0] > 3)) {",
-      "    throw new Error('Bootstrap\\'s JavaScript requires jQuery version 1.9.1 or higher, but lower than version 4')",
-      "  }",
-      "}(jQuery);\n\n"
-    ]
-  }
-}

+ 0 - 2679
app/Resources/public/assets/bootstrap/grunt/npm-shrinkwrap.json

@@ -1,2679 +0,0 @@
-{
-  "name": "bootstrap",
-  "version": "3.3.7",
-  "dependencies": {
-    "abbrev": {
-      "version": "1.0.9",
-      "from": "abbrev@>=1.0.0 <2.0.0",
-      "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.0.9.tgz"
-    },
-    "accepts": {
-      "version": "1.3.3",
-      "from": "accepts@>=1.3.3 <1.4.0",
-      "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.3.tgz"
-    },
-    "acorn": {
-      "version": "3.2.0",
-      "from": "acorn@>=3.1.0 <4.0.0",
-      "resolved": "https://registry.npmjs.org/acorn/-/acorn-3.2.0.tgz"
-    },
-    "acorn-globals": {
-      "version": "3.0.0",
-      "from": "acorn-globals@>=3.0.0 <4.0.0",
-      "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-3.0.0.tgz"
-    },
-    "agent-base": {
-      "version": "2.0.1",
-      "from": "agent-base@>=2.0.0 <3.0.0",
-      "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-2.0.1.tgz",
-      "dependencies": {
-        "semver": {
-          "version": "5.0.3",
-          "from": "semver@>=5.0.1 <5.1.0",
-          "resolved": "https://registry.npmjs.org/semver/-/semver-5.0.3.tgz"
-        }
-      }
-    },
-    "align-text": {
-      "version": "0.1.4",
-      "from": "align-text@>=0.1.3 <0.2.0",
-      "resolved": "https://registry.npmjs.org/align-text/-/align-text-0.1.4.tgz"
-    },
-    "amdefine": {
-      "version": "1.0.0",
-      "from": "amdefine@>=0.0.4",
-      "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.0.tgz"
-    },
-    "ansi-regex": {
-      "version": "2.0.0",
-      "from": "ansi-regex@>=2.0.0 <3.0.0",
-      "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.0.0.tgz"
-    },
-    "ansi-styles": {
-      "version": "2.2.1",
-      "from": "ansi-styles@>=2.2.1 <3.0.0",
-      "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz"
-    },
-    "archiver": {
-      "version": "1.0.0",
-      "from": "archiver@>=1.0.0 <2.0.0",
-      "resolved": "https://registry.npmjs.org/archiver/-/archiver-1.0.0.tgz",
-      "dependencies": {
-        "lodash": {
-          "version": "4.13.1",
-          "from": "lodash@>=4.8.0 <5.0.0",
-          "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.13.1.tgz"
-        }
-      }
-    },
-    "archiver-utils": {
-      "version": "1.2.0",
-      "from": "archiver-utils@>=1.0.0 <2.0.0",
-      "resolved": "https://registry.npmjs.org/archiver-utils/-/archiver-utils-1.2.0.tgz",
-      "dependencies": {
-        "lodash": {
-          "version": "4.13.1",
-          "from": "lodash@>=4.8.0 <5.0.0",
-          "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.13.1.tgz"
-        }
-      }
-    },
-    "argparse": {
-      "version": "1.0.7",
-      "from": "argparse@>=1.0.2 <2.0.0",
-      "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.7.tgz"
-    },
-    "array-differ": {
-      "version": "1.0.0",
-      "from": "array-differ@>=1.0.0 <2.0.0",
-      "resolved": "https://registry.npmjs.org/array-differ/-/array-differ-1.0.0.tgz"
-    },
-    "array-find-index": {
-      "version": "1.0.1",
-      "from": "array-find-index@>=1.0.1 <2.0.0",
-      "resolved": "https://registry.npmjs.org/array-find-index/-/array-find-index-1.0.1.tgz"
-    },
-    "array-union": {
-      "version": "1.0.2",
-      "from": "array-union@>=1.0.1 <2.0.0",
-      "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz"
-    },
-    "array-uniq": {
-      "version": "1.0.3",
-      "from": "array-uniq@>=1.0.1 <2.0.0",
-      "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz"
-    },
-    "arrify": {
-      "version": "1.0.1",
-      "from": "arrify@>=1.0.0 <2.0.0",
-      "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz"
-    },
-    "asap": {
-      "version": "2.0.4",
-      "from": "asap@>=2.0.3 <2.1.0",
-      "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.4.tgz"
-    },
-    "asn1": {
-      "version": "0.2.3",
-      "from": "asn1@>=0.2.3 <0.3.0",
-      "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.3.tgz"
-    },
-    "assert-plus": {
-      "version": "0.2.0",
-      "from": "assert-plus@>=0.2.0 <0.3.0",
-      "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-0.2.0.tgz"
-    },
-    "async": {
-      "version": "1.5.2",
-      "from": "async@>=1.5.2 <1.6.0",
-      "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz"
-    },
-    "autoprefixer-core": {
-      "version": "5.2.1",
-      "from": "autoprefixer-core@>=5.1.7 <6.0.0",
-      "resolved": "https://registry.npmjs.org/autoprefixer-core/-/autoprefixer-core-5.2.1.tgz"
-    },
-    "aws-sign2": {
-      "version": "0.6.0",
-      "from": "aws-sign2@>=0.6.0 <0.7.0",
-      "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.6.0.tgz"
-    },
-    "aws4": {
-      "version": "1.4.1",
-      "from": "aws4@>=1.2.1 <2.0.0",
-      "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.4.1.tgz"
-    },
-    "babel-runtime": {
-      "version": "6.9.2",
-      "from": "babel-runtime@>=6.9.2 <7.0.0",
-      "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.9.2.tgz"
-    },
-    "babylon": {
-      "version": "6.8.4",
-      "from": "babylon@>=6.8.1 <7.0.0",
-      "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.8.4.tgz"
-    },
-    "balanced-match": {
-      "version": "0.4.1",
-      "from": "balanced-match@>=0.4.1 <0.5.0",
-      "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-0.4.1.tgz"
-    },
-    "basic-auth": {
-      "version": "1.0.4",
-      "from": "basic-auth@>=1.0.3 <1.1.0",
-      "resolved": "https://registry.npmjs.org/basic-auth/-/basic-auth-1.0.4.tgz"
-    },
-    "batch": {
-      "version": "0.5.3",
-      "from": "batch@0.5.3",
-      "resolved": "https://registry.npmjs.org/batch/-/batch-0.5.3.tgz"
-    },
-    "bl": {
-      "version": "1.1.2",
-      "from": "bl@>=1.0.0 <2.0.0",
-      "resolved": "https://registry.npmjs.org/bl/-/bl-1.1.2.tgz",
-      "dependencies": {
-        "readable-stream": {
-          "version": "2.0.6",
-          "from": "readable-stream@>=2.0.5 <2.1.0",
-          "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.0.6.tgz"
-        }
-      }
-    },
-    "body-parser": {
-      "version": "1.14.2",
-      "from": "body-parser@>=1.14.0 <1.15.0",
-      "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.14.2.tgz",
-      "dependencies": {
-        "http-errors": {
-          "version": "1.3.1",
-          "from": "http-errors@>=1.3.1 <1.4.0",
-          "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.3.1.tgz"
-        },
-        "qs": {
-          "version": "5.2.0",
-          "from": "qs@5.2.0",
-          "resolved": "https://registry.npmjs.org/qs/-/qs-5.2.0.tgz"
-        }
-      }
-    },
-    "boom": {
-      "version": "2.10.1",
-      "from": "boom@>=2.0.0 <3.0.0",
-      "resolved": "https://registry.npmjs.org/boom/-/boom-2.10.1.tgz"
-    },
-    "brace-expansion": {
-      "version": "1.1.5",
-      "from": "brace-expansion@>=1.0.0 <2.0.0",
-      "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.5.tgz"
-    },
-    "browserify-zlib": {
-      "version": "0.1.4",
-      "from": "browserify-zlib@>=0.1.4 <0.2.0",
-      "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.1.4.tgz"
-    },
-    "browserslist": {
-      "version": "0.4.0",
-      "from": "browserslist@>=0.4.0 <0.5.0",
-      "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-0.4.0.tgz"
-    },
-    "btoa": {
-      "version": "1.1.2",
-      "from": "btoa@>=1.1.2 <1.2.0",
-      "resolved": "https://registry.npmjs.org/btoa/-/btoa-1.1.2.tgz"
-    },
-    "buffer-crc32": {
-      "version": "0.2.5",
-      "from": "buffer-crc32@>=0.2.1 <0.3.0",
-      "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.5.tgz"
-    },
-    "buffer-shims": {
-      "version": "1.0.0",
-      "from": "buffer-shims@>=1.0.0 <2.0.0",
-      "resolved": "https://registry.npmjs.org/buffer-shims/-/buffer-shims-1.0.0.tgz"
-    },
-    "builtin-modules": {
-      "version": "1.1.1",
-      "from": "builtin-modules@>=1.0.0 <2.0.0",
-      "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz"
-    },
-    "bytes": {
-      "version": "2.2.0",
-      "from": "bytes@2.2.0",
-      "resolved": "https://registry.npmjs.org/bytes/-/bytes-2.2.0.tgz"
-    },
-    "camel-case": {
-      "version": "3.0.0",
-      "from": "camel-case@>=3.0.0 <4.0.0",
-      "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-3.0.0.tgz"
-    },
-    "camelcase": {
-      "version": "2.1.1",
-      "from": "camelcase@>=2.0.0 <3.0.0",
-      "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-2.1.1.tgz"
-    },
-    "camelcase-keys": {
-      "version": "2.1.0",
-      "from": "camelcase-keys@>=2.0.0 <3.0.0",
-      "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-2.1.0.tgz"
-    },
-    "caniuse-db": {
-      "version": "1.0.30000506",
-      "from": "caniuse-db@>=1.0.30000214 <2.0.0",
-      "resolved": "https://registry.npmjs.org/caniuse-db/-/caniuse-db-1.0.30000506.tgz"
-    },
-    "caseless": {
-      "version": "0.11.0",
-      "from": "caseless@>=0.11.0 <0.12.0",
-      "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.11.0.tgz"
-    },
-    "center-align": {
-      "version": "0.1.3",
-      "from": "center-align@>=0.1.1 <0.2.0",
-      "resolved": "https://registry.npmjs.org/center-align/-/center-align-0.1.3.tgz"
-    },
-    "chalk": {
-      "version": "1.1.3",
-      "from": "chalk@>=1.1.1 <1.2.0",
-      "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz"
-    },
-    "change-case": {
-      "version": "3.0.0",
-      "from": "change-case@>=3.0.0 <3.1.0",
-      "resolved": "https://registry.npmjs.org/change-case/-/change-case-3.0.0.tgz"
-    },
-    "character-parser": {
-      "version": "2.2.0",
-      "from": "character-parser@>=2.1.1 <3.0.0",
-      "resolved": "https://registry.npmjs.org/character-parser/-/character-parser-2.2.0.tgz"
-    },
-    "clean-css": {
-      "version": "3.4.18",
-      "from": "clean-css@>=3.4.2 <3.5.0",
-      "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-3.4.18.tgz"
-    },
-    "cli": {
-      "version": "0.6.6",
-      "from": "cli@>=0.6.0 <0.7.0",
-      "resolved": "https://registry.npmjs.org/cli/-/cli-0.6.6.tgz",
-      "dependencies": {
-        "glob": {
-          "version": "3.2.11",
-          "from": "glob@>=3.2.1 <3.3.0",
-          "resolved": "https://registry.npmjs.org/glob/-/glob-3.2.11.tgz"
-        },
-        "minimatch": {
-          "version": "0.3.0",
-          "from": "minimatch@>=0.3.0 <0.4.0",
-          "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-0.3.0.tgz"
-        }
-      }
-    },
-    "cli-table": {
-      "version": "0.3.1",
-      "from": "cli-table@>=0.3.1 <0.4.0",
-      "resolved": "https://registry.npmjs.org/cli-table/-/cli-table-0.3.1.tgz",
-      "dependencies": {
-        "colors": {
-          "version": "1.0.3",
-          "from": "colors@1.0.3",
-          "resolved": "https://registry.npmjs.org/colors/-/colors-1.0.3.tgz"
-        }
-      }
-    },
-    "cliui": {
-      "version": "2.1.0",
-      "from": "cliui@>=2.1.0 <3.0.0",
-      "resolved": "https://registry.npmjs.org/cliui/-/cliui-2.1.0.tgz"
-    },
-    "coffee-script": {
-      "version": "1.10.0",
-      "from": "coffee-script@>=1.10.0 <1.11.0",
-      "resolved": "https://registry.npmjs.org/coffee-script/-/coffee-script-1.10.0.tgz"
-    },
-    "colors": {
-      "version": "1.1.2",
-      "from": "colors@>=1.1.2 <1.2.0",
-      "resolved": "https://registry.npmjs.org/colors/-/colors-1.1.2.tgz"
-    },
-    "combined-stream": {
-      "version": "1.0.5",
-      "from": "combined-stream@>=1.0.5 <1.1.0",
-      "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.5.tgz"
-    },
-    "commander": {
-      "version": "2.8.1",
-      "from": "commander@>=2.8.0 <2.9.0",
-      "resolved": "https://registry.npmjs.org/commander/-/commander-2.8.1.tgz"
-    },
-    "comment-parser": {
-      "version": "0.3.1",
-      "from": "comment-parser@>=0.3.1 <0.4.0",
-      "resolved": "https://registry.npmjs.org/comment-parser/-/comment-parser-0.3.1.tgz"
-    },
-    "compress-commons": {
-      "version": "1.0.0",
-      "from": "compress-commons@>=1.0.0 <2.0.0",
-      "resolved": "https://registry.npmjs.org/compress-commons/-/compress-commons-1.0.0.tgz"
-    },
-    "concat-map": {
-      "version": "0.0.1",
-      "from": "concat-map@0.0.1",
-      "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz"
-    },
-    "concat-stream": {
-      "version": "1.5.1",
-      "from": "concat-stream@>=1.4.1 <2.0.0",
-      "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.5.1.tgz",
-      "dependencies": {
-        "readable-stream": {
-          "version": "2.0.6",
-          "from": "readable-stream@>=2.0.0 <2.1.0",
-          "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.0.6.tgz"
-        }
-      }
-    },
-    "connect": {
-      "version": "3.4.1",
-      "from": "connect@>=3.4.0 <4.0.0",
-      "resolved": "https://registry.npmjs.org/connect/-/connect-3.4.1.tgz"
-    },
-    "connect-livereload": {
-      "version": "0.5.4",
-      "from": "connect-livereload@>=0.5.0 <0.6.0",
-      "resolved": "https://registry.npmjs.org/connect-livereload/-/connect-livereload-0.5.4.tgz"
-    },
-    "console-browserify": {
-      "version": "1.1.0",
-      "from": "console-browserify@>=1.1.0 <1.2.0",
-      "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.1.0.tgz"
-    },
-    "constant-case": {
-      "version": "2.0.0",
-      "from": "constant-case@>=2.0.0 <3.0.0",
-      "resolved": "https://registry.npmjs.org/constant-case/-/constant-case-2.0.0.tgz"
-    },
-    "constantinople": {
-      "version": "3.1.0",
-      "from": "constantinople@>=3.0.1 <4.0.0",
-      "resolved": "https://registry.npmjs.org/constantinople/-/constantinople-3.1.0.tgz"
-    },
-    "content-type": {
-      "version": "1.0.2",
-      "from": "content-type@>=1.0.1 <1.1.0",
-      "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.2.tgz"
-    },
-    "core-js": {
-      "version": "2.4.0",
-      "from": "core-js@>=2.4.0 <3.0.0",
-      "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.4.0.tgz"
-    },
-    "core-util-is": {
-      "version": "1.0.2",
-      "from": "core-util-is@>=1.0.0 <1.1.0",
-      "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz"
-    },
-    "crc32-stream": {
-      "version": "1.0.0",
-      "from": "crc32-stream@>=1.0.0 <2.0.0",
-      "resolved": "https://registry.npmjs.org/crc32-stream/-/crc32-stream-1.0.0.tgz"
-    },
-    "cryptiles": {
-      "version": "2.0.5",
-      "from": "cryptiles@>=2.0.0 <3.0.0",
-      "resolved": "https://registry.npmjs.org/cryptiles/-/cryptiles-2.0.5.tgz"
-    },
-    "csscomb": {
-      "version": "3.1.8",
-      "from": "csscomb@>=3.1.0 <3.2.0",
-      "resolved": "https://registry.npmjs.org/csscomb/-/csscomb-3.1.8.tgz",
-      "dependencies": {
-        "commander": {
-          "version": "2.0.0",
-          "from": "commander@2.0.0",
-          "resolved": "https://registry.npmjs.org/commander/-/commander-2.0.0.tgz"
-        }
-      }
-    },
-    "csscomb-core": {
-      "version": "3.0.0-3.1",
-      "from": "csscomb-core@3.0.0-3.1",
-      "resolved": "https://registry.npmjs.org/csscomb-core/-/csscomb-core-3.0.0-3.1.tgz",
-      "dependencies": {
-        "minimatch": {
-          "version": "0.2.12",
-          "from": "minimatch@0.2.12",
-          "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-0.2.12.tgz"
-        }
-      }
-    },
-    "csslint": {
-      "version": "0.10.0",
-      "from": "csslint@>=0.10.0 <0.11.0",
-      "resolved": "https://registry.npmjs.org/csslint/-/csslint-0.10.0.tgz"
-    },
-    "cst": {
-      "version": "0.4.4",
-      "from": "cst@>=0.4.3 <0.5.0",
-      "resolved": "https://registry.npmjs.org/cst/-/cst-0.4.4.tgz"
-    },
-    "currently-unhandled": {
-      "version": "0.4.1",
-      "from": "currently-unhandled@>=0.4.1 <0.5.0",
-      "resolved": "https://registry.npmjs.org/currently-unhandled/-/currently-unhandled-0.4.1.tgz"
-    },
-    "cycle": {
-      "version": "1.0.3",
-      "from": "cycle@>=1.0.0 <1.1.0",
-      "resolved": "https://registry.npmjs.org/cycle/-/cycle-1.0.3.tgz"
-    },
-    "dashdash": {
-      "version": "1.14.0",
-      "from": "dashdash@>=1.12.0 <2.0.0",
-      "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.0.tgz",
-      "dependencies": {
-        "assert-plus": {
-          "version": "1.0.0",
-          "from": "assert-plus@>=1.0.0 <2.0.0",
-          "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz"
-        }
-      }
-    },
-    "date-now": {
-      "version": "0.1.4",
-      "from": "date-now@>=0.1.4 <0.2.0",
-      "resolved": "https://registry.npmjs.org/date-now/-/date-now-0.1.4.tgz"
-    },
-    "date-time": {
-      "version": "1.0.0",
-      "from": "date-time@>=1.0.0 <2.0.0",
-      "resolved": "https://registry.npmjs.org/date-time/-/date-time-1.0.0.tgz"
-    },
-    "dateformat": {
-      "version": "1.0.12",
-      "from": "dateformat@>=1.0.12 <1.1.0",
-      "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-1.0.12.tgz"
-    },
-    "debug": {
-      "version": "2.2.0",
-      "from": "debug@>=2.2.0 <2.3.0",
-      "resolved": "https://registry.npmjs.org/debug/-/debug-2.2.0.tgz"
-    },
-    "decamelize": {
-      "version": "1.2.0",
-      "from": "decamelize@>=1.1.2 <2.0.0",
-      "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz"
-    },
-    "deep-equal": {
-      "version": "1.0.1",
-      "from": "deep-equal@*",
-      "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.0.1.tgz"
-    },
-    "delayed-stream": {
-      "version": "1.0.0",
-      "from": "delayed-stream@>=1.0.0 <1.1.0",
-      "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz"
-    },
-    "depd": {
-      "version": "1.1.0",
-      "from": "depd@>=1.1.0 <1.2.0",
-      "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.0.tgz"
-    },
-    "destroy": {
-      "version": "1.0.4",
-      "from": "destroy@>=1.0.4 <1.1.0",
-      "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz"
-    },
-    "diff": {
-      "version": "1.3.2",
-      "from": "diff@>=1.3.0 <1.4.0",
-      "resolved": "https://registry.npmjs.org/diff/-/diff-1.3.2.tgz"
-    },
-    "doctypes": {
-      "version": "1.0.0",
-      "from": "doctypes@>=1.0.0 <2.0.0",
-      "resolved": "https://registry.npmjs.org/doctypes/-/doctypes-1.0.0.tgz"
-    },
-    "dom-serializer": {
-      "version": "0.1.0",
-      "from": "dom-serializer@>=0.0.0 <1.0.0",
-      "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.1.0.tgz",
-      "dependencies": {
-        "domelementtype": {
-          "version": "1.1.3",
-          "from": "domelementtype@>=1.1.1 <1.2.0",
-          "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.1.3.tgz"
-        },
-        "entities": {
-          "version": "1.1.1",
-          "from": "entities@>=1.1.1 <1.2.0",
-          "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.1.tgz"
-        }
-      }
-    },
-    "domelementtype": {
-      "version": "1.3.0",
-      "from": "domelementtype@>=1.0.0 <2.0.0",
-      "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.0.tgz"
-    },
-    "domhandler": {
-      "version": "2.3.0",
-      "from": "domhandler@>=2.3.0 <2.4.0",
-      "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-2.3.0.tgz"
-    },
-    "domutils": {
-      "version": "1.5.1",
-      "from": "domutils@>=1.5.0 <1.6.0",
-      "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.5.1.tgz"
-    },
-    "dot-case": {
-      "version": "2.1.0",
-      "from": "dot-case@>=2.1.0 <3.0.0",
-      "resolved": "https://registry.npmjs.org/dot-case/-/dot-case-2.1.0.tgz"
-    },
-    "ecc-jsbn": {
-      "version": "0.1.1",
-      "from": "ecc-jsbn@>=0.1.1 <0.2.0",
-      "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.1.tgz"
-    },
-    "ee-first": {
-      "version": "1.1.1",
-      "from": "ee-first@1.1.1",
-      "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz"
-    },
-    "encodeurl": {
-      "version": "1.0.1",
-      "from": "encodeurl@>=1.0.1 <1.1.0",
-      "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.1.tgz"
-    },
-    "end-of-stream": {
-      "version": "1.1.0",
-      "from": "end-of-stream@>=1.0.0 <2.0.0",
-      "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.1.0.tgz"
-    },
-    "entities": {
-      "version": "1.0.0",
-      "from": "entities@>=1.0.0 <1.1.0",
-      "resolved": "https://registry.npmjs.org/entities/-/entities-1.0.0.tgz"
-    },
-    "errno": {
-      "version": "0.1.4",
-      "from": "errno@>=0.1.1 <0.2.0",
-      "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.4.tgz"
-    },
-    "error-ex": {
-      "version": "1.3.0",
-      "from": "error-ex@>=1.2.0 <2.0.0",
-      "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.0.tgz"
-    },
-    "es6-promise": {
-      "version": "2.3.0",
-      "from": "es6-promise@>=2.3.0 <2.4.0",
-      "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-2.3.0.tgz"
-    },
-    "escape-html": {
-      "version": "1.0.3",
-      "from": "escape-html@>=1.0.3 <1.1.0",
-      "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz"
-    },
-    "escape-string-regexp": {
-      "version": "1.0.5",
-      "from": "escape-string-regexp@>=1.0.2 <2.0.0",
-      "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz"
-    },
-    "esprima": {
-      "version": "2.7.2",
-      "from": "esprima@>=2.6.0 <3.0.0",
-      "resolved": "https://registry.npmjs.org/esprima/-/esprima-2.7.2.tgz"
-    },
-    "estraverse": {
-      "version": "4.2.0",
-      "from": "estraverse@>=4.1.0 <5.0.0",
-      "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.2.0.tgz"
-    },
-    "etag": {
-      "version": "1.7.0",
-      "from": "etag@>=1.7.0 <1.8.0",
-      "resolved": "https://registry.npmjs.org/etag/-/etag-1.7.0.tgz"
-    },
-    "eventemitter2": {
-      "version": "0.4.14",
-      "from": "eventemitter2@>=0.4.13 <0.5.0",
-      "resolved": "https://registry.npmjs.org/eventemitter2/-/eventemitter2-0.4.14.tgz"
-    },
-    "exit": {
-      "version": "0.1.2",
-      "from": "exit@>=0.1.1 <0.2.0",
-      "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz"
-    },
-    "extend": {
-      "version": "3.0.0",
-      "from": "extend@>=3.0.0 <3.1.0",
-      "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.0.tgz"
-    },
-    "extract-zip": {
-      "version": "1.5.0",
-      "from": "extract-zip@>=1.5.0 <1.6.0",
-      "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-1.5.0.tgz",
-      "dependencies": {
-        "concat-stream": {
-          "version": "1.5.0",
-          "from": "concat-stream@1.5.0",
-          "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.5.0.tgz"
-        },
-        "debug": {
-          "version": "0.7.4",
-          "from": "debug@0.7.4",
-          "resolved": "https://registry.npmjs.org/debug/-/debug-0.7.4.tgz"
-        },
-        "minimist": {
-          "version": "0.0.8",
-          "from": "minimist@0.0.8",
-          "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz"
-        },
-        "mkdirp": {
-          "version": "0.5.0",
-          "from": "mkdirp@0.5.0",
-          "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.0.tgz"
-        },
-        "readable-stream": {
-          "version": "2.0.6",
-          "from": "readable-stream@>=2.0.0 <2.1.0",
-          "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.0.6.tgz"
-        }
-      }
-    },
-    "extsprintf": {
-      "version": "1.0.2",
-      "from": "extsprintf@1.0.2",
-      "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.0.2.tgz"
-    },
-    "eyes": {
-      "version": "0.1.8",
-      "from": "eyes@>=0.1.0 <0.2.0",
-      "resolved": "https://registry.npmjs.org/eyes/-/eyes-0.1.8.tgz"
-    },
-    "faye-websocket": {
-      "version": "0.10.0",
-      "from": "faye-websocket@>=0.10.0 <0.11.0",
-      "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.10.0.tgz"
-    },
-    "fd-slicer": {
-      "version": "1.0.1",
-      "from": "fd-slicer@>=1.0.1 <1.1.0",
-      "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.0.1.tgz"
-    },
-    "fg-lodash": {
-      "version": "0.0.2",
-      "from": "fg-lodash@0.0.2",
-      "resolved": "https://registry.npmjs.org/fg-lodash/-/fg-lodash-0.0.2.tgz",
-      "dependencies": {
-        "lodash": {
-          "version": "2.4.2",
-          "from": "lodash@>=2.4.1 <3.0.0",
-          "resolved": "https://registry.npmjs.org/lodash/-/lodash-2.4.2.tgz"
-        },
-        "underscore.string": {
-          "version": "2.3.3",
-          "from": "underscore.string@>=2.3.3 <2.4.0",
-          "resolved": "https://registry.npmjs.org/underscore.string/-/underscore.string-2.3.3.tgz"
-        }
-      }
-    },
-    "figures": {
-      "version": "1.7.0",
-      "from": "figures@>=1.0.1 <2.0.0",
-      "resolved": "https://registry.npmjs.org/figures/-/figures-1.7.0.tgz"
-    },
-    "file-sync-cmp": {
-      "version": "0.1.1",
-      "from": "file-sync-cmp@>=0.1.0 <0.2.0",
-      "resolved": "https://registry.npmjs.org/file-sync-cmp/-/file-sync-cmp-0.1.1.tgz"
-    },
-    "finalhandler": {
-      "version": "0.4.1",
-      "from": "finalhandler@0.4.1",
-      "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-0.4.1.tgz"
-    },
-    "find-up": {
-      "version": "1.1.2",
-      "from": "find-up@>=1.0.0 <2.0.0",
-      "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz"
-    },
-    "findup-sync": {
-      "version": "0.3.0",
-      "from": "findup-sync@>=0.3.0 <0.4.0",
-      "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-0.3.0.tgz",
-      "dependencies": {
-        "glob": {
-          "version": "5.0.15",
-          "from": "glob@>=5.0.0 <5.1.0",
-          "resolved": "https://registry.npmjs.org/glob/-/glob-5.0.15.tgz"
-        }
-      }
-    },
-    "forever-agent": {
-      "version": "0.6.1",
-      "from": "forever-agent@>=0.6.1 <0.7.0",
-      "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz"
-    },
-    "form-data": {
-      "version": "1.0.0-rc4",
-      "from": "form-data@>=1.0.0-rc4 <1.1.0",
-      "resolved": "https://registry.npmjs.org/form-data/-/form-data-1.0.0-rc4.tgz"
-    },
-    "fresh": {
-      "version": "0.3.0",
-      "from": "fresh@0.3.0",
-      "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.3.0.tgz"
-    },
-    "fs-extra": {
-      "version": "0.26.7",
-      "from": "fs-extra@>=0.26.4 <0.27.0",
-      "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-0.26.7.tgz"
-    },
-    "fs.realpath": {
-      "version": "1.0.0",
-      "from": "fs.realpath@>=1.0.0 <2.0.0",
-      "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz"
-    },
-    "gaze": {
-      "version": "1.1.0",
-      "from": "gaze@>=1.0.0 <2.0.0",
-      "resolved": "https://registry.npmjs.org/gaze/-/gaze-1.1.0.tgz"
-    },
-    "generate-function": {
-      "version": "2.0.0",
-      "from": "generate-function@>=2.0.0 <3.0.0",
-      "resolved": "https://registry.npmjs.org/generate-function/-/generate-function-2.0.0.tgz"
-    },
-    "generate-object-property": {
-      "version": "1.2.0",
-      "from": "generate-object-property@>=1.1.0 <2.0.0",
-      "resolved": "https://registry.npmjs.org/generate-object-property/-/generate-object-property-1.2.0.tgz"
-    },
-    "get-stdin": {
-      "version": "4.0.1",
-      "from": "get-stdin@>=4.0.1 <5.0.0",
-      "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-4.0.1.tgz"
-    },
-    "getobject": {
-      "version": "0.1.0",
-      "from": "getobject@>=0.1.0 <0.2.0",
-      "resolved": "https://registry.npmjs.org/getobject/-/getobject-0.1.0.tgz"
-    },
-    "getpass": {
-      "version": "0.1.6",
-      "from": "getpass@>=0.1.1 <0.2.0",
-      "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.6.tgz",
-      "dependencies": {
-        "assert-plus": {
-          "version": "1.0.0",
-          "from": "assert-plus@>=1.0.0 <2.0.0",
-          "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz"
-        }
-      }
-    },
-    "glob": {
-      "version": "7.0.5",
-      "from": "glob@>=7.0.3 <7.1.0",
-      "resolved": "https://registry.npmjs.org/glob/-/glob-7.0.5.tgz"
-    },
-    "globule": {
-      "version": "1.0.0",
-      "from": "globule@>=1.0.0 <2.0.0",
-      "resolved": "https://registry.npmjs.org/globule/-/globule-1.0.0.tgz",
-      "dependencies": {
-        "lodash": {
-          "version": "4.9.0",
-          "from": "lodash@>=4.9.0 <4.10.0",
-          "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.9.0.tgz"
-        }
-      }
-    },
-    "gonzales-pe": {
-      "version": "3.0.0-28",
-      "from": "gonzales-pe@3.0.0-28",
-      "resolved": "https://registry.npmjs.org/gonzales-pe/-/gonzales-pe-3.0.0-28.tgz"
-    },
-    "graceful-fs": {
-      "version": "4.1.4",
-      "from": "graceful-fs@>=4.1.2 <5.0.0",
-      "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.4.tgz"
-    },
-    "graceful-readlink": {
-      "version": "1.0.1",
-      "from": "graceful-readlink@>=1.0.0",
-      "resolved": "https://registry.npmjs.org/graceful-readlink/-/graceful-readlink-1.0.1.tgz"
-    },
-    "grunt": {
-      "version": "1.0.1",
-      "from": "grunt@>=1.0.1 <1.1.0",
-      "resolved": "https://registry.npmjs.org/grunt/-/grunt-1.0.1.tgz",
-      "dependencies": {
-        "grunt-cli": {
-          "version": "1.2.0",
-          "from": "grunt-cli@>=1.2.0 <1.3.0",
-          "resolved": "https://registry.npmjs.org/grunt-cli/-/grunt-cli-1.2.0.tgz"
-        }
-      }
-    },
-    "grunt-autoprefixer": {
-      "version": "3.0.4",
-      "from": "grunt-autoprefixer@>=3.0.4 <3.1.0",
-      "resolved": "https://registry.npmjs.org/grunt-autoprefixer/-/grunt-autoprefixer-3.0.4.tgz",
-      "dependencies": {
-        "ansi-regex": {
-          "version": "1.1.1",
-          "from": "ansi-regex@>=1.1.0 <2.0.0",
-          "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-1.1.1.tgz"
-        },
-        "chalk": {
-          "version": "1.0.0",
-          "from": "chalk@>=1.0.0 <1.1.0",
-          "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.0.0.tgz"
-        },
-        "has-ansi": {
-          "version": "1.0.3",
-          "from": "has-ansi@>=1.0.3 <2.0.0",
-          "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-1.0.3.tgz"
-        },
-        "strip-ansi": {
-          "version": "2.0.1",
-          "from": "strip-ansi@>=2.0.1 <3.0.0",
-          "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-2.0.1.tgz"
-        },
-        "supports-color": {
-          "version": "1.3.1",
-          "from": "supports-color@>=1.3.0 <2.0.0",
-          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-1.3.1.tgz"
-        }
-      }
-    },
-    "grunt-contrib-clean": {
-      "version": "1.0.0",
-      "from": "grunt-contrib-clean@>=1.0.0 <1.1.0",
-      "resolved": "https://registry.npmjs.org/grunt-contrib-clean/-/grunt-contrib-clean-1.0.0.tgz",
-      "dependencies": {
-        "rimraf": {
-          "version": "2.5.3",
-          "from": "rimraf@>=2.5.1 <3.0.0",
-          "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.5.3.tgz"
-        }
-      }
-    },
-    "grunt-contrib-compress": {
-      "version": "1.3.0",
-      "from": "grunt-contrib-compress@>=1.3.0 <1.4.0",
-      "resolved": "https://registry.npmjs.org/grunt-contrib-compress/-/grunt-contrib-compress-1.3.0.tgz",
-      "dependencies": {
-        "lodash": {
-          "version": "4.13.1",
-          "from": "lodash@>=4.7.0 <5.0.0",
-          "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.13.1.tgz"
-        }
-      }
-    },
-    "grunt-contrib-concat": {
-      "version": "1.0.1",
-      "from": "grunt-contrib-concat@>=1.0.0 <1.1.0",
-      "resolved": "https://registry.npmjs.org/grunt-contrib-concat/-/grunt-contrib-concat-1.0.1.tgz",
-      "dependencies": {
-        "source-map": {
-          "version": "0.5.6",
-          "from": "source-map@>=0.5.3 <0.6.0",
-          "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.6.tgz"
-        }
-      }
-    },
-    "grunt-contrib-connect": {
-      "version": "1.0.2",
-      "from": "grunt-contrib-connect@>=1.0.0 <1.1.0",
-      "resolved": "https://registry.npmjs.org/grunt-contrib-connect/-/grunt-contrib-connect-1.0.2.tgz"
-    },
-    "grunt-contrib-copy": {
-      "version": "1.0.0",
-      "from": "grunt-contrib-copy@>=1.0.0 <1.1.0",
-      "resolved": "https://registry.npmjs.org/grunt-contrib-copy/-/grunt-contrib-copy-1.0.0.tgz"
-    },
-    "grunt-contrib-csslint": {
-      "version": "1.0.0",
-      "from": "grunt-contrib-csslint@>=1.0.0 <1.1.0",
-      "resolved": "https://registry.npmjs.org/grunt-contrib-csslint/-/grunt-contrib-csslint-1.0.0.tgz"
-    },
-    "grunt-contrib-cssmin": {
-      "version": "1.0.1",
-      "from": "grunt-contrib-cssmin@>=1.0.0 <1.1.0",
-      "resolved": "https://registry.npmjs.org/grunt-contrib-cssmin/-/grunt-contrib-cssmin-1.0.1.tgz"
-    },
-    "grunt-contrib-htmlmin": {
-      "version": "1.5.0",
-      "from": "grunt-contrib-htmlmin@>=1.5.0 <1.6.0",
-      "resolved": "https://registry.npmjs.org/grunt-contrib-htmlmin/-/grunt-contrib-htmlmin-1.5.0.tgz"
-    },
-    "grunt-contrib-jshint": {
-      "version": "1.0.0",
-      "from": "grunt-contrib-jshint@>=1.0.0 <1.1.0",
-      "resolved": "https://registry.npmjs.org/grunt-contrib-jshint/-/grunt-contrib-jshint-1.0.0.tgz"
-    },
-    "grunt-contrib-less": {
-      "version": "1.3.0",
-      "from": "grunt-contrib-less@>=1.3.0 <1.4.0",
-      "resolved": "https://registry.npmjs.org/grunt-contrib-less/-/grunt-contrib-less-1.3.0.tgz",
-      "dependencies": {
-        "lodash": {
-          "version": "4.13.1",
-          "from": "lodash@>=4.8.2 <5.0.0",
-          "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.13.1.tgz"
-        }
-      }
-    },
-    "grunt-contrib-pug": {
-      "version": "1.0.0",
-      "from": "grunt-contrib-pug@>=1.0.0 <1.1.0",
-      "resolved": "https://registry.npmjs.org/grunt-contrib-pug/-/grunt-contrib-pug-1.0.0.tgz"
-    },
-    "grunt-contrib-qunit": {
-      "version": "0.7.0",
-      "from": "grunt-contrib-qunit@>=0.7.0 <0.8.0",
-      "resolved": "https://registry.npmjs.org/grunt-contrib-qunit/-/grunt-contrib-qunit-0.7.0.tgz"
-    },
-    "grunt-contrib-uglify": {
-      "version": "1.0.1",
-      "from": "grunt-contrib-uglify@>=1.0.0 <1.1.0",
-      "resolved": "https://registry.npmjs.org/grunt-contrib-uglify/-/grunt-contrib-uglify-1.0.1.tgz",
-      "dependencies": {
-        "lodash": {
-          "version": "4.13.1",
-          "from": "lodash@>=4.0.1 <5.0.0",
-          "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.13.1.tgz"
-        }
-      }
-    },
-    "grunt-contrib-watch": {
-      "version": "1.0.0",
-      "from": "grunt-contrib-watch@>=1.0.0 <1.1.0",
-      "resolved": "https://registry.npmjs.org/grunt-contrib-watch/-/grunt-contrib-watch-1.0.0.tgz"
-    },
-    "grunt-csscomb": {
-      "version": "3.1.1",
-      "from": "grunt-csscomb@>=3.1.0 <3.2.0",
-      "resolved": "https://registry.npmjs.org/grunt-csscomb/-/grunt-csscomb-3.1.1.tgz"
-    },
-    "grunt-exec": {
-      "version": "1.0.0",
-      "from": "grunt-exec@>=1.0.0 <1.1.0",
-      "resolved": "https://registry.npmjs.org/grunt-exec/-/grunt-exec-1.0.0.tgz"
-    },
-    "grunt-html": {
-      "version": "8.0.2",
-      "from": "grunt-html@>=8.0.1 <8.1.0",
-      "resolved": "https://registry.npmjs.org/grunt-html/-/grunt-html-8.0.2.tgz"
-    },
-    "grunt-jekyll": {
-      "version": "0.4.4",
-      "from": "grunt-jekyll@>=0.4.4 <0.5.0",
-      "resolved": "https://registry.npmjs.org/grunt-jekyll/-/grunt-jekyll-0.4.4.tgz"
-    },
-    "grunt-jscs": {
-      "version": "3.0.1",
-      "from": "grunt-jscs@>=3.0.1 <3.1.0",
-      "resolved": "https://registry.npmjs.org/grunt-jscs/-/grunt-jscs-3.0.1.tgz",
-      "dependencies": {
-        "lodash": {
-          "version": "4.6.1",
-          "from": "lodash@>=4.6.1 <4.7.0",
-          "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.6.1.tgz"
-        }
-      }
-    },
-    "grunt-known-options": {
-      "version": "1.1.0",
-      "from": "grunt-known-options@>=1.1.0 <1.2.0",
-      "resolved": "https://registry.npmjs.org/grunt-known-options/-/grunt-known-options-1.1.0.tgz"
-    },
-    "grunt-legacy-log": {
-      "version": "1.0.0",
-      "from": "grunt-legacy-log@>=1.0.0 <1.1.0",
-      "resolved": "https://registry.npmjs.org/grunt-legacy-log/-/grunt-legacy-log-1.0.0.tgz"
-    },
-    "grunt-legacy-log-utils": {
-      "version": "1.0.0",
-      "from": "grunt-legacy-log-utils@>=1.0.0 <1.1.0",
-      "resolved": "https://registry.npmjs.org/grunt-legacy-log-utils/-/grunt-legacy-log-utils-1.0.0.tgz",
-      "dependencies": {
-        "lodash": {
-          "version": "4.3.0",
-          "from": "lodash@>=4.3.0 <4.4.0",
-          "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.3.0.tgz"
-        }
-      }
-    },
-    "grunt-legacy-util": {
-      "version": "1.0.0",
-      "from": "grunt-legacy-util@>=1.0.0 <1.1.0",
-      "resolved": "https://registry.npmjs.org/grunt-legacy-util/-/grunt-legacy-util-1.0.0.tgz",
-      "dependencies": {
-        "lodash": {
-          "version": "4.3.0",
-          "from": "lodash@>=4.3.0 <4.4.0",
-          "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.3.0.tgz"
-        }
-      }
-    },
-    "grunt-lib-phantomjs": {
-      "version": "0.6.0",
-      "from": "grunt-lib-phantomjs@>=0.6.0 <0.7.0",
-      "resolved": "https://registry.npmjs.org/grunt-lib-phantomjs/-/grunt-lib-phantomjs-0.6.0.tgz",
-      "dependencies": {
-        "semver": {
-          "version": "1.0.14",
-          "from": "semver@>=1.0.14 <1.1.0",
-          "resolved": "https://registry.npmjs.org/semver/-/semver-1.0.14.tgz"
-        }
-      }
-    },
-    "grunt-saucelabs": {
-      "version": "9.0.0",
-      "from": "grunt-saucelabs@>=9.0.0 <9.1.0",
-      "resolved": "https://registry.npmjs.org/grunt-saucelabs/-/grunt-saucelabs-9.0.0.tgz",
-      "dependencies": {
-        "lodash": {
-          "version": "4.13.1",
-          "from": "lodash@>=4.13.1 <4.14.0",
-          "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.13.1.tgz"
-        }
-      }
-    },
-    "gzip-size": {
-      "version": "1.0.0",
-      "from": "gzip-size@>=1.0.0 <2.0.0",
-      "resolved": "https://registry.npmjs.org/gzip-size/-/gzip-size-1.0.0.tgz"
-    },
-    "har-validator": {
-      "version": "2.0.6",
-      "from": "har-validator@>=2.0.6 <2.1.0",
-      "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-2.0.6.tgz",
-      "dependencies": {
-        "commander": {
-          "version": "2.9.0",
-          "from": "commander@>=2.9.0 <3.0.0",
-          "resolved": "https://registry.npmjs.org/commander/-/commander-2.9.0.tgz"
-        }
-      }
-    },
-    "has-ansi": {
-      "version": "2.0.0",
-      "from": "has-ansi@>=2.0.0 <3.0.0",
-      "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz"
-    },
-    "has-color": {
-      "version": "0.1.7",
-      "from": "has-color@>=0.1.0 <0.2.0",
-      "resolved": "https://registry.npmjs.org/has-color/-/has-color-0.1.7.tgz"
-    },
-    "hasha": {
-      "version": "2.2.0",
-      "from": "hasha@>=2.2.0 <3.0.0",
-      "resolved": "https://registry.npmjs.org/hasha/-/hasha-2.2.0.tgz"
-    },
-    "hawk": {
-      "version": "3.1.3",
-      "from": "hawk@>=3.1.3 <3.2.0",
-      "resolved": "https://registry.npmjs.org/hawk/-/hawk-3.1.3.tgz"
-    },
-    "he": {
-      "version": "1.1.0",
-      "from": "he@>=1.1.0 <1.2.0",
-      "resolved": "https://registry.npmjs.org/he/-/he-1.1.0.tgz"
-    },
-    "header-case": {
-      "version": "1.0.0",
-      "from": "header-case@>=1.0.0 <2.0.0",
-      "resolved": "https://registry.npmjs.org/header-case/-/header-case-1.0.0.tgz"
-    },
-    "hoek": {
-      "version": "2.16.3",
-      "from": "hoek@>=2.0.0 <3.0.0",
-      "resolved": "https://registry.npmjs.org/hoek/-/hoek-2.16.3.tgz"
-    },
-    "hooker": {
-      "version": "0.2.3",
-      "from": "hooker@>=0.2.3 <0.3.0",
-      "resolved": "https://registry.npmjs.org/hooker/-/hooker-0.2.3.tgz"
-    },
-    "hosted-git-info": {
-      "version": "2.1.5",
-      "from": "hosted-git-info@>=2.1.4 <3.0.0",
-      "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.1.5.tgz"
-    },
-    "html-minifier": {
-      "version": "2.1.7",
-      "from": "html-minifier@>=2.1.7 <2.2.0",
-      "resolved": "https://registry.npmjs.org/html-minifier/-/html-minifier-2.1.7.tgz",
-      "dependencies": {
-        "commander": {
-          "version": "2.9.0",
-          "from": "commander@>=2.9.0 <2.10.0",
-          "resolved": "https://registry.npmjs.org/commander/-/commander-2.9.0.tgz"
-        }
-      }
-    },
-    "htmlparser2": {
-      "version": "3.8.3",
-      "from": "htmlparser2@>=3.8.0 <3.9.0",
-      "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.8.3.tgz",
-      "dependencies": {
-        "isarray": {
-          "version": "0.0.1",
-          "from": "isarray@0.0.1",
-          "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz"
-        },
-        "readable-stream": {
-          "version": "1.1.14",
-          "from": "readable-stream@>=1.1.0 <1.2.0",
-          "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz"
-        }
-      }
-    },
-    "http-errors": {
-      "version": "1.5.0",
-      "from": "http-errors@>=1.5.0 <1.6.0",
-      "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.5.0.tgz"
-    },
-    "http-signature": {
-      "version": "1.1.1",
-      "from": "http-signature@>=1.1.0 <1.2.0",
-      "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.1.1.tgz"
-    },
-    "http2": {
-      "version": "3.3.4",
-      "from": "http2@>=3.3.4 <4.0.0",
-      "resolved": "https://registry.npmjs.org/http2/-/http2-3.3.4.tgz"
-    },
-    "https-proxy-agent": {
-      "version": "1.0.0",
-      "from": "https-proxy-agent@>=1.0.0 <2.0.0",
-      "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-1.0.0.tgz"
-    },
-    "i": {
-      "version": "0.3.5",
-      "from": "i@>=0.3.0 <0.4.0",
-      "resolved": "https://registry.npmjs.org/i/-/i-0.3.5.tgz"
-    },
-    "iconv-lite": {
-      "version": "0.4.13",
-      "from": "iconv-lite@>=0.4.13 <0.5.0",
-      "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.13.tgz"
-    },
-    "image-size": {
-      "version": "0.4.0",
-      "from": "image-size@>=0.4.0 <0.5.0",
-      "resolved": "https://registry.npmjs.org/image-size/-/image-size-0.4.0.tgz"
-    },
-    "indent-string": {
-      "version": "2.1.0",
-      "from": "indent-string@>=2.1.0 <3.0.0",
-      "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-2.1.0.tgz"
-    },
-    "inflight": {
-      "version": "1.0.5",
-      "from": "inflight@>=1.0.4 <2.0.0",
-      "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.5.tgz"
-    },
-    "inherit": {
-      "version": "2.2.4",
-      "from": "inherit@>=2.2.2 <3.0.0",
-      "resolved": "https://registry.npmjs.org/inherit/-/inherit-2.2.4.tgz"
-    },
-    "inherits": {
-      "version": "2.0.1",
-      "from": "inherits@>=2.0.0 <3.0.0",
-      "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz"
-    },
-    "interpret": {
-      "version": "1.0.1",
-      "from": "interpret@>=1.0.0 <2.0.0",
-      "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.0.1.tgz"
-    },
-    "is-arrayish": {
-      "version": "0.2.1",
-      "from": "is-arrayish@>=0.2.1 <0.3.0",
-      "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz"
-    },
-    "is-buffer": {
-      "version": "1.1.3",
-      "from": "is-buffer@>=1.0.2 <2.0.0",
-      "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.3.tgz"
-    },
-    "is-builtin-module": {
-      "version": "1.0.0",
-      "from": "is-builtin-module@>=1.0.0 <2.0.0",
-      "resolved": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-1.0.0.tgz"
-    },
-    "is-expression": {
-      "version": "2.0.1",
-      "from": "is-expression@>=2.0.1 <3.0.0",
-      "resolved": "https://registry.npmjs.org/is-expression/-/is-expression-2.0.1.tgz",
-      "dependencies": {
-        "acorn": {
-          "version": "3.1.0",
-          "from": "acorn@>=3.1.0 <3.2.0",
-          "resolved": "https://registry.npmjs.org/acorn/-/acorn-3.1.0.tgz"
-        }
-      }
-    },
-    "is-finite": {
-      "version": "1.0.1",
-      "from": "is-finite@>=1.0.0 <2.0.0",
-      "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.0.1.tgz"
-    },
-    "is-lower-case": {
-      "version": "1.1.3",
-      "from": "is-lower-case@>=1.1.0 <2.0.0",
-      "resolved": "https://registry.npmjs.org/is-lower-case/-/is-lower-case-1.1.3.tgz"
-    },
-    "is-my-json-valid": {
-      "version": "2.13.1",
-      "from": "is-my-json-valid@>=2.12.4 <3.0.0",
-      "resolved": "https://registry.npmjs.org/is-my-json-valid/-/is-my-json-valid-2.13.1.tgz"
-    },
-    "is-promise": {
-      "version": "2.1.0",
-      "from": "is-promise@>=2.0.0 <3.0.0",
-      "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.1.0.tgz"
-    },
-    "is-property": {
-      "version": "1.0.2",
-      "from": "is-property@>=1.0.0 <2.0.0",
-      "resolved": "https://registry.npmjs.org/is-property/-/is-property-1.0.2.tgz"
-    },
-    "is-regex": {
-      "version": "1.0.3",
-      "from": "is-regex@>=1.0.3 <2.0.0",
-      "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.3.tgz"
-    },
-    "is-stream": {
-      "version": "1.1.0",
-      "from": "is-stream@>=1.0.1 <2.0.0",
-      "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz"
-    },
-    "is-typedarray": {
-      "version": "1.0.0",
-      "from": "is-typedarray@>=1.0.0 <1.1.0",
-      "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz"
-    },
-    "is-upper-case": {
-      "version": "1.1.2",
-      "from": "is-upper-case@>=1.1.0 <2.0.0",
-      "resolved": "https://registry.npmjs.org/is-upper-case/-/is-upper-case-1.1.2.tgz"
-    },
-    "is-utf8": {
-      "version": "0.2.1",
-      "from": "is-utf8@>=0.2.0 <0.3.0",
-      "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz"
-    },
-    "isarray": {
-      "version": "1.0.0",
-      "from": "isarray@>=1.0.0 <1.1.0",
-      "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz"
-    },
-    "isexe": {
-      "version": "1.1.2",
-      "from": "isexe@>=1.1.1 <2.0.0",
-      "resolved": "https://registry.npmjs.org/isexe/-/isexe-1.1.2.tgz"
-    },
-    "isstream": {
-      "version": "0.1.2",
-      "from": "isstream@>=0.1.2 <0.2.0",
-      "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz"
-    },
-    "jodid25519": {
-      "version": "1.0.2",
-      "from": "jodid25519@>=1.0.0 <2.0.0",
-      "resolved": "https://registry.npmjs.org/jodid25519/-/jodid25519-1.0.2.tgz"
-    },
-    "js-base64": {
-      "version": "2.1.9",
-      "from": "js-base64@>=2.1.8 <2.2.0",
-      "resolved": "https://registry.npmjs.org/js-base64/-/js-base64-2.1.9.tgz"
-    },
-    "js-stringify": {
-      "version": "1.0.2",
-      "from": "js-stringify@>=1.0.1 <2.0.0",
-      "resolved": "https://registry.npmjs.org/js-stringify/-/js-stringify-1.0.2.tgz"
-    },
-    "js-yaml": {
-      "version": "3.5.5",
-      "from": "js-yaml@>=3.5.2 <3.6.0",
-      "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.5.5.tgz"
-    },
-    "jsbn": {
-      "version": "0.1.0",
-      "from": "jsbn@>=0.1.0 <0.2.0",
-      "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.0.tgz"
-    },
-    "jscs": {
-      "version": "3.0.7",
-      "from": "jscs@>=3.0.5 <3.1.0",
-      "resolved": "https://registry.npmjs.org/jscs/-/jscs-3.0.7.tgz",
-      "dependencies": {
-        "commander": {
-          "version": "2.9.0",
-          "from": "commander@>=2.9.0 <2.10.0",
-          "resolved": "https://registry.npmjs.org/commander/-/commander-2.9.0.tgz"
-        },
-        "glob": {
-          "version": "5.0.15",
-          "from": "glob@>=5.0.1 <6.0.0",
-          "resolved": "https://registry.npmjs.org/glob/-/glob-5.0.15.tgz"
-        },
-        "js-yaml": {
-          "version": "3.4.6",
-          "from": "js-yaml@>=3.4.0 <3.5.0",
-          "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.4.6.tgz"
-        },
-        "vow": {
-          "version": "0.4.12",
-          "from": "vow@>=0.4.8 <0.5.0",
-          "resolved": "https://registry.npmjs.org/vow/-/vow-0.4.12.tgz"
-        },
-        "vow-fs": {
-          "version": "0.3.5",
-          "from": "vow-fs@>=0.3.4 <0.4.0",
-          "resolved": "https://registry.npmjs.org/vow-fs/-/vow-fs-0.3.5.tgz",
-          "dependencies": {
-            "glob": {
-              "version": "4.5.3",
-              "from": "glob@>=4.3.1 <5.0.0",
-              "resolved": "https://registry.npmjs.org/glob/-/glob-4.5.3.tgz"
-            },
-            "minimatch": {
-              "version": "2.0.10",
-              "from": "minimatch@>=2.0.1 <3.0.0",
-              "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-2.0.10.tgz"
-            }
-          }
-        },
-        "vow-queue": {
-          "version": "0.4.2",
-          "from": "vow-queue@>=0.4.1 <0.5.0",
-          "resolved": "https://registry.npmjs.org/vow-queue/-/vow-queue-0.4.2.tgz"
-        }
-      }
-    },
-    "jscs-jsdoc": {
-      "version": "2.0.0",
-      "from": "jscs-jsdoc@>=2.0.0 <3.0.0",
-      "resolved": "https://registry.npmjs.org/jscs-jsdoc/-/jscs-jsdoc-2.0.0.tgz"
-    },
-    "jscs-preset-wikimedia": {
-      "version": "1.0.0",
-      "from": "jscs-preset-wikimedia@>=1.0.0 <1.1.0",
-      "resolved": "https://registry.npmjs.org/jscs-preset-wikimedia/-/jscs-preset-wikimedia-1.0.0.tgz"
-    },
-    "jsdoctypeparser": {
-      "version": "1.2.0",
-      "from": "jsdoctypeparser@>=1.2.0 <1.3.0",
-      "resolved": "https://registry.npmjs.org/jsdoctypeparser/-/jsdoctypeparser-1.2.0.tgz"
-    },
-    "jshint": {
-      "version": "2.9.2",
-      "from": "jshint@>=2.9.1 <2.10.0",
-      "resolved": "https://registry.npmjs.org/jshint/-/jshint-2.9.2.tgz",
-      "dependencies": {
-        "lodash": {
-          "version": "3.7.0",
-          "from": "lodash@>=3.7.0 <3.8.0",
-          "resolved": "https://registry.npmjs.org/lodash/-/lodash-3.7.0.tgz"
-        },
-        "minimatch": {
-          "version": "2.0.10",
-          "from": "minimatch@>=2.0.0 <2.1.0",
-          "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-2.0.10.tgz"
-        },
-        "shelljs": {
-          "version": "0.3.0",
-          "from": "shelljs@>=0.3.0 <0.4.0",
-          "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.3.0.tgz"
-        }
-      }
-    },
-    "json-schema": {
-      "version": "0.2.2",
-      "from": "json-schema@0.2.2",
-      "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.2.tgz"
-    },
-    "json-stringify-safe": {
-      "version": "5.0.1",
-      "from": "json-stringify-safe@>=5.0.1 <5.1.0",
-      "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz"
-    },
-    "jsonfile": {
-      "version": "2.3.1",
-      "from": "jsonfile@>=2.1.0 <3.0.0",
-      "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-2.3.1.tgz"
-    },
-    "jsonlint": {
-      "version": "1.6.2",
-      "from": "jsonlint@>=1.6.2 <1.7.0",
-      "resolved": "https://registry.npmjs.org/jsonlint/-/jsonlint-1.6.2.tgz"
-    },
-    "jsonpointer": {
-      "version": "2.0.0",
-      "from": "jsonpointer@2.0.0",
-      "resolved": "https://registry.npmjs.org/jsonpointer/-/jsonpointer-2.0.0.tgz"
-    },
-    "jsprim": {
-      "version": "1.3.0",
-      "from": "jsprim@>=1.2.2 <2.0.0",
-      "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.3.0.tgz"
-    },
-    "jstransformer": {
-      "version": "1.0.0",
-      "from": "jstransformer@1.0.0",
-      "resolved": "https://registry.npmjs.org/jstransformer/-/jstransformer-1.0.0.tgz"
-    },
-    "JSV": {
-      "version": "4.0.2",
-      "from": "JSV@>=4.0.0",
-      "resolved": "https://registry.npmjs.org/JSV/-/JSV-4.0.2.tgz"
-    },
-    "kew": {
-      "version": "0.7.0",
-      "from": "kew@>=0.7.0 <0.8.0",
-      "resolved": "https://registry.npmjs.org/kew/-/kew-0.7.0.tgz"
-    },
-    "kind-of": {
-      "version": "3.0.3",
-      "from": "kind-of@>=3.0.2 <4.0.0",
-      "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.0.3.tgz"
-    },
-    "klaw": {
-      "version": "1.3.0",
-      "from": "klaw@>=1.0.0 <2.0.0",
-      "resolved": "https://registry.npmjs.org/klaw/-/klaw-1.3.0.tgz"
-    },
-    "lazy-cache": {
-      "version": "1.0.4",
-      "from": "lazy-cache@>=1.0.3 <2.0.0",
-      "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-1.0.4.tgz"
-    },
-    "lazystream": {
-      "version": "1.0.0",
-      "from": "lazystream@>=1.0.0 <2.0.0",
-      "resolved": "https://registry.npmjs.org/lazystream/-/lazystream-1.0.0.tgz"
-    },
-    "less": {
-      "version": "2.6.1",
-      "from": "less@>=2.6.0 <2.7.0",
-      "resolved": "https://registry.npmjs.org/less/-/less-2.6.1.tgz",
-      "dependencies": {
-        "source-map": {
-          "version": "0.5.6",
-          "from": "source-map@>=0.5.3 <0.6.0",
-          "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.6.tgz"
-        }
-      }
-    },
-    "linkify-it": {
-      "version": "2.0.0",
-      "from": "linkify-it@>=2.0.0 <3.0.0",
-      "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-2.0.0.tgz"
-    },
-    "livereload-js": {
-      "version": "2.2.2",
-      "from": "livereload-js@>=2.2.0 <3.0.0",
-      "resolved": "https://registry.npmjs.org/livereload-js/-/livereload-js-2.2.2.tgz"
-    },
-    "load-grunt-tasks": {
-      "version": "3.5.0",
-      "from": "load-grunt-tasks@>=3.5.0 <3.6.0",
-      "resolved": "https://registry.npmjs.org/load-grunt-tasks/-/load-grunt-tasks-3.5.0.tgz"
-    },
-    "load-json-file": {
-      "version": "1.1.0",
-      "from": "load-json-file@>=1.0.0 <2.0.0",
-      "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz"
-    },
-    "lodash": {
-      "version": "3.10.1",
-      "from": "lodash@>=3.10.1 <3.11.0",
-      "resolved": "https://registry.npmjs.org/lodash/-/lodash-3.10.1.tgz"
-    },
-    "longest": {
-      "version": "1.0.1",
-      "from": "longest@>=1.0.1 <2.0.0",
-      "resolved": "https://registry.npmjs.org/longest/-/longest-1.0.1.tgz"
-    },
-    "loud-rejection": {
-      "version": "1.6.0",
-      "from": "loud-rejection@>=1.0.0 <2.0.0",
-      "resolved": "https://registry.npmjs.org/loud-rejection/-/loud-rejection-1.6.0.tgz"
-    },
-    "lower-case": {
-      "version": "1.1.3",
-      "from": "lower-case@>=1.1.1 <2.0.0",
-      "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-1.1.3.tgz"
-    },
-    "lower-case-first": {
-      "version": "1.0.2",
-      "from": "lower-case-first@>=1.0.0 <2.0.0",
-      "resolved": "https://registry.npmjs.org/lower-case-first/-/lower-case-first-1.0.2.tgz"
-    },
-    "lru-cache": {
-      "version": "2.7.3",
-      "from": "lru-cache@>=2.0.0 <3.0.0",
-      "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-2.7.3.tgz"
-    },
-    "map-obj": {
-      "version": "1.0.1",
-      "from": "map-obj@>=1.0.1 <2.0.0",
-      "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz"
-    },
-    "markdown-it": {
-      "version": "7.0.0",
-      "from": "markdown-it@>=7.0.0 <8.0.0",
-      "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-7.0.0.tgz",
-      "dependencies": {
-        "entities": {
-          "version": "1.1.1",
-          "from": "entities@>=1.1.1 <1.2.0",
-          "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.1.tgz"
-        }
-      }
-    },
-    "maxmin": {
-      "version": "1.1.0",
-      "from": "maxmin@>=1.1.0 <2.0.0",
-      "resolved": "https://registry.npmjs.org/maxmin/-/maxmin-1.1.0.tgz",
-      "dependencies": {
-        "pretty-bytes": {
-          "version": "1.0.4",
-          "from": "pretty-bytes@>=1.0.0 <2.0.0",
-          "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-1.0.4.tgz"
-        }
-      }
-    },
-    "mdurl": {
-      "version": "1.0.1",
-      "from": "mdurl@>=1.0.1 <2.0.0",
-      "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-1.0.1.tgz"
-    },
-    "media-typer": {
-      "version": "0.3.0",
-      "from": "media-typer@0.3.0",
-      "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz"
-    },
-    "meow": {
-      "version": "3.7.0",
-      "from": "meow@>=3.3.0 <4.0.0",
-      "resolved": "https://registry.npmjs.org/meow/-/meow-3.7.0.tgz"
-    },
-    "mime": {
-      "version": "1.3.4",
-      "from": "mime@1.3.4",
-      "resolved": "https://registry.npmjs.org/mime/-/mime-1.3.4.tgz"
-    },
-    "mime-db": {
-      "version": "1.23.0",
-      "from": "mime-db@>=1.23.0 <1.24.0",
-      "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.23.0.tgz"
-    },
-    "mime-types": {
-      "version": "2.1.11",
-      "from": "mime-types@>=2.1.11 <2.2.0",
-      "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.11.tgz"
-    },
-    "minimatch": {
-      "version": "3.0.2",
-      "from": "minimatch@>=3.0.2 <4.0.0",
-      "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.2.tgz"
-    },
-    "minimist": {
-      "version": "1.2.0",
-      "from": "minimist@>=1.1.3 <2.0.0",
-      "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz"
-    },
-    "mkdirp": {
-      "version": "0.5.1",
-      "from": "mkdirp@>=0.5.0 <0.6.0",
-      "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz",
-      "dependencies": {
-        "minimist": {
-          "version": "0.0.8",
-          "from": "minimist@0.0.8",
-          "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz"
-        }
-      }
-    },
-    "morgan": {
-      "version": "1.7.0",
-      "from": "morgan@>=1.6.1 <2.0.0",
-      "resolved": "https://registry.npmjs.org/morgan/-/morgan-1.7.0.tgz"
-    },
-    "ms": {
-      "version": "0.7.1",
-      "from": "ms@0.7.1",
-      "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.1.tgz"
-    },
-    "multimatch": {
-      "version": "2.1.0",
-      "from": "multimatch@>=2.0.0 <3.0.0",
-      "resolved": "https://registry.npmjs.org/multimatch/-/multimatch-2.1.0.tgz"
-    },
-    "mute-stream": {
-      "version": "0.0.6",
-      "from": "mute-stream@>=0.0.4 <0.1.0",
-      "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.6.tgz"
-    },
-    "natural-compare": {
-      "version": "1.2.2",
-      "from": "natural-compare@>=1.2.2 <1.3.0",
-      "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.2.2.tgz"
-    },
-    "ncname": {
-      "version": "1.0.0",
-      "from": "ncname@>=1.0.0 <1.1.0",
-      "resolved": "https://registry.npmjs.org/ncname/-/ncname-1.0.0.tgz"
-    },
-    "ncp": {
-      "version": "0.4.2",
-      "from": "ncp@>=0.4.0 <0.5.0",
-      "resolved": "https://registry.npmjs.org/ncp/-/ncp-0.4.2.tgz"
-    },
-    "negotiator": {
-      "version": "0.6.1",
-      "from": "negotiator@0.6.1",
-      "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.1.tgz"
-    },
-    "no-case": {
-      "version": "2.3.0",
-      "from": "no-case@>=2.2.0 <3.0.0",
-      "resolved": "https://registry.npmjs.org/no-case/-/no-case-2.3.0.tgz"
-    },
-    "node-int64": {
-      "version": "0.4.0",
-      "from": "node-int64@>=0.4.0 <0.5.0",
-      "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz"
-    },
-    "node-uuid": {
-      "version": "1.4.7",
-      "from": "node-uuid@>=1.4.7 <1.5.0",
-      "resolved": "https://registry.npmjs.org/node-uuid/-/node-uuid-1.4.7.tgz"
-    },
-    "nomnom": {
-      "version": "1.8.1",
-      "from": "nomnom@>=1.5.0",
-      "resolved": "https://registry.npmjs.org/nomnom/-/nomnom-1.8.1.tgz",
-      "dependencies": {
-        "ansi-styles": {
-          "version": "1.0.0",
-          "from": "ansi-styles@>=1.0.0 <1.1.0",
-          "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-1.0.0.tgz"
-        },
-        "chalk": {
-          "version": "0.4.0",
-          "from": "chalk@>=0.4.0 <0.5.0",
-          "resolved": "https://registry.npmjs.org/chalk/-/chalk-0.4.0.tgz"
-        },
-        "strip-ansi": {
-          "version": "0.1.1",
-          "from": "strip-ansi@>=0.1.0 <0.2.0",
-          "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-0.1.1.tgz"
-        }
-      }
-    },
-    "nopt": {
-      "version": "3.0.6",
-      "from": "nopt@>=3.0.6 <3.1.0",
-      "resolved": "https://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz"
-    },
-    "normalize-package-data": {
-      "version": "2.3.5",
-      "from": "normalize-package-data@>=2.3.4 <3.0.0",
-      "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.3.5.tgz"
-    },
-    "normalize-path": {
-      "version": "2.0.1",
-      "from": "normalize-path@>=2.0.0 <3.0.0",
-      "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.0.1.tgz"
-    },
-    "num2fraction": {
-      "version": "1.2.2",
-      "from": "num2fraction@>=1.1.0 <2.0.0",
-      "resolved": "https://registry.npmjs.org/num2fraction/-/num2fraction-1.2.2.tgz"
-    },
-    "number-is-nan": {
-      "version": "1.0.0",
-      "from": "number-is-nan@>=1.0.0 <2.0.0",
-      "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.0.tgz"
-    },
-    "oauth-sign": {
-      "version": "0.8.2",
-      "from": "oauth-sign@>=0.8.1 <0.9.0",
-      "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.8.2.tgz"
-    },
-    "object-assign": {
-      "version": "4.1.0",
-      "from": "object-assign@>=4.0.1 <5.0.0",
-      "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.0.tgz"
-    },
-    "on-finished": {
-      "version": "2.3.0",
-      "from": "on-finished@>=2.3.0 <2.4.0",
-      "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz"
-    },
-    "on-headers": {
-      "version": "1.0.1",
-      "from": "on-headers@>=1.0.1 <1.1.0",
-      "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.1.tgz"
-    },
-    "once": {
-      "version": "1.3.3",
-      "from": "once@>=1.3.0 <2.0.0",
-      "resolved": "https://registry.npmjs.org/once/-/once-1.3.3.tgz"
-    },
-    "opn": {
-      "version": "4.0.2",
-      "from": "opn@>=4.0.0 <5.0.0",
-      "resolved": "https://registry.npmjs.org/opn/-/opn-4.0.2.tgz"
-    },
-    "os-tmpdir": {
-      "version": "1.0.1",
-      "from": "os-tmpdir@>=1.0.1 <1.1.0",
-      "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.1.tgz"
-    },
-    "package": {
-      "version": "1.0.1",
-      "from": "package@>=1.0.0 <1.2.0",
-      "resolved": "https://registry.npmjs.org/package/-/package-1.0.1.tgz"
-    },
-    "pako": {
-      "version": "0.2.8",
-      "from": "pako@>=0.2.0 <0.3.0",
-      "resolved": "https://registry.npmjs.org/pako/-/pako-0.2.8.tgz"
-    },
-    "param-case": {
-      "version": "2.1.0",
-      "from": "param-case@>=2.1.0 <3.0.0",
-      "resolved": "https://registry.npmjs.org/param-case/-/param-case-2.1.0.tgz"
-    },
-    "parse-json": {
-      "version": "2.2.0",
-      "from": "parse-json@>=2.2.0 <3.0.0",
-      "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz"
-    },
-    "parse-ms": {
-      "version": "1.0.1",
-      "from": "parse-ms@>=1.0.0 <2.0.0",
-      "resolved": "https://registry.npmjs.org/parse-ms/-/parse-ms-1.0.1.tgz"
-    },
-    "parserlib": {
-      "version": "0.2.5",
-      "from": "parserlib@>=0.2.2 <0.3.0",
-      "resolved": "https://registry.npmjs.org/parserlib/-/parserlib-0.2.5.tgz"
-    },
-    "parseurl": {
-      "version": "1.3.1",
-      "from": "parseurl@>=1.3.1 <1.4.0",
-      "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.1.tgz"
-    },
-    "pascal-case": {
-      "version": "2.0.0",
-      "from": "pascal-case@>=2.0.0 <3.0.0",
-      "resolved": "https://registry.npmjs.org/pascal-case/-/pascal-case-2.0.0.tgz"
-    },
-    "path-case": {
-      "version": "2.1.0",
-      "from": "path-case@>=2.1.0 <3.0.0",
-      "resolved": "https://registry.npmjs.org/path-case/-/path-case-2.1.0.tgz"
-    },
-    "path-exists": {
-      "version": "2.1.0",
-      "from": "path-exists@>=2.0.0 <3.0.0",
-      "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz"
-    },
-    "path-is-absolute": {
-      "version": "1.0.0",
-      "from": "path-is-absolute@>=1.0.0 <2.0.0",
-      "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.0.tgz"
-    },
-    "path-type": {
-      "version": "1.1.0",
-      "from": "path-type@>=1.0.0 <2.0.0",
-      "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz"
-    },
-    "pathval": {
-      "version": "0.1.1",
-      "from": "pathval@>=0.1.1 <0.2.0",
-      "resolved": "https://registry.npmjs.org/pathval/-/pathval-0.1.1.tgz"
-    },
-    "pend": {
-      "version": "1.2.0",
-      "from": "pend@>=1.2.0 <1.3.0",
-      "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz"
-    },
-    "phantomjs": {
-      "version": "1.9.20",
-      "from": "phantomjs@>=1.9.0-1 <1.10.0",
-      "resolved": "https://registry.npmjs.org/phantomjs/-/phantomjs-1.9.20.tgz",
-      "dependencies": {
-        "bl": {
-          "version": "1.0.3",
-          "from": "bl@>=1.0.0 <1.1.0",
-          "resolved": "https://registry.npmjs.org/bl/-/bl-1.0.3.tgz"
-        },
-        "qs": {
-          "version": "5.2.0",
-          "from": "qs@>=5.2.0 <5.3.0",
-          "resolved": "https://registry.npmjs.org/qs/-/qs-5.2.0.tgz"
-        },
-        "readable-stream": {
-          "version": "2.0.6",
-          "from": "readable-stream@>=2.0.5 <2.1.0",
-          "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.0.6.tgz"
-        },
-        "request": {
-          "version": "2.67.0",
-          "from": "request@>=2.67.0 <2.68.0",
-          "resolved": "https://registry.npmjs.org/request/-/request-2.67.0.tgz"
-        }
-      }
-    },
-    "pify": {
-      "version": "2.3.0",
-      "from": "pify@>=2.0.0 <3.0.0",
-      "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz"
-    },
-    "pinkie": {
-      "version": "2.0.4",
-      "from": "pinkie@>=2.0.0 <3.0.0",
-      "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz"
-    },
-    "pinkie-promise": {
-      "version": "2.0.1",
-      "from": "pinkie-promise@>=2.0.0 <3.0.0",
-      "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz"
-    },
-    "pkg-up": {
-      "version": "1.0.0",
-      "from": "pkg-up@>=1.0.0 <2.0.0",
-      "resolved": "https://registry.npmjs.org/pkg-up/-/pkg-up-1.0.0.tgz"
-    },
-    "pkginfo": {
-      "version": "0.4.0",
-      "from": "pkginfo@>=0.0.0 <1.0.0",
-      "resolved": "https://registry.npmjs.org/pkginfo/-/pkginfo-0.4.0.tgz"
-    },
-    "plur": {
-      "version": "1.0.0",
-      "from": "plur@>=1.0.0 <2.0.0",
-      "resolved": "https://registry.npmjs.org/plur/-/plur-1.0.0.tgz"
-    },
-    "portscanner": {
-      "version": "1.0.0",
-      "from": "portscanner@>=1.0.0 <2.0.0",
-      "resolved": "https://registry.npmjs.org/portscanner/-/portscanner-1.0.0.tgz",
-      "dependencies": {
-        "async": {
-          "version": "0.1.15",
-          "from": "async@0.1.15",
-          "resolved": "https://registry.npmjs.org/async/-/async-0.1.15.tgz"
-        }
-      }
-    },
-    "postcss": {
-      "version": "4.1.16",
-      "from": "postcss@>=4.1.11 <5.0.0",
-      "resolved": "https://registry.npmjs.org/postcss/-/postcss-4.1.16.tgz"
-    },
-    "pretty-bytes": {
-      "version": "3.0.1",
-      "from": "pretty-bytes@>=3.0.1 <4.0.0",
-      "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-3.0.1.tgz"
-    },
-    "pretty-ms": {
-      "version": "2.1.0",
-      "from": "pretty-ms@>=2.1.0 <3.0.0",
-      "resolved": "https://registry.npmjs.org/pretty-ms/-/pretty-ms-2.1.0.tgz"
-    },
-    "process-nextick-args": {
-      "version": "1.0.7",
-      "from": "process-nextick-args@>=1.0.6 <1.1.0",
-      "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz"
-    },
-    "progress": {
-      "version": "1.1.8",
-      "from": "progress@>=1.1.8 <1.2.0",
-      "resolved": "https://registry.npmjs.org/progress/-/progress-1.1.8.tgz"
-    },
-    "promise": {
-      "version": "7.1.1",
-      "from": "promise@>=7.1.1 <8.0.0",
-      "resolved": "https://registry.npmjs.org/promise/-/promise-7.1.1.tgz"
-    },
-    "prompt": {
-      "version": "0.2.14",
-      "from": "prompt@>=0.2.14 <0.3.0",
-      "resolved": "https://registry.npmjs.org/prompt/-/prompt-0.2.14.tgz"
-    },
-    "prr": {
-      "version": "0.0.0",
-      "from": "prr@>=0.0.0 <0.1.0",
-      "resolved": "https://registry.npmjs.org/prr/-/prr-0.0.0.tgz"
-    },
-    "pug": {
-      "version": "2.0.0-beta3",
-      "from": "pug@>=2.0.0-alpha3 <3.0.0",
-      "resolved": "https://registry.npmjs.org/pug/-/pug-2.0.0-beta3.tgz"
-    },
-    "pug-attrs": {
-      "version": "2.0.1",
-      "from": "pug-attrs@>=2.0.1 <3.0.0",
-      "resolved": "https://registry.npmjs.org/pug-attrs/-/pug-attrs-2.0.1.tgz"
-    },
-    "pug-code-gen": {
-      "version": "0.0.7",
-      "from": "pug-code-gen@0.0.7",
-      "resolved": "https://registry.npmjs.org/pug-code-gen/-/pug-code-gen-0.0.7.tgz"
-    },
-    "pug-error": {
-      "version": "1.3.1",
-      "from": "pug-error@>=1.3.0 <2.0.0",
-      "resolved": "https://registry.npmjs.org/pug-error/-/pug-error-1.3.1.tgz"
-    },
-    "pug-filters": {
-      "version": "1.2.2",
-      "from": "pug-filters@>=1.2.1 <2.0.0",
-      "resolved": "https://registry.npmjs.org/pug-filters/-/pug-filters-1.2.2.tgz"
-    },
-    "pug-lexer": {
-      "version": "2.0.2",
-      "from": "pug-lexer@>=2.0.0 <3.0.0",
-      "resolved": "https://registry.npmjs.org/pug-lexer/-/pug-lexer-2.0.2.tgz"
-    },
-    "pug-linker": {
-      "version": "1.0.0",
-      "from": "pug-linker@>=1.0.0 <2.0.0",
-      "resolved": "https://registry.npmjs.org/pug-linker/-/pug-linker-1.0.0.tgz"
-    },
-    "pug-load": {
-      "version": "2.0.0",
-      "from": "pug-load@>=2.0.0 <3.0.0",
-      "resolved": "https://registry.npmjs.org/pug-load/-/pug-load-2.0.0.tgz"
-    },
-    "pug-parser": {
-      "version": "2.0.1",
-      "from": "pug-parser@>=2.0.0 <3.0.0",
-      "resolved": "https://registry.npmjs.org/pug-parser/-/pug-parser-2.0.1.tgz"
-    },
-    "pug-runtime": {
-      "version": "2.0.1",
-      "from": "pug-runtime@>=2.0.1 <3.0.0",
-      "resolved": "https://registry.npmjs.org/pug-runtime/-/pug-runtime-2.0.1.tgz"
-    },
-    "pug-strip-comments": {
-      "version": "0.0.1",
-      "from": "pug-strip-comments@0.0.1",
-      "resolved": "https://registry.npmjs.org/pug-strip-comments/-/pug-strip-comments-0.0.1.tgz",
-      "dependencies": {
-        "pug-error": {
-          "version": "0.0.0",
-          "from": "pug-error@>=0.0.0 <0.0.1",
-          "resolved": "https://registry.npmjs.org/pug-error/-/pug-error-0.0.0.tgz"
-        }
-      }
-    },
-    "pug-walk": {
-      "version": "0.0.3",
-      "from": "pug-walk@>=0.0.3 <0.0.4",
-      "resolved": "https://registry.npmjs.org/pug-walk/-/pug-walk-0.0.3.tgz"
-    },
-    "q": {
-      "version": "1.4.1",
-      "from": "q@>=1.4.1 <1.5.0",
-      "resolved": "https://registry.npmjs.org/q/-/q-1.4.1.tgz"
-    },
-    "qs": {
-      "version": "6.2.0",
-      "from": "qs@>=6.2.0 <6.3.0",
-      "resolved": "https://registry.npmjs.org/qs/-/qs-6.2.0.tgz"
-    },
-    "range-parser": {
-      "version": "1.2.0",
-      "from": "range-parser@>=1.2.0 <1.3.0",
-      "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.0.tgz"
-    },
-    "raw-body": {
-      "version": "2.1.7",
-      "from": "raw-body@>=2.1.5 <2.2.0",
-      "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.1.7.tgz",
-      "dependencies": {
-        "bytes": {
-          "version": "2.4.0",
-          "from": "bytes@2.4.0",
-          "resolved": "https://registry.npmjs.org/bytes/-/bytes-2.4.0.tgz"
-        }
-      }
-    },
-    "read": {
-      "version": "1.0.7",
-      "from": "read@>=1.0.0 <1.1.0",
-      "resolved": "https://registry.npmjs.org/read/-/read-1.0.7.tgz"
-    },
-    "read-pkg": {
-      "version": "1.1.0",
-      "from": "read-pkg@>=1.0.0 <2.0.0",
-      "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz"
-    },
-    "read-pkg-up": {
-      "version": "1.0.1",
-      "from": "read-pkg-up@>=1.0.1 <2.0.0",
-      "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz"
-    },
-    "readable-stream": {
-      "version": "2.1.4",
-      "from": "readable-stream@>=2.0.0 <3.0.0",
-      "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.1.4.tgz"
-    },
-    "rechoir": {
-      "version": "0.6.2",
-      "from": "rechoir@>=0.6.2 <0.7.0",
-      "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz"
-    },
-    "redent": {
-      "version": "1.0.0",
-      "from": "redent@>=1.0.0 <2.0.0",
-      "resolved": "https://registry.npmjs.org/redent/-/redent-1.0.0.tgz"
-    },
-    "regenerator-runtime": {
-      "version": "0.9.5",
-      "from": "regenerator-runtime@>=0.9.5 <0.10.0",
-      "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.9.5.tgz"
-    },
-    "relateurl": {
-      "version": "0.2.6",
-      "from": "relateurl@>=0.2.0 <0.3.0",
-      "resolved": "https://registry.npmjs.org/relateurl/-/relateurl-0.2.6.tgz"
-    },
-    "repeat-string": {
-      "version": "1.5.4",
-      "from": "repeat-string@>=1.5.2 <2.0.0",
-      "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.5.4.tgz"
-    },
-    "repeating": {
-      "version": "2.0.1",
-      "from": "repeating@>=2.0.0 <3.0.0",
-      "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz"
-    },
-    "request": {
-      "version": "2.73.0",
-      "from": "request@>=2.51.0 <3.0.0",
-      "resolved": "https://registry.npmjs.org/request/-/request-2.73.0.tgz"
-    },
-    "request-progress": {
-      "version": "2.0.1",
-      "from": "request-progress@>=2.0.1 <2.1.0",
-      "resolved": "https://registry.npmjs.org/request-progress/-/request-progress-2.0.1.tgz"
-    },
-    "requestretry": {
-      "version": "1.9.0",
-      "from": "requestretry@>=1.9.0 <1.10.0",
-      "resolved": "https://registry.npmjs.org/requestretry/-/requestretry-1.9.0.tgz"
-    },
-    "reserved-words": {
-      "version": "0.1.1",
-      "from": "reserved-words@>=0.1.1 <0.2.0",
-      "resolved": "https://registry.npmjs.org/reserved-words/-/reserved-words-0.1.1.tgz"
-    },
-    "resolve": {
-      "version": "1.1.7",
-      "from": "resolve@>=1.1.0 <1.2.0",
-      "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz"
-    },
-    "resolve-from": {
-      "version": "2.0.0",
-      "from": "resolve-from@>=2.0.0 <3.0.0",
-      "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-2.0.0.tgz"
-    },
-    "resolve-pkg": {
-      "version": "0.1.0",
-      "from": "resolve-pkg@>=0.1.0 <0.2.0",
-      "resolved": "https://registry.npmjs.org/resolve-pkg/-/resolve-pkg-0.1.0.tgz"
-    },
-    "revalidator": {
-      "version": "0.1.8",
-      "from": "revalidator@>=0.1.0 <0.2.0",
-      "resolved": "https://registry.npmjs.org/revalidator/-/revalidator-0.1.8.tgz"
-    },
-    "right-align": {
-      "version": "0.1.3",
-      "from": "right-align@>=0.1.1 <0.2.0",
-      "resolved": "https://registry.npmjs.org/right-align/-/right-align-0.1.3.tgz"
-    },
-    "rimraf": {
-      "version": "2.2.8",
-      "from": "rimraf@>=2.2.8 <2.3.0",
-      "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.2.8.tgz"
-    },
-    "sauce-tunnel": {
-      "version": "2.5.0",
-      "from": "sauce-tunnel@>=2.5.0 <2.6.0",
-      "resolved": "https://registry.npmjs.org/sauce-tunnel/-/sauce-tunnel-2.5.0.tgz"
-    },
-    "saucelabs": {
-      "version": "1.2.0",
-      "from": "saucelabs@>=1.2.0 <1.3.0",
-      "resolved": "https://registry.npmjs.org/saucelabs/-/saucelabs-1.2.0.tgz"
-    },
-    "semver": {
-      "version": "5.2.0",
-      "from": "semver@>=2.0.0 <3.0.0||>=3.0.0 <4.0.0||>=4.0.0 <5.0.0||>=5.0.0 <6.0.0",
-      "resolved": "https://registry.npmjs.org/semver/-/semver-5.2.0.tgz"
-    },
-    "send": {
-      "version": "0.14.1",
-      "from": "send@0.14.1",
-      "resolved": "https://registry.npmjs.org/send/-/send-0.14.1.tgz"
-    },
-    "sentence-case": {
-      "version": "2.1.0",
-      "from": "sentence-case@>=2.1.0 <3.0.0",
-      "resolved": "https://registry.npmjs.org/sentence-case/-/sentence-case-2.1.0.tgz"
-    },
-    "serve-index": {
-      "version": "1.8.0",
-      "from": "serve-index@>=1.7.1 <2.0.0",
-      "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.8.0.tgz"
-    },
-    "serve-static": {
-      "version": "1.11.1",
-      "from": "serve-static@>=1.10.0 <2.0.0",
-      "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.11.1.tgz"
-    },
-    "setprototypeof": {
-      "version": "1.0.1",
-      "from": "setprototypeof@1.0.1",
-      "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.0.1.tgz"
-    },
-    "shelljs": {
-      "version": "0.7.0",
-      "from": "shelljs@>=0.7.0 <0.8.0",
-      "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.7.0.tgz"
-    },
-    "shx": {
-      "version": "0.1.2",
-      "from": "shx@>=0.1.2 <0.2.0",
-      "resolved": "https://registry.npmjs.org/shx/-/shx-0.1.2.tgz"
-    },
-    "sigmund": {
-      "version": "1.0.1",
-      "from": "sigmund@>=1.0.0 <1.1.0",
-      "resolved": "https://registry.npmjs.org/sigmund/-/sigmund-1.0.1.tgz"
-    },
-    "signal-exit": {
-      "version": "3.0.0",
-      "from": "signal-exit@>=3.0.0 <4.0.0",
-      "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.0.tgz"
-    },
-    "snake-case": {
-      "version": "2.1.0",
-      "from": "snake-case@>=2.1.0 <3.0.0",
-      "resolved": "https://registry.npmjs.org/snake-case/-/snake-case-2.1.0.tgz"
-    },
-    "sntp": {
-      "version": "1.0.9",
-      "from": "sntp@>=1.0.0 <2.0.0",
-      "resolved": "https://registry.npmjs.org/sntp/-/sntp-1.0.9.tgz"
-    },
-    "source-map": {
-      "version": "0.4.4",
-      "from": "source-map@>=0.4.2 <0.5.0",
-      "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.4.4.tgz"
-    },
-    "source-map-support": {
-      "version": "0.4.1",
-      "from": "source-map-support@>=0.4.0 <0.5.0",
-      "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.4.1.tgz",
-      "dependencies": {
-        "source-map": {
-          "version": "0.1.32",
-          "from": "source-map@0.1.32",
-          "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.1.32.tgz"
-        }
-      }
-    },
-    "spdx-correct": {
-      "version": "1.0.2",
-      "from": "spdx-correct@>=1.0.0 <1.1.0",
-      "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-1.0.2.tgz"
-    },
-    "spdx-exceptions": {
-      "version": "1.0.5",
-      "from": "spdx-exceptions@>=1.0.4 <2.0.0",
-      "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-1.0.5.tgz"
-    },
-    "spdx-expression-parse": {
-      "version": "1.0.2",
-      "from": "spdx-expression-parse@>=1.0.0 <1.1.0",
-      "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-1.0.2.tgz"
-    },
-    "spdx-license-ids": {
-      "version": "1.2.1",
-      "from": "spdx-license-ids@>=1.0.2 <2.0.0",
-      "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-1.2.1.tgz"
-    },
-    "split": {
-      "version": "1.0.0",
-      "from": "split@>=1.0.0 <2.0.0",
-      "resolved": "https://registry.npmjs.org/split/-/split-1.0.0.tgz"
-    },
-    "sprintf-js": {
-      "version": "1.0.3",
-      "from": "sprintf-js@>=1.0.2 <1.1.0",
-      "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz"
-    },
-    "sshpk": {
-      "version": "1.8.3",
-      "from": "sshpk@>=1.7.0 <2.0.0",
-      "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.8.3.tgz",
-      "dependencies": {
-        "assert-plus": {
-          "version": "1.0.0",
-          "from": "assert-plus@>=1.0.0 <2.0.0",
-          "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz"
-        }
-      }
-    },
-    "stack-trace": {
-      "version": "0.0.9",
-      "from": "stack-trace@>=0.0.0 <0.1.0",
-      "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.9.tgz"
-    },
-    "statuses": {
-      "version": "1.3.0",
-      "from": "statuses@>=1.3.0 <2.0.0",
-      "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.3.0.tgz"
-    },
-    "stream-buffers": {
-      "version": "2.2.0",
-      "from": "stream-buffers@>=2.1.0 <3.0.0",
-      "resolved": "https://registry.npmjs.org/stream-buffers/-/stream-buffers-2.2.0.tgz"
-    },
-    "string_decoder": {
-      "version": "0.10.31",
-      "from": "string_decoder@>=0.10.0 <0.11.0",
-      "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz"
-    },
-    "stringstream": {
-      "version": "0.0.5",
-      "from": "stringstream@>=0.0.4 <0.1.0",
-      "resolved": "https://registry.npmjs.org/stringstream/-/stringstream-0.0.5.tgz"
-    },
-    "strip-ansi": {
-      "version": "3.0.1",
-      "from": "strip-ansi@>=3.0.0 <4.0.0",
-      "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz"
-    },
-    "strip-bom": {
-      "version": "2.0.0",
-      "from": "strip-bom@>=2.0.0 <3.0.0",
-      "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz"
-    },
-    "strip-indent": {
-      "version": "1.0.1",
-      "from": "strip-indent@>=1.0.1 <2.0.0",
-      "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-1.0.1.tgz"
-    },
-    "strip-json-comments": {
-      "version": "1.0.4",
-      "from": "strip-json-comments@>=1.0.2 <2.0.0",
-      "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-1.0.4.tgz"
-    },
-    "supports-color": {
-      "version": "2.0.0",
-      "from": "supports-color@>=2.0.0 <3.0.0",
-      "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz"
-    },
-    "swap-case": {
-      "version": "1.1.2",
-      "from": "swap-case@>=1.1.0 <2.0.0",
-      "resolved": "https://registry.npmjs.org/swap-case/-/swap-case-1.1.2.tgz"
-    },
-    "tar-stream": {
-      "version": "1.5.2",
-      "from": "tar-stream@>=1.5.0 <2.0.0",
-      "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-1.5.2.tgz"
-    },
-    "temporary": {
-      "version": "0.0.8",
-      "from": "temporary@>=0.0.4 <0.1.0",
-      "resolved": "https://registry.npmjs.org/temporary/-/temporary-0.0.8.tgz"
-    },
-    "text-table": {
-      "version": "0.2.0",
-      "from": "text-table@>=0.2.0 <0.3.0",
-      "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz"
-    },
-    "throttleit": {
-      "version": "1.0.0",
-      "from": "throttleit@>=1.0.0 <2.0.0",
-      "resolved": "https://registry.npmjs.org/throttleit/-/throttleit-1.0.0.tgz"
-    },
-    "through": {
-      "version": "2.3.8",
-      "from": "through@>=2.0.0 <3.0.0",
-      "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz"
-    },
-    "time-grunt": {
-      "version": "1.3.0",
-      "from": "time-grunt@>=1.3.0 <2.0.0",
-      "resolved": "https://registry.npmjs.org/time-grunt/-/time-grunt-1.3.0.tgz"
-    },
-    "tiny-lr": {
-      "version": "0.2.1",
-      "from": "tiny-lr@>=0.2.1 <0.3.0",
-      "resolved": "https://registry.npmjs.org/tiny-lr/-/tiny-lr-0.2.1.tgz",
-      "dependencies": {
-        "qs": {
-          "version": "5.1.0",
-          "from": "qs@>=5.1.0 <5.2.0",
-          "resolved": "https://registry.npmjs.org/qs/-/qs-5.1.0.tgz"
-        }
-      }
-    },
-    "title-case": {
-      "version": "2.1.0",
-      "from": "title-case@>=2.1.0 <3.0.0",
-      "resolved": "https://registry.npmjs.org/title-case/-/title-case-2.1.0.tgz"
-    },
-    "tmp": {
-      "version": "0.0.28",
-      "from": "tmp@>=0.0.28 <0.0.29",
-      "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.28.tgz"
-    },
-    "to-double-quotes": {
-      "version": "2.0.0",
-      "from": "to-double-quotes@>=2.0.0 <3.0.0",
-      "resolved": "https://registry.npmjs.org/to-double-quotes/-/to-double-quotes-2.0.0.tgz"
-    },
-    "to-single-quotes": {
-      "version": "2.0.1",
-      "from": "to-single-quotes@>=2.0.0 <3.0.0",
-      "resolved": "https://registry.npmjs.org/to-single-quotes/-/to-single-quotes-2.0.1.tgz"
-    },
-    "token-stream": {
-      "version": "0.0.1",
-      "from": "token-stream@0.0.1",
-      "resolved": "https://registry.npmjs.org/token-stream/-/token-stream-0.0.1.tgz"
-    },
-    "tough-cookie": {
-      "version": "2.2.2",
-      "from": "tough-cookie@>=2.2.0 <2.3.0",
-      "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.2.2.tgz"
-    },
-    "trim-newlines": {
-      "version": "1.0.0",
-      "from": "trim-newlines@>=1.0.0 <2.0.0",
-      "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-1.0.0.tgz"
-    },
-    "tunnel-agent": {
-      "version": "0.4.3",
-      "from": "tunnel-agent@>=0.4.1 <0.5.0",
-      "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.4.3.tgz"
-    },
-    "tweetnacl": {
-      "version": "0.13.3",
-      "from": "tweetnacl@>=0.13.0 <0.14.0",
-      "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.13.3.tgz"
-    },
-    "type-is": {
-      "version": "1.6.13",
-      "from": "type-is@>=1.6.10 <1.7.0",
-      "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.13.tgz"
-    },
-    "typedarray": {
-      "version": "0.0.6",
-      "from": "typedarray@>=0.0.5 <0.1.0",
-      "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz"
-    },
-    "uc.micro": {
-      "version": "1.0.2",
-      "from": "uc.micro@>=1.0.1 <2.0.0",
-      "resolved": "https://registry.npmjs.org/uc.micro/-/uc.micro-1.0.2.tgz"
-    },
-    "uglify-js": {
-      "version": "2.6.4",
-      "from": "uglify-js@>=2.6.0 <2.7.0",
-      "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-2.6.4.tgz",
-      "dependencies": {
-        "async": {
-          "version": "0.2.10",
-          "from": "async@>=0.2.6 <0.3.0",
-          "resolved": "https://registry.npmjs.org/async/-/async-0.2.10.tgz"
-        },
-        "source-map": {
-          "version": "0.5.6",
-          "from": "source-map@>=0.5.1 <0.6.0",
-          "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.6.tgz"
-        }
-      }
-    },
-    "uglify-to-browserify": {
-      "version": "1.0.2",
-      "from": "uglify-to-browserify@>=1.0.0 <1.1.0",
-      "resolved": "https://registry.npmjs.org/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz"
-    },
-    "underscore": {
-      "version": "1.6.0",
-      "from": "underscore@>=1.6.0 <1.7.0",
-      "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.6.0.tgz"
-    },
-    "underscore.string": {
-      "version": "3.2.3",
-      "from": "underscore.string@>=3.2.3 <3.3.0",
-      "resolved": "https://registry.npmjs.org/underscore.string/-/underscore.string-3.2.3.tgz"
-    },
-    "unpipe": {
-      "version": "1.0.0",
-      "from": "unpipe@>=1.0.0 <1.1.0",
-      "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz"
-    },
-    "upper-case": {
-      "version": "1.1.3",
-      "from": "upper-case@>=1.1.1 <2.0.0",
-      "resolved": "https://registry.npmjs.org/upper-case/-/upper-case-1.1.3.tgz"
-    },
-    "upper-case-first": {
-      "version": "1.1.2",
-      "from": "upper-case-first@>=1.1.0 <2.0.0",
-      "resolved": "https://registry.npmjs.org/upper-case-first/-/upper-case-first-1.1.2.tgz"
-    },
-    "uri-path": {
-      "version": "1.0.0",
-      "from": "uri-path@>=1.0.0 <2.0.0",
-      "resolved": "https://registry.npmjs.org/uri-path/-/uri-path-1.0.0.tgz"
-    },
-    "util-deprecate": {
-      "version": "1.0.2",
-      "from": "util-deprecate@>=1.0.1 <1.1.0",
-      "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz"
-    },
-    "utile": {
-      "version": "0.2.1",
-      "from": "utile@>=0.2.0 <0.3.0",
-      "resolved": "https://registry.npmjs.org/utile/-/utile-0.2.1.tgz",
-      "dependencies": {
-        "async": {
-          "version": "0.2.10",
-          "from": "async@>=0.2.9 <0.3.0",
-          "resolved": "https://registry.npmjs.org/async/-/async-0.2.10.tgz"
-        }
-      }
-    },
-    "utils-merge": {
-      "version": "1.0.0",
-      "from": "utils-merge@1.0.0",
-      "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.0.tgz"
-    },
-    "uuid": {
-      "version": "2.0.2",
-      "from": "uuid@>=2.0.2 <3.0.0",
-      "resolved": "https://registry.npmjs.org/uuid/-/uuid-2.0.2.tgz"
-    },
-    "validate-npm-package-license": {
-      "version": "3.0.1",
-      "from": "validate-npm-package-license@>=3.0.1 <4.0.0",
-      "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.1.tgz"
-    },
-    "verror": {
-      "version": "1.3.6",
-      "from": "verror@1.3.6",
-      "resolved": "https://registry.npmjs.org/verror/-/verror-1.3.6.tgz"
-    },
-    "void-elements": {
-      "version": "2.0.1",
-      "from": "void-elements@>=2.0.1 <3.0.0",
-      "resolved": "https://registry.npmjs.org/void-elements/-/void-elements-2.0.1.tgz"
-    },
-    "vow": {
-      "version": "0.4.4",
-      "from": "vow@0.4.4",
-      "resolved": "https://registry.npmjs.org/vow/-/vow-0.4.4.tgz"
-    },
-    "vow-fs": {
-      "version": "0.3.2",
-      "from": "vow-fs@0.3.2",
-      "resolved": "https://registry.npmjs.org/vow-fs/-/vow-fs-0.3.2.tgz",
-      "dependencies": {
-        "glob": {
-          "version": "3.2.8",
-          "from": "glob@3.2.8",
-          "resolved": "https://registry.npmjs.org/glob/-/glob-3.2.8.tgz"
-        },
-        "minimatch": {
-          "version": "0.2.14",
-          "from": "minimatch@>=0.2.11 <0.3.0",
-          "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-0.2.14.tgz"
-        },
-        "node-uuid": {
-          "version": "1.4.0",
-          "from": "node-uuid@1.4.0",
-          "resolved": "https://registry.npmjs.org/node-uuid/-/node-uuid-1.4.0.tgz"
-        }
-      }
-    },
-    "vow-queue": {
-      "version": "0.3.1",
-      "from": "vow-queue@0.3.1",
-      "resolved": "https://registry.npmjs.org/vow-queue/-/vow-queue-0.3.1.tgz"
-    },
-    "websocket-driver": {
-      "version": "0.6.5",
-      "from": "websocket-driver@>=0.5.1",
-      "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.6.5.tgz"
-    },
-    "websocket-extensions": {
-      "version": "0.1.1",
-      "from": "websocket-extensions@>=0.1.1",
-      "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.1.tgz"
-    },
-    "when": {
-      "version": "3.7.7",
-      "from": "when@>=3.7.5 <3.8.0",
-      "resolved": "https://registry.npmjs.org/when/-/when-3.7.7.tgz"
-    },
-    "which": {
-      "version": "1.2.10",
-      "from": "which@>=1.2.1 <1.3.0",
-      "resolved": "https://registry.npmjs.org/which/-/which-1.2.10.tgz"
-    },
-    "window-size": {
-      "version": "0.1.0",
-      "from": "window-size@0.1.0",
-      "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.1.0.tgz"
-    },
-    "winston": {
-      "version": "0.8.3",
-      "from": "winston@>=0.8.0 <0.9.0",
-      "resolved": "https://registry.npmjs.org/winston/-/winston-0.8.3.tgz",
-      "dependencies": {
-        "async": {
-          "version": "0.2.10",
-          "from": "async@>=0.2.0 <0.3.0",
-          "resolved": "https://registry.npmjs.org/async/-/async-0.2.10.tgz"
-        },
-        "colors": {
-          "version": "0.6.2",
-          "from": "colors@>=0.6.0 <0.7.0",
-          "resolved": "https://registry.npmjs.org/colors/-/colors-0.6.2.tgz"
-        },
-        "pkginfo": {
-          "version": "0.3.1",
-          "from": "pkginfo@>=0.3.0 <0.4.0",
-          "resolved": "https://registry.npmjs.org/pkginfo/-/pkginfo-0.3.1.tgz"
-        }
-      }
-    },
-    "with": {
-      "version": "5.1.1",
-      "from": "with@>=5.0.0 <6.0.0",
-      "resolved": "https://registry.npmjs.org/with/-/with-5.1.1.tgz"
-    },
-    "wordwrap": {
-      "version": "0.0.2",
-      "from": "wordwrap@0.0.2",
-      "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.2.tgz"
-    },
-    "wrappy": {
-      "version": "1.0.2",
-      "from": "wrappy@>=1.0.0 <2.0.0",
-      "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz"
-    },
-    "xml-char-classes": {
-      "version": "1.0.0",
-      "from": "xml-char-classes@>=1.0.0 <2.0.0",
-      "resolved": "https://registry.npmjs.org/xml-char-classes/-/xml-char-classes-1.0.0.tgz"
-    },
-    "xmlbuilder": {
-      "version": "3.1.0",
-      "from": "xmlbuilder@>=3.1.0 <4.0.0",
-      "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-3.1.0.tgz"
-    },
-    "xtend": {
-      "version": "4.0.1",
-      "from": "xtend@>=4.0.0 <5.0.0",
-      "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz"
-    },
-    "yargs": {
-      "version": "3.10.0",
-      "from": "yargs@>=3.10.0 <3.11.0",
-      "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.10.0.tgz",
-      "dependencies": {
-        "camelcase": {
-          "version": "1.2.1",
-          "from": "camelcase@>=1.0.2 <2.0.0",
-          "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-1.2.1.tgz"
-        }
-      }
-    },
-    "yauzl": {
-      "version": "2.4.1",
-      "from": "yauzl@2.4.1",
-      "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.4.1.tgz"
-    },
-    "zip-stream": {
-      "version": "1.0.0",
-      "from": "zip-stream@>=1.0.0 <2.0.0",
-      "resolved": "https://registry.npmjs.org/zip-stream/-/zip-stream-1.0.0.tgz",
-      "dependencies": {
-        "lodash": {
-          "version": "4.13.1",
-          "from": "lodash@>=4.8.0 <5.0.0",
-          "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.13.1.tgz"
-        }
-      }
-    }
-  }
-}

+ 0 - 82
app/Resources/public/assets/bootstrap/grunt/sauce_browsers.yml

@@ -1,82 +0,0 @@
-[
-  # Docs: https://saucelabs.com/docs/platforms/webdriver
-
-  {
-    browserName: "safari",
-    platform: "OS X 10.10"
-  },
-  {
-    browserName: "chrome",
-    platform: "OS X 10.10"
-  },
-  {
-    browserName: "firefox",
-    platform: "OS X 10.10"
-  },
-
-  # Mac Opera not currently supported by Sauce Labs
-
-  {
-    browserName: "internet explorer",
-    version: "11",
-    platform: "Windows 8.1"
-  },
-  {
-    browserName: "internet explorer",
-    version: "10",
-    platform: "Windows 8"
-  },
-  {
-    browserName: "internet explorer",
-    version: "9",
-    platform: "Windows 7"
-  },
-  {
-    browserName: "internet explorer",
-    version: "8",
-    platform: "Windows 7"
-  },
-
-  # { # Unofficial
-  #   browserName: "internet explorer",
-  #   version: "7",
-  #   platform: "Windows XP"
-  # },
-
-  {
-    browserName: "chrome",
-    platform: "Windows 8.1"
-  },
-  {
-    browserName: "firefox",
-    platform: "Windows 8.1"
-  },
-
-  # Win Opera 15+ not currently supported by Sauce Labs
-
-  {
-    browserName: "iphone",
-    platform: "OS X 10.10",
-    version: "9.2"
-  },
-
-  # iOS Chrome not currently supported by Sauce Labs
-
-  # Linux (unofficial)
-  {
-    browserName: "chrome",
-    platform: "Linux"
-  },
-  {
-    browserName: "firefox",
-    platform: "Linux"
-  }
-
-  # Android Chrome not currently supported by Sauce Labs
-
-  # { # Android Browser (super-unofficial)
-  #   browserName: "android",
-  #   version: "4.0",
-  #   platform: "Linux"
-  # }
-]

+ 0 - 8
app/Resources/public/assets/bootstrap/nuget/MyGet.ps1

@@ -1,8 +0,0 @@
-$nuget = $env:NuGet
-
-# parse the version number out of package.json
-$bsversion = ((Get-Content $env:SourcesPath\package.json) -join "`n" | ConvertFrom-Json).version
-
-# create packages
-& $nuget pack "nuget\bootstrap.nuspec" -Verbosity detailed -NonInteractive -NoPackageAnalysis -BasePath $env:SourcesPath -Version $bsversion
-& $nuget pack "nuget\bootstrap.less.nuspec" -Verbosity detailed -NonInteractive -NoPackageAnalysis -BasePath $env:SourcesPath -Version $bsversion

+ 0 - 28
app/Resources/public/assets/bootstrap/nuget/bootstrap.less.nuspec

@@ -1,28 +0,0 @@
-<?xml version="1.0"?>
-<package xmlns="http://schemas.microsoft.com/packaging/2011/08/nuspec.xsd">
-  <metadata>
-    <id>bootstrap.less</id>
-    <version>3.3.7</version>
-    <title>Bootstrap Less</title>
-    <authors>Twitter, Inc.</authors>
-    <owners>bootstrap</owners>
-    <description>The most popular front-end framework for developing responsive, mobile first projects on the web.</description>
-    <releaseNotes>http://blog.getbootstrap.com</releaseNotes>
-    <summary>Bootstrap framework in Less. Includes fonts and JavaScript</summary>
-    <language>en-us</language>
-    <projectUrl>http://getbootstrap.com</projectUrl>
-    <iconUrl>http://getbootstrap.com/apple-touch-icon.png</iconUrl>
-    <licenseUrl>https://github.com/twbs/bootstrap/blob/master/LICENSE</licenseUrl>
-    <copyright>Copyright 2016</copyright>
-    <requireLicenseAcceptance>false</requireLicenseAcceptance>
-    <dependencies>
-      <dependency id="jQuery" version="[1.9.1,4)" />
-    </dependencies>
-    <tags>css js less mobile-first responsive front-end framework web</tags>
-  </metadata>
-  <files>
-    <file src="less\**\*.less" target="content\Content\bootstrap" />
-    <file src="fonts\*.*" target="content\Content\fonts" />
-    <file src="dist\js\bootstrap*.js" target="content\Scripts" />
-  </files>
-</package>

+ 0 - 28
app/Resources/public/assets/bootstrap/nuget/bootstrap.nuspec

@@ -1,28 +0,0 @@
-<?xml version="1.0"?>
-<package xmlns="http://schemas.microsoft.com/packaging/2011/08/nuspec.xsd">
-  <metadata>
-    <id>bootstrap</id>
-    <version>3.3.7</version>
-    <title>Bootstrap CSS</title>
-    <authors>Twitter, Inc.</authors>
-    <owners>bootstrap</owners>
-    <description>The most popular front-end framework for developing responsive, mobile first projects on the web.</description>
-    <releaseNotes>http://blog.getbootstrap.com</releaseNotes>
-    <summary>Bootstrap framework in CSS. Includes fonts and JavaScript</summary>
-    <language>en-us</language>
-    <projectUrl>http://getbootstrap.com</projectUrl>
-    <iconUrl>http://getbootstrap.com/apple-touch-icon.png</iconUrl>
-    <licenseUrl>https://github.com/twbs/bootstrap/blob/master/LICENSE</licenseUrl>
-    <copyright>Copyright 2016</copyright>
-    <requireLicenseAcceptance>false</requireLicenseAcceptance>
-    <dependencies>
-      <dependency id="jQuery" version="[1.9.1,4)" />
-    </dependencies>
-    <tags>css js less mobile-first responsive front-end framework web</tags>
-  </metadata>
-  <files>
-    <file src="dist\css\*.*" target="content\Content" />
-    <file src="dist\fonts\*.*" target="content\fonts" />
-    <file src="dist\js\bootstrap*.js" target="content\Scripts" />
-  </files>
-</package>

+ 0 - 32
app/Resources/public/assets/bootstrap/package.js

@@ -1,32 +0,0 @@
-// package metadata file for Meteor.js
-
-/* jshint strict:false */
-/* global Package:true */
-
-Package.describe({
-  name: 'twbs:bootstrap',  // http://atmospherejs.com/twbs/bootstrap
-  summary: 'The most popular front-end framework for developing responsive, mobile first projects on the web.',
-  version: '3.3.7',
-  git: 'https://github.com/twbs/bootstrap.git'
-});
-
-Package.onUse(function (api) {
-  api.versionsFrom('METEOR@1.0');
-  api.use('jquery', 'client');
-  var assets = [
-    'dist/fonts/glyphicons-halflings-regular.eot',
-    'dist/fonts/glyphicons-halflings-regular.svg',
-    'dist/fonts/glyphicons-halflings-regular.ttf',
-    'dist/fonts/glyphicons-halflings-regular.woff',
-    'dist/fonts/glyphicons-halflings-regular.woff2'
-  ];
-  if (api.addAssets) {
-    api.addAssets(assets, 'client');
-  } else {
-    api.addFiles(assets, 'client', { isAsset: true });
-  }
-  api.addFiles([
-    'dist/css/bootstrap.css',
-    'dist/js/bootstrap.js'
-  ], 'client');
-});

+ 0 - 89
app/Resources/public/assets/bootstrap/package.json

@@ -1,89 +0,0 @@
-{
-  "name": "bootstrap",
-  "description": "The most popular front-end framework for developing responsive, mobile first projects on the web.",
-  "version": "3.3.7",
-  "keywords": [
-    "css",
-    "less",
-    "mobile-first",
-    "responsive",
-    "front-end",
-    "framework",
-    "web"
-  ],
-  "homepage": "http://getbootstrap.com",
-  "author": "Twitter, Inc.",
-  "scripts": {
-    "change-version": "node grunt/change-version.js",
-    "update-shrinkwrap": "npm shrinkwrap --dev && shx mv ./npm-shrinkwrap.json ./grunt/npm-shrinkwrap.json",
-    "test": "grunt test"
-  },
-  "style": "dist/css/bootstrap.css",
-  "less": "less/bootstrap.less",
-  "main": "./dist/js/npm",
-  "repository": {
-    "type": "git",
-    "url": "https://github.com/twbs/bootstrap.git"
-  },
-  "bugs": {
-    "url": "https://github.com/twbs/bootstrap/issues"
-  },
-  "license": "MIT",
-  "devDependencies": {
-    "btoa": "~1.1.2",
-    "glob": "~7.0.3",
-    "grunt": "~1.0.1",
-    "grunt-autoprefixer": "~3.0.4",
-    "grunt-contrib-clean": "~1.0.0",
-    "grunt-contrib-compress": "~1.3.0",
-    "grunt-contrib-concat": "~1.0.0",
-    "grunt-contrib-connect": "~1.0.0",
-    "grunt-contrib-copy": "~1.0.0",
-    "grunt-contrib-csslint": "~1.0.0",
-    "grunt-contrib-cssmin": "~1.0.0",
-    "grunt-contrib-htmlmin": "~1.5.0",
-    "grunt-contrib-jshint": "~1.0.0",
-    "grunt-contrib-less": "~1.3.0",
-    "grunt-contrib-pug": "~1.0.0",
-    "grunt-contrib-qunit": "~0.7.0",
-    "grunt-contrib-uglify": "~1.0.0",
-    "grunt-contrib-watch": "~1.0.0",
-    "grunt-csscomb": "~3.1.0",
-    "grunt-exec": "~1.0.0",
-    "grunt-html": "~8.0.1",
-    "grunt-jekyll": "~0.4.4",
-    "grunt-jscs": "~3.0.1",
-    "grunt-saucelabs": "~9.0.0",
-    "load-grunt-tasks": "~3.5.0",
-    "markdown-it": "^7.0.0",
-    "shelljs": "^0.7.0",
-    "shx": "^0.1.2",
-    "time-grunt": "^1.3.0"
-  },
-  "engines": {
-    "node": ">=0.10.1"
-  },
-  "files": [
-    "dist",
-    "fonts",
-    "grunt",
-    "js/*.js",
-    "less/**/*.less",
-    "Gruntfile.js",
-    "LICENSE"
-  ],
-  "jspm": {
-    "main": "js/bootstrap",
-    "shim": {
-      "js/bootstrap": {
-        "deps": "jquery",
-        "exports": "$"
-      }
-    },
-    "files": [
-      "css",
-      "fonts",
-      "js"
-    ]
-  }
-}

Fichier diff supprimé car celui-ci est trop grand
+ 0 - 0
app/Resources/public/assets/ckeditor/skins/kama/dialog.css


Fichier diff supprimé car celui-ci est trop grand
+ 0 - 0
app/Resources/public/assets/ckeditor/skins/kama/dialog_ie.css


Fichier diff supprimé car celui-ci est trop grand
+ 0 - 0
app/Resources/public/assets/ckeditor/skins/kama/dialog_ie7.css


Fichier diff supprimé car celui-ci est trop grand
+ 0 - 0
app/Resources/public/assets/ckeditor/skins/kama/dialog_ie8.css


Fichier diff supprimé car celui-ci est trop grand
+ 0 - 0
app/Resources/public/assets/ckeditor/skins/kama/dialog_iequirks.css


Fichier diff supprimé car celui-ci est trop grand
+ 0 - 0
app/Resources/public/assets/ckeditor/skins/kama/editor.css


Fichier diff supprimé car celui-ci est trop grand
+ 0 - 0
app/Resources/public/assets/ckeditor/skins/kama/editor_ie.css


Fichier diff supprimé car celui-ci est trop grand
+ 0 - 0
app/Resources/public/assets/ckeditor/skins/kama/editor_ie7.css


Fichier diff supprimé car celui-ci est trop grand
+ 0 - 0
app/Resources/public/assets/ckeditor/skins/kama/editor_ie8.css


Fichier diff supprimé car celui-ci est trop grand
+ 0 - 0
app/Resources/public/assets/ckeditor/skins/kama/editor_iequirks.css


Fichier diff supprimé car celui-ci est trop grand
+ 0 - 0
app/Resources/public/assets/ckeditor/skins/moono/dialog.css


Fichier diff supprimé car celui-ci est trop grand
+ 0 - 0
app/Resources/public/assets/ckeditor/skins/moono/dialog_ie.css


Fichier diff supprimé car celui-ci est trop grand
+ 0 - 0
app/Resources/public/assets/ckeditor/skins/moono/dialog_ie7.css


Fichier diff supprimé car celui-ci est trop grand
+ 0 - 0
app/Resources/public/assets/ckeditor/skins/moono/dialog_ie8.css


Fichier diff supprimé car celui-ci est trop grand
+ 0 - 0
app/Resources/public/assets/ckeditor/skins/moono/dialog_iequirks.css


Fichier diff supprimé car celui-ci est trop grand
+ 0 - 0
app/Resources/public/assets/ckeditor/skins/moono/editor.css


Fichier diff supprimé car celui-ci est trop grand
+ 0 - 0
app/Resources/public/assets/ckeditor/skins/moono/editor_gecko.css


Fichier diff supprimé car celui-ci est trop grand
+ 0 - 0
app/Resources/public/assets/ckeditor/skins/moono/editor_ie.css


Fichier diff supprimé car celui-ci est trop grand
+ 0 - 0
app/Resources/public/assets/ckeditor/skins/moono/editor_ie7.css


Fichier diff supprimé car celui-ci est trop grand
+ 0 - 0
app/Resources/public/assets/ckeditor/skins/moono/editor_ie8.css


Fichier diff supprimé car celui-ci est trop grand
+ 0 - 0
app/Resources/public/assets/ckeditor/skins/moono/editor_iequirks.css


+ 30 - 0
app/Resources/public/assets/jquery.easy-pie-chart/.bower.json

@@ -0,0 +1,30 @@
+{
+  "name": "jquery.easy-pie-chart",
+  "version": "2.1.6",
+  "main": [
+    "dist/jquery.easypiechart.js"
+  ],
+  "ignore": [
+    "demo",
+    ".editorconfig"
+  ],
+  "dependencies": {
+    "jquery": ">=1.9.0",
+    "requirejs": "~2.1.10"
+  },
+  "devDependencies": {
+    "angular": "~1.2.9",
+    "angular-mocks": "~1.2.9"
+  },
+  "homepage": "https://github.com/rendro/easy-pie-chart",
+  "_release": "2.1.6",
+  "_resolution": {
+    "type": "version",
+    "tag": "2.1.6",
+    "commit": "29636bc1cc0ecbd8de9490525724a12dbf723888"
+  },
+  "_source": "https://github.com/rendro/easy-pie-chart.git",
+  "_target": "^2.1.6",
+  "_originalSource": "jquery.easy-pie-chart",
+  "_direct": true
+}

+ 4 - 0
app/Resources/public/assets/jquery.easy-pie-chart/.gitignore

@@ -0,0 +1,4 @@
+node_modules
+bower_components
+.grunt
+_SpecRunner.html

+ 7 - 0
app/Resources/public/assets/jquery.easy-pie-chart/.travis.yml

@@ -0,0 +1,7 @@
+language: node_js
+node_js:
+  - "0.10"
+before_install:
+  - npm install -g karma bower grunt-cli
+  - bower install
+  - npm install

+ 188 - 0
app/Resources/public/assets/jquery.easy-pie-chart/Gruntfile.js

@@ -0,0 +1,188 @@
+module.exports = function(grunt) {
+
+	grunt.initConfig({
+
+		pkg: grunt.file.readJSON('package.json'),
+
+		cfg: {
+			filename: 'easypiechart',
+			vanillaExportName: 'EasyPieChart'
+		},
+
+		dirs: {
+			tmp: 'tmp',
+			src: 'src',
+			dest: 'dist',
+			docs: 'docs',
+			test: 'test',
+			demo: 'demo'
+		},
+
+		clean: {
+			all: ['<%= dirs.dest %>/', '<%= dirs.tmp %>/'],
+			tmp: ['<%= dirs.tmp %>/']
+		},
+
+		concat: {
+			vanilla: {
+				src: [
+					'<%= dirs.src %>/renderer/canvas.js',
+					'<%= dirs.src %>/<%= cfg.filename %>.js'
+				],
+				dest: '<%= dirs.tmp %>/<%= cfg.filename %>.js'
+			},
+			jquery: {
+				src: [
+					'<%= dirs.src %>/renderer/canvas.js',
+					'<%= dirs.src %>/<%= cfg.filename %>.js',
+					'<%= dirs.src %>/jquery.plugin.js'
+				],
+				dest: '<%= dirs.tmp %>/jquery.<%= cfg.filename %>.js'
+			},
+			angular: {
+				src: [
+					'<%= dirs.src %>/angular.directive.js',
+					'<%= dirs.src %>/renderer/canvas.js',
+					'<%= dirs.src %>/<%= cfg.filename %>.js'
+				],
+				dest: '<%= dirs.tmp %>/angular.<%= cfg.filename %>.js'
+			}
+		},
+
+		usebanner: {
+			options: {
+				position: 'top',
+				banner: '/**!\n' +
+						' * <%= pkg.name %>\n' +
+						' * <%= pkg.description %>\n' +
+						' *\n' +
+						' * @license <%= pkg.license %>\n'+
+						' * @author <%= pkg.author.name %> <<%= pkg.author.email %>> (<%= pkg.author.url %>)\n' +
+						' * @version <%= pkg.version %>\n' +
+						' **/\n'
+			},
+			files: {
+				src: [
+					'<%= dirs.dest %>/<%= cfg.filename %>.js',
+					'<%= dirs.dest %>/jquery.<%= cfg.filename %>.js',
+					'<%= dirs.dest %>/angular.<%= cfg.filename %>.js'
+				]
+			}
+		},
+
+		uglify: {
+			dist: {
+				options: {
+					report: 'gzip',
+					preserveComments: 'some'
+				},
+				files: {
+					'dist/<%= cfg.filename %>.min.js': ['dist/<%= cfg.filename %>.js'],
+					'dist/jquery.<%= cfg.filename %>.min.js': ['dist/jquery.<%= cfg.filename %>.js'],
+					'dist/angular.<%= cfg.filename %>.min.js': ['dist/angular.<%= cfg.filename %>.js']
+				}
+			}
+		},
+
+		watch: {
+			gruntfile: {
+				files: ['Gruntfile.js']
+			},
+			scripts: {
+				files: '<%= dirs.src %>/**/*.js',
+				tasks: ['default'],
+				options: {
+					debounceDelay: 250
+				}
+			},
+			less: {
+				files: '<%= dirs.demo %>/*.less',
+				tasks: ['less'],
+				options: {
+					debounceDelay: 250
+				}
+			},
+			readme: {
+				files: '<%= dirs.docs %>/**/*.md',
+				tasks: ['readme'],
+				options: {
+					debounceDelay: 250
+				}
+			}
+		},
+
+		jshint: {
+			files: [
+				'<%= dirs.src %>/**/*.js',
+				'<%= dirs.test %>/**/*.js'
+			],
+			options: {}
+		},
+
+		karma: {
+			unit: {
+				configFile: 'karma.conf.coffee'
+			},
+			ci: {
+				configFile: 'karma.conf.coffee',
+				singleRun: true,
+				browsers: ['PhantomJS']
+			}
+		},
+
+		less: {
+			demo: {
+				files: {
+					'<%= dirs.demo %>/style.css': ['<%= dirs.demo %>/style.less']
+				}
+			}
+		},
+
+		umd: {
+			vanilla: {
+				src: '<%= dirs.tmp %>/<%= cfg.filename %>.js',
+				dest: '<%= dirs.dest %>/<%= cfg.filename %>.js',
+				objectToExport: '<%= cfg.vanillaExportName %>',
+				globalAlias: '<%= cfg.vanillaExportName %>'
+			},
+			jquery: {
+				src: '<%= dirs.tmp %>/jquery.<%= cfg.filename %>.js',
+				dest: '<%= dirs.dest %>/jquery.<%= cfg.filename %>.js',
+				deps: {
+					'default': ['$'],
+					amd: ['jquery'],
+					cjs: ['jquery'],
+					global: ['jQuery']
+				}
+			},
+			angular: {
+				src: '<%= dirs.tmp %>/angular.<%= cfg.filename %>.js',
+				dest: '<%= dirs.dest %>/angular.<%= cfg.filename %>.js',
+				deps: {
+					'default': ['angular'],
+					amd: ['angular'],
+					cjs: ['angular'],
+					global: ['angular']
+				}
+			}
+		}
+	});
+
+	// load all installed grunt tasks
+	require('load-grunt-tasks')(grunt);
+
+	// task defiinitions
+	grunt.registerTask('default', [
+		'clean:all',
+		'jshint',
+		'concat',
+		'umd',
+		'usebanner',
+		'uglify',
+		'clean:tmp',
+		'readme'
+	]);
+
+	grunt.registerTask('test', ['karma:unit']);
+	grunt.registerTask('all', ['default', 'less']);
+};

+ 21 - 0
app/Resources/public/assets/jquery.easy-pie-chart/LICENSE

@@ -0,0 +1,21 @@
+The MIT License (MIT)
+
+Copyright (c) 2013 Robert Fleischmann
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.

+ 268 - 0
app/Resources/public/assets/jquery.easy-pie-chart/Readme.md

@@ -0,0 +1,268 @@
+# easyPieChart
+
+> Lightweight plugin to render simple, animated and retina optimized pie charts
+
+![Version](http://img.shields.io/version/2.1.6.png?color=green)
+[![Build Status](https://travis-ci.org/rendro/easy-pie-chart.png)](https://travis-ci.org/rendro/easy-pie-chart)
+[![Dependencies Status](https://david-dm.org/rendro/easy-pie-chart/dev-status.png)](https://david-dm.org/rendro/easy-pie-chart)
+[![Analytics](https://ga-beacon.appspot.com/UA-46840672-1/easy-pie-chart/readme)](https://github.com/igrigorik/ga-beacon)
+
+
+
+## Features
+[![](https://github.com/rendro/easy-pie-chart/raw/master/demo/img/easy-pie-chart.png)](http://drbl.in/ezuc)
+
+* highly customizable
+* very easy to implement
+* resolution independent (retina optimized)
+* uses `requestAnimationFrame` for smooth animations on modern devices and
+* works in all modern browsers, even in IE7+ with [excanvas](https://code.google.com/p/explorercanvas/wiki/Instructions)
+
+#### framework support
+
+* Vanilla JS *(no dependencies)* (~872 bytes)
+* jQuery plugin (~921 bytes)
+* Angular Module (~983 bytes)
+
+
+
+## Get started
+#### Installation
+
+You can also use [bower](http://bower.io) to install the component:
+
+```
+$ bower install jquery.easy-pie-chart
+```
+
+#### jQuery
+
+To use the easy pie chart plugin you need to load the current version of jQuery (> 1.6.4) and the source of the plugin.
+
+```html
+<div class="chart" data-percent="73" data-scale-color="#ffb400">73%</div>
+
+<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min.js"></script>
+<script src="/path/to/jquery.easy-pie-chart.js"></script>
+<script>
+    $(function() {
+        $('.chart').easyPieChart({
+            //your options goes here
+        });
+    });
+</script>
+```
+
+#### Vanilla JS
+
+If you don't want to use jQuery, implement the Vanilla JS version without any dependencies.
+
+```html
+<div class="chart" data-percent="73">73%</div>
+
+<script src="/path/to/easy-pie-chart.js"></script>
+<script>
+    var element = document.querySelector('.chart');
+    new EasyPieChart(element, {
+        // your options goes here
+    });
+</script>
+```
+
+#### AngularJS
+
+```html
+<div ng-controller="chartCtrl">
+    <div easypiechart options="options" percent="percent"></div>
+</div>
+
+<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.9/angular.min.js"></script>
+<script src="../dist/angular.easypiechart.min.js"></script>
+<script>
+    var app = angular.module('app', ['easypiechart']);
+    app.controller('chartCtrl', ['$scope', function ($scope) {
+        $scope.percent = 65;
+        $scope.options = {
+            animate:{
+                duration:0,
+                enabled:false
+            },
+            barColor:'#2C3E50',
+            scaleColor:false,
+            lineWidth:20,
+            lineCap:'circle'
+        };
+    }]);
+</script>
+```
+
+
+
+## Options
+You can pass these options to the initialize function to set a custom look and feel for the plugin.
+
+<table>
+    <tr>
+        <th>Property (Type)</th>
+        <th>Default</th>
+        <th>Description</th>
+    </tr>
+    <tr>
+        <td><strong>barColor</strong></td>
+        <td>#ef1e25</td>
+        <td>The color of the curcular bar. You can either pass a valid css color string, or a function that takes the current percentage as a value and returns a valid css color string.</td>
+    </tr>
+    <tr>
+        <td><strong>trackColor</strong></td>
+        <td>#f2f2f2</td>
+        <td>The color of the track, or false to disable rendering.</td>
+    </tr>
+    <tr>
+        <td><strong>scaleColor</strong></td>
+        <td>#dfe0e0</td>
+        <td>The color of the scale lines, false to disable rendering.</td>
+    </tr>
+    <tr>
+        <td><strong>scaleLength</strong></td>
+        <td>5</td>
+        <td>Length of the scale lines (reduces the radius of the chart).</td>
+    </tr>
+    <tr>
+        <td><strong>lineCap</strong></td>
+        <td>round</td>
+        <td>Defines how the ending of the bar line looks like. Possible values are: <code>butt</code>, <code>round</code> and <code>square</code>.</td>
+    </tr>
+    <tr>
+        <td><strong>lineWidth</strong></td>
+        <td>3</td>
+        <td>Width of the chart line in px.</td>
+    </tr>
+    <tr>
+        <td><strong>size</strong></td>
+        <td>110</td>
+        <td>Size of the pie chart in px. It will always be a square.</td>
+    </tr>
+        <tr>
+        <td><strong>rotate</strong></td>
+        <td>0</td>
+        <td>Rotation of the complete chart in degrees.</td>
+    </tr>
+    <tr>
+        <td><strong>animate</strong></td>
+        <td>object</td>
+        <td>Object with time in milliseconds and boolean for an animation of the bar growing (<code>{ duration: 1000, enabled: true }</code>), or false to deactivate animations.</td>
+    </tr>
+    <tr>
+        <td><strong>easing</strong></td>
+        <td>defaultEasing</td>
+        <td>Easing function or string with the name of a <a href="http://gsgd.co.uk/sandbox/jquery/easing/" target="_blank">jQuery easing function</a></td>
+    </tr>
+</table>
+
+
+
+## Callbacks
+All callbacks will only be called if `animate` is not `false`.
+
+<table>
+    <tr>
+        <th>Callback(params, ...)</th>
+        <th>Description</th>
+    </tr>
+    <tr>
+        <td><strong>onStart(from, to)</strong></td>
+        <td>Is called at the start of any animation.</td>
+    </tr>
+    <tr>
+        <td><strong>onStep(from, to, currentValue)</strong></td>
+        <td>Is called during animations providing the current value (the method is scoped to the context of th eplugin, so you can access the DOM element via <code>this.el</code>).</td>
+    </tr>
+    <tr>
+        <td><strong>onStop(from, to)</strong></td>
+        <td>Is called at the end of any animation.</td>
+    </tr>
+</table>
+
+
+
+## Plugin api
+#### jQuery
+
+```javascript
+$(function() {
+    // instantiate the plugin
+    ...
+    // update
+    $('.chart').data('easyPieChart').update(40);
+    ...
+    // disable animation
+    $('.chart').data('easyPieChart').disableAnimation();
+    ...
+    // enable animation
+    $('.chart').data('easyPieChart').enableAnimation();
+});
+```
+
+#### Vanilla JS
+
+```javascript
+// instantiate the plugin
+var chart = new EasyPieChart(element, options);
+// update
+chart.update(40);
+// disable animation
+chart.disableAnimation();
+// enable animation
+chart.enableAnimation();
+```
+
+###### Using a gradient
+
+```javascript
+new EasyPieChart(element, {
+  barColor: function(percent) {
+    var ctx = this.renderer.ctx();
+    var canvas = this.renderer.canvas();
+    var gradient = ctx.createLinearGradient(0,0,canvas.width,0);
+        gradient.addColorStop(0, "#ffe57e");
+        gradient.addColorStop(1, "#de5900");
+    return gradient;
+  }
+});
+```
+
+#### AngularJS
+
+For a value binding you need to add the `percent` attribute and bind it to your controller.
+
+#### RequireJS
+
+When using [RequireJS](http://requirejs.org) you can define your own name. Examples can be found in the `demo/requirejs.html`.
+
+
+
+## Browser Support
+Native support
+
+* Chrome
+* Safari
+* FireFox
+* Opera
+* Internet Explorer 9+
+
+Support for Internet Explorer 7 and 8 with [excanvas](https://code.google.com/p/explorercanvas/wiki/Instructions) polyfill.
+
+
+
+## Test
+To run the test just use the karma adapter of grunt: `grunt test`
+
+
+
+## Credits
+Thanks to [Rafal Bromirski](http://www.paranoida.com/) for designing [this dribble shot](http://drbl.in/ezuc) which inspired me building this plugin.
+
+
+
+## Copyright
+Copyright (c) 2014 Robert Fleischmann, contributors. Released under the MIT, GPL licenses

+ 19 - 0
app/Resources/public/assets/jquery.easy-pie-chart/bower.json

@@ -0,0 +1,19 @@
+{
+  "name": "jquery.easy-pie-chart",
+  "version": "2.1.6",
+  "main": [
+    "dist/jquery.easypiechart.js"
+  ],
+  "ignore": [
+    "demo",
+    ".editorconfig"
+  ],
+  "dependencies": {
+    "jquery": ">=1.9.0",
+    "requirejs": "~2.1.10"
+  },
+  "devDependencies": {
+    "angular": "~1.2.9",
+    "angular-mocks": "~1.2.9"
+  }
+}

+ 80 - 0
app/Resources/public/assets/jquery.easy-pie-chart/changelog.md

@@ -0,0 +1,80 @@
+# Changlog
+
+## Version 2.1.5 - Feb 28, 2014
+* Fixed build error for minified vanilla version
+
+## Version 2.1.4 - Feb 1, 2014
+* Various updates and pull requests
+
+## Version 2.1.3 - Dec 1, 2013
+* Allow negative percent values with a reversed pie chart
+
+## Version 2.1.2 - Dec 1, 2013
+* Allow override of default options with data attributes in JQuery plugin
+
+## Version 2.1.1 - Nov 19, 2013
+* Fixed AMD support for jQuery version
+
+## Version 2.1.0 - Oct 28, 2013
+* Added UMD (Universal Module Definition) wrapper for AMD and requireJS support
+* Angular module: Move options into single attribute and provide it as JSON
+* Allow decimal numbers for percent values
+
+## Version 2.0.5 – Oct 12, 2013
+* (Angular) Fixed timer bug
+
+## Version 2.0.4 - Oct 10, 2013
+* Use the internal timing function of angular
+* Added the ability to create two instances of the chart on one main scope
+* Removed unnecessary stuff from the angular example to provide the minimal setup
+* Added more conventional way to create controller in angular
+
+## Version 2.0.3 - Sep 29, 2013
+* Fixed render bug on retina displays
+* Auto detect and load renderer (in preparation of a svg renderer)
+
+## Version 2.0.2 - Sep 26, 2013
+* Improved render performance by approx. 300%
+
+## Version 2.0.1 - Sep 22, 2013
+* Support for Internet Explorer 7 and 8 with excanvas
+
+## Version 2.0.0 - Sep 22, 2013
+* Added vanilla JS version
+* Added angular directive
+* Dropped coffeescript version
+* Dropped support for delayed animations
+* Moved canvas render methods in own module
+
+## Version 1.2.5 - Aug 05, 2013
+* Added default option value for delay
+
+## Version 1.2.4 - Aug 05, 2013
+* bug fix for incomplete animations
+* support for delayed animations
+
+## Version 1.2.3 - Jul 17, 2013
+* Date.now fix for IE < IE9
+
+## Version 1.2.2 - Jul 15, 2013
+* Add `currentValue` and `to` to the onStop callback
+
+## Version 1.2.1 - Jun 19, 2013
+* Allow overriding of options with HTML data attributes where provided
+
+## Version 1.2.0 - Jun 19, 2013
+* Added `rotate` option to rotate the complete chart
+
+## Version 1.1.0 - Jun 10, 2013
+* Added missing `onStop` method
+* cast `percent` to float to avoid breaking chart if a string is passed to the update method
+
+## Version 1.0.2 - Jun 07, 2013
+* Use requestAnimationFrame for smooth animations
+* Added `onStep` option to get the current value during animations
+
+## Version 1.0.1 - Feb 07, 2013
+* Added retina support
+
+## Version 1.0.0 - Aug 02, 2012
+* Initial version

+ 397 - 0
app/Resources/public/assets/jquery.easy-pie-chart/dist/angular.easypiechart.js

@@ -0,0 +1,397 @@
+/**!
+ * easyPieChart
+ * Lightweight plugin to render simple, animated and retina optimized pie charts
+ *
+ * @license 
+ * @author Robert Fleischmann <rendro87@gmail.com> (http://robert-fleischmann.de)
+ * @version 2.1.6
+ **/
+
+(function(root, factory) {
+    if(typeof exports === 'object') {
+        module.exports = factory(require('angular'));
+    }
+    else if(typeof define === 'function' && define.amd) {
+        define(['angular'], factory);
+    }
+    else {
+        factory(root.angular);
+    }
+}(this, function(angular) {
+
+(function (angular) {
+
+	'use strict';
+
+	return angular.module('easypiechart', [])
+
+		.directive('easypiechart', [function() {
+			return {
+				restrict: 'A',
+				require: '?ngModel',
+				scope: {
+					percent: '=',
+					options: '='
+				},
+				link: function (scope, element, attrs) {
+
+					scope.percent = scope.percent || 0;
+
+					/**
+					 * default easy pie chart options
+					 * @type {Object}
+					 */
+					var options = {
+						barColor: '#ef1e25',
+						trackColor: '#f9f9f9',
+						scaleColor: '#dfe0e0',
+						scaleLength: 5,
+						lineCap: 'round',
+						lineWidth: 3,
+						size: 110,
+						rotate: 0,
+						animate: {
+							duration: 1000,
+							enabled: true
+						}
+					};
+					scope.options = angular.extend(options, scope.options);
+
+					var pieChart = new EasyPieChart(element[0], options);
+
+					scope.$watch('percent', function(newVal, oldVal) {
+						pieChart.update(newVal);
+					});
+				}
+			};
+		}]);
+
+})(angular);
+/**
+ * Renderer to render the chart on a canvas object
+ * @param {DOMElement} el      DOM element to host the canvas (root of the plugin)
+ * @param {object}     options options object of the plugin
+ */
+var CanvasRenderer = function(el, options) {
+	var cachedBackground;
+	var canvas = document.createElement('canvas');
+
+	el.appendChild(canvas);
+
+	if (typeof(G_vmlCanvasManager) !== 'undefined') {
+		G_vmlCanvasManager.initElement(canvas);
+	}
+
+	var ctx = canvas.getContext('2d');
+
+	canvas.width = canvas.height = options.size;
+
+	// canvas on retina devices
+	var scaleBy = 1;
+	if (window.devicePixelRatio > 1) {
+		scaleBy = window.devicePixelRatio;
+		canvas.style.width = canvas.style.height = [options.size, 'px'].join('');
+		canvas.width = canvas.height = options.size * scaleBy;
+		ctx.scale(scaleBy, scaleBy);
+	}
+
+	// move 0,0 coordinates to the center
+	ctx.translate(options.size / 2, options.size / 2);
+
+	// rotate canvas -90deg
+	ctx.rotate((-1 / 2 + options.rotate / 180) * Math.PI);
+
+	var radius = (options.size - options.lineWidth) / 2;
+	if (options.scaleColor && options.scaleLength) {
+		radius -= options.scaleLength + 2; // 2 is the distance between scale and bar
+	}
+
+	// IE polyfill for Date
+	Date.now = Date.now || function() {
+		return +(new Date());
+	};
+
+	/**
+	 * Draw a circle around the center of the canvas
+	 * @param {strong} color     Valid CSS color string
+	 * @param {number} lineWidth Width of the line in px
+	 * @param {number} percent   Percentage to draw (float between -1 and 1)
+	 */
+	var drawCircle = function(color, lineWidth, percent) {
+		percent = Math.min(Math.max(-1, percent || 0), 1);
+		var isNegative = percent <= 0 ? true : false;
+
+		ctx.beginPath();
+		ctx.arc(0, 0, radius, 0, Math.PI * 2 * percent, isNegative);
+
+		ctx.strokeStyle = color;
+		ctx.lineWidth = lineWidth;
+
+		ctx.stroke();
+	};
+
+	/**
+	 * Draw the scale of the chart
+	 */
+	var drawScale = function() {
+		var offset;
+		var length;
+
+		ctx.lineWidth = 1;
+		ctx.fillStyle = options.scaleColor;
+
+		ctx.save();
+		for (var i = 24; i > 0; --i) {
+			if (i % 6 === 0) {
+				length = options.scaleLength;
+				offset = 0;
+			} else {
+				length = options.scaleLength * 0.6;
+				offset = options.scaleLength - length;
+			}
+			ctx.fillRect(-options.size/2 + offset, 0, length, 1);
+			ctx.rotate(Math.PI / 12);
+		}
+		ctx.restore();
+	};
+
+	/**
+	 * Request animation frame wrapper with polyfill
+	 * @return {function} Request animation frame method or timeout fallback
+	 */
+	var reqAnimationFrame = (function() {
+		return  window.requestAnimationFrame ||
+				window.webkitRequestAnimationFrame ||
+				window.mozRequestAnimationFrame ||
+				function(callback) {
+					window.setTimeout(callback, 1000 / 60);
+				};
+	}());
+
+	/**
+	 * Draw the background of the plugin including the scale and the track
+	 */
+	var drawBackground = function() {
+		if(options.scaleColor) drawScale();
+		if(options.trackColor) drawCircle(options.trackColor, options.trackWidth || options.lineWidth, 1);
+	};
+
+  /**
+    * Canvas accessor
+   */
+  this.getCanvas = function() {
+    return canvas;
+  };
+
+  /**
+    * Canvas 2D context 'ctx' accessor
+   */
+  this.getCtx = function() {
+    return ctx;
+  };
+
+	/**
+	 * Clear the complete canvas
+	 */
+	this.clear = function() {
+		ctx.clearRect(options.size / -2, options.size / -2, options.size, options.size);
+	};
+
+	/**
+	 * Draw the complete chart
+	 * @param {number} percent Percent shown by the chart between -100 and 100
+	 */
+	this.draw = function(percent) {
+		// do we need to render a background
+		if (!!options.scaleColor || !!options.trackColor) {
+			// getImageData and putImageData are supported
+			if (ctx.getImageData && ctx.putImageData) {
+				if (!cachedBackground) {
+					drawBackground();
+					cachedBackground = ctx.getImageData(0, 0, options.size * scaleBy, options.size * scaleBy);
+				} else {
+					ctx.putImageData(cachedBackground, 0, 0);
+				}
+			} else {
+				this.clear();
+				drawBackground();
+			}
+		} else {
+			this.clear();
+		}
+
+		ctx.lineCap = options.lineCap;
+
+		// if barcolor is a function execute it and pass the percent as a value
+		var color;
+		if (typeof(options.barColor) === 'function') {
+			color = options.barColor(percent);
+		} else {
+			color = options.barColor;
+		}
+
+		// draw bar
+		drawCircle(color, options.lineWidth, percent / 100);
+	}.bind(this);
+
+	/**
+	 * Animate from some percent to some other percentage
+	 * @param {number} from Starting percentage
+	 * @param {number} to   Final percentage
+	 */
+	this.animate = function(from, to) {
+		var startTime = Date.now();
+		options.onStart(from, to);
+		var animation = function() {
+			var process = Math.min(Date.now() - startTime, options.animate.duration);
+			var currentValue = options.easing(this, process, from, to - from, options.animate.duration);
+			this.draw(currentValue);
+			options.onStep(from, to, currentValue);
+			if (process >= options.animate.duration) {
+				options.onStop(from, to);
+			} else {
+				reqAnimationFrame(animation);
+			}
+		}.bind(this);
+
+		reqAnimationFrame(animation);
+	}.bind(this);
+};
+
+var EasyPieChart = function(el, opts) {
+	var defaultOptions = {
+		barColor: '#ef1e25',
+		trackColor: '#f9f9f9',
+		scaleColor: '#dfe0e0',
+		scaleLength: 5,
+		lineCap: 'round',
+		lineWidth: 3,
+		trackWidth: undefined,
+		size: 110,
+		rotate: 0,
+		animate: {
+			duration: 1000,
+			enabled: true
+		},
+		easing: function (x, t, b, c, d) { // more can be found here: http://gsgd.co.uk/sandbox/jquery/easing/
+			t = t / (d/2);
+			if (t < 1) {
+				return c / 2 * t * t + b;
+			}
+			return -c/2 * ((--t)*(t-2) - 1) + b;
+		},
+		onStart: function(from, to) {
+			return;
+		},
+		onStep: function(from, to, currentValue) {
+			return;
+		},
+		onStop: function(from, to) {
+			return;
+		}
+	};
+
+	// detect present renderer
+	if (typeof(CanvasRenderer) !== 'undefined') {
+		defaultOptions.renderer = CanvasRenderer;
+	} else if (typeof(SVGRenderer) !== 'undefined') {
+		defaultOptions.renderer = SVGRenderer;
+	} else {
+		throw new Error('Please load either the SVG- or the CanvasRenderer');
+	}
+
+	var options = {};
+	var currentValue = 0;
+
+	/**
+	 * Initialize the plugin by creating the options object and initialize rendering
+	 */
+	var init = function() {
+		this.el = el;
+		this.options = options;
+
+		// merge user options into default options
+		for (var i in defaultOptions) {
+			if (defaultOptions.hasOwnProperty(i)) {
+				options[i] = opts && typeof(opts[i]) !== 'undefined' ? opts[i] : defaultOptions[i];
+				if (typeof(options[i]) === 'function') {
+					options[i] = options[i].bind(this);
+				}
+			}
+		}
+
+		// check for jQuery easing
+		if (typeof(options.easing) === 'string' && typeof(jQuery) !== 'undefined' && jQuery.isFunction(jQuery.easing[options.easing])) {
+			options.easing = jQuery.easing[options.easing];
+		} else {
+			options.easing = defaultOptions.easing;
+		}
+
+		// process earlier animate option to avoid bc breaks
+		if (typeof(options.animate) === 'number') {
+			options.animate = {
+				duration: options.animate,
+				enabled: true
+			};
+		}
+
+		if (typeof(options.animate) === 'boolean' && !options.animate) {
+			options.animate = {
+				duration: 1000,
+				enabled: options.animate
+			};
+		}
+
+		// create renderer
+		this.renderer = new options.renderer(el, options);
+
+		// initial draw
+		this.renderer.draw(currentValue);
+
+		// initial update
+		if (el.dataset && el.dataset.percent) {
+			this.update(parseFloat(el.dataset.percent));
+		} else if (el.getAttribute && el.getAttribute('data-percent')) {
+			this.update(parseFloat(el.getAttribute('data-percent')));
+		}
+	}.bind(this);
+
+	/**
+	 * Update the value of the chart
+	 * @param  {number} newValue Number between 0 and 100
+	 * @return {object}          Instance of the plugin for method chaining
+	 */
+	this.update = function(newValue) {
+		newValue = parseFloat(newValue);
+		if (options.animate.enabled) {
+			this.renderer.animate(currentValue, newValue);
+		} else {
+			this.renderer.draw(newValue);
+		}
+		currentValue = newValue;
+		return this;
+	}.bind(this);
+
+	/**
+	 * Disable animation
+	 * @return {object} Instance of the plugin for method chaining
+	 */
+	this.disableAnimation = function() {
+		options.animate.enabled = false;
+		return this;
+	};
+
+	/**
+	 * Enable animation
+	 * @return {object} Instance of the plugin for method chaining
+	 */
+	this.enableAnimation = function() {
+		options.animate.enabled = true;
+		return this;
+	};
+
+	init();
+};
+
+
+}));

Fichier diff supprimé car celui-ci est trop grand
+ 8 - 0
app/Resources/public/assets/jquery.easy-pie-chart/dist/angular.easypiechart.min.js


+ 351 - 0
app/Resources/public/assets/jquery.easy-pie-chart/dist/easypiechart.js

@@ -0,0 +1,351 @@
+/**!
+ * easyPieChart
+ * Lightweight plugin to render simple, animated and retina optimized pie charts
+ *
+ * @license 
+ * @author Robert Fleischmann <rendro87@gmail.com> (http://robert-fleischmann.de)
+ * @version 2.1.6
+ **/
+
+(function(root, factory) {
+    if(typeof exports === 'object') {
+        module.exports = factory();
+    }
+    else if(typeof define === 'function' && define.amd) {
+        define([], factory);
+    }
+    else {
+        root['EasyPieChart'] = factory();
+    }
+}(this, function() {
+
+/**
+ * Renderer to render the chart on a canvas object
+ * @param {DOMElement} el      DOM element to host the canvas (root of the plugin)
+ * @param {object}     options options object of the plugin
+ */
+var CanvasRenderer = function(el, options) {
+	var cachedBackground;
+	var canvas = document.createElement('canvas');
+
+	el.appendChild(canvas);
+
+	if (typeof(G_vmlCanvasManager) !== 'undefined') {
+		G_vmlCanvasManager.initElement(canvas);
+	}
+
+	var ctx = canvas.getContext('2d');
+
+	canvas.width = canvas.height = options.size;
+
+	// canvas on retina devices
+	var scaleBy = 1;
+	if (window.devicePixelRatio > 1) {
+		scaleBy = window.devicePixelRatio;
+		canvas.style.width = canvas.style.height = [options.size, 'px'].join('');
+		canvas.width = canvas.height = options.size * scaleBy;
+		ctx.scale(scaleBy, scaleBy);
+	}
+
+	// move 0,0 coordinates to the center
+	ctx.translate(options.size / 2, options.size / 2);
+
+	// rotate canvas -90deg
+	ctx.rotate((-1 / 2 + options.rotate / 180) * Math.PI);
+
+	var radius = (options.size - options.lineWidth) / 2;
+	if (options.scaleColor && options.scaleLength) {
+		radius -= options.scaleLength + 2; // 2 is the distance between scale and bar
+	}
+
+	// IE polyfill for Date
+	Date.now = Date.now || function() {
+		return +(new Date());
+	};
+
+	/**
+	 * Draw a circle around the center of the canvas
+	 * @param {strong} color     Valid CSS color string
+	 * @param {number} lineWidth Width of the line in px
+	 * @param {number} percent   Percentage to draw (float between -1 and 1)
+	 */
+	var drawCircle = function(color, lineWidth, percent) {
+		percent = Math.min(Math.max(-1, percent || 0), 1);
+		var isNegative = percent <= 0 ? true : false;
+
+		ctx.beginPath();
+		ctx.arc(0, 0, radius, 0, Math.PI * 2 * percent, isNegative);
+
+		ctx.strokeStyle = color;
+		ctx.lineWidth = lineWidth;
+
+		ctx.stroke();
+	};
+
+	/**
+	 * Draw the scale of the chart
+	 */
+	var drawScale = function() {
+		var offset;
+		var length;
+
+		ctx.lineWidth = 1;
+		ctx.fillStyle = options.scaleColor;
+
+		ctx.save();
+		for (var i = 24; i > 0; --i) {
+			if (i % 6 === 0) {
+				length = options.scaleLength;
+				offset = 0;
+			} else {
+				length = options.scaleLength * 0.6;
+				offset = options.scaleLength - length;
+			}
+			ctx.fillRect(-options.size/2 + offset, 0, length, 1);
+			ctx.rotate(Math.PI / 12);
+		}
+		ctx.restore();
+	};
+
+	/**
+	 * Request animation frame wrapper with polyfill
+	 * @return {function} Request animation frame method or timeout fallback
+	 */
+	var reqAnimationFrame = (function() {
+		return  window.requestAnimationFrame ||
+				window.webkitRequestAnimationFrame ||
+				window.mozRequestAnimationFrame ||
+				function(callback) {
+					window.setTimeout(callback, 1000 / 60);
+				};
+	}());
+
+	/**
+	 * Draw the background of the plugin including the scale and the track
+	 */
+	var drawBackground = function() {
+		if(options.scaleColor) drawScale();
+		if(options.trackColor) drawCircle(options.trackColor, options.trackWidth || options.lineWidth, 1);
+	};
+
+  /**
+    * Canvas accessor
+   */
+  this.getCanvas = function() {
+    return canvas;
+  };
+
+  /**
+    * Canvas 2D context 'ctx' accessor
+   */
+  this.getCtx = function() {
+    return ctx;
+  };
+
+	/**
+	 * Clear the complete canvas
+	 */
+	this.clear = function() {
+		ctx.clearRect(options.size / -2, options.size / -2, options.size, options.size);
+	};
+
+	/**
+	 * Draw the complete chart
+	 * @param {number} percent Percent shown by the chart between -100 and 100
+	 */
+	this.draw = function(percent) {
+		// do we need to render a background
+		if (!!options.scaleColor || !!options.trackColor) {
+			// getImageData and putImageData are supported
+			if (ctx.getImageData && ctx.putImageData) {
+				if (!cachedBackground) {
+					drawBackground();
+					cachedBackground = ctx.getImageData(0, 0, options.size * scaleBy, options.size * scaleBy);
+				} else {
+					ctx.putImageData(cachedBackground, 0, 0);
+				}
+			} else {
+				this.clear();
+				drawBackground();
+			}
+		} else {
+			this.clear();
+		}
+
+		ctx.lineCap = options.lineCap;
+
+		// if barcolor is a function execute it and pass the percent as a value
+		var color;
+		if (typeof(options.barColor) === 'function') {
+			color = options.barColor(percent);
+		} else {
+			color = options.barColor;
+		}
+
+		// draw bar
+		drawCircle(color, options.lineWidth, percent / 100);
+	}.bind(this);
+
+	/**
+	 * Animate from some percent to some other percentage
+	 * @param {number} from Starting percentage
+	 * @param {number} to   Final percentage
+	 */
+	this.animate = function(from, to) {
+		var startTime = Date.now();
+		options.onStart(from, to);
+		var animation = function() {
+			var process = Math.min(Date.now() - startTime, options.animate.duration);
+			var currentValue = options.easing(this, process, from, to - from, options.animate.duration);
+			this.draw(currentValue);
+			options.onStep(from, to, currentValue);
+			if (process >= options.animate.duration) {
+				options.onStop(from, to);
+			} else {
+				reqAnimationFrame(animation);
+			}
+		}.bind(this);
+
+		reqAnimationFrame(animation);
+	}.bind(this);
+};
+
+var EasyPieChart = function(el, opts) {
+	var defaultOptions = {
+		barColor: '#ef1e25',
+		trackColor: '#f9f9f9',
+		scaleColor: '#dfe0e0',
+		scaleLength: 5,
+		lineCap: 'round',
+		lineWidth: 3,
+		trackWidth: undefined,
+		size: 110,
+		rotate: 0,
+		animate: {
+			duration: 1000,
+			enabled: true
+		},
+		easing: function (x, t, b, c, d) { // more can be found here: http://gsgd.co.uk/sandbox/jquery/easing/
+			t = t / (d/2);
+			if (t < 1) {
+				return c / 2 * t * t + b;
+			}
+			return -c/2 * ((--t)*(t-2) - 1) + b;
+		},
+		onStart: function(from, to) {
+			return;
+		},
+		onStep: function(from, to, currentValue) {
+			return;
+		},
+		onStop: function(from, to) {
+			return;
+		}
+	};
+
+	// detect present renderer
+	if (typeof(CanvasRenderer) !== 'undefined') {
+		defaultOptions.renderer = CanvasRenderer;
+	} else if (typeof(SVGRenderer) !== 'undefined') {
+		defaultOptions.renderer = SVGRenderer;
+	} else {
+		throw new Error('Please load either the SVG- or the CanvasRenderer');
+	}
+
+	var options = {};
+	var currentValue = 0;
+
+	/**
+	 * Initialize the plugin by creating the options object and initialize rendering
+	 */
+	var init = function() {
+		this.el = el;
+		this.options = options;
+
+		// merge user options into default options
+		for (var i in defaultOptions) {
+			if (defaultOptions.hasOwnProperty(i)) {
+				options[i] = opts && typeof(opts[i]) !== 'undefined' ? opts[i] : defaultOptions[i];
+				if (typeof(options[i]) === 'function') {
+					options[i] = options[i].bind(this);
+				}
+			}
+		}
+
+		// check for jQuery easing
+		if (typeof(options.easing) === 'string' && typeof(jQuery) !== 'undefined' && jQuery.isFunction(jQuery.easing[options.easing])) {
+			options.easing = jQuery.easing[options.easing];
+		} else {
+			options.easing = defaultOptions.easing;
+		}
+
+		// process earlier animate option to avoid bc breaks
+		if (typeof(options.animate) === 'number') {
+			options.animate = {
+				duration: options.animate,
+				enabled: true
+			};
+		}
+
+		if (typeof(options.animate) === 'boolean' && !options.animate) {
+			options.animate = {
+				duration: 1000,
+				enabled: options.animate
+			};
+		}
+
+		// create renderer
+		this.renderer = new options.renderer(el, options);
+
+		// initial draw
+		this.renderer.draw(currentValue);
+
+		// initial update
+		if (el.dataset && el.dataset.percent) {
+			this.update(parseFloat(el.dataset.percent));
+		} else if (el.getAttribute && el.getAttribute('data-percent')) {
+			this.update(parseFloat(el.getAttribute('data-percent')));
+		}
+	}.bind(this);
+
+	/**
+	 * Update the value of the chart
+	 * @param  {number} newValue Number between 0 and 100
+	 * @return {object}          Instance of the plugin for method chaining
+	 */
+	this.update = function(newValue) {
+		newValue = parseFloat(newValue);
+		if (options.animate.enabled) {
+			this.renderer.animate(currentValue, newValue);
+		} else {
+			this.renderer.draw(newValue);
+		}
+		currentValue = newValue;
+		return this;
+	}.bind(this);
+
+	/**
+	 * Disable animation
+	 * @return {object} Instance of the plugin for method chaining
+	 */
+	this.disableAnimation = function() {
+		options.animate.enabled = false;
+		return this;
+	};
+
+	/**
+	 * Enable animation
+	 * @return {object} Instance of the plugin for method chaining
+	 */
+	this.enableAnimation = function() {
+		options.animate.enabled = true;
+		return this;
+	};
+
+	init();
+};
+
+
+return EasyPieChart;
+
+}));

Certains fichiers n'ont pas été affichés car il y a eu trop de fichiers modifiés dans ce diff