diff --git a/.gitignore b/.gitignore
index 1423dc8..e53b77f 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,2 +1,4 @@
-lib/*
 tests/phpunit.xml
+
+# Ignore Composer's generated lock file.
+composer.lock
diff --git a/commands/runserver/runserver.drush.inc b/commands/runserver/runserver.drush.inc
index 711412f..c81ba0c 100644
--- a/commands/runserver/runserver.drush.inc
+++ b/commands/runserver/runserver.drush.inc
@@ -10,21 +10,6 @@
  */
 
 /**
- * Supported version of httpserver. This is displayed in the manual install help.
- */
-define('DRUSH_HTTPSERVER_VERSION', '41dd2b7160b8cbd25d7b5383e3ffc6d8a9a59478');
-
-/**
- * Directory name for httpserver. This is displayed in the manual install help.
- */
-define('DRUSH_HTTPSERVER_DIR_BASE', 'youngj-httpserver-');
-
-/**
- * Base URL for automatic download of supported version of httpserver.
- */
-define('DRUSH_HTTPSERVER_BASE_URL', 'https://github.com/youngj/httpserver/tarball/');
-
-/**
  * Implementation of hook_drush_help().
  */
 function runserver_drush_help($section) {
@@ -106,22 +91,6 @@ function drush_core_runserver_validate() {
     return drush_set_error('RUNSERVER_PHP_CGI', dt('The runserver command with the "builtin" server requires php 5.4 (or higher), which could not be found.'));
   }
 
-  // Update with detected configuration.
-  $server = drush_get_option('server', FALSE);
-  if ($server == 'cgi') {
-    // Fetch httpserver cgi based server to our /lib directory, if needed.
-    $lib = drush_get_option('lib', DRUSH_BASE_PATH . '/lib');
-    $httpserverfile = $lib . '/' . DRUSH_HTTPSERVER_DIR_BASE . substr(DRUSH_HTTPSERVER_VERSION, 0, 7) . '/httpserver.php';
-    if (!drush_file_not_empty($httpserverfile)) {
-      // Download and extract httpserver, and confirm success.
-      drush_lib_fetch(DRUSH_HTTPSERVER_BASE_URL . DRUSH_HTTPSERVER_VERSION);
-      if (!drush_file_not_empty($httpserverfile)) {
-        // Something went wrong - the library is still not present.
-        return drush_set_error('RUNSERVER_HTTPSERVER_LIB_NOT_FOUND', dt("The runserver command needs a copy of the httpserver library in order to function, and the attempt to download this file automatically failed. To continue you will need to download the package from !url, extract it into the !lib directory, such that httpserver.php exists at !httpserverfile.", array('!version' => DRUSH_HTTPSERVER_VERSION, '!url' => DRUSH_HTTPSERVER_BASE_URL . DRUSH_HTTPSERVER_VERSION, '!httpserverfile' => $httpserverfile, '!lib' => $lib)));
-      }
-    }
-  }
-
   // Check we have a valid server.
   if (!in_array($server, array('cgi', 'builtin'))) {
     return drush_set_error('RUNSERVER_INVALID', dt('Invalid server specified.'));
@@ -223,10 +192,7 @@ function drush_core_runserver($uri = NULL) {
     drush_shell_exec_interactive($php . ' -S ' . $addr . ':' . $uri['port'] . ' --define auto_prepend_file="' . DRUSH_BASE_PATH . '/commands/runserver/runserver-prepend.php"');
   }
   else {
-    // Include the library and our class that extends it.
-    $lib = drush_get_option('lib', DRUSH_BASE_PATH . '/lib');
-    $httpserverfile = $lib . '/' . DRUSH_HTTPSERVER_DIR_BASE . substr(DRUSH_HTTPSERVER_VERSION, 0, 7) . '/httpserver.php';
-    require_once $httpserverfile;
+    // Include the Drush class that uses the autoloaded HTTPServer.
     require_once 'runserver-drupal.inc';
     // Create a new httpserver instance and start it running.
     $server = new DrupalServer(array(
diff --git a/composer.json b/composer.json
new file mode 100644
index 0000000..3517646
--- /dev/null
+++ b/composer.json
@@ -0,0 +1,47 @@
+{
+  "name": "drush",
+  "description": "",
+  "keywords": [],
+  "homepage": "http://drupal.org/project/drush",
+  "license": "GPLv3",
+  "authors": [
+    { "name": "Moshe Weitzman", "email": "weitzman@tejasa.com" },
+    { "name": "Owen Barton", "email": "drupal@owenbarton.com" },
+    { "name": "Mark Sonnabaum", "email": "marksonnabaum@gmail.com" },
+    { "name": "Antoine Beaupré", "email": "anarcat@koumbit.org" },
+    { "name": "Greg Anderson", "email": "greg.1.anderson@greenknowe.org" },
+    { "name": "Jonathan Araña Cruz", "email": "jonhattan@faita.net" },
+    { "name": "Jonathan Hedstrom", "email": "jhedstrom@gmail.com" }
+  ],
+  "repositories": [
+    {
+      "type": "pear",
+      "url": "http://pear.php.net"
+    },
+    {
+      "type": "package",
+      "package": {
+        "name": "youngj/httpserver",
+        "version": "1.0.0",
+        "source": {
+          "url": "https://github.com/youngj/httpserver",
+          "type": "git",
+          "reference": "41dd2b7160b8cbd25d7b5383e3ffc6d8a9a59478"
+        },
+        "autoload": {
+          "classmap": { "HTTPServer": "" }
+        }
+      }
+    }
+  ],
+  "autoload": {
+    "psr-0": { "Drush": "lib/" },
+    "classmap": [ "vendor/pear-pear/Console_Table/" ]
+  },
+  "require": {
+    "php": ">=5.3.2",
+    "symfony/yaml": ">=2.0.12",
+    "pear-pear/Console_Table": "*",
+    "youngj/httpserver": "1.0.0"
+  }
+}
diff --git a/includes/.gitignore b/includes/.gitignore
deleted file mode 100644
index ed285c0..0000000
--- a/includes/.gitignore
+++ /dev/null
@@ -1 +0,0 @@
-table.inc
\ No newline at end of file
diff --git a/includes/bootstrap.inc b/includes/bootstrap.inc
index c13db27..de0386c 100644
--- a/includes/bootstrap.inc
+++ b/includes/bootstrap.inc
@@ -399,10 +399,6 @@ function _drush_bootstrap_drush_validate() {
     return FALSE;
   }
 
-  if (drush_environment_table_lib() === FALSE) {
-    return FALSE;
-  }
-
   return TRUE;
 }
 
@@ -977,6 +973,10 @@ function drush_bootstrap_value($context, $value = null) {
 function drush_bootstrap_prepare() {
   define('DRUSH_BASE_PATH', dirname(dirname(__FILE__)));
 
+  // Make sure the Drush dependencies are available via Composer.
+  require_once DRUSH_BASE_PATH . '/includes/composer.inc';
+  drush_bootstrap_composer();
+
   require_once DRUSH_BASE_PATH . '/includes/environment.inc';
   require_once DRUSH_BASE_PATH . '/includes/command.inc';
   require_once DRUSH_BASE_PATH . '/includes/drush.inc';
diff --git a/includes/composer.inc b/includes/composer.inc
new file mode 100644
index 0000000..652e1a5
--- /dev/null
+++ b/includes/composer.inc
@@ -0,0 +1,112 @@
+<?php
+
+/**
+ * @file
+ * Provides Drush bootstrap integration with Composer.
+ */
+
+use Symfony\Component\Console\Input\ArrayInput;
+use Symfony\Component\Console\Input\InputDefinition;
+use Symfony\Component\Console\Input\InputOption;
+use Symfony\Component\Console\Output\ConsoleOutput;
+use Symfony\Component\Console\Helper\HelperSet;
+use Composer\IO\ConsoleIO;
+
+/**
+ * Make sure the Drush dependencies are available and up to date.
+ *
+ * @return Composer\Autoload\ClassLoader
+ *   The class loader object that was used to autoload all of the Drush
+ *   dependencies.
+ *
+ * @see drush_bootstrap_composer_update()
+ */
+function drush_bootstrap_composer() {
+  static $composer = NULL;
+
+  // We only have to load Drush's version of Composer once.
+  if (!isset($composer)) {
+    // Compare the hash of the currently installed dependencies to the hash of
+    // the currently existing composer.json. This will ensure that changes to
+    // composer.json will force an update to Drush's dependencies.
+    $hashFile = DRUSH_BASE_PATH . '/vendor/.composer/drush.md5.txt';
+    $hash = file_exists($hashFile) ? file_get_contents($hashFile) : FALSE;
+
+    // If drush.md5.txt exists, we compare it to the hash of composer.json.
+    $composerFile = DRUSH_BASE_PATH . '/composer.json';
+    $composerHash = $hash ? md5_file($composerFile) : TRUE;
+    if ($composerHash != $hash) {
+      // Since the hashes are different, we need to update the dependencies by
+      // running an installation through Composer.
+      if (drush_bootstrap_composer_update($composerFile, DRUSH_BASE_PATH)) {
+        // Composer was installed successfully, so save the composer.json hash.
+        file_put_contents($hashFile, md5_file($composerFile));
+      }
+    }
+
+    // Now that the dependencies are installed and up to date, we will initaite
+    // the Composer autoloader.
+    $composer = require_once(DRUSH_BASE_PATH . '/vendor/.composer/autoload.php');
+  }
+
+  return $composer;
+}
+
+/**
+ * Installs the given composer.json file into the given path.
+ *
+ * @param $composerFile
+ *   The Composer installation file to process. If not provided, will default to
+ *   the composer.json file in the current working directory.
+ * @param $path
+ *   The path to install the Composer dependencies. If not provided, will
+ *   default to the current working directory.
+ *
+ * @return
+ *   TRUE or FALSE whether or not composer.json was processed correctly.
+ *
+ * @see drush_bootstrap_composer()
+ */
+function drush_bootstrap_composer_update($composerFile = NULL, $path = NULL) {
+  // Load the Composer class autoloader.
+  require_once DRUSH_BASE_PATH . '/vendor/composer/composer/vendor/.composer/autoload.php';
+
+  // The Composer application uses the current working directory, so we'll
+  // mock it as the path as the current working directory.
+  if (isset($path)) {
+    $originalPath = getcwd();
+    chdir($path);
+    $path = $originalPath;
+  }
+
+  // Create the Composer Console IO mappings.
+  $definition = new InputDefinition(array(
+    new InputOption('verbose'), // Run in verbose mode.
+  ));
+  $input = new ArrayInput(array(), $definition);
+  $io = new ConsoleIO($input, new ConsoleOutput(), new HelperSet());
+
+  // Create the Composer and Installer objects using the provided composer.json.
+  $composer = Composer\Factory::create($io, $composerFile);
+  $installer = Composer\Installer::create($io, $composer);
+
+  // Set up the installer to install and update any dependencies.
+  $installer
+    ->setDryRun(FALSE) // Actually perform actions.
+    ->setVerbose(TRUE) // Output messages more frequently.
+    ->setPreferSource(TRUE) // Use package sources when possible.
+    ->setInstallRecommends(TRUE) // Retrieve recommended packages.
+    ->setInstallSuggests(TRUE) // Retrieve suggested packages too.
+    ->setUpdate(TRUE); // Update any dependencies during installation.
+
+  // Run the installation process, ignoring any PHP warnings that may pop up.
+  $installed = @$installer->run();
+
+  // Now that the dependencies have been installed, we can switch back to
+  // the original directory.
+  if (isset($path)) {
+    chdir($path);
+  }
+
+  return $installed;
+}
diff --git a/includes/environment.inc b/includes/environment.inc
index c7ff6b0..103d517 100644
--- a/includes/environment.inc
+++ b/includes/environment.inc
@@ -131,34 +131,6 @@ function drush_environment_lib() {
   }
 }
 
-function drush_environment_table_lib() {
-  // Try using the PEAR installed version of Console_Table.
-  $tablefile = 'Console/Table.php';
-  if (@file_get_contents($tablefile, FILE_USE_INCLUDE_PATH) === FALSE) {
-    $lib = drush_get_option('lib', DRUSH_BASE_PATH . '/lib');
-    $tablefile = $lib . '/Console_Table-' . DRUSH_TABLE_VERSION . '/Table.php';
-    // If it is not already present, download Console Table.
-    if (!drush_file_not_empty($tablefile)) {
-      // Attempt to remove the old Console Table file, from the legacy location.
-      // TODO: Remove this (and associated .git.ignore) in Drush 6.x.
-      $tablefile_legacy = DRUSH_BASE_PATH . '/includes/table.inc';
-      if (drush_file_not_empty($tablefile_legacy)) {
-        drush_op('unlink', $tablefile_legacy);
-      }
-
-      // Download and extract Console_Table, and confirm success.
-      if (drush_lib_fetch(DRUSH_PEAR_BASE_URL . 'Console_Table-' . DRUSH_TABLE_VERSION . '.tgz')) {
-        // Remove unneccessary package.xml file which ends up in /lib.
-        drush_op('unlink', $lib . '/package.xml');
-      }
-      if (!drush_file_not_empty($tablefile)) {
-        return drush_bootstrap_error('DRUSH_TABLES_LIB_NOT_FOUND', dt("Drush needs a copy of the PEAR Console_Table library in order to function, and the attempt to download this file automatically failed. To continue you will need to download the !version package from http://pear.php.net/package/Console_Table, extract it into !lib directory, such that Table.php exists at !tablefile.", array('!version' => DRUSH_TABLE_VERSION, '!tablefile' => $tablefile, '!lib' => $lib)));
-      }
-    }
-  }
-  require_once $tablefile;
-}
-
 /**
  * Returns the current working directory.
  *
diff --git a/lib/README.txt b/lib/README.txt
index 6e828ad..2a21a26 100644
--- a/lib/README.txt
+++ b/lib/README.txt
@@ -1,6 +1,7 @@
-Drush adds external libraries here; examples include the Console Table
-and lightweight httpserver.
+The lib directory is for classes provided by Drush that are original to Drush.
+All Drush-originated code must follow the PSR-0 naming convention for classes
+and namespaces as documented here:
 
-This directory should be writable by the first user who runs Drush so
-that these dependencies can be downloaded.  It may be set to read-only
-after that.
+https://github.com/php-fig/fig-standards/blob/master/accepted/PSR-0.md
+
+The PSR-0 namespace for Drush-originated code is "Drush".
diff --git a/vendor/.gitignore b/vendor/.gitignore
new file mode 100644
index 0000000..9bb5d38
--- /dev/null
+++ b/vendor/.gitignore
@@ -0,0 +1,5 @@
+# Ignore everything but composer and README.txt
+pear-pear
+symfony
+youngj
+.composer
diff --git a/lib/README.txt b/vendor/README.txt
similarity index 100%
copy from lib/README.txt
copy to vendor/README.txt
diff --git a/vendor/composer/composer/.travis.yml b/vendor/composer/composer/.travis.yml
new file mode 100644
index 0000000..56d4b92
--- /dev/null
+++ b/vendor/composer/composer/.travis.yml
@@ -0,0 +1,12 @@
+language: php
+
+php: 
+  - 5.3.2
+  - 5.3
+  - 5.4
+
+before_script:
+  - wget -nc http://getcomposer.org/composer.phar
+  - php composer.phar update
+
+script: phpunit
diff --git a/vendor/composer/composer/CHANGELOG.md b/vendor/composer/composer/CHANGELOG.md
new file mode 100644
index 0000000..8797738
--- /dev/null
+++ b/vendor/composer/composer/CHANGELOG.md
@@ -0,0 +1,24 @@
+* 1.0.0-alpha3
+
+  * Added caching of repository metadata (faster startup times & failover if packagist is down)
+  * Added include_path support for legacy projects that are full of require_once statements
+  * Improved repository protocol to have large cacheable parts
+
+* 1.0.0-alpha2 (2012-04-03)
+
+  * Added `create-project` command to install a project from scratch with composer
+  * Added automated `classmap` autoloading support for non-PSR-0 compliant projects
+  * Added human readable error reporting when deps can not be solved
+  * Added support for private GitHub and SVN repositories (use --no-interaction for CI)
+  * Added "file" downloader type to download plain files
+  * Added support for authentication with svn repositories
+  * Added autoload support for PEAR repositories
+  * Improved clones from GitHub which now automatically select between git/https/http protocols
+  * Improved `validate` command to give more feedback
+  * Improved the `search` & `show` commands output
+  * Removed dependency on filter_var
+  * Various robustness & error handling improvements, docs fixes and more bug fixes
+
+* 1.0.0-alpha1 (2012-03-01)
+
+  * Initial release
diff --git a/vendor/composer/composer/LICENSE b/vendor/composer/composer/LICENSE
new file mode 100644
index 0000000..2f0e8b7
--- /dev/null
+++ b/vendor/composer/composer/LICENSE
@@ -0,0 +1,19 @@
+Copyright (c) 2011 Nils Adermann, Jordi Boggiano
+
+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.
diff --git a/vendor/composer/composer/PORTING_INFO b/vendor/composer/composer/PORTING_INFO
new file mode 100644
index 0000000..54d86b2
--- /dev/null
+++ b/vendor/composer/composer/PORTING_INFO
@@ -0,0 +1,39 @@
+ * add rule
+ *  p = direct literal; always < 0 for installed rpm rules
+ *  d, if < 0 direct literal, if > 0 offset into whatprovides, if == 0 rule is assertion (look at p only)
+ *
+ *
+ * A requires b, b provided by B1,B2,B3 => (-A|B1|B2|B3)
+ *
+ * p < 0 : pkg id of A
+ * d > 0 : Offset in whatprovidesdata (list of providers of b)
+ *
+ * A conflicts b, b provided by B1,B2,B3 => (-A|-B1), (-A|-B2), (-A|-B3)
+ * p < 0 : pkg id of A
+ * d < 0 : Id of solvable (e.g. B1)
+ *
+ * d == 0: unary rule, assertion => (A) or (-A)
+ *
+ *   Install:    p > 0, d = 0   (A)             user requested install
+ *   Remove:     p < 0, d = 0   (-A)            user requested remove (also: uninstallable)
+ *   Requires:   p < 0, d > 0   (-A|B1|B2|...)  d: <list of providers for requirement of p>
+ *   Updates:    p > 0, d > 0   (A|B1|B2|...)   d: <list of updates for solvable p>
+ *   Conflicts:  p < 0, d < 0   (-A|-B)         either p (conflict issuer) or d (conflict provider) (binary rule)
+ *                                              also used for obsoletes
+ *   ?:          p > 0, d < 0   (A|-B)
+ *   No-op ?:    p = 0, d = 0   (null)          (used as policy rule placeholder)
+ *
+ *   resulting watches:
+ *   ------------------
+ *   Direct assertion (no watch needed)( if d <0 ) --> d = 0, w1 = p, w2 = 0
+ *   Binary rule: p = first literal, d = 0, w2 = second literal, w1 = p
+ *   every other : w1 = p, w2 = whatprovidesdata[d];
+ *   Disabled rule: w1 = 0
+ *
+ *   always returns a rule for non-rpm rules
+
+
+
+p > 0, d = 0, (A), w1 = p, w2 = 0
+p < 0, d = 0, (-A), w1 = p, w2 = 0
+p !=0, d = 0, (p|q), w1 = p, w2 = q
diff --git a/vendor/composer/composer/README.md b/vendor/composer/composer/README.md
new file mode 100644
index 0000000..c8a3baa
--- /dev/null
+++ b/vendor/composer/composer/README.md
@@ -0,0 +1,119 @@
+Composer - Package Management for PHP
+=====================================
+
+Composer is a package manager tracking local dependencies of your projects and libraries.
+
+See [http://getcomposer.org/](http://getcomposer.org/) for more information and documentation.
+
+[![Build Status](https://secure.travis-ci.org/composer/composer.png)](http://travis-ci.org/composer/composer)
+
+Installation / Usage
+--------------------
+
+1. Download the [`composer.phar`](http://getcomposer.org/composer.phar) executable or use the installer.
+
+    ``` sh
+    $ curl -s http://getcomposer.org/installer | php
+    ```
+
+
+2. Create a composer.json defining your dependencies. Note that this example is
+a short version for applications that are not meant to be published as packages
+themselves. To create libraries/packages please read the [guidelines](http://packagist.org/about).
+
+    ``` json
+    {
+        "require": {
+            "monolog/monolog": ">=1.0.0"
+        }
+    }
+    ```
+
+3. Run Composer: `php composer.phar install`
+4. Browse for more packages on [Packagist](http://packagist.org).
+
+Installation from Source
+------------------------
+
+To run tests, or develop Composer itself, you must use the sources and not the phar
+file as described above.
+
+1. Run `git clone https://github.com/composer/composer.git`
+2. Download the [`composer.phar`](http://getcomposer.org/composer.phar) executable
+3. Run Composer to get the dependencies: `php composer.phar install`
+
+Global installation of Composer (manual)
+----------------------------------------
+
+Since Composer works with the current working directory it is possible to install it
+in a system wide way.
+
+1. Change into a directory in your path like `cd /usr/local/bin`
+2. Get Composer `curl -s http://getcomposer.org/installer | php`
+3. Make the phar executeable `chmod a+x composer.phar`
+4. Change into a project directory `cd /path/to/my/project`
+5. Use Composer as you normally would `composer.phar install`
+6. Optionally you can rename the composer.phar to composer to make it easier
+
+Global installation of Composer (via homebrew)
+----------------------------------------------
+
+Installing via this homebrew formula will always get you the latest Composer version.
+
+1. run `brew uninstall composer ; brew install --HEAD https://raw.github.com/gist/1574469/composer.rb`
+2. Change into a project directory `cd /path/to/my/project`
+3. Use Composer as you normally would `composer.phar install`
+
+*You will see a warning "Warning: Cannot verify package integrity"; however,
+this is benign and expected.*
+
+Updating Composer
+-----------------
+
+Running `php composer.phar self-update` or equivalent will update a phar
+install with the latest version.
+
+Contributing
+------------
+
+All code contributions - including those of people having commit access -
+must go through a pull request and approved by a core developer before being
+merged. This is to ensure proper review of all the code.
+
+Fork the project, create a feature branch, and send us a pull request.
+
+To ensure a consistent code base, you should make sure the code follows
+the [Coding Standards](http://symfony.com/doc/2.0/contributing/code/standards.html)
+which we borrowed from Symfony.
+
+If you would like to help take a look at the [list of issues](http://github.com/composer/composer/issues).
+
+Community
+---------
+
+The developer mailing list is on [google groups](http://groups.google.com/group/composer-dev)
+IRC channels are available for discussion as well, on irc.freenode.org [#composer](irc://irc.freenode.org/composer)
+for users and [#composer-dev](irc://irc.freenode.org/composer-dev) for development.
+
+Requirements
+------------
+
+PHP 5.3+
+
+Authors
+-------
+
+Nils Adermann - <naderman@naderman.de> - <http://twitter.com/naderman> - <http://www.naderman.de><br />
+Jordi Boggiano - <j.boggiano@seld.be> - <http://twitter.com/seldaek> - <http://seld.be><br />
+
+See also the list of [contributors](https://github.com/composer/composer/contributors) who participated in this project.
+
+License
+-------
+
+Composer is licensed under the MIT License - see the LICENSE file for details
+
+Acknowledgments
+---------------
+
+This project's Solver started out as a PHP port of openSUSE's [Libzypp satsolver](http://en.opensuse.org/openSUSE:Libzypp_satsolver).
diff --git a/vendor/composer/composer/bin/compile b/vendor/composer/composer/bin/compile
new file mode 100755
index 0000000..3bb0fb7
--- /dev/null
+++ b/vendor/composer/composer/bin/compile
@@ -0,0 +1,9 @@
+#!/usr/bin/env php
+<?php
+
+require __DIR__.'/../src/bootstrap.php';
+
+use Composer\Compiler;
+
+$compiler = new Compiler();
+$compiler->compile();
diff --git a/vendor/composer/composer/bin/composer b/vendor/composer/composer/bin/composer
new file mode 100755
index 0000000..71d8372
--- /dev/null
+++ b/vendor/composer/composer/bin/composer
@@ -0,0 +1,10 @@
+#!/usr/bin/env php
+<?php
+
+require __DIR__.'/../src/bootstrap.php';
+
+use Composer\Console\Application;
+
+// run the command application
+$application = new Application();
+$application->run();
diff --git a/vendor/composer/composer/composer.json b/vendor/composer/composer/composer.json
new file mode 100644
index 0000000..07a8c3c
--- /dev/null
+++ b/vendor/composer/composer/composer.json
@@ -0,0 +1,40 @@
+{
+    "name": "composer/composer",
+    "description": "Package Manager",
+    "keywords": ["package", "dependency", "autoload"],
+    "homepage": "http://getcomposer.org/",
+    "type": "library",
+    "license": "MIT",
+    "authors": [
+        {
+            "name": "Nils Adermann",
+            "email": "naderman@naderman.de",
+            "homepage": "http://www.naderman.de"
+        },
+        {
+            "name": "Jordi Boggiano",
+            "email": "j.boggiano@seld.be",
+            "homepage": "http://seld.be"
+        }
+    ],
+    "require": {
+        "php": ">=5.3.2",
+        "justinrainbow/json-schema": "1.1.*",
+        "seld/jsonlint": "1.*",
+        "symfony/console": "2.1.*",
+        "symfony/finder": "2.1.*",
+        "symfony/process": "2.1.*"
+    },
+    "recommend": {
+        "ext-zip": "*"
+    },
+    "autoload": {
+        "psr-0": { "Composer": "src/" }
+    },
+    "bin": ["bin/composer"],
+    "extra": {
+        "branch-alias": {
+            "dev-master": "1.0-dev"
+        }
+    }
+}
diff --git a/vendor/composer/composer/phpunit.xml.dist b/vendor/composer/composer/phpunit.xml.dist
new file mode 100644
index 0000000..246d305
--- /dev/null
+++ b/vendor/composer/composer/phpunit.xml.dist
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<phpunit backupGlobals="false"
+         backupStaticAttributes="false"
+         colors="true"
+         convertErrorsToExceptions="true"
+         convertNoticesToExceptions="true"
+         convertWarningsToExceptions="true"
+         processIsolation="false"
+         stopOnFailure="false"
+         syntaxCheck="false"
+         bootstrap="tests/bootstrap.php"
+>
+    <testsuites>
+        <testsuite name="Composer Test Suite">
+            <directory>./tests/Composer/</directory>
+        </testsuite>
+    </testsuites>
+
+    <filter>
+        <whitelist>
+            <directory>./src/Composer/</directory>
+            <exclude>
+                <file>./src/Composer/Autoload/ClassLoader.php</file>
+            </exclude>
+        </whitelist>
+    </filter>
+</phpunit>
diff --git a/vendor/composer/composer/res/composer-schema.json b/vendor/composer/composer/res/composer-schema.json
new file mode 100644
index 0000000..3a43aba
--- /dev/null
+++ b/vendor/composer/composer/res/composer-schema.json
@@ -0,0 +1,203 @@
+{
+    "name": "Package",
+    "type": "object",
+    "additionalProperties": false,
+    "properties": {
+        "name": {
+            "type": "string",
+            "description": "Package name, including 'vendor-name/' prefix.",
+            "required": true
+        },
+        "type": {
+            "description": "Package type, either 'library' for common packages, 'composer-installer' for custom installers, 'metapackage' for empty packages, or a custom type defined by whatever project this package applies to.",
+            "type": "string"
+        },
+        "target-dir": {
+            "description": "Forces the package to be installed into the given subdirectory path. This is used for autoloading PSR-0 packages that do not contain their full path. Use forward slashes for cross-platform compatibility.",
+            "type": "string"
+        },
+        "description": {
+            "type": "string",
+            "description": "Short package description.",
+            "required": true
+        },
+        "keywords": {
+            "type": "array",
+            "items": {
+                "type": "string",
+                "description": "A tag/keyword that this package relates to."
+            }
+        },
+        "homepage": {
+            "type": "string",
+            "description": "Homepage URL for the project.",
+            "format": "uri"
+        },
+        "version": {
+            "type": "string",
+            "description": "Package version, see http://getcomposer.org/doc/04-schema.md#version for more info on valid schemes."
+        },
+        "time": {
+            "type": "string",
+            "description": "Package release date, in 'YYYY-MM-DD' or 'YYYY-MM-DD HH:MM:SS' format."
+        },
+        "license": {
+            "type": ["string", "array"],
+            "description": "License name. Or an array of license names."
+        },
+        "authors": {
+            "type": "array",
+            "description": "List of authors that contributed to the package. This is typically the main maintainers, not the full list.",
+            "items": {
+                "type": "object",
+                "additionalProperties": false,
+                "properties": {
+                    "name": {
+                        "type": "string",
+                        "description": "Full name of the author.",
+                        "required": true
+                    },
+                    "email": {
+                        "type": "string",
+                        "description": "Email address of the author.",
+                        "format": "email"
+                    },
+                    "homepage": {
+                        "type": "string",
+                        "description": "Homepage URL for the author.",
+                        "format": "uri"
+                    }
+                }
+            }
+        },
+        "require": {
+            "type": "object",
+            "description": "This is a hash of package name (keys) and version constraints (values) that are required to run this package.",
+            "additionalProperties": true
+        },
+        "replace": {
+            "type": "object",
+            "description": "This is a hash of package name (keys) and version constraints (values) that can be replaced by this package.",
+            "additionalProperties": true
+        },
+        "conflict": {
+            "type": "object",
+            "description": "This is a hash of package name (keys) and version constraints (values) that conflict with this package.",
+            "additionalProperties": true
+        },
+        "provide": {
+            "type": "object",
+            "description": "This is a hash of package name (keys) and version constraints (values) that this package provides in addition to this package's name.",
+            "additionalProperties": true
+        },
+        "recommend": {
+            "type": "object",
+            "description": "This is a hash of package name (keys) and version constraints (values) that this package recommends to be installed (typically this will be installed as well).",
+            "additionalProperties": true
+        },
+        "suggest": {
+            "type": "object",
+            "description": "This is a hash of package name (keys) and version constraints (values) that this package suggests work well with it (typically this will only be suggested to the user).",
+            "additionalProperties": true
+        },
+        "config": {
+            "type": ["object"],
+            "description": "Composer options.",
+            "properties": {
+                "vendor-dir": {
+                    "type": "string",
+                    "description": "The location where all packages are installed, defaults to \"vendor\"."
+                },
+                "bin-dir": {
+                    "type": "string",
+                    "description": "The location where all binaries are linked, defaults to \"vendor/bin\"."
+                }
+            }
+        },
+        "extra": {
+            "type": ["object", "array"],
+            "description": "Arbitrary extra data that can be used by custom installers, for example, package of type composer-installer must have a 'class' key defining the installer class name.",
+            "additionalProperties": true
+        },
+        "autoload": {
+            "type": "object",
+            "description": "Description of how the package can be autoloaded.",
+            "properties": {
+                "psr-0": {
+                    "type": "object",
+                    "description": "This is a hash of namespaces (keys) and the directories they can be found into (values, can be arrays of paths) by the autoloader.",
+                    "additionalProperties": true
+                },
+                "classmap": {
+                    "type": "array",
+                    "description": "This is an array of directories that contain classes to be included in the class-map generation process."
+                }
+            }
+        },
+        "repositories": {
+            "type": ["object", "array"],
+            "description": "A set of additional repositories where packages can be found.",
+            "additionalProperties": true
+        },
+        "bin": {
+            "type": ["array"],
+            "description": "A set of files that should be treated as binaries and symlinked into bin-dir (from config).",
+            "items": {
+                "type": "string"
+            }
+        },
+        "include-path": {
+            "type": ["array"],
+            "description": "DEPRECATED: A list of directories which should get added to PHP's include path. This is only present to support legacy projects, and all new code should preferably use autoloading.",
+            "items": {
+                "type": "string"
+            }
+        },
+        "scripts": {
+            "type": ["object"],
+            "description": "Scripts listeners that will be executed before/after some events.",
+            "properties": {
+                "pre-install-cmd": {
+                    "type": ["array", "string"],
+                    "description": "Occurs before the install command is executed, contains one or more Class::method callables."
+                },
+                "post-install-cmd": {
+                    "type": ["array", "string"],
+                    "description": "Occurs after the install command is executed, contains one or more Class::method callables."
+                },
+                "pre-update-cmd": {
+                    "type": ["array", "string"],
+                    "description": "Occurs before the update command is executed, contains one or more Class::method callables."
+                },
+                "post-update-cmd": {
+                    "type": ["array", "string"],
+                    "description": "Occurs after the update command is executed, contains one or more Class::method callables."
+                },
+                "pre-package-install": {
+                    "type": ["array", "string"],
+                    "description": "Occurs before a package is installed, contains one or more Class::method callables."
+                },
+                "post-package-install": {
+                    "type": ["array", "string"],
+                    "description": "Occurs after a package is installed, contains one or more Class::method callables."
+                },
+                "pre-package-update": {
+                    "type": ["array", "string"],
+                    "description": "Occurs before a package is updated, contains one or more Class::method callables."
+                },
+                "post-package-update": {
+                    "type": ["array", "string"],
+                    "description": "Occurs after a package is updated, contains one or more Class::method callables."
+                },
+                "pre-package-uninstall": {
+                    "type": ["array", "string"],
+                    "description": "Occurs before a package has been uninstalled, contains one or more Class::method callables."
+                },
+                "post-package-uninstall": {
+                    "type": ["array", "string"],
+                    "description": "Occurs after a package has been uninstalled, contains one or more Class::method callables."
+                }
+            }
+        }
+    }
+}
diff --git a/vendor/composer/composer/src/Composer/Autoload/AutoloadGenerator.php b/vendor/composer/composer/src/Composer/Autoload/AutoloadGenerator.php
new file mode 100644
index 0000000..594cc28
--- /dev/null
+++ b/vendor/composer/composer/src/Composer/Autoload/AutoloadGenerator.php
@@ -0,0 +1,264 @@
+<?php
+
+/*
+ * This file is part of Composer.
+ *
+ * (c) Nils Adermann <naderman@naderman.de>
+ *     Jordi Boggiano <j.boggiano@seld.be>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Composer\Autoload;
+
+use Composer\Installer\InstallationManager;
+use Composer\Json\JsonFile;
+use Composer\Package\Loader\JsonLoader;
+use Composer\Package\PackageInterface;
+use Composer\Repository\RepositoryInterface;
+use Composer\Util\Filesystem;
+
+/**
+ * @author Igor Wiedler <igor@wiedler.ch>
+ * @author Jordi Boggiano <j.boggiano@seld.be>
+ */
+class AutoloadGenerator
+{
+    public function dump(RepositoryInterface $localRepo, PackageInterface $mainPackage, InstallationManager $installationManager, $targetDir)
+    {
+        $filesystem = new Filesystem();
+        $vendorPath = strtr(realpath($installationManager->getVendorPath()), '\\', '/');
+        $relVendorPath = $filesystem->findShortestPath(getcwd(), $vendorPath, true);
+        $vendorDirCode = $filesystem->findShortestPathCode(realpath($targetDir), $vendorPath, true);
+
+        $appBaseDir = $filesystem->findShortestPathCode($vendorPath, getcwd(), true);
+        $appBaseDir = str_replace('__DIR__', '$vendorDir', $appBaseDir);
+
+        $namespacesFile = <<<EOF
+<?php
+
+// autoload_namespace.php generated by Composer
+
+\$vendorDir = $vendorDirCode;
+\$baseDir = $appBaseDir;
+
+return array(
+
+EOF;
+
+        $packageMap = $this->buildPackageMap($installationManager, $mainPackage, $localRepo->getPackages());
+        $autoloads = $this->parseAutoloads($packageMap);
+
+        foreach ($autoloads['psr-0'] as $namespace => $paths) {
+            $exportedPaths = array();
+            foreach ($paths as $path) {
+                $path = strtr($path, '\\', '/');
+                $baseDir = '';
+                if (!$filesystem->isAbsolutePath($path)) {
+                    if (strpos($path, $relVendorPath) === 0) {
+                        // path starts with vendor dir
+                        $path = substr($path, strlen($relVendorPath));
+                        $baseDir = '$vendorDir . ';
+                    } else {
+                        $path = '/'.$path;
+                        $baseDir = '$baseDir . ';
+                    }
+                } elseif (strpos($path, $vendorPath) === 0) {
+                    $path = substr($path, strlen($vendorPath));
+                    $baseDir = '$vendorDir . ';
+                }
+                $exportedPaths[] = $baseDir.var_export($path, true);
+            }
+            $exportedPrefix = var_export($namespace, true);
+            $namespacesFile .= "    $exportedPrefix => ";
+            if (count($exportedPaths) > 1) {
+                $namespacesFile .= "array(".implode(', ', $exportedPaths)."),\n";
+            } else {
+                $namespacesFile .= $exportedPaths[0].",\n";
+            }
+        }
+        $namespacesFile .= ");\n";
+
+        $classmapFile = <<<EOF
+<?php
+
+// autoload_classmap.php generated by Composer
+
+\$vendorDir = $vendorDirCode;
+\$baseDir = $appBaseDir;
+
+return array(
+
+EOF;
+
+        // flatten array
+        $autoloads['classmap'] = new \RecursiveIteratorIterator(new \RecursiveArrayIterator($autoloads['classmap']));
+        foreach ($autoloads['classmap'] as $dir) {
+            foreach (ClassMapGenerator::createMap($dir) as $class => $path) {
+                $path = '/'.$filesystem->findShortestPath(getcwd(), $path, true);
+                $classmapFile .= '    '.var_export($class, true).' => $baseDir . '.var_export($path, true).",\n";
+            }
+        }
+        $classmapFile .= ");\n";
+
+        file_put_contents($targetDir.'/autoload_namespaces.php', $namespacesFile);
+        file_put_contents($targetDir.'/autoload_classmap.php', $classmapFile);
+        if ($includePathFile = $this->getIncludePathsFile($packageMap)) {
+            file_put_contents($targetDir.'/include_paths.php', $includePathFile);
+        }
+        file_put_contents($targetDir.'/autoload.php', $this->getAutoloadFile(true, true, (Boolean) $includePathFile));
+        copy(__DIR__.'/ClassLoader.php', $targetDir.'/ClassLoader.php');
+    }
+
+    public function buildPackageMap(InstallationManager $installationManager, PackageInterface $mainPackage, array $packages)
+    {
+        // build package => install path map
+        $packageMap = array();
+
+        // add main package
+        $packageMap[] = array($mainPackage, '');
+
+        foreach ($packages as $package) {
+            $packageMap[] = array(
+                $package,
+                $installationManager->getInstallPath($package)
+            );
+        }
+
+        return $packageMap;
+    }
+
+    /**
+     * Compiles an ordered list of namespace => path mappings
+     *
+     * @param array $packageMap array of array(package, installDir-relative-to-composer.json)
+     * @return array array('psr-0' => array('Ns\\Foo' => array('installDir')))
+     */
+    public function parseAutoloads(array $packageMap)
+    {
+        $autoloads = array('classmap' => array(), 'psr-0' => array());
+        foreach ($packageMap as $item) {
+            list($package, $installPath) = $item;
+
+            if (null !== $package->getTargetDir()) {
+                $installPath = substr($installPath, 0, -strlen('/'.$package->getTargetDir()));
+            }
+
+            foreach ($package->getAutoload() as $type => $mapping) {
+                foreach ($mapping as $namespace => $paths) {
+                    foreach ((array) $paths as $path) {
+                        $autoloads[$type][$namespace][] = empty($installPath) ? $path : $installPath.'/'.$path;
+                    }
+                }
+            }
+        }
+
+        foreach ($autoloads as $type => $maps) {
+            krsort($autoloads[$type]);
+        }
+
+        return $autoloads;
+    }
+
+    /**
+     * Registers an autoloader based on an autoload map returned by parseAutoloads
+     *
+     * @param array $autoloads see parseAutoloads return value
+     * @return ClassLoader
+     */
+    public function createLoader(array $autoloads)
+    {
+        $loader = new ClassLoader();
+
+        if (isset($autoloads['psr-0'])) {
+            foreach ($autoloads['psr-0'] as $namespace => $path) {
+                $loader->add($namespace, $path);
+            }
+        }
+
+        return $loader;
+    }
+
+    protected function getIncludePathsFile(array $packageMap)
+    {
+        $includePaths = array();
+
+        foreach ($packageMap as $item) {
+            list($package, $installPath) = $item;
+
+            if (null !== $package->getTargetDir()) {
+                $installPath = substr($installPath, 0, -strlen('/'.$package->getTargetDir()));
+            }
+
+            foreach ($package->getIncludePaths() as $includePath) {
+                $includePaths[] = empty($installPath) ? $includePath : $installPath.'/'.$includePath;
+            }
+        }
+
+        if (!$includePaths) {
+            return;
+        }
+
+        return sprintf(
+            "<?php\nreturn %s;\n", var_export($includePaths, true)
+        );
+    }
+
+    protected function getAutoloadFile($usePSR0, $useClassMap, $useIncludePath)
+    {
+        $file = <<<'HEADER'
+<?php
+
+// autoload.php generated by Composer
+if (!class_exists('Composer\\Autoload\\ClassLoader', false)) {
+    require __DIR__.'/ClassLoader.php';
+}
+
+return call_user_func(function() {
+    $loader = new \Composer\Autoload\ClassLoader();
+
+
+HEADER;
+
+        if ($useIncludePath) {
+            $file .= <<<'INCLUDE_PATH'
+    $includePaths = require __DIR__.'/include_paths.php';
+    array_unshift($includePaths, get_include_path());
+    set_include_path(join(PATH_SEPARATOR, $includePaths));
+
+
+INCLUDE_PATH;
+        }
+
+        if ($usePSR0) {
+            $file .= <<<'PSR0'
+    $map = require __DIR__.'/autoload_namespaces.php';
+    foreach ($map as $namespace => $path) {
+        $loader->add($namespace, $path);
+    }
+
+
+PSR0;
+        }
+
+        if ($useClassMap) {
+            $file .= <<<'CLASSMAP'
+    $classMap = require __DIR__.'/autoload_classmap.php';
+    if ($classMap) {
+        $loader->addClassMap($classMap);
+    }
+
+
+CLASSMAP;
+        }
+
+        return $file . <<<'FOOTER'
+    $loader->register();
+
+    return $loader;
+});
+
+FOOTER;
+    }
+}
diff --git a/vendor/composer/composer/src/Composer/Autoload/ClassLoader.php b/vendor/composer/composer/src/Composer/Autoload/ClassLoader.php
new file mode 100644
index 0000000..d07cb31
--- /dev/null
+++ b/vendor/composer/composer/src/Composer/Autoload/ClassLoader.php
@@ -0,0 +1,203 @@
+<?php
+
+/*
+ * This file is part of Composer.
+ *
+ * (c) Nils Adermann <naderman@naderman.de>
+ *     Jordi Boggiano <j.boggiano@seld.be>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Composer\Autoload;
+
+/**
+ * ClassLoader implements an PSR-0 class loader
+ *
+ * See https://github.com/php-fig/fig-standards/blob/master/accepted/PSR-0.md
+ *
+ *     $loader = new ComposerClassLoader();
+ *
+ *     // register classes with namespaces
+ *     $loader->add('Symfony\Component', __DIR__.'/component');
+ *     $loader->add('Symfony',           __DIR__.'/framework');
+ *
+ *     // activate the autoloader
+ *     $loader->register();
+ *
+ *     // to enable searching the include path (eg. for PEAR packages)
+ *     $loader->setUseIncludePath(true);
+ *
+ * In this example, if you try to use a class in the Symfony\Component
+ * namespace or one of its children (Symfony\Component\Console for instance),
+ * the autoloader will first look for the class under the component/
+ * directory, and it will then fallback to the framework/ directory if not
+ * found before giving up.
+ *
+ * This class is loosely based on the Symfony UniversalClassLoader.
+ *
+ * @author Fabien Potencier <fabien@symfony.com>
+ * @author Jordi Boggiano <j.boggiano@seld.be>
+ */
+class ClassLoader
+{
+    private $prefixes = array();
+    private $fallbackDirs = array();
+    private $useIncludePath = false;
+    private $classMap = array();
+
+    public function getPrefixes()
+    {
+        return $this->prefixes;
+    }
+
+    public function getFallbackDirs()
+    {
+        return $this->fallbackDirs;
+    }
+
+    public function getClassMap()
+    {
+        return $this->classMap;
+    }
+
+    /**
+     * @param array $classMap Class to filename map
+     */
+    public function addClassMap(array $classMap)
+    {
+        if ($this->classMap) {
+            $this->classMap = array_merge($this->classMap, $classMap);
+        } else {
+            $this->classMap = $classMap;
+        }
+    }
+
+    /**
+     * Registers a set of classes
+     *
+     * @param string       $prefix  The classes prefix
+     * @param array|string $paths   The location(s) of the classes
+     */
+    public function add($prefix, $paths)
+    {
+        if (!$prefix) {
+            foreach ((array) $paths as $path) {
+                $this->fallbackDirs[] = $path;
+            }
+            return;
+        }
+        if (isset($this->prefixes[$prefix])) {
+            $this->prefixes[$prefix] = array_merge(
+                $this->prefixes[$prefix],
+                (array) $paths
+            );
+        } else {
+            $this->prefixes[$prefix] = (array) $paths;
+        }
+    }
+
+    /**
+     * Turns on searching the include for class files.
+     *
+     * @param Boolean $useIncludePath
+     */
+    public function setUseIncludePath($useIncludePath)
+    {
+        $this->useIncludePath = $useIncludePath;
+    }
+
+    /**
+     * Can be used to check if the autoloader uses the include path to check
+     * for classes.
+     *
+     * @return Boolean
+     */
+    public function getUseIncludePath()
+    {
+        return $this->useIncludePath;
+    }
+
+    /**
+     * Registers this instance as an autoloader.
+     *
+     * @param Boolean $prepend Whether to prepend the autoloader or not
+     */
+    public function register($prepend = false)
+    {
+        spl_autoload_register(array($this, 'loadClass'), true, $prepend);
+    }
+
+    /**
+     * Unregisters this instance as an autoloader.
+     */
+    public function unregister()
+    {
+        spl_autoload_unregister(array($this, 'loadClass'));
+    }
+
+    /**
+     * Loads the given class or interface.
+     *
+     * @param string $class The name of the class
+     * @return Boolean|null True, if loaded
+     */
+    public function loadClass($class)
+    {
+        if ($file = $this->findFile($class)) {
+            require $file;
+            return true;
+        }
+    }
+
+    /**
+     * Finds the path to the file where the class is defined.
+     *
+     * @param string $class The name of the class
+     *
+     * @return string|null The path, if found
+     */
+    public function findFile($class)
+    {
+        if (isset($this->classMap[$class])) {
+            return $this->classMap[$class];
+        }
+
+        if ('\\' == $class[0]) {
+            $class = substr($class, 1);
+        }
+
+        if (false !== $pos = strrpos($class, '\\')) {
+            // namespaced class name
+            $classPath = str_replace('\\', DIRECTORY_SEPARATOR, substr($class, 0, $pos)) . DIRECTORY_SEPARATOR;
+            $className = substr($class, $pos + 1);
+        } else {
+            // PEAR-like class name
+            $classPath = null;
+            $className = $class;
+        }
+
+        $classPath .= str_replace('_', DIRECTORY_SEPARATOR, $className) . '.php';
+
+        foreach ($this->prefixes as $prefix => $dirs) {
+            if (0 === strpos($class, $prefix)) {
+                foreach ($dirs as $dir) {
+                    if (file_exists($dir . DIRECTORY_SEPARATOR . $classPath)) {
+                        return $dir . DIRECTORY_SEPARATOR . $classPath;
+                    }
+                }
+            }
+        }
+
+        foreach ($this->fallbackDirs as $dir) {
+            if (file_exists($dir . DIRECTORY_SEPARATOR . $classPath)) {
+                return $dir . DIRECTORY_SEPARATOR . $classPath;
+            }
+        }
+
+        if ($this->useIncludePath && $file = stream_resolve_include_path($classPath)) {
+            return $file;
+        }
+    }
+}
diff --git a/vendor/composer/composer/src/Composer/Autoload/ClassMapGenerator.php b/vendor/composer/composer/src/Composer/Autoload/ClassMapGenerator.php
new file mode 100644
index 0000000..4d6b5ea
--- /dev/null
+++ b/vendor/composer/composer/src/Composer/Autoload/ClassMapGenerator.php
@@ -0,0 +1,138 @@
+<?php
+
+/*
+ * This file is copied from the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ *
+ * @license MIT
+ */
+
+namespace Composer\Autoload;
+
+/**
+ * ClassMapGenerator
+ *
+ * @author Gyula Sallai <salla016@gmail.com>
+ */
+class ClassMapGenerator
+{
+    /**
+     * Generate a class map file
+     *
+     * @param Traversable $dirs Directories or a single path to search in
+     * @param string $file The name of the class map file
+     */
+    static public function dump($dirs, $file)
+    {
+        $maps = array();
+
+        foreach ($dirs as $dir) {
+            $maps = array_merge($maps, static::createMap($dir));
+        }
+
+        file_put_contents($file, sprintf('<?php return %s;', var_export($maps, true)));
+    }
+
+    /**
+     * Iterate over all files in the given directory searching for classes
+     *
+     * @param Iterator|string $dir The directory to search in or an iterator
+     *
+     * @return array A class map array
+     */
+    static public function createMap($dir)
+    {
+        if (is_string($dir)) {
+            if (is_file($dir)) {
+                $dir = array(new \SplFileInfo($dir));
+            } else {
+                $dir = new \RecursiveIteratorIterator(new \RecursiveDirectoryIterator($dir));
+            }
+        }
+
+        $map = array();
+
+        foreach ($dir as $file) {
+            if (!$file->isFile()) {
+                continue;
+            }
+
+            $path = $file->getRealPath();
+
+            if (pathinfo($path, PATHINFO_EXTENSION) !== 'php') {
+                continue;
+            }
+
+            $classes = self::findClasses($path);
+
+            foreach ($classes as $class) {
+                $map[$class] = $path;
+            }
+
+        }
+
+        return $map;
+    }
+
+    /**
+     * Extract the classes in the given file
+     *
+     * @param string $path The file to check
+     *
+     * @return array The found classes
+     */
+    static private function findClasses($path)
+    {
+        $contents = file_get_contents($path);
+        $tokens   = token_get_all($contents);
+        $T_TRAIT  = version_compare(PHP_VERSION, '5.4', '<') ? -1 : T_TRAIT;
+
+        $classes = array();
+
+        $namespace = '';
+        for ($i = 0, $max = count($tokens); $i < $max; $i++) {
+            $token = $tokens[$i];
+
+            if (is_string($token)) {
+                continue;
+            }
+
+            $class = '';
+
+            switch ($token[0]) {
+                case T_NAMESPACE:
+                    $namespace = '';
+                    // If there is a namespace, extract it
+                    while (($t = $tokens[++$i]) && is_array($t)) {
+                        if (in_array($t[0], array(T_STRING, T_NS_SEPARATOR))) {
+                            $namespace .= $t[1];
+                        }
+                    }
+                    $namespace .= '\\';
+                    break;
+                case T_CLASS:
+                case T_INTERFACE:
+                case $T_TRAIT:
+                    // Find the classname
+                    while (($t = $tokens[++$i]) && is_array($t)) {
+                        if (T_STRING === $t[0]) {
+                            $class .= $t[1];
+                        } elseif ($class !== '' && T_WHITESPACE == $t[0]) {
+                            break;
+                        }
+                    }
+
+                    $classes[] = ltrim($namespace . $class, '\\');
+                    break;
+                default:
+                    break;
+            }
+        }
+
+        return $classes;
+    }
+}
diff --git a/vendor/composer/composer/src/Composer/Cache.php b/vendor/composer/composer/src/Composer/Cache.php
new file mode 100644
index 0000000..492a94e
--- /dev/null
+++ b/vendor/composer/composer/src/Composer/Cache.php
@@ -0,0 +1,65 @@
+<?php
+
+/*
+ * This file is part of Composer.
+ *
+ * (c) Nils Adermann <naderman@naderman.de>
+ *     Jordi Boggiano <j.boggiano@seld.be>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Composer;
+
+use Composer\IO\IOInterface;
+
+/**
+ * Reads/writes to a filesystem cache
+ *
+ * @author Jordi Boggiano <j.boggiano@seld.be>
+ */
+class Cache
+{
+    private $io;
+    private $root;
+    private $enabled = true;
+
+    public function __construct(IOInterface $io, $cacheDir)
+    {
+        $this->io = $io;
+        $this->root = rtrim($cacheDir, '/\\') . '/';
+
+        if (!is_dir($this->root)) {
+            if (!@mkdir($this->root, 0777, true)) {
+                $this->enabled = false;
+            }
+        }
+    }
+
+    public function getRoot()
+    {
+        return $this->root;
+    }
+
+    public function read($file)
+    {
+        if ($this->enabled && file_exists($this->root . $file)) {
+            return file_get_contents($this->root . $file);
+        }
+    }
+
+    public function write($file, $contents)
+    {
+        if ($this->enabled) {
+            file_put_contents($this->root . $file, $contents);
+        }
+    }
+
+    public function sha1($file)
+    {
+        if ($this->enabled && file_exists($this->root . $file)) {
+            return sha1_file($this->root . $file);
+        }
+    }
+}
diff --git a/vendor/composer/composer/src/Composer/Command/AboutCommand.php b/vendor/composer/composer/src/Composer/Command/AboutCommand.php
new file mode 100644
index 0000000..fb56ea3
--- /dev/null
+++ b/vendor/composer/composer/src/Composer/Command/AboutCommand.php
@@ -0,0 +1,45 @@
+<?php
+
+/*
+ * This file is part of Composer.
+ *
+ * (c) Nils Adermann <naderman@naderman.de>
+ *     Jordi Boggiano <j.boggiano@seld.be>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Composer\Command;
+
+use Symfony\Component\Console\Input\InputInterface;
+use Symfony\Component\Console\Output\OutputInterface;
+
+/**
+ * @author Jordi Boggiano <j.boggiano@seld.be>
+ */
+class AboutCommand extends Command
+{
+    protected function configure()
+    {
+        $this
+            ->setName('about')
+            ->setDescription('Short information about Composer')
+            ->setHelp(<<<EOT
+<info>php composer.phar about</info>
+EOT
+            )
+        ;
+    }
+
+    protected function execute(InputInterface $input, OutputInterface $output)
+    {
+        $output->writeln(<<<EOT
+<info>Composer - Package Management for PHP</info>
+<comment>Composer is a package manager tracking local dependencies of your projects and libraries.
+See http://getcomposer.org/ for more information.</comment>
+EOT
+        );
+
+    }
+}
diff --git a/vendor/composer/composer/src/Composer/Command/Command.php b/vendor/composer/composer/src/Composer/Command/Command.php
new file mode 100644
index 0000000..98298d1
--- /dev/null
+++ b/vendor/composer/composer/src/Composer/Command/Command.php
@@ -0,0 +1,40 @@
+<?php
+
+/*
+ * This file is part of Composer.
+ *
+ * (c) Nils Adermann <naderman@naderman.de>
+ *     Jordi Boggiano <j.boggiano@seld.be>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Composer\Command;
+
+use Symfony\Component\Console\Command\Command as BaseCommand;
+
+/**
+ * Base class for Composer commands
+ *
+ * @author Ryan Weaver <ryan@knplabs.com>
+ * @author Konstantin Kudryashov <ever.zet@gmail.com>
+ */
+abstract class Command extends BaseCommand
+{
+    /**
+     * @return \Composer\Composer
+     */
+    protected function getComposer($required = true)
+    {
+        return $this->getApplication()->getComposer($required);
+    }
+
+    /**
+     * @return \Composer\IO\ConsoleIO
+     */
+    protected function getIO()
+    {
+        return $this->getApplication()->getIO();
+    }
+}
diff --git a/vendor/composer/composer/src/Composer/Command/CreateProjectCommand.php b/vendor/composer/composer/src/Composer/Command/CreateProjectCommand.php
new file mode 100644
index 0000000..3dff39e
--- /dev/null
+++ b/vendor/composer/composer/src/Composer/Command/CreateProjectCommand.php
@@ -0,0 +1,134 @@
+<?php
+
+/*
+ * This file is part of Composer.
+ *
+ * (c) Nils Adermann <naderman@naderman.de>
+ *     Jordi Boggiano <j.boggiano@seld.be>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Composer\Command;
+
+use Composer\Factory;
+use Composer\Installer;
+use Composer\Installer\ProjectInstaller;
+use Composer\IO\IOInterface;
+use Composer\Repository\ComposerRepository;
+use Composer\Repository\FilesystemRepository;
+use Symfony\Component\Console\Input\InputArgument;
+use Symfony\Component\Console\Input\InputInterface;
+use Symfony\Component\Console\Input\InputOption;
+use Symfony\Component\Console\Output\OutputInterface;
+use Composer\Json\JsonFile;
+use Composer\Util\RemoteFilesystem;
+
+/**
+ * Install a package as new project into new directory.
+ *
+ * @author Benjamin Eberlei <kontakt@beberlei.de>
+ */
+class CreateProjectCommand extends Command
+{
+    protected function configure()
+    {
+        $this
+            ->setName('create-project')
+            ->setDescription('Create new project from a package into given directory.')
+            ->setDefinition(array(
+                new InputArgument('package', InputArgument::REQUIRED, 'Package name to be installed'),
+                new InputArgument('directory', InputArgument::OPTIONAL, 'Directory where the files should be created'),
+                new InputArgument('version', InputArgument::OPTIONAL, 'Version, will defaults to latest'),
+                new InputOption('prefer-source', null, InputOption::VALUE_NONE, 'Forces installation from package sources when possible, including VCS information.'),
+                new InputOption('repository-url', null, InputOption::VALUE_REQUIRED, 'Pick a different repository url to look for the package.'),
+            ))
+            ->setHelp(<<<EOT
+The <info>create-project</info> command creates a new project from a given
+package into a new directory. You can use this command to bootstrap new
+projects or setup a clean version-controlled installation
+for developers of your project.
+
+<info>php composer.phar create-project vendor/project target-directory [version]</info>
+
+To setup a developer workable version you should create the project using the source
+controlled code by appending the <info>'--prefer-source'</info> flag.
+
+To install a package from another repository repository than the default one you
+can pass the <info>'--repository-url=http://myrepository.org'</info> flag.
+
+EOT
+            )
+        ;
+    }
+
+    protected function execute(InputInterface $input, OutputInterface $output)
+    {
+        return $this->installProject(
+            $this->getIO(),
+            $input->getArgument('package'),
+            $input->getArgument('directory'),
+            $input->getArgument('version'),
+            (Boolean) $input->getOption('prefer-source'),
+            $input->getOption('repository-url')
+        );
+    }
+
+    public function installProject(IOInterface $io, $packageName, $directory = null, $version = null, $preferSource = false, $repositoryUrl = null)
+    {
+        $dm = $this->createDownloadManager($io);
+        if ($preferSource) {
+            $dm->setPreferSource(true);
+        }
+
+        if (null === $repositoryUrl) {
+            $sourceRepo = new ComposerRepository(array('url' => 'http://packagist.org'), $io);
+        } elseif ("json" === pathinfo($repositoryUrl, PATHINFO_EXTENSION)) {
+            $sourceRepo = new FilesystemRepository(new JsonFile($repositoryUrl, new RemoteFilesystem($io)));
+        } elseif (0 === strpos($repositoryUrl, 'http')) {
+            $sourceRepo = new ComposerRepository(array('url' => $repositoryUrl), $io);
+        } else {
+            throw new \InvalidArgumentException("Invalid repository url given. Has to be a .json file or an http url.");
+        }
+
+        $candidates = $sourceRepo->findPackages($packageName, $version);
+        if (!$candidates) {
+            throw new \InvalidArgumentException("Could not find package $packageName" . ($version ? " with version $version." : ''));
+        }
+
+        if (null === $directory) {
+            $parts = explode("/", $packageName, 2);
+            $directory = getcwd() . DIRECTORY_SEPARATOR . array_pop($parts);
+        }
+
+        // select highest version if we have many
+        $package = $candidates[0];
+        foreach ($candidates as $candidate) {
+            if (version_compare($package->getVersion(), $candidate->getVersion(), '<')) {
+                $package = $candidate;
+            }
+        }
+
+        $io->write('<info>Installing ' . $package->getName() . ' as new project.</info>', true);
+        $projectInstaller = new ProjectInstaller($directory, $dm);
+        $projectInstaller->install($package);
+
+        $io->write('<info>Created project into directory ' . $directory . '</info>', true);
+        chdir($directory);
+
+        $composer = Factory::create($io);
+        $installer = Installer::create($io, $composer);
+
+        $installer
+            ->setPreferSource($preferSource)
+            ->run();
+    }
+
+    protected function createDownloadManager(IOInterface $io)
+    {
+        $factory = new Factory();
+        return $factory->createDownloadManager($io);
+    }
+}
+
diff --git a/vendor/composer/composer/src/Composer/Command/DependsCommand.php b/vendor/composer/composer/src/Composer/Command/DependsCommand.php
new file mode 100644
index 0000000..82ff5e0
--- /dev/null
+++ b/vendor/composer/composer/src/Composer/Command/DependsCommand.php
@@ -0,0 +1,117 @@
+<?php
+
+/*
+ * This file is part of Composer.
+ *
+ * (c) Nils Adermann <naderman@naderman.de>
+ *     Jordi Boggiano <j.boggiano@seld.be>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Composer\Command;
+
+use Composer\Composer;
+use Composer\Package\PackageInterface;
+use Symfony\Component\Console\Input\InputInterface;
+use Symfony\Component\Console\Input\InputArgument;
+use Symfony\Component\Console\Input\InputOption;
+use Symfony\Component\Console\Output\OutputInterface;
+
+/**
+ * @author Justin Rainbow <justin.rainbow@gmail.com>
+ * @author Jordi Boggiano <j.boggiano@seld.be>
+ */
+class DependsCommand extends Command
+{
+    protected $linkTypes = array('require', 'recommend', 'suggest');
+
+    protected function configure()
+    {
+        $this
+            ->setName('depends')
+            ->setDescription('Shows which packages depend on the given package')
+            ->setDefinition(array(
+                new InputArgument('package', InputArgument::REQUIRED, 'Package to inspect'),
+                new InputOption('link-type', '', InputOption::VALUE_OPTIONAL | InputOption::VALUE_IS_ARRAY, 'Link types to show', $this->linkTypes)
+            ))
+            ->setHelp(<<<EOT
+Displays detailed information about where a package is referenced.
+
+<info>php composer.phar depends composer/composer</info>
+
+EOT
+            )
+        ;
+    }
+
+    protected function execute(InputInterface $input, OutputInterface $output)
+    {
+        $composer = $this->getComposer();
+        $references = $this->getReferences($input, $output, $composer);
+
+        if ($input->getOption('verbose')) {
+            $this->printReferences($input, $output, $references);
+        } else {
+            $this->printPackages($input, $output, $references);
+        }
+    }
+
+    /**
+     * finds a list of packages which depend on another package
+     *
+     * @param InputInterface $input
+     * @param OutputInterface $output
+     * @param Composer $composer
+     * @return array
+     * @throws \InvalidArgumentException
+     */
+    private function getReferences(InputInterface $input, OutputInterface $output, Composer $composer)
+    {
+        $needle = $input->getArgument('package');
+
+        $references = array();
+        $verbose = (Boolean) $input->getOption('verbose');
+
+        $repos = $composer->getRepositoryManager()->getRepositories();
+        $types = $input->getOption('link-type');
+
+        foreach ($repos as $repository) {
+            foreach ($repository->getPackages() as $package) {
+                foreach ($types as $type) {
+                    $type = rtrim($type, 's');
+                    if (!in_array($type, $this->linkTypes)) {
+                        throw new \InvalidArgumentException('Unexpected link type: '.$type.', valid types: '.implode(', ', $this->linkTypes));
+                    }
+                    foreach ($package->{'get'.$type.'s'}() as $link) {
+                        if ($link->getTarget() === $needle) {
+                            if ($verbose) {
+                                $references[] = array($type, $package, $link);
+                            } else {
+                                $references[$package->getName()] = $package->getPrettyName();
+                            }
+                        }
+                    }
+                }
+            }
+        }
+
+        return $references;
+    }
+
+    private function printReferences(InputInterface $input, OutputInterface $output, array $references)
+    {
+        foreach ($references as $ref) {
+            $output->writeln($ref[1]->getPrettyName() . ' ' . $ref[1]->getPrettyVersion() . ' <info>' . $ref[0] . '</info> ' . $ref[2]->getPrettyConstraint());
+        }
+    }
+
+    private function printPackages(InputInterface $input, OutputInterface $output, array $packages)
+    {
+        ksort($packages);
+        foreach ($packages as $package) {
+            $output->writeln($package);
+        }
+    }
+}
\ No newline at end of file
diff --git a/vendor/composer/composer/src/Composer/Command/Helper/DialogHelper.php b/vendor/composer/composer/src/Composer/Command/Helper/DialogHelper.php
new file mode 100644
index 0000000..d08ac19
--- /dev/null
+++ b/vendor/composer/composer/src/Composer/Command/Helper/DialogHelper.php
@@ -0,0 +1,37 @@
+<?php
+
+/*
+ * This file is part of Composer.
+ *
+ * (c) Nils Adermann <naderman@naderman.de>
+ *     Jordi Boggiano <j.boggiano@seld.be>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Composer\Command\Helper;
+
+use Symfony\Component\Console\Helper\DialogHelper as BaseDialogHelper;
+use Symfony\Component\Console\Output\OutputInterface;
+
+class DialogHelper extends BaseDialogHelper
+{
+    /**
+     * Build text for asking a question. For example:
+     *
+     *  "Do you want to continue [yes]:"
+     *
+     * @param string $question The question you want to ask
+     * @param mixed $default Default value to add to message, if false no default will be shown
+     * @param string $sep Separation char for between message and user input
+     *
+     * @return string
+     */
+    public function getQuestion($question, $default = null, $sep = ':')
+    {
+        return $default !== null ?
+            sprintf('<info>%s</info> [<comment>%s</comment>]%s ', $question, $default, $sep) :
+            sprintf('<info>%s</info>%s ', $question, $sep);
+    }
+}
\ No newline at end of file
diff --git a/vendor/composer/composer/src/Composer/Command/InitCommand.php b/vendor/composer/composer/src/Composer/Command/InitCommand.php
new file mode 100644
index 0000000..e72f01e
--- /dev/null
+++ b/vendor/composer/composer/src/Composer/Command/InitCommand.php
@@ -0,0 +1,391 @@
+<?php
+
+/*
+ * This file is part of Composer.
+ *
+ * (c) Nils Adermann <naderman@naderman.de>
+ *     Jordi Boggiano <j.boggiano@seld.be>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Composer\Command;
+
+use Composer\Json\JsonFile;
+use Composer\Repository\CompositeRepository;
+use Composer\Repository\PlatformRepository;
+use Composer\Repository\ComposerRepository;
+use Symfony\Component\Console\Input\InputInterface;
+use Symfony\Component\Console\Input\InputOption;
+use Symfony\Component\Console\Output\OutputInterface;
+use Symfony\Component\Process\Process;
+use Symfony\Component\Process\ExecutableFinder;
+
+/**
+ * @author Justin Rainbow <justin.rainbow@gmail.com>
+ * @author Jordi Boggiano <j.boggiano@seld.be>
+ */
+class InitCommand extends Command
+{
+    private $gitConfig;
+    private $repos;
+
+    public function parseAuthorString($author)
+    {
+        if (preg_match('/^(?P<name>[- \.,\w\'’]+) <(?P<email>.+?)>$/u', $author, $match)) {
+            if (!function_exists('filter_var') || $match['email'] === filter_var($match['email'], FILTER_VALIDATE_EMAIL)) {
+                return array(
+                    'name'  => trim($match['name']),
+                    'email' => $match['email']
+                );
+            }
+        }
+
+        throw new \InvalidArgumentException(
+            'Invalid author string.  Must be in the format: '.
+            'John Smith <john@example.com>'
+        );
+    }
+
+    protected function configure()
+    {
+        $this
+            ->setName('init')
+            ->setDescription('Creates a basic composer.json file in current directory.')
+            ->setDefinition(array(
+                new InputOption('name', null, InputOption::VALUE_NONE, 'Name of the package'),
+                new InputOption('description', null, InputOption::VALUE_NONE, 'Description of package'),
+                new InputOption('author', null, InputOption::VALUE_NONE, 'Author name of package'),
+                // new InputOption('version', null, InputOption::VALUE_NONE, 'Version of package'),
+                new InputOption('homepage', null, InputOption::VALUE_NONE, 'Homepage of package'),
+                new InputOption('require', null, InputOption::VALUE_IS_ARRAY | InputOption::VALUE_REQUIRED, 'An array required packages'),
+            ))
+            ->setHelp(<<<EOT
+The <info>init</info> command creates a basic composer.json file
+in the current directory.
+
+<info>php composer.phar init</info>
+
+EOT
+            )
+        ;
+    }
+
+    protected function execute(InputInterface $input, OutputInterface $output)
+    {
+        $dialog = $this->getHelperSet()->get('dialog');
+
+        $whitelist = array('name', 'description', 'author', 'require');
+
+        $options = array_filter(array_intersect_key($input->getOptions(), array_flip($whitelist)));
+
+        if (isset($options['author'])) {
+            $options['authors'] = $this->formatAuthors($options['author']);
+            unset($options['author']);
+        }
+
+        $options['require'] = isset($options['require']) ?
+            $this->formatRequirements($options['require']) :
+            new \stdClass;
+
+        $file = new JsonFile('composer.json');
+
+        $json = $file->encode($options);
+
+        if ($input->isInteractive()) {
+            $output->writeln(array(
+                '',
+                $json,
+                ''
+            ));
+            if (!$dialog->askConfirmation($output, $dialog->getQuestion('Do you confirm generation', 'yes', '?'), true)) {
+                $output->writeln('<error>Command aborted</error>');
+
+                return 1;
+            }
+        }
+
+        $file->write($options);
+
+        if ($input->isInteractive()) {
+            $ignoreFile = realpath('.gitignore');
+
+            if (false === $ignoreFile) {
+                $ignoreFile = realpath('.') . '/.gitignore';
+            }
+
+            if (!$this->hasVendorIgnore($ignoreFile)) {
+                $question = 'Would you like the <info>vendor</info> directory added to your <info>.gitignore</info> [<comment>yes</comment>]?';
+
+                if ($dialog->askConfirmation($output, $question, true)) {
+                    $this->addVendorIgnore($ignoreFile);
+                }
+            }
+        }
+    }
+
+    protected function interact(InputInterface $input, OutputInterface $output)
+    {
+        $git = $this->getGitConfig();
+
+        $dialog = $this->getHelperSet()->get('dialog');
+        $formatter = $this->getHelperSet()->get('formatter');
+        $output->writeln(array(
+            '',
+            $formatter->formatBlock('Welcome to the Composer config generator', 'bg=blue;fg=white', true),
+            ''
+        ));
+
+        // namespace
+        $output->writeln(array(
+            '',
+            'This command will guide you through creating your composer.json config.',
+            '',
+        ));
+
+        $cwd = realpath(".");
+
+        if (false === $name = $input->getOption('name')) {
+            $name = basename($cwd);
+            if (isset($git['github.user'])) {
+                $name = $git['github.user'] . '/' . $name;
+            } elseif (!empty($_SERVER['USERNAME'])) {
+                $name = $_SERVER['USERNAME'] . '/' . $name;
+            } elseif (get_current_user()) {
+                $name = get_current_user() . '/' . $name;
+            } else {
+                // package names must be in the format foo/bar
+                $name = $name . '/' . $name;
+            }
+        }
+
+        $name = $dialog->askAndValidate(
+            $output,
+            $dialog->getQuestion('Package name (<vendor>/<name>)', $name),
+            function ($value) use ($name) {
+                if (null === $value) {
+                    return $name;
+                }
+
+                if (!preg_match('{^[a-z0-9_.-]+/[a-z0-9_.-]+$}i', $value)) {
+                    throw new \InvalidArgumentException(
+                        'The package name '.$value.' is invalid, it should have a vendor name, a forward slash, and a package name, matching: [a-z0-9_.-]+/[a-z0-9_.-]+'
+                    );
+                }
+
+                return $value;
+            }
+        );
+        $input->setOption('name', $name);
+
+        $description = $input->getOption('description') ?: false;
+        $description = $dialog->ask(
+            $output,
+            $dialog->getQuestion('Description', $description)
+        );
+        $input->setOption('description', $description);
+
+        if (false === $author = $input->getOption('author')) {
+            if (isset($git['user.name']) && isset($git['user.email'])) {
+                $author = sprintf('%s <%s>', $git['user.name'], $git['user.email']);
+            }
+        }
+
+        $self = $this;
+        $author = $dialog->askAndValidate(
+            $output,
+            $dialog->getQuestion('Author', $author),
+            function ($value) use ($self, $author) {
+                if (null === $value) {
+                    return $author;
+                }
+
+                $author = $self->parseAuthorString($value);
+
+                return sprintf('%s <%s>', $author['name'], $author['email']);
+            }
+        );
+        $input->setOption('author', $author);
+
+        $output->writeln(array(
+            '',
+            'Define your dependencies.',
+            ''
+        ));
+
+        $requirements = array();
+        if ($dialog->askConfirmation($output, $dialog->getQuestion('Would you like to define your dependencies interactively', 'yes', '?'), true)) {
+            $requirements = $this->determineRequirements($input, $output);
+        }
+        $input->setOption('require', $requirements);
+    }
+
+    protected function findPackages($name)
+    {
+        $packages = array();
+
+        // init repos
+        if (!$this->repos) {
+            $this->repos = new CompositeRepository(array(
+                new PlatformRepository,
+                new ComposerRepository(array('url' => 'http://packagist.org'), $this->getIO())
+            ));
+        }
+
+        $token = strtolower($name);
+        foreach ($this->repos->getPackages() as $package) {
+            if (false === ($pos = strpos($package->getName(), $token))) {
+                continue;
+            }
+
+            $packages[] = $package;
+        }
+
+        return $packages;
+    }
+
+    protected function determineRequirements(InputInterface $input, OutputInterface $output)
+    {
+        $dialog = $this->getHelperSet()->get('dialog');
+        $prompt = $dialog->getQuestion('Search for a package', false, ':');
+
+        $requires = $input->getOption('require') ?: array();
+
+        while (null !== $package = $dialog->ask($output, $prompt)) {
+            $matches = $this->findPackages($package);
+
+            if (count($matches)) {
+                $output->writeln(array(
+                    '',
+                    sprintf('Found <info>%s</info> packages matching <info>%s</info>', count($matches), $package),
+                    ''
+                ));
+
+                foreach ($matches as $position => $package) {
+                    $output->writeln(sprintf(' <info>%5s</info> %s <comment>%s</comment>', "[$position]", $package->getPrettyName(), $package->getPrettyVersion()));
+                }
+
+                $output->writeln('');
+
+                $validator = function ($selection) use ($matches) {
+                    if ('' === $selection) {
+                        return false;
+                    }
+
+                    if (!is_numeric($selection) && preg_match('{^\s*(\S+) +(\S.*)\s*}', $selection, $matches)) {
+                        return $matches[1].' '.$matches[2];
+                    }
+
+                    if (!isset($matches[(int) $selection])) {
+                        throw new \Exception('Not a valid selection');
+                    }
+
+                    $package = $matches[(int) $selection];
+
+                    return sprintf('%s %s', $package->getName(), $package->getPrettyVersion());
+                };
+
+                $package = $dialog->askAndValidate($output, $dialog->getQuestion('Enter package # to add, or a <package> <version> couple if it is not listed', false, ':'), $validator, 3);
+
+                if (false !== $package) {
+                    $requires[] = $package;
+                }
+            }
+        }
+
+        return $requires;
+    }
+
+    protected function formatAuthors($author)
+    {
+        return array($this->parseAuthorString($author));
+    }
+
+    protected function formatRequirements(array $requirements)
+    {
+        $requires = array();
+        foreach ($requirements as $requirement) {
+            list($packageName, $packageVersion) = explode(" ", $requirement, 2);
+
+            $requires[$packageName] = $packageVersion;
+        }
+
+        return empty($requires) ? new \stdClass : $requires;
+    }
+
+    protected function getGitConfig()
+    {
+        if (null !== $this->gitConfig) {
+            return $this->gitConfig;
+        }
+
+        $finder = new ExecutableFinder();
+        $gitBin = $finder->find('git');
+
+        $cmd = new Process(sprintf('%s config -l', escapeshellarg($gitBin)));
+        $cmd->run();
+
+        if ($cmd->isSuccessful()) {
+            $this->gitConfig = array();
+            preg_match_all('{^([^=]+)=(.*)$}m', $cmd->getOutput(), $matches, PREG_SET_ORDER);
+            foreach ($matches as $match) {
+                $this->gitConfig[$match[1]] = $match[2];
+            }
+            return $this->gitConfig;
+        }
+
+        return $this->gitConfig = array();
+    }
+
+    /**
+     * Checks the local .gitignore file for the Composer vendor directory.
+     *
+     * Tested patterns include:
+     *  "/$vendor"
+     *  "$vendor"
+     *  "$vendor/"
+     *  "/$vendor/"
+     *  "/$vendor/*"
+     *  "$vendor/*"
+     *
+     * @param string $ignoreFile
+     * @param string $vendor
+     *
+     * @return Boolean
+     */
+    protected function hasVendorIgnore($ignoreFile, $vendor = 'vendor')
+    {
+        if (!file_exists($ignoreFile)) {
+            return false;
+        }
+
+        $pattern = sprintf(
+            '~^/?%s(/|/\*)?$~',
+            preg_quote($vendor, '~')
+        );
+
+        $lines = file($ignoreFile, FILE_IGNORE_NEW_LINES);
+        foreach ($lines as $line) {
+            if (preg_match($pattern, $line)) {
+                return true;
+            }
+        }
+
+        return false;
+    }
+
+    protected function addVendorIgnore($ignoreFile, $vendor = 'vendor')
+    {
+        $contents = "";
+        if (file_exists($ignoreFile)) {
+            $contents = file_get_contents($ignoreFile);
+
+            if ("\n" !== substr($contents, 0, -1)) {
+                $contents .= "\n";
+            }
+        }
+
+        file_put_contents($ignoreFile, $contents . $vendor. "\n");
+    }
+}
\ No newline at end of file
diff --git a/vendor/composer/composer/src/Composer/Command/InstallCommand.php b/vendor/composer/composer/src/Composer/Command/InstallCommand.php
new file mode 100644
index 0000000..1f711c3
--- /dev/null
+++ b/vendor/composer/composer/src/Composer/Command/InstallCommand.php
@@ -0,0 +1,66 @@
+<?php
+
+/*
+ * This file is part of Composer.
+ *
+ * (c) Nils Adermann <naderman@naderman.de>
+ *     Jordi Boggiano <j.boggiano@seld.be>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Composer\Command;
+
+use Composer\Installer;
+use Symfony\Component\Console\Input\InputInterface;
+use Symfony\Component\Console\Input\InputOption;
+use Symfony\Component\Console\Output\OutputInterface;
+
+/**
+ * @author Jordi Boggiano <j.boggiano@seld.be>
+ * @author Ryan Weaver <ryan@knplabs.com>
+ * @author Konstantin Kudryashov <ever.zet@gmail.com>
+ */
+class InstallCommand extends Command
+{
+    protected function configure()
+    {
+        $this
+            ->setName('install')
+            ->setDescription('Parses the composer.json file and downloads the needed dependencies.')
+            ->setDefinition(array(
+                new InputOption('prefer-source', null, InputOption::VALUE_NONE, 'Forces installation from package sources when possible, including VCS information.'),
+                new InputOption('dry-run', null, InputOption::VALUE_NONE, 'Outputs the operations but will not execute anything (implicitly enables --verbose).'),
+                new InputOption('no-install-recommends', null, InputOption::VALUE_NONE, 'Do not install recommended packages (ignored when installing from an existing lock file).'),
+                new InputOption('install-suggests', null, InputOption::VALUE_NONE, 'Also install suggested packages (ignored when installing from an existing lock file).'),
+            ))
+            ->setHelp(<<<EOT
+The <info>install</info> command reads the composer.json file from the
+current directory, processes it, and downloads and installs all the
+libraries and dependencies outlined in that file.
+
+<info>php composer.phar install</info>
+
+EOT
+            )
+        ;
+    }
+
+    protected function execute(InputInterface $input, OutputInterface $output)
+    {
+        $composer = $this->getComposer();
+        $io = $this->getIO();
+        $install = Installer::create($io, $composer);
+
+        $install
+            ->setDryRun($input->getOption('dry-run'))
+            ->setVerbose($input->getOption('verbose'))
+            ->setPreferSource($input->getOption('prefer-source'))
+            ->setInstallRecommends(!$input->getOption('no-install-recommends'))
+            ->setInstallSuggests($input->getOption('install-suggests'))
+        ;
+
+        return $install->run() ? 0 : 1;
+    }
+}
diff --git a/vendor/composer/composer/src/Composer/Command/SearchCommand.php b/vendor/composer/composer/src/Composer/Command/SearchCommand.php
new file mode 100644
index 0000000..2a25dc6
--- /dev/null
+++ b/vendor/composer/composer/src/Composer/Command/SearchCommand.php
@@ -0,0 +1,109 @@
+<?php
+
+/*
+ * This file is part of Composer.
+ *
+ * (c) Nils Adermann <naderman@naderman.de>
+ *     Jordi Boggiano <j.boggiano@seld.be>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Composer\Command;
+
+use Symfony\Component\Console\Input\InputInterface;
+use Symfony\Component\Console\Input\InputArgument;
+use Symfony\Component\Console\Output\OutputInterface;
+use Composer\Repository\CompositeRepository;
+use Composer\Repository\PlatformRepository;
+use Composer\Repository\ComposerRepository;
+use Composer\Package\PackageInterface;
+use Composer\Package\AliasPackage;
+
+/**
+ * @author Robert Schönthal <seroscho@googlemail.com>
+ */
+class SearchCommand extends Command
+{
+    protected function configure()
+    {
+        $this
+            ->setName('search')
+            ->setDescription('Search for packages')
+            ->setDefinition(array(
+                new InputArgument('tokens', InputArgument::IS_ARRAY | InputArgument::REQUIRED, 'tokens to search for'),
+            ))
+            ->setHelp(<<<EOT
+The search command searches for packages by its name
+<info>php composer.phar search symfony composer</info>
+
+EOT
+            )
+        ;
+    }
+
+    protected function execute(InputInterface $input, OutputInterface $output)
+    {
+        // init repos
+        $platformRepo = new PlatformRepository;
+        if ($composer = $this->getComposer(false)) {
+            $localRepo = $composer->getRepositoryManager()->getLocalRepository();
+            $installedRepo = new CompositeRepository(array($localRepo, $platformRepo));
+            $repos = new CompositeRepository(array_merge(array($installedRepo), $composer->getRepositoryManager()->getRepositories()));
+        } else {
+            $output->writeln('No composer.json found in the current directory, showing packages from packagist.org');
+            $installedRepo = $platformRepo;
+            $packagist = new ComposerRepository(array('url' => 'http://packagist.org'), $this->getIO());
+            $repos = new CompositeRepository(array($installedRepo, $packagist));
+        }
+
+        $tokens = $input->getArgument('tokens');
+        $packages = array();
+
+        foreach ($repos->getPackages() as $package) {
+            if ($package instanceof AliasPackage || isset($packages[$package->getName()])) {
+                continue;
+            }
+
+            foreach ($tokens as $token) {
+                if (!$this->matchPackage($package, $token)) {
+                    continue;
+                }
+
+                if (false !== ($pos = stripos($package->getName(), $token))) {
+                    $name = substr($package->getPrettyName(), 0, $pos)
+                        . '<highlight>' . substr($package->getPrettyName(), $pos, strlen($token)) . '</highlight>'
+                        . substr($package->getPrettyName(), $pos + strlen($token));
+                } else {
+                    $name = $package->getPrettyName();
+                }
+
+                $packages[$package->getName()] = array(
+                    'name' => $name,
+                    'description' => strtok($package->getDescription(), "\r\n")
+                );
+                continue 2;
+            }
+        }
+
+        foreach ($packages as $details) {
+            $output->writeln($details['name'] .' <comment>:</comment> '. $details['description']);
+        }
+    }
+
+    /**
+     * tries to find a token within the name/keywords/description
+     *
+     * @param PackageInterface $package
+     * @param string $token
+     * @return boolean
+     */
+    private function matchPackage(PackageInterface $package, $token)
+    {
+        return (false !== stripos($package->getName(), $token))
+            || (false !== stripos(join(',', $package->getKeywords() ?: array()), $token))
+            || (false !== stripos($package->getDescription(), $token))
+        ;
+    }
+}
\ No newline at end of file
diff --git a/vendor/composer/composer/src/Composer/Command/SelfUpdateCommand.php b/vendor/composer/composer/src/Composer/Command/SelfUpdateCommand.php
new file mode 100644
index 0000000..721e444
--- /dev/null
+++ b/vendor/composer/composer/src/Composer/Command/SelfUpdateCommand.php
@@ -0,0 +1,57 @@
+<?php
+
+/*
+ * This file is part of Composer.
+ *
+ * (c) Nils Adermann <naderman@naderman.de>
+ *     Jordi Boggiano <j.boggiano@seld.be>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Composer\Command;
+
+use Composer\Composer;
+use Composer\Util\RemoteFilesystem;
+use Symfony\Component\Console\Input\InputInterface;
+use Symfony\Component\Console\Output\OutputInterface;
+
+/**
+ * @author Igor Wiedler <igor@wiedler.ch>
+ */
+class SelfUpdateCommand extends Command
+{
+    protected function configure()
+    {
+        $this
+            ->setName('self-update')
+            ->setDescription('Updates composer.phar to the latest version.')
+            ->setHelp(<<<EOT
+The <info>self-update</info> command checks getcomposer.org for newer
+versions of composer and if found, installs the latest.
+
+<info>php composer.phar self-update</info>
+
+EOT
+            )
+        ;
+    }
+
+    protected function execute(InputInterface $input, OutputInterface $output)
+    {
+        $rfs = new RemoteFilesystem($this->getIO());
+        $latest = trim($rfs->getContents('getcomposer.org', 'http://getcomposer.org/version', false));
+
+        if (Composer::VERSION !== $latest) {
+            $output->writeln(sprintf("Updating to version <info>%s</info>.", $latest));
+
+            $remoteFilename = 'http://getcomposer.org/composer.phar';
+            $localFilename = $_SERVER['argv'][0];
+
+            $rfs->copy('getcomposer.org', $remoteFilename, $localFilename);
+        } else {
+            $output->writeln("<info>You are using the latest composer version.</info>");
+        }
+    }
+}
diff --git a/vendor/composer/composer/src/Composer/Command/ShowCommand.php b/vendor/composer/composer/src/Composer/Command/ShowCommand.php
new file mode 100644
index 0000000..167d34b
--- /dev/null
+++ b/vendor/composer/composer/src/Composer/Command/ShowCommand.php
@@ -0,0 +1,222 @@
+<?php
+
+/*
+ * This file is part of Composer.
+ *
+ * (c) Nils Adermann <naderman@naderman.de>
+ *     Jordi Boggiano <j.boggiano@seld.be>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Composer\Command;
+
+use Composer\Composer;
+use Composer\Package\PackageInterface;
+use Symfony\Component\Console\Input\InputInterface;
+use Symfony\Component\Console\Input\InputArgument;
+use Symfony\Component\Console\Input\InputOption;
+use Symfony\Component\Console\Output\OutputInterface;
+use Composer\Repository\CompositeRepository;
+use Composer\Repository\PlatformRepository;
+use Composer\Repository\ComposerRepository;
+use Composer\Repository\RepositoryInterface;
+
+/**
+ * @author Robert Schönthal <seroscho@googlemail.com>
+ * @author Jordi Boggiano <j.boggiano@seld.be>
+ */
+class ShowCommand extends Command
+{
+    protected function configure()
+    {
+        $this
+            ->setName('show')
+            ->setDescription('Show information about packages')
+            ->setDefinition(array(
+                new InputArgument('package', InputArgument::OPTIONAL, 'Package to inspect'),
+                new InputArgument('version', InputArgument::OPTIONAL, 'Version to inspect'),
+                new InputOption('installed', null, InputOption::VALUE_NONE, 'List installed packages only'),
+                new InputOption('platform', null, InputOption::VALUE_NONE, 'List platform packages only'),
+            ))
+            ->setHelp(<<<EOT
+The show command displays detailed information about a package, or
+lists all packages available.
+
+EOT
+            )
+        ;
+    }
+
+    protected function execute(InputInterface $input, OutputInterface $output)
+    {
+        // init repos
+        $platformRepo = new PlatformRepository;
+        if ($input->getOption('platform')) {
+            $repos = $installedRepo = $platformRepo;
+        } elseif ($input->getOption('installed')) {
+            $composer = $this->getComposer();
+            $repos = $installedRepo = $composer->getRepositoryManager()->getLocalRepository();
+        } elseif ($composer = $this->getComposer(false)) {
+            $localRepo = $composer->getRepositoryManager()->getLocalRepository();
+            $installedRepo = new CompositeRepository(array($localRepo, $platformRepo));
+            $repos = new CompositeRepository(array_merge(array($installedRepo), $composer->getRepositoryManager()->getRepositories()));
+        } else {
+            $output->writeln('No composer.json found in the current directory, showing packages from packagist.org');
+            $installedRepo = $platformRepo;
+            $packagist = new ComposerRepository(array('url' => 'http://packagist.org'), $this->getIO());
+            $repos = new CompositeRepository(array($installedRepo, $packagist));
+        }
+
+        // show single package or single version
+        if ($input->getArgument('package')) {
+            $package = $this->getPackage($input, $output, $installedRepo, $repos);
+            if (!$package) {
+                throw new \InvalidArgumentException('Package '.$input->getArgument('package').' not found');
+            }
+
+            $this->printMeta($input, $output, $package, $installedRepo, $repos);
+            $this->printLinks($input, $output, $package, 'requires');
+            $this->printLinks($input, $output, $package, 'recommends');
+            $this->printLinks($input, $output, $package, 'replaces');
+            return;
+        }
+
+        // list packages
+        $packages = array();
+        foreach ($repos->getPackages() as $package) {
+            if ($platformRepo->hasPackage($package)) {
+                $type = '<info>platform</info>:';
+            } elseif ($installedRepo->hasPackage($package)) {
+                $type = '<info>installed</info>:';
+            } else {
+                $type = '<comment>available</comment>:';
+            }
+            if (isset($packages[$type][$package->getName()])
+                && version_compare($packages[$type][$package->getName()]->getVersion(), $package->getVersion(), '>=')
+            ) {
+                continue;
+            }
+            $packages[$type][$package->getName()] = $package;
+        }
+
+        foreach (array('<info>platform</info>:', '<comment>available</comment>:', '<info>installed</info>:') as $type) {
+            if (isset($packages[$type])) {
+                $output->writeln($type);
+                ksort($packages[$type]);
+                foreach ($packages[$type] as $package) {
+                    $output->writeln('  '.$package->getPrettyName() .' <comment>:</comment> '. strtok($package->getDescription(), "\r\n"));
+                }
+                $output->writeln('');
+            }
+        }
+    }
+
+    /**
+     * finds a package by name and version if provided
+     *
+     * @param InputInterface $input
+     * @return PackageInterface
+     * @throws \InvalidArgumentException
+     */
+    protected function getPackage(InputInterface $input, OutputInterface $output, RepositoryInterface $installedRepo, RepositoryInterface $repos)
+    {
+        // we have a name and a version so we can use ::findPackage
+        if ($input->getArgument('version')) {
+            return $repos->findPackage($input->getArgument('package'), $input->getArgument('version'));
+        }
+
+        // check if we have a local installation so we can grab the right package/version
+        foreach ($installedRepo->getPackages() as $package) {
+            if ($package->getName() === $input->getArgument('package')) {
+                return $package;
+            }
+        }
+
+        // we only have a name, so search for the highest version of the given package
+        $highestVersion = null;
+        foreach ($repos->findPackages($input->getArgument('package')) as $package) {
+            if (null === $highestVersion || version_compare($package->getVersion(), $highestVersion->getVersion(), '>=')) {
+                $highestVersion = $package;
+            }
+        }
+
+        return $highestVersion;
+    }
+
+    /**
+     * prints package meta data
+     */
+    protected function printMeta(InputInterface $input, OutputInterface $output, PackageInterface $package, RepositoryInterface $installedRepo, RepositoryInterface $repos)
+    {
+        $output->writeln('<info>name</info>     : ' . $package->getPrettyName());
+        $output->writeln('<info>descrip.</info> : ' . $package->getDescription());
+        $output->writeln('<info>keywords</info> : ' . join(', ', $package->getKeywords() ?: array()));
+        $this->printVersions($input, $output, $package, $installedRepo, $repos);
+        $output->writeln('<info>type</info>     : ' . $package->getType());
+        $output->writeln('<info>license</info>  : ' . implode(', ', $package->getLicense()));
+        $output->writeln('<info>source</info>   : ' . sprintf('[%s] <comment>%s</comment> %s', $package->getSourceType(), $package->getSourceUrl(), $package->getSourceReference()));
+        $output->writeln('<info>dist</info>     : ' . sprintf('[%s] <comment>%s</comment> %s', $package->getDistType(), $package->getDistUrl(), $package->getDistReference()));
+        $output->writeln('<info>names</info>    : ' . implode(', ', $package->getNames()));
+
+        if ($package->getAutoload()) {
+            $output->writeln("\n<info>autoload</info>");
+            foreach ($package->getAutoload() as $type => $autoloads) {
+                $output->writeln('<comment>' . $type . '</comment>');
+
+                if ($type === 'psr-0') {
+                    foreach ($autoloads as $name => $path) {
+                        $output->writeln(($name ?: '*') . ' => ' . ($path ?: '.'));
+                    }
+                } elseif ($type === 'classmap') {
+                    $output->writeln(implode(', ', $autoloads));
+                }
+            }
+        }
+    }
+
+    /**
+     * prints all available versions of this package and highlights the installed one if any
+     */
+    protected function printVersions(InputInterface $input, OutputInterface $output, PackageInterface $package, RepositoryInterface $installedRepo, RepositoryInterface $repos)
+    {
+        if ($input->getArgument('version')) {
+            $output->writeln('<info>version</info>  : ' . $package->getPrettyVersion());
+            return;
+        }
+
+        $versions = array();
+
+        foreach ($repos->findPackages($package->getName()) as $version) {
+            $versions[$version->getPrettyVersion()] = $version->getVersion();
+        }
+
+        uasort($versions, 'version_compare');
+
+        $versions = implode(', ', array_keys(array_reverse($versions)));
+
+        // highlight installed version
+        if ($installedRepo->hasPackage($package)) {
+            $versions = str_replace($package->getPrettyVersion(), '<info>* ' . $package->getPrettyVersion() . '</info>', $versions);
+        }
+
+        $output->writeln('<info>versions</info> : ' . $versions);
+    }
+
+    /**
+     * print link objects
+     *
+     * @param string $linkType
+     */
+    protected function printLinks(InputInterface $input, OutputInterface $output, PackageInterface $package, $linkType)
+    {
+        if ($links = $package->{'get'.ucfirst($linkType)}()) {
+            $output->writeln("\n<info>" . $linkType . "</info>");
+
+            foreach ($links as $link) {
+                $output->writeln($link->getTarget() . ' <comment>' . $link->getPrettyConstraint() . '</comment>');
+            }
+        }
+    }
+}
diff --git a/vendor/composer/composer/src/Composer/Command/UpdateCommand.php b/vendor/composer/composer/src/Composer/Command/UpdateCommand.php
new file mode 100644
index 0000000..44bd17b
--- /dev/null
+++ b/vendor/composer/composer/src/Composer/Command/UpdateCommand.php
@@ -0,0 +1,65 @@
+<?php
+
+/*
+ * This file is part of Composer.
+ *
+ * (c) Nils Adermann <naderman@naderman.de>
+ *     Jordi Boggiano <j.boggiano@seld.be>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Composer\Command;
+
+use Composer\Installer;
+use Symfony\Component\Console\Input\InputInterface;
+use Symfony\Component\Console\Input\InputOption;
+use Symfony\Component\Console\Output\OutputInterface;
+
+/**
+ * @author Jordi Boggiano <j.boggiano@seld.be>
+ */
+class UpdateCommand extends Command
+{
+    protected function configure()
+    {
+        $this
+            ->setName('update')
+            ->setDescription('Updates your dependencies to the latest version, and updates the composer.lock file.')
+            ->setDefinition(array(
+                new InputOption('prefer-source', null, InputOption::VALUE_NONE, 'Forces installation from package sources when possible, including VCS information.'),
+                new InputOption('dry-run', null, InputOption::VALUE_NONE, 'Outputs the operations but will not execute anything (implicitly enables --verbose).'),
+                new InputOption('no-install-recommends', null, InputOption::VALUE_NONE, 'Do not install recommended packages.'),
+                new InputOption('install-suggests', null, InputOption::VALUE_NONE, 'Also install suggested packages.'),
+            ))
+            ->setHelp(<<<EOT
+The <info>update</info> command reads the composer.json file from the
+current directory, processes it, and updates, removes or installs all the
+dependencies.
+
+<info>php composer.phar update</info>
+
+EOT
+            )
+        ;
+    }
+
+    protected function execute(InputInterface $input, OutputInterface $output)
+    {
+        $composer = $this->getComposer();
+        $io = $this->getIO();
+        $install = Installer::create($io, $composer);
+
+        $install
+            ->setDryRun($input->getOption('dry-run'))
+            ->setVerbose($input->getOption('verbose'))
+            ->setPreferSource($input->getOption('prefer-source'))
+            ->setInstallRecommends(!$input->getOption('no-install-recommends'))
+            ->setInstallSuggests($input->getOption('install-suggests'))
+            ->setUpdate(true)
+        ;
+
+        return $install->run();
+    }
+}
diff --git a/vendor/composer/composer/src/Composer/Command/ValidateCommand.php b/vendor/composer/composer/src/Composer/Command/ValidateCommand.php
new file mode 100644
index 0000000..b65841d
--- /dev/null
+++ b/vendor/composer/composer/src/Composer/Command/ValidateCommand.php
@@ -0,0 +1,84 @@
+<?php
+
+/*
+ * This file is part of Composer.
+ *
+ * (c) Nils Adermann <naderman@naderman.de>
+ *     Jordi Boggiano <j.boggiano@seld.be>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Composer\Command;
+
+use Symfony\Component\Console\Input\InputInterface;
+use Symfony\Component\Console\Input\InputArgument;
+use Symfony\Component\Console\Output\OutputInterface;
+use Composer\Json\JsonFile;
+use Composer\Json\JsonValidationException;
+use Composer\Util\RemoteFilesystem;
+
+/**
+ * @author Robert Schönthal <seroscho@googlemail.com>
+ * @author Jordi Boggiano <j.boggiano@seld.be>
+ */
+class ValidateCommand extends Command
+{
+    protected function configure()
+    {
+        $this
+            ->setName('validate')
+            ->setDescription('Validates a composer.json')
+            ->setDefinition(array(
+                new InputArgument('file', InputArgument::OPTIONAL, 'path to composer.json file', './composer.json')
+            ))
+            ->setHelp(<<<EOT
+The validate command validates a given composer.json
+
+EOT
+            )
+        ;
+    }
+
+    protected function execute(InputInterface $input, OutputInterface $output)
+    {
+        $file = $input->getArgument('file');
+
+        if (!file_exists($file)) {
+            $output->writeln('<error>'.$file.' not found.</error>');
+            return 1;
+        }
+        if (!is_readable($file)) {
+            $output->writeln('<error>'.$file.' is not readable.</error>');
+            return 1;
+        }
+
+        $laxValid = false;
+        try {
+            $json = new JsonFile($file, new RemoteFilesystem($this->getIO()));
+            $json->read();
+
+            $json->validateSchema(JsonFile::LAX_SCHEMA);
+            $laxValid = true;
+            $json->validateSchema();
+        } catch (JsonValidationException $e) {
+            if ($laxValid) {
+                $output->writeln('<info>'.$file.' is valid for simple usage with composer but has</info>');
+                $output->writeln('<info>strict errors that make it unable to be published as a package:</info>');
+            } else {
+                $output->writeln('<error>'.$file.' is invalid, the following errors were found:</error>');
+            }
+            foreach ($e->getErrors() as $message) {
+                $output->writeln('<error>'.$message.'</error>');
+            }
+            return 1;
+        } catch (\Exception $e) {
+            $output->writeln('<error>'.$file.' contains a JSON Syntax Error:</error>');
+            $output->writeln('<error>'.$e->getMessage().'</error>');
+            return 1;
+        }
+
+        $output->writeln('<info>'.$file.' is valid</info>');
+    }
+}
diff --git a/vendor/composer/composer/src/Composer/Compiler.php b/vendor/composer/composer/src/Composer/Compiler.php
new file mode 100644
index 0000000..3271b66
--- /dev/null
+++ b/vendor/composer/composer/src/Composer/Compiler.php
@@ -0,0 +1,182 @@
+<?php
+
+/*
+ * This file is part of Composer.
+ *
+ * (c) Nils Adermann <naderman@naderman.de>
+ *     Jordi Boggiano <j.boggiano@seld.be>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Composer;
+
+use Symfony\Component\Finder\Finder;
+use Symfony\Component\Process\Process;
+
+/**
+ * The Compiler class compiles composer into a phar
+ *
+ * @author Fabien Potencier <fabien@symfony.com>
+ * @author Jordi Boggiano <j.boggiano@seld.be>
+ */
+class Compiler
+{
+    /**
+     * Compiles composer into a single phar file
+     *
+     * @throws \RuntimeException
+     * @param string $pharFile The full path to the file to create
+     */
+    public function compile($pharFile = 'composer.phar')
+    {
+        if (file_exists($pharFile)) {
+            unlink($pharFile);
+        }
+
+        $process = new Process('git log --pretty="%h" -n1 HEAD', __DIR__);
+        if ($process->run() != 0) {
+            throw new \RuntimeException('Can\'t run git log. You must ensure to run compile from composer git repository clone and that git binary is available.');
+        }
+        $this->version = trim($process->getOutput());
+
+        $process = new Process('git describe --tags HEAD');
+        if ($process->run() == 0) {
+            $this->version = trim($process->getOutput());
+        }
+
+        $phar = new \Phar($pharFile, 0, 'composer.phar');
+        $phar->setSignatureAlgorithm(\Phar::SHA1);
+
+        $phar->startBuffering();
+
+        $finder = new Finder();
+        $finder->files()
+            ->ignoreVCS(true)
+            ->name('*.php')
+            ->notName('Compiler.php')
+            ->notName('ClassLoader.php')
+            ->in(__DIR__.'/..')
+        ;
+
+        foreach ($finder as $file) {
+            $this->addFile($phar, $file);
+        }
+        $this->addFile($phar, new \SplFileInfo(__DIR__.'/Autoload/ClassLoader.php'), false);
+        $this->addFile($phar, new \SplFileInfo(__DIR__.'/../../res/composer-schema.json'), false);
+        $this->addFile($phar, new \SplFileInfo(__DIR__.'/../../src/Composer/IO/hiddeninput.exe'), false);
+
+        $finder = new Finder();
+        $finder->files()
+            ->ignoreVCS(true)
+            ->name('*.php')
+            ->exclude('Tests')
+            ->in(__DIR__.'/../../vendor/symfony/')
+            ->in(__DIR__.'/../../vendor/seld/jsonlint/src/')
+            ->in(__DIR__.'/../../vendor/justinrainbow/json-schema/src/')
+        ;
+
+        foreach ($finder as $file) {
+            $this->addFile($phar, $file);
+        }
+
+        $this->addFile($phar, new \SplFileInfo(__DIR__.'/../../vendor/.composer/ClassLoader.php'));
+        $this->addFile($phar, new \SplFileInfo(__DIR__.'/../../vendor/.composer/autoload.php'));
+        $this->addFile($phar, new \SplFileInfo(__DIR__.'/../../vendor/.composer/autoload_namespaces.php'));
+        $this->addFile($phar, new \SplFileInfo(__DIR__.'/../../vendor/.composer/autoload_classmap.php'));
+        $this->addComposerBin($phar);
+
+        // Stubs
+        $phar->setStub($this->getStub());
+
+        $phar->stopBuffering();
+
+        // disabled for interoperability with systems without gzip ext
+        // $phar->compressFiles(\Phar::GZ);
+
+        $this->addFile($phar, new \SplFileInfo(__DIR__.'/../../LICENSE'), false);
+
+        unset($phar);
+    }
+
+    private function addFile($phar, $file, $strip = true)
+    {
+        $path = str_replace(dirname(dirname(__DIR__)).DIRECTORY_SEPARATOR, '', $file->getRealPath());
+
+        $content = file_get_contents($file);
+        if ($strip) {
+            $content = $this->stripWhitespace($content);
+        } elseif ('LICENSE' === basename($file)) {
+            $content = "\n".$content."\n";
+        }
+
+        $content = str_replace('@package_version@', $this->version, $content);
+
+        $phar->addFromString($path, $content);
+    }
+
+    private function addComposerBin($phar)
+    {
+        $content = file_get_contents(__DIR__.'/../../bin/composer');
+        $content = preg_replace('{^#!/usr/bin/env php\s*}', '', $content);
+        $phar->addFromString('bin/composer', $content);
+    }
+
+    /**
+     * Removes whitespace from a PHP source string while preserving line numbers.
+     *
+     * @param string $source A PHP string
+     * @return string The PHP string with the whitespace removed
+     */
+    private function stripWhitespace($source)
+    {
+        if (!function_exists('token_get_all')) {
+            return $source;
+        }
+
+        $output = '';
+        foreach (token_get_all($source) as $token) {
+            if (is_string($token)) {
+                $output .= $token;
+            } elseif (in_array($token[0], array(T_COMMENT, T_DOC_COMMENT))) {
+                $output .= str_repeat("\n", substr_count($token[1], "\n"));
+            } elseif (T_WHITESPACE === $token[0]) {
+                // reduce wide spaces
+                $whitespace = preg_replace('{[ \t]+}', ' ', $token[1]);
+                // normalize newlines to \n
+                $whitespace = preg_replace('{(?:\r\n|\r|\n)}', "\n", $whitespace);
+                // trim leading spaces
+                $whitespace = preg_replace('{\n +}', "\n", $whitespace);
+                $output .= $whitespace;
+            } else {
+                $output .= $token[1];
+            }
+        }
+
+        return $output;
+    }
+
+    private function getStub()
+    {
+        return <<<'EOF'
+#!/usr/bin/env php
+<?php
+/*
+ * This file is part of Composer.
+ *
+ * (c) Nils Adermann <naderman@naderman.de>
+ *     Jordi Boggiano <j.boggiano@seld.be>
+ *
+ * For the full copyright and license information, please view
+ * the license that is located at the bottom of this file.
+ */
+
+Phar::mapPhar('composer.phar');
+
+require 'phar://composer.phar/bin/composer';
+
+__HALT_COMPILER();
+EOF;
+    }
+}
diff --git a/vendor/composer/composer/src/Composer/Composer.php b/vendor/composer/composer/src/Composer/Composer.php
new file mode 100644
index 0000000..0ad14c4
--- /dev/null
+++ b/vendor/composer/composer/src/Composer/Composer.php
@@ -0,0 +1,95 @@
+<?php
+
+/*
+ * This file is part of Composer.
+ *
+ * (c) Nils Adermann <naderman@naderman.de>
+ *     Jordi Boggiano <j.boggiano@seld.be>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Composer;
+
+use Composer\Package\PackageInterface;
+use Composer\Package\Locker;
+use Composer\Repository\RepositoryManager;
+use Composer\Installer\InstallationManager;
+use Composer\Downloader\DownloadManager;
+
+/**
+ * @author Jordi Boggiano <j.boggiano@seld.be>
+ * @author Konstantin Kudryashiv <ever.zet@gmail.com>
+ */
+class Composer
+{
+    const VERSION = '@package_version@';
+
+    private $package;
+    private $locker;
+
+    private $repositoryManager;
+    private $downloadManager;
+    private $installationManager;
+
+    public function setPackage(PackageInterface $package)
+    {
+        $this->package = $package;
+    }
+
+    public function getPackage()
+    {
+        return $this->package;
+    }
+
+    public function setConfig(Config $config)
+    {
+        $this->config = $config;
+    }
+
+    public function getConfig()
+    {
+        return $this->config;
+    }
+
+    public function setLocker(Locker $locker)
+    {
+        $this->locker = $locker;
+    }
+
+    public function getLocker()
+    {
+        return $this->locker;
+    }
+
+    public function setRepositoryManager(RepositoryManager $manager)
+    {
+        $this->repositoryManager = $manager;
+    }
+
+    public function getRepositoryManager()
+    {
+        return $this->repositoryManager;
+    }
+
+    public function setDownloadManager(DownloadManager $manager)
+    {
+        $this->downloadManager = $manager;
+    }
+
+    public function getDownloadManager()
+    {
+        return $this->downloadManager;
+    }
+
+    public function setInstallationManager(InstallationManager $manager)
+    {
+        $this->installationManager = $manager;
+    }
+
+    public function getInstallationManager()
+    {
+        return $this->installationManager;
+    }
+}
diff --git a/vendor/composer/composer/src/Composer/Config.php b/vendor/composer/composer/src/Composer/Config.php
new file mode 100644
index 0000000..7725a8b
--- /dev/null
+++ b/vendor/composer/composer/src/Composer/Config.php
@@ -0,0 +1,93 @@
+<?php
+
+/*
+ * This file is part of Composer.
+ *
+ * (c) Nils Adermann <naderman@naderman.de>
+ *     Jordi Boggiano <j.boggiano@seld.be>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Composer;
+
+/**
+ * @author Jordi Boggiano <j.boggiano@seld.be>
+ */
+class Config
+{
+    private $config;
+
+    public function __construct()
+    {
+        // load defaults
+        $this->config = array(
+            'process-timeout' => 300,
+            'vendor-dir' => 'vendor',
+            'bin-dir' => '{$vendor-dir}/bin',
+        );
+    }
+
+    /**
+     * Merges new config values with the existing ones (overriding)
+     *
+     * @param array $config
+     */
+    public function merge(array $config)
+    {
+        // override defaults with given config
+        if (!empty($config['config']) && is_array($config['config'])) {
+            $this->config = array_replace_recursive($this->config, $config['config']);
+        }
+    }
+
+    /**
+     * Returns a setting
+     *
+     * @param string $key
+     * @return mixed
+     */
+    public function get($key)
+    {
+        switch ($key) {
+            case 'vendor-dir':
+            case 'bin-dir':
+            case 'process-timeout':
+                // convert foo-bar to COMPOSER_FOO_BAR and check if it exists since it overrides the local config
+                $env = 'COMPOSER_' . strtoupper(strtr($key, '-', '_'));
+                return $this->process(getenv($env) ?: $this->config[$key]);
+
+            case 'home':
+                return rtrim($this->process($this->config[$key]), '/\\');
+
+            default:
+                return $this->process($this->config[$key]);
+        }
+    }
+
+    /**
+     * Checks whether a setting exists
+     *
+     * @param string $key
+     * @return Boolean
+     */
+    public function has($key)
+    {
+        return array_key_exists($key, $this->config);
+    }
+
+    /**
+     * Replaces {$refs} inside a config string
+     *
+     * @param string a config string that can contain {$refs-to-other-config}
+     * @return string
+     */
+    private function process($value)
+    {
+        $config = $this;
+        return preg_replace_callback('#\{\$(.+)\}#', function ($match) use ($config) {
+            return $config->get($match[1]);
+        }, $value);
+    }
+}
diff --git a/vendor/composer/composer/src/Composer/Console/Application.php b/vendor/composer/composer/src/Composer/Console/Application.php
new file mode 100644
index 0000000..bcdd181
--- /dev/null
+++ b/vendor/composer/composer/src/Composer/Console/Application.php
@@ -0,0 +1,133 @@
+<?php
+
+/*
+ * This file is part of Composer.
+ *
+ * (c) Nils Adermann <naderman@naderman.de>
+ *     Jordi Boggiano <j.boggiano@seld.be>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Composer\Console;
+
+use Symfony\Component\Console\Application as BaseApplication;
+use Symfony\Component\Console\Input\InputInterface;
+use Symfony\Component\Console\Output\OutputInterface;
+use Symfony\Component\Console\Output\ConsoleOutput;
+use Symfony\Component\Console\Formatter\OutputFormatter;
+use Symfony\Component\Console\Formatter\OutputFormatterStyle;
+use Composer\Command;
+use Composer\Command\Helper\DialogHelper;
+use Composer\Composer;
+use Composer\Factory;
+use Composer\IO\IOInterface;
+use Composer\IO\ConsoleIO;
+use Composer\Util\ErrorHandler;
+
+/**
+ * The console application that handles the commands
+ *
+ * @author Ryan Weaver <ryan@knplabs.com>
+ * @author Jordi Boggiano <j.boggiano@seld.be>
+ * @author François Pluchino <francois.pluchino@opendisplay.com>
+ */
+class Application extends BaseApplication
+{
+    protected $composer;
+    protected $io;
+
+    public function __construct()
+    {
+        ErrorHandler::register();
+        parent::__construct('Composer', Composer::VERSION);
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public function run(InputInterface $input = null, OutputInterface $output = null)
+    {
+        if (null === $output) {
+            $styles['highlight'] = new OutputFormatterStyle('red');
+            $styles['warning'] = new OutputFormatterStyle('black', 'yellow');
+            $formatter = new OutputFormatter(null, $styles);
+            $output = new ConsoleOutput(ConsoleOutput::VERBOSITY_NORMAL, null, $formatter);
+        }
+
+        return parent::run($input, $output);
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public function doRun(InputInterface $input, OutputInterface $output)
+    {
+        $this->registerCommands();
+        $this->io = new ConsoleIO($input, $output, $this->getHelperSet());
+
+        return parent::doRun($input, $output);
+    }
+
+    /**
+     * @return Composer
+     */
+    public function getComposer($required = true)
+    {
+        if (null === $this->composer) {
+            try {
+                $this->composer = Factory::create($this->io);
+            } catch (\InvalidArgumentException $e) {
+                if ($required) {
+                    $this->io->write($e->getMessage());
+                    exit(1);
+                }
+
+                return;
+            }
+        }
+
+        return $this->composer;
+    }
+
+    /**
+     * @return IOInterface
+     */
+    public function getIO()
+    {
+        return $this->io;
+    }
+
+    /**
+     * Initializes all the composer commands
+     */
+    protected function registerCommands()
+    {
+        $this->add(new Command\AboutCommand());
+        $this->add(new Command\DependsCommand());
+        $this->add(new Command\InitCommand());
+        $this->add(new Command\InstallCommand());
+        $this->add(new Command\CreateProjectCommand());
+        $this->add(new Command\UpdateCommand());
+        $this->add(new Command\SearchCommand());
+        $this->add(new Command\ValidateCommand());
+        $this->add(new Command\ShowCommand());
+
+        if ('phar:' === substr(__FILE__, 0, 5)) {
+            $this->add(new Command\SelfUpdateCommand());
+        }
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    protected function getDefaultHelperSet()
+    {
+        $helperSet = parent::getDefaultHelperSet();
+
+        $helperSet->set(new DialogHelper());
+
+        return $helperSet;
+    }
+}
diff --git a/vendor/composer/composer/src/Composer/DependencyResolver/DefaultPolicy.php b/vendor/composer/composer/src/Composer/DependencyResolver/DefaultPolicy.php
new file mode 100644
index 0000000..3659b0a
--- /dev/null
+++ b/vendor/composer/composer/src/Composer/DependencyResolver/DefaultPolicy.php
@@ -0,0 +1,242 @@
+<?php
+
+/*
+ * This file is part of Composer.
+ *
+ * (c) Nils Adermann <naderman@naderman.de>
+ *     Jordi Boggiano <j.boggiano@seld.be>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Composer\DependencyResolver;
+
+use Composer\Repository\RepositoryInterface;
+use Composer\Package\PackageInterface;
+use Composer\Package\AliasPackage;
+use Composer\Package\LinkConstraint\VersionConstraint;
+
+/**
+ * @author Nils Adermann <naderman@naderman.de>
+ */
+class DefaultPolicy implements PolicyInterface
+{
+    public function versionCompare(PackageInterface $a, PackageInterface $b, $operator)
+    {
+        $constraint = new VersionConstraint($operator, $b->getVersion());
+        $version = new VersionConstraint('==', $a->getVersion());
+
+        return $constraint->matchSpecific($version);
+    }
+
+    public function findUpdatePackages(Solver $solver, Pool $pool, array $installedMap, PackageInterface $package)
+    {
+        $packages = array();
+
+        foreach ($pool->whatProvides($package->getName()) as $candidate) {
+            if ($candidate !== $package) {
+                $packages[] = $candidate;
+            }
+        }
+
+        return $packages;
+    }
+
+    public function installable(Solver $solver, Pool $pool, array $installedMap, PackageInterface $package)
+    {
+        // todo: package blacklist?
+        return true;
+    }
+
+    public function getPriority(Pool $pool, PackageInterface $package)
+    {
+        return $pool->getPriority($package->getRepository());
+    }
+
+    public function selectPreferedPackages(Pool $pool, array $installedMap, array $literals)
+    {
+        $packages = $this->groupLiteralsByNamePreferInstalled($installedMap, $literals);
+
+        foreach ($packages as &$literals) {
+            $policy = $this;
+            usort($literals, function ($a, $b) use ($policy, $pool, $installedMap) {
+                return $policy->compareByPriorityPreferInstalled($pool, $installedMap, $a->getPackage(), $b->getPackage(), true);
+            });
+        }
+
+        foreach ($packages as &$literals) {
+            $literals = $this->pruneToBestVersion($literals);
+
+            $literals = $this->pruneToHighestPriorityOrInstalled($pool, $installedMap, $literals);
+        }
+
+        $selected = call_user_func_array('array_merge', $packages);
+
+        // now sort the result across all packages to respect replaces across packages
+        usort($selected, function ($a, $b) use ($policy, $pool, $installedMap) {
+            return $policy->compareByPriorityPreferInstalled($pool, $installedMap, $a->getPackage(), $b->getPackage());
+        });
+
+        return $selected;
+    }
+
+    protected function groupLiteralsByNamePreferInstalled(array $installedMap, $literals)
+    {
+        $packages = array();
+        foreach ($literals as $literal) {
+            $packageName = $literal->getPackage()->getName();
+
+            if (!isset($packages[$packageName])) {
+                $packages[$packageName] = array();
+            }
+
+            if (isset($installedMap[$literal->getPackageId()])) {
+                array_unshift($packages[$packageName], $literal);
+            } else {
+                $packages[$packageName][] = $literal;
+            }
+        }
+
+        return $packages;
+    }
+
+    public function compareByPriorityPreferInstalled(Pool $pool, array $installedMap, PackageInterface $a, PackageInterface $b, $ignoreReplace = false)
+    {
+        if ($a->getRepository() === $b->getRepository()) {
+            // prefer aliases to the original package
+            if ($a->getName() === $b->getName()) {
+                $aAliased = $a instanceof AliasPackage;
+                $bAliased = $b instanceof AliasPackage;
+                if ($aAliased && !$bAliased) {
+                    return -1; // use a
+                }
+                if (!$aAliased && $bAliased) {
+                    return 1; // use b
+                }
+            }
+
+            if (!$ignoreReplace) {
+                // return original, not replaced
+                if ($this->replaces($a, $b)) {
+                    return 1; // use b
+                }
+                if ($this->replaces($b, $a)) {
+                    return -1; // use a
+                }
+            }
+
+            // priority equal, sort by package id to make reproducible
+            if ($a->getId() === $b->getId()) {
+                return 0;
+            }
+
+            return ($a->getId() < $b->getId()) ? -1 : 1;
+        }
+
+        if (isset($installedMap[$a->getId()])) {
+            return -1;
+        }
+
+        if (isset($installedMap[$b->getId()])) {
+            return 1;
+        }
+
+        return ($this->getPriority($pool, $a) > $this->getPriority($pool, $b)) ? -1 : 1;
+    }
+
+    /**
+    * Checks if source replaces a package with the same name as target.
+    *
+    * Replace constraints are ignored. This method should only be used for
+    * prioritisation, not for actual constraint verification.
+    *
+    * @param PackageInterface $source
+    * @param PackageInterface $target
+    * @return bool
+    */
+    protected function replaces(PackageInterface $source, PackageInterface $target)
+    {
+        foreach ($source->getReplaces() as $link) {
+            if ($link->getTarget() === $target->getName()
+//                && (null === $link->getConstraint() ||
+//                $link->getConstraint()->matches(new VersionConstraint('==', $target->getVersion())))) {
+                ) {
+                return true;
+            }
+        }
+
+        return false;
+    }
+
+    protected function pruneToBestVersion($literals)
+    {
+        $bestLiterals = array($literals[0]);
+        $bestPackage = $literals[0]->getPackage();
+        foreach ($literals as $i => $literal) {
+            if (0 === $i) {
+                continue;
+            }
+
+            if ($this->versionCompare($literal->getPackage(), $bestPackage, '>')) {
+                $bestPackage = $literal->getPackage();
+                $bestLiterals = array($literal);
+            } else if ($this->versionCompare($literal->getPackage(), $bestPackage, '==')) {
+                $bestLiterals[] = $literal;
+            }
+        }
+
+        return $bestLiterals;
+    }
+
+    protected function selectNewestPackages(array $installedMap, array $literals)
+    {
+        $maxLiterals = array($literals[0]);
+        $maxPackage = $literals[0]->getPackage();
+        foreach ($literals as $i => $literal) {
+            if (0 === $i) {
+                continue;
+            }
+
+            if ($this->versionCompare($literal->getPackage(), $maxPackage, '>')) {
+                $maxPackage = $literal->getPackage();
+                $maxLiterals = array($literal);
+            } else if ($this->versionCompare($literal->getPackage(), $maxPackage, '==')) {
+                $maxLiterals[] = $literal;
+            }
+        }
+
+        return $maxLiterals;
+    }
+
+    /**
+    * Assumes that installed packages come first and then all highest priority packages
+    */
+    protected function pruneToHighestPriorityOrInstalled(Pool $pool, array $installedMap, array $literals)
+    {
+        $selected = array();
+
+        $priority = null;
+
+        foreach ($literals as $literal) {
+            $package = $literal->getPackage();
+
+            if (isset($installedMap[$package->getId()])) {
+                $selected[] = $literal;
+                continue;
+            }
+
+            if (null === $priority) {
+                $priority = $this->getPriority($pool, $package);
+            }
+
+            if ($this->getPriority($pool, $package) != $priority) {
+                break;
+            }
+
+            $selected[] = $literal;
+        }
+
+        return $selected;
+    }
+}
diff --git a/vendor/composer/composer/src/Composer/DependencyResolver/Literal.php b/vendor/composer/composer/src/Composer/DependencyResolver/Literal.php
new file mode 100644
index 0000000..7234b58
--- /dev/null
+++ b/vendor/composer/composer/src/Composer/DependencyResolver/Literal.php
@@ -0,0 +1,67 @@
+<?php
+
+/*
+ * This file is part of Composer.
+ *
+ * (c) Nils Adermann <naderman@naderman.de>
+ *     Jordi Boggiano <j.boggiano@seld.be>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Composer\DependencyResolver;
+
+use Composer\Package\PackageInterface;
+
+/**
+ * @author Nils Adermann <naderman@naderman.de>
+ */
+class Literal
+{
+    protected $package;
+    protected $wanted;
+    protected $id;
+
+    public function __construct(PackageInterface $package, $wanted)
+    {
+        $this->package = $package;
+        $this->wanted = $wanted;
+        $this->id = ($this->wanted ? '' : '-') . $this->package->getId();
+    }
+
+    public function isWanted()
+    {
+        return $this->wanted;
+    }
+
+    public function getPackage()
+    {
+        return $this->package;
+    }
+
+    public function getPackageId()
+    {
+        return $this->package->getId();
+    }
+
+    public function getId()
+    {
+        return $this->id;
+    }
+
+    public function __toString()
+    {
+        return ($this->wanted ? '+' : '-') . $this->getPackage();
+    }
+
+    public function inverted()
+    {
+        return new Literal($this->getPackage(), !$this->isWanted());
+    }
+
+    public function equals(Literal $b)
+    {
+        return $this->id === $b->id;
+    }
+}
diff --git a/vendor/composer/composer/src/Composer/DependencyResolver/Operation/InstallOperation.php b/vendor/composer/composer/src/Composer/DependencyResolver/Operation/InstallOperation.php
new file mode 100644
index 0000000..0a16629
--- /dev/null
+++ b/vendor/composer/composer/src/Composer/DependencyResolver/Operation/InstallOperation.php
@@ -0,0 +1,66 @@
+<?php
+
+/*
+ * This file is part of Composer.
+ *
+ * (c) Nils Adermann <naderman@naderman.de>
+ *     Jordi Boggiano <j.boggiano@seld.be>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Composer\DependencyResolver\Operation;
+
+use Composer\Package\PackageInterface;
+
+/**
+ * Solver install operation.
+ *
+ * @author Konstantin Kudryashov <ever.zet@gmail.com>
+ */
+class InstallOperation extends SolverOperation
+{
+    protected $package;
+
+    /**
+     * Initializes operation.
+     *
+     * @param   PackageInterface    $package    package instance
+     * @param   string              $reason     operation reason
+     */
+    public function __construct(PackageInterface $package, $reason = null)
+    {
+        parent::__construct($reason);
+
+        $this->package = $package;
+    }
+
+    /**
+     * Returns package instance.
+     *
+     * @return  PackageInterface
+     */
+    public function getPackage()
+    {
+        return $this->package;
+    }
+
+    /**
+     * Returns job type.
+     *
+     * @return  string
+     */
+    public function getJobType()
+    {
+        return 'install';
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public function __toString()
+    {
+        return 'Installing '.$this->package->getPrettyName().' ('.$this->package->getPrettyVersion().')';
+    }
+}
diff --git a/vendor/composer/composer/src/Composer/DependencyResolver/Operation/OperationInterface.php b/vendor/composer/composer/src/Composer/DependencyResolver/Operation/OperationInterface.php
new file mode 100644
index 0000000..5c819ca
--- /dev/null
+++ b/vendor/composer/composer/src/Composer/DependencyResolver/Operation/OperationInterface.php
@@ -0,0 +1,44 @@
+<?php
+
+/*
+ * This file is part of Composer.
+ *
+ * (c) Nils Adermann <naderman@naderman.de>
+ *     Jordi Boggiano <j.boggiano@seld.be>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Composer\DependencyResolver\Operation;
+
+use Composer\Package\PackageInterface;
+
+/**
+ * Solver operation interface.
+ *
+ * @author Konstantin Kudryashov <ever.zet@gmail.com>
+ */
+interface OperationInterface
+{
+    /**
+     * Returns job type.
+     *
+     * @return  string
+     */
+    function getJobType();
+
+    /**
+     * Returns operation reason.
+     *
+     * @return  string
+     */
+    function getReason();
+
+    /**
+     * Serializes the operation in a human readable format
+     *
+     * @return string
+     */
+    function __toString();
+}
diff --git a/vendor/composer/composer/src/Composer/DependencyResolver/Operation/SolverOperation.php b/vendor/composer/composer/src/Composer/DependencyResolver/Operation/SolverOperation.php
new file mode 100644
index 0000000..a007164
--- /dev/null
+++ b/vendor/composer/composer/src/Composer/DependencyResolver/Operation/SolverOperation.php
@@ -0,0 +1,45 @@
+<?php
+
+/*
+ * This file is part of Composer.
+ *
+ * (c) Nils Adermann <naderman@naderman.de>
+ *     Jordi Boggiano <j.boggiano@seld.be>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Composer\DependencyResolver\Operation;
+
+use Composer\Package\PackageInterface;
+
+/**
+ * Abstract solver operation class.
+ *
+ * @author Konstantin Kudryashov <ever.zet@gmail.com>
+ */
+abstract class SolverOperation implements OperationInterface
+{
+    protected $reason;
+
+    /**
+     * Initializes operation.
+     *
+     * @param   string  $reason     operation reason
+     */
+    public function __construct($reason = null)
+    {
+        $this->reason = $reason;
+    }
+
+    /**
+     * Returns operation reason.
+     *
+     * @return  string
+     */
+    public function getReason()
+    {
+        return $this->reason;
+    }
+}
diff --git a/vendor/composer/composer/src/Composer/DependencyResolver/Operation/UninstallOperation.php b/vendor/composer/composer/src/Composer/DependencyResolver/Operation/UninstallOperation.php
new file mode 100644
index 0000000..018df26
--- /dev/null
+++ b/vendor/composer/composer/src/Composer/DependencyResolver/Operation/UninstallOperation.php
@@ -0,0 +1,66 @@
+<?php
+
+/*
+ * This file is part of Composer.
+ *
+ * (c) Nils Adermann <naderman@naderman.de>
+ *     Jordi Boggiano <j.boggiano@seld.be>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Composer\DependencyResolver\Operation;
+
+use Composer\Package\PackageInterface;
+
+/**
+ * Solver uninstall operation.
+ *
+ * @author Konstantin Kudryashov <ever.zet@gmail.com>
+ */
+class UninstallOperation extends SolverOperation
+{
+    protected $package;
+
+    /**
+     * Initializes operation.
+     *
+     * @param   PackageInterface    $package    package instance
+     * @param   string              $reason     operation reason
+     */
+    public function __construct(PackageInterface $package, $reason = null)
+    {
+        parent::__construct($reason);
+
+        $this->package = $package;
+    }
+
+    /**
+     * Returns package instance.
+     *
+     * @return  PackageInterface
+     */
+    public function getPackage()
+    {
+        return $this->package;
+    }
+
+    /**
+     * Returns job type.
+     *
+     * @return  string
+     */
+    public function getJobType()
+    {
+        return 'uninstall';
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public function __toString()
+    {
+        return 'Uninstalling '.$this->package->getPrettyName().' ('.$this->package->getPrettyVersion().')';
+    }
+}
diff --git a/vendor/composer/composer/src/Composer/DependencyResolver/Operation/UpdateOperation.php b/vendor/composer/composer/src/Composer/DependencyResolver/Operation/UpdateOperation.php
new file mode 100644
index 0000000..5f0bae2
--- /dev/null
+++ b/vendor/composer/composer/src/Composer/DependencyResolver/Operation/UpdateOperation.php
@@ -0,0 +1,80 @@
+<?php
+
+/*
+ * This file is part of Composer.
+ *
+ * (c) Nils Adermann <naderman@naderman.de>
+ *     Jordi Boggiano <j.boggiano@seld.be>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Composer\DependencyResolver\Operation;
+
+use Composer\Package\PackageInterface;
+
+/**
+ * Solver update operation.
+ *
+ * @author Konstantin Kudryashov <ever.zet@gmail.com>
+ */
+class UpdateOperation extends SolverOperation
+{
+    protected $initialPackage;
+    protected $targetPackage;
+
+    /**
+     * Initializes update operation.
+     *
+     * @param   PackageInterface    $initial    initial package
+     * @param   PackageInterface    $target     target package (updated)
+     * @param   string              $reason     update reason
+     */
+    public function __construct(PackageInterface $initial, PackageInterface $target, $reason = null)
+    {
+        parent::__construct($reason);
+
+        $this->initialPackage = $initial;
+        $this->targetPackage  = $target;
+    }
+
+    /**
+     * Returns initial package.
+     *
+     * @return  PackageInterface
+     */
+    public function getInitialPackage()
+    {
+        return $this->initialPackage;
+    }
+
+    /**
+     * Returns target package.
+     *
+     * @return  PackageInterface
+     */
+    public function getTargetPackage()
+    {
+        return $this->targetPackage;
+    }
+
+    /**
+     * Returns job type.
+     *
+     * @return  string
+     */
+    public function getJobType()
+    {
+        return 'update';
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public function __toString()
+    {
+        return 'Updating '.$this->initialPackage->getPrettyName().' ('.$this->initialPackage->getPrettyVersion().') to '.
+            $this->targetPackage->getPrettyName(). ' ('.$this->targetPackage->getPrettyVersion().')';
+    }
+}
diff --git a/vendor/composer/composer/src/Composer/DependencyResolver/PolicyInterface.php b/vendor/composer/composer/src/Composer/DependencyResolver/PolicyInterface.php
new file mode 100644
index 0000000..7c26ab6
--- /dev/null
+++ b/vendor/composer/composer/src/Composer/DependencyResolver/PolicyInterface.php
@@ -0,0 +1,27 @@
+<?php
+
+/*
+ * This file is part of Composer.
+ *
+ * (c) Nils Adermann <naderman@naderman.de>
+ *     Jordi Boggiano <j.boggiano@seld.be>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Composer\DependencyResolver;
+
+use Composer\Repository\RepositoryInterface;
+use Composer\Package\PackageInterface;
+
+/**
+ * @author Nils Adermann <naderman@naderman.de>
+ */
+interface PolicyInterface
+{
+    function versionCompare(PackageInterface $a, PackageInterface $b, $operator);
+    function findUpdatePackages(Solver $solver, Pool $pool, array $installedMap, PackageInterface $package);
+    function installable(Solver $solver, Pool $pool, array $installedMap, PackageInterface $package);
+    function selectPreferedPackages(Pool $pool, array $installedMap, array $literals);
+}
diff --git a/vendor/composer/composer/src/Composer/DependencyResolver/Pool.php b/vendor/composer/composer/src/Composer/DependencyResolver/Pool.php
new file mode 100644
index 0000000..24ef542
--- /dev/null
+++ b/vendor/composer/composer/src/Composer/DependencyResolver/Pool.php
@@ -0,0 +1,110 @@
+<?php
+
+/*
+ * This file is part of Composer.
+ *
+ * (c) Nils Adermann <naderman@naderman.de>
+ *     Jordi Boggiano <j.boggiano@seld.be>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Composer\DependencyResolver;
+
+use Composer\Package\LinkConstraint\LinkConstraintInterface;
+use Composer\Repository\RepositoryInterface;
+
+/**
+ * A package pool contains repositories that provide packages.
+ *
+ * @author Nils Adermann <naderman@naderman.de>
+ */
+class Pool
+{
+    protected $repositories = array();
+    protected $packages = array();
+    protected $packageByName = array();
+
+    /**
+     * Adds a repository and its packages to this package pool
+     *
+     * @param RepositoryInterface $repo A package repository
+     */
+    public function addRepository(RepositoryInterface $repo)
+    {
+        $this->repositories[] = $repo;
+
+        foreach ($repo->getPackages() as $package) {
+            $package->setId(count($this->packages) + 1);
+            $this->packages[] = $package;
+
+            foreach ($package->getNames() as $name) {
+                $this->packageByName[$name][] = $package;
+            }
+        }
+    }
+
+    public function getPriority(RepositoryInterface $repo)
+    {
+        $priority = array_search($repo, $this->repositories, true);
+
+        if (false === $priority) {
+            throw new \RuntimeException("Could not determine repository priority. The repository was not registered in the pool.");
+        }
+
+        return -$priority;
+    }
+
+    /**
+    * Retrieves the package object for a given package id.
+    *
+    * @param int $id
+    * @return PackageInterface
+    */
+    public function packageById($id)
+    {
+        return $this->packages[$id - 1];
+    }
+
+    /**
+    * Retrieves the highest id assigned to a package in this pool
+    *
+    * @return int Highest package id
+    */
+    public function getMaxId()
+    {
+        return count($this->packages);
+    }
+
+    /**
+     * Searches all packages providing the given package name and match the constraint
+     *
+     * @param string                  $name       The package name to be searched for
+     * @param LinkConstraintInterface $constraint A constraint that all returned
+     *                                            packages must match or null to return all
+     * @return array                              A set of packages
+     */
+    public function whatProvides($name, LinkConstraintInterface $constraint = null)
+    {
+        if (!isset($this->packageByName[$name])) {
+            return array();
+        }
+
+        $candidates = $this->packageByName[$name];
+
+        if (null === $constraint) {
+            return $candidates;
+        }
+
+        $result = array();
+
+        foreach ($candidates as $candidate) {
+            if ($candidate->matches($name, $constraint)) {
+                $result[] = $candidate;
+            }
+        }
+
+        return $result;
+    }
+}
diff --git a/vendor/composer/composer/src/Composer/DependencyResolver/Problem.php b/vendor/composer/composer/src/Composer/DependencyResolver/Problem.php
new file mode 100644
index 0000000..8ac2ed4
--- /dev/null
+++ b/vendor/composer/composer/src/Composer/DependencyResolver/Problem.php
@@ -0,0 +1,150 @@
+<?php
+
+/*
+ * This file is part of Composer.
+ *
+ * (c) Nils Adermann <naderman@naderman.de>
+ *     Jordi Boggiano <j.boggiano@seld.be>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Composer\DependencyResolver;
+
+/**
+ * Represents a problem detected while solving dependencies
+ *
+ * @author Nils Adermann <naderman@naderman.de>
+ */
+class Problem
+{
+    /**
+     * A set of reasons for the problem, each is a rule or a job and a rule
+     * @var array
+     */
+    protected $reasons;
+
+    /**
+     * Add a job as a reason
+     *
+     * @param   array   $job    A job descriptor which is a reason for this problem
+     * @param   Rule    $rule   An optional rule associated with the job
+     */
+    public function addJobRule($job, Rule $rule = null)
+    {
+        $this->addReason(serialize($job), array(
+            'rule' => $rule,
+            'job' => $job,
+        ));
+    }
+
+    /**
+     * Add a rule as a reason
+     *
+     * @param   Rule    $rule   A rule which is a reason for this problem
+     */
+    public function addRule(Rule $rule)
+    {
+        $this->addReason($rule->getId(), array(
+            'rule' => $rule,
+            'job' => null,
+        ));
+    }
+
+    /**
+     * Retrieve all reasons for this problem
+     *
+     * @return  array   The problem's reasons
+     */
+    public function getReasons()
+    {
+        return $this->reasons;
+    }
+
+    /**
+     * A human readable textual representation of the problem's reasons
+     */
+    public function __toString()
+    {
+        if (count($this->reasons) === 1) {
+            reset($this->reasons);
+            $reason = current($this->reasons);
+
+            $rule = $reason['rule'];
+            $job = $reason['job'];
+
+            if ($job && $job['cmd'] === 'install' && empty($job['packages'])) {
+                // handle php extensions
+                if (0 === stripos($job['packageName'], 'ext-')) {
+                    $ext = substr($job['packageName'], 4);
+                    $error = extension_loaded($ext) ? 'has the wrong version ('.phpversion($ext).') installed' : 'is missing from your system';
+                    return 'The requested PHP extension "'.$job['packageName'].'" '.$this->constraintToText($job['constraint']).$error.'.';
+                }
+                return 'The requested package "'.$job['packageName'].'" '.$this->constraintToText($job['constraint']).'could not be found.';
+            }
+        }
+
+        $messages = array("Problem caused by:");
+
+        foreach ($this->reasons as $reason) {
+
+            $rule = $reason['rule'];
+            $job = $reason['job'];
+
+            if ($job) {
+                $messages[] = $this->jobToText($job);
+            } elseif ($rule) {
+                if ($rule instanceof Rule) {
+                    $messages[] = $rule->toHumanReadableString();
+                }
+            }
+        }
+
+        return implode("\n\t\t\t- ", $messages);
+    }
+
+    /**
+     * Store a reason descriptor but ignore duplicates
+     *
+     * @param   string  $id         A canonical identifier for the reason
+     * @param   string  $reason     The reason descriptor
+     */
+    protected function addReason($id, $reason)
+    {
+        if (!isset($this->reasons[$id])) {
+            $this->reasons[$id] = $reason;
+        }
+    }
+
+    /**
+     * Turns a job into a human readable description
+     *
+     * @param   array   $job
+     * @return  string
+     */
+    protected function jobToText($job)
+    {
+        switch ($job['cmd']) {
+            case 'install':
+                return 'Installation of package "'.$job['packageName'].'" '.$this->constraintToText($job['constraint']).'was requested. Satisfiable by packages ['.implode(', ', $job['packages']).'].';
+            case 'update':
+                return 'Update of package "'.$job['packageName'].'" '.$this->constraintToText($job['constraint']).'was requested.';
+            case 'remove':
+                return 'Removal of package "'.$job['packageName'].'" '.$this->constraintToText($job['constraint']).'was requested.';
+        }
+
+        return 'Job(cmd='.$job['cmd'].', target='.$job['packageName'].', packages=['.implode(', ', $job['packages']).'])';
+    }
+
+    /**
+     * Turns a constraint into text usable in a sentence describing a job
+     *
+     * @param   LinkConstraint  $constraint
+     * @return  string
+     */
+    protected function constraintToText($constraint)
+    {
+        return ($constraint) ? 'with constraint '.$constraint.' ' : '';
+    }
+}
diff --git a/vendor/composer/composer/src/Composer/DependencyResolver/Request.php b/vendor/composer/composer/src/Composer/DependencyResolver/Request.php
new file mode 100644
index 0000000..92c8aa1
--- /dev/null
+++ b/vendor/composer/composer/src/Composer/DependencyResolver/Request.php
@@ -0,0 +1,68 @@
+<?php
+
+/*
+ * This file is part of Composer.
+ *
+ * (c) Nils Adermann <naderman@naderman.de>
+ *     Jordi Boggiano <j.boggiano@seld.be>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Composer\DependencyResolver;
+
+use Composer\Package\LinkConstraint\LinkConstraintInterface;
+
+/**
+ * @author Nils Adermann <naderman@naderman.de>
+ */
+class Request
+{
+    protected $jobs;
+    protected $pool;
+
+    public function __construct(Pool $pool)
+    {
+        $this->pool = $pool;
+        $this->jobs = array();
+    }
+
+    public function install($packageName, LinkConstraintInterface $constraint = null)
+    {
+        $this->addJob($packageName, 'install', $constraint);
+    }
+
+    public function update($packageName, LinkConstraintInterface $constraint = null)
+    {
+        $this->addJob($packageName, 'update', $constraint);
+    }
+
+    public function remove($packageName, LinkConstraintInterface $constraint = null)
+    {
+        $this->addJob($packageName, 'remove', $constraint);
+    }
+
+    protected function addJob($packageName, $cmd, LinkConstraintInterface $constraint = null)
+    {
+        $packageName = strtolower($packageName);
+        $packages = $this->pool->whatProvides($packageName, $constraint);
+
+        $this->jobs[] = array(
+            'packages' => $packages,
+            'cmd' => $cmd,
+            'packageName' => $packageName,
+            'constraint' => $constraint,
+        );
+    }
+
+    public function updateAll()
+    {
+        $this->jobs[] = array('cmd' => 'update-all', 'packages' => array());
+    }
+
+    public function getJobs()
+    {
+        return $this->jobs;
+    }
+}
diff --git a/vendor/composer/composer/src/Composer/DependencyResolver/Rule.php b/vendor/composer/composer/src/Composer/DependencyResolver/Rule.php
new file mode 100644
index 0000000..cd674ef
--- /dev/null
+++ b/vendor/composer/composer/src/Composer/DependencyResolver/Rule.php
@@ -0,0 +1,276 @@
+<?php
+
+/*
+ * This file is part of Composer.
+ *
+ * (c) Nils Adermann <naderman@naderman.de>
+ *     Jordi Boggiano <j.boggiano@seld.be>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Composer\DependencyResolver;
+
+/**
+ * @author Nils Adermann <naderman@naderman.de>
+ */
+class Rule
+{
+    const RULE_INTERNAL_ALLOW_UPDATE = 1;
+    const RULE_JOB_INSTALL = 2;
+    const RULE_JOB_REMOVE = 3;
+    const RULE_JOB_LOCK = 4;
+    const RULE_NOT_INSTALLABLE = 5;
+    const RULE_PACKAGE_CONFLICT = 6;
+    const RULE_PACKAGE_REQUIRES = 7;
+    const RULE_PACKAGE_OBSOLETES = 8;
+    const RULE_INSTALLED_PACKAGE_OBSOLETES = 9;
+    const RULE_PACKAGE_SAME_NAME = 10;
+    const RULE_PACKAGE_IMPLICIT_OBSOLETES = 11;
+    const RULE_LEARNED = 12;
+
+    protected $disabled;
+    protected $literals;
+    protected $type;
+    protected $id;
+    protected $weak;
+
+    public $watch1;
+    public $watch2;
+
+    public $next1;
+    public $next2;
+
+    public $ruleHash;
+
+    public function __construct(array $literals, $reason, $reasonData)
+    {
+        // sort all packages ascending by id
+        usort($literals, array($this, 'compareLiteralsById'));
+
+        $this->literals = $literals;
+        $this->reason = $reason;
+        $this->reasonData = $reasonData;
+
+        $this->disabled = false;
+        $this->weak = false;
+
+        $this->watch1 = (count($this->literals) > 0) ? $literals[0]->getId() : 0;
+        $this->watch2 = (count($this->literals) > 1) ? $literals[1]->getId() : 0;
+
+        $this->type = -1;
+
+        $this->ruleHash = substr(md5(implode(',', array_map(function ($l) {
+            return $l->getId();
+        }, $this->literals))), 0, 5);
+    }
+
+    public function getHash()
+    {
+        return $this->ruleHash;
+    }
+
+    public function setId($id)
+    {
+        $this->id = $id;
+    }
+
+    public function getId()
+    {
+        return $this->id;
+    }
+
+    /**
+     * Checks if this rule is equal to another one
+     *
+     * Ignores whether either of the rules is disabled.
+     *
+     * @param  Rule $rule The rule to check against
+     * @return bool       Whether the rules are equal
+     */
+    public function equals(Rule $rule)
+    {
+        if ($this->ruleHash !== $rule->ruleHash) {
+            return false;
+        }
+
+        if (count($this->literals) != count($rule->literals)) {
+            return false;
+        }
+
+        for ($i = 0, $n = count($this->literals); $i < $n; $i++) {
+            if ($this->literals[$i]->getId() !== $rule->literals[$i]->getId()) {
+                return false;
+            }
+        }
+
+        return true;
+    }
+
+    public function setType($type)
+    {
+        $this->type = $type;
+    }
+
+    public function getType()
+    {
+        return $this->type;
+    }
+
+    public function disable()
+    {
+        $this->disabled = true;
+    }
+
+    public function enable()
+    {
+        $this->disabled = false;
+    }
+
+    public function isDisabled()
+    {
+        return $this->disabled;
+    }
+
+    public function isEnabled()
+    {
+        return !$this->disabled;
+    }
+
+    public function isWeak()
+    {
+        return $this->weak;
+    }
+
+    public function setWeak($weak)
+    {
+        $this->weak = $weak;
+    }
+
+    public function getLiterals()
+    {
+        return $this->literals;
+    }
+
+    public function isAssertion()
+    {
+        return 1 === count($this->literals);
+    }
+
+    public function getNext(Literal $literal)
+    {
+        if ($this->watch1 == $literal->getId()) {
+            return $this->next1;
+        } else {
+            return $this->next2;
+        }
+    }
+
+    public function getOtherWatch(Literal $literal)
+    {
+        if ($this->watch1 == $literal->getId()) {
+            return $this->watch2;
+        } else {
+            return $this->watch1;
+        }
+    }
+
+    public function toHumanReadableString()
+    {
+        $ruleText = '';
+        foreach ($this->literals as $i => $literal) {
+            if ($i != 0) {
+                $ruleText .= '|';
+            }
+            $ruleText .= $literal;
+        }
+
+        switch ($this->reason) {
+            case self::RULE_INTERNAL_ALLOW_UPDATE:
+                return $ruleText;
+
+            case self::RULE_JOB_INSTALL:
+                return "Install command rule ($ruleText)";
+
+            case self::RULE_JOB_REMOVE:
+                return "Remove command rule ($ruleText)";
+
+            case self::RULE_JOB_LOCK:
+                return "Lock command rule ($ruleText)";
+
+            case self::RULE_NOT_INSTALLABLE:
+                return $ruleText;
+
+            case self::RULE_PACKAGE_CONFLICT:
+                $package1 = $this->literals[0]->getPackage();
+                $package2 = $this->literals[1]->getPackage();
+                return 'Package "'.$package1.'" conflicts with "'.$package2.'"';
+
+            case self::RULE_PACKAGE_REQUIRES:
+                $literals = $this->literals;
+                $sourceLiteral = array_shift($literals);
+                $sourcePackage = $sourceLiteral->getPackage();
+
+                $requires = array();
+                foreach ($literals as $literal) {
+                    $requires[] = $literal->getPackage();
+                }
+
+                $text = 'Package "'.$sourcePackage.'" contains the rule '.$this->reasonData.'. ';
+                if ($requires) {
+                    $text .= 'Any of these packages satisfy the dependency: '.implode(', ', $requires).'.';
+                } else {
+                    $text .= 'No package satisfies this dependency.';
+                }
+                return $text;
+
+            case self::RULE_PACKAGE_OBSOLETES:
+                return $ruleText;
+            case self::RULE_INSTALLED_PACKAGE_OBSOLETES:
+                return $ruleText;
+            case self::RULE_PACKAGE_SAME_NAME:
+                return $ruleText;
+            case self::RULE_PACKAGE_IMPLICIT_OBSOLETES:
+                return $ruleText;
+            case self::RULE_LEARNED:
+                return 'learned: '.$ruleText;
+        }
+    }
+
+    /**
+     * Formats a rule as a string of the format (Literal1|Literal2|...)
+     *
+     * @return string
+     */
+    public function __toString()
+    {
+        $result = ($this->isDisabled()) ? 'disabled(' : '(';
+
+        foreach ($this->literals as $i => $literal) {
+            if ($i != 0) {
+                $result .= '|';
+            }
+            $result .= $literal;
+        }
+
+        $result .= ')';
+
+        return $result;
+    }
+
+    /**
+     * Comparison function for sorting literals by their id
+     *
+     * @param  Literal $a
+     * @param  Literal $b
+     * @return int        0 if the literals are equal, 1 if b is larger than a, -1 else
+     */
+    private function compareLiteralsById(Literal $a, Literal $b)
+    {
+        if ($a->getId() === $b->getId()) {
+            return 0;
+        }
+        return $a->getId() < $b->getId() ? -1 : 1;
+    }
+}
diff --git a/vendor/composer/composer/src/Composer/DependencyResolver/RuleSet.php b/vendor/composer/composer/src/Composer/DependencyResolver/RuleSet.php
new file mode 100644
index 0000000..1f444c7
--- /dev/null
+++ b/vendor/composer/composer/src/Composer/DependencyResolver/RuleSet.php
@@ -0,0 +1,168 @@
+<?php
+
+/*
+ * This file is part of Composer.
+ *
+ * (c) Nils Adermann <naderman@naderman.de>
+ *     Jordi Boggiano <j.boggiano@seld.be>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Composer\DependencyResolver;
+
+/**
+ * @author Nils Adermann <naderman@naderman.de>
+ */
+class RuleSet implements \IteratorAggregate, \Countable
+{
+    // highest priority => lowest number
+    const TYPE_PACKAGE = 0;
+    const TYPE_JOB = 1;
+    const TYPE_FEATURE = 3;
+    const TYPE_CHOICE = 4;
+    const TYPE_LEARNED = 5;
+
+    protected static $types = array(
+        -1 => 'UNKNOWN',
+        self::TYPE_PACKAGE => 'PACKAGE',
+        self::TYPE_FEATURE => 'FEATURE',
+        self::TYPE_JOB => 'JOB',
+        self::TYPE_CHOICE => 'CHOICE',
+        self::TYPE_LEARNED => 'LEARNED',
+    );
+
+    protected $rules;
+    protected $ruleById;
+    protected $nextRuleId;
+
+    protected $rulesByHash;
+
+    public function __construct()
+    {
+        $this->nextRuleId = 0;
+
+        foreach ($this->getTypes() as $type) {
+            $this->rules[$type] = array();
+        }
+
+        $this->rulesByHash = array();
+    }
+
+    public function add(Rule $rule, $type)
+    {
+        if (!isset(self::$types[$type])) {
+            throw new \OutOfBoundsException('Unknown rule type: ' . $type);
+        }
+
+        if (!isset($this->rules[$type])) {
+            $this->rules[$type] = array();
+        }
+
+        $this->rules[$type][] = $rule;
+        $this->ruleById[$this->nextRuleId] = $rule;
+        $rule->setType($type);
+
+        $rule->setId($this->nextRuleId);
+        $this->nextRuleId++;
+
+        $hash = $rule->getHash();
+        if (!isset($this->rulesByHash[$hash])) {
+            $this->rulesByHash[$hash] = array($rule);
+        } else {
+            $this->rulesByHash[$hash][] = $rule;
+        }
+    }
+
+    public function count()
+    {
+        return $this->nextRuleId;
+    }
+
+    public function ruleById($id)
+    {
+        return $this->ruleById[$id];
+    }
+
+    public function getRules()
+    {
+        return $this->rules;
+    }
+
+    public function getIterator()
+    {
+        return new RuleSetIterator($this->getRules());
+    }
+
+    public function getIteratorFor($types)
+    {
+        if (!is_array($types))
+        {
+            $types = array($types);
+        }
+
+        $allRules = $this->getRules();
+        $rules = array();
+
+        foreach ($types as $type)
+        {
+            $rules[$type] = $allRules[$type];
+        }
+
+        return new RuleSetIterator($rules);
+    }
+
+
+    public function getIteratorWithout($types)
+    {
+        if (!is_array($types))
+        {
+            $types = array($types);
+        }
+
+        $rules = $this->getRules();
+
+        foreach ($types as $type)
+        {
+            unset($rules[$type]);
+        }
+
+        return new RuleSetIterator($rules);
+    }
+
+    public function getTypes()
+    {
+        $types = self::$types;
+        unset($types[-1]);
+        return array_keys($types);
+    }
+
+    public function containsEqual($rule)
+    {
+        if (isset($this->rulesByHash[$rule->getHash()])) {
+            $potentialDuplicates = $this->rulesByHash[$rule->getHash()];
+            foreach ($potentialDuplicates as $potentialDuplicate) {
+                if ($rule->equals($potentialDuplicate)) {
+                    return true;
+                }
+            }
+        }
+
+        return false;
+    }
+
+    public function __toString()
+    {
+        $string = "\n";
+        foreach ($this->rules as $type => $rules) {
+            $string .= str_pad(self::$types[$type], 8, ' ') . ": ";
+            foreach ($rules as $rule) {
+                $string .= $rule."\n";
+            }
+            $string .= "\n\n";
+        }
+
+        return $string;
+    }
+}
diff --git a/vendor/composer/composer/src/Composer/DependencyResolver/RuleSetIterator.php b/vendor/composer/composer/src/Composer/DependencyResolver/RuleSetIterator.php
new file mode 100644
index 0000000..63563ae
--- /dev/null
+++ b/vendor/composer/composer/src/Composer/DependencyResolver/RuleSetIterator.php
@@ -0,0 +1,94 @@
+<?php
+
+/*
+ * This file is part of Composer.
+ *
+ * (c) Nils Adermann <naderman@naderman.de>
+ *     Jordi Boggiano <j.boggiano@seld.be>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Composer\DependencyResolver;
+
+/**
+ * @author Nils Adermann <naderman@naderman.de>
+ */
+class RuleSetIterator implements \Iterator
+{
+    protected $rules;
+    protected $types;
+
+    protected $currentOffset;
+    protected $currentType;
+    protected $currentTypeOffset;
+
+    public function __construct(array $rules)
+    {
+        $this->rules = $rules;
+        $this->types = array_keys($rules);
+        sort($this->types);
+
+        $this->rewind();
+    }
+
+    public function current()
+    {
+        return $this->rules[$this->currentType][$this->currentOffset];
+    }
+
+    public function key()
+    {
+        return $this->currentType;
+    }
+
+    public function next()
+    {
+        $this->currentOffset++;
+
+        if (!isset($this->rules[$this->currentType])) {
+            return;
+        }
+
+        if ($this->currentOffset >= sizeof($this->rules[$this->currentType])) {
+            $this->currentOffset = 0;
+
+            do {
+                $this->currentTypeOffset++;
+
+                if (!isset($this->types[$this->currentTypeOffset])) {
+                    $this->currentType = -1;
+                    break;
+                }
+
+                $this->currentType = $this->types[$this->currentTypeOffset];
+            } while (isset($this->types[$this->currentTypeOffset]) && !sizeof($this->rules[$this->currentType]));
+        }
+    }
+
+    public function rewind()
+    {
+        $this->currentOffset = 0;
+
+        $this->currentTypeOffset = -1;
+        $this->currentType = -1;
+
+        do {
+            $this->currentTypeOffset++;
+
+            if (!isset($this->types[$this->currentTypeOffset])) {
+                $this->currentType = -1;
+                break;
+            }
+
+            $this->currentType = $this->types[$this->currentTypeOffset];
+        } while (isset($this->types[$this->currentTypeOffset]) && !sizeof($this->rules[$this->currentType]));
+    }
+
+    public function valid()
+    {
+        return isset($this->rules[$this->currentType])
+               && isset($this->rules[$this->currentType][$this->currentOffset]);
+    }
+}
diff --git a/vendor/composer/composer/src/Composer/DependencyResolver/Solver.php b/vendor/composer/composer/src/Composer/DependencyResolver/Solver.php
new file mode 100644
index 0000000..c19aa21
--- /dev/null
+++ b/vendor/composer/composer/src/Composer/DependencyResolver/Solver.php
@@ -0,0 +1,2032 @@
+<?php
+
+/*
+ * This file is part of Composer.
+ *
+ * (c) Nils Adermann <naderman@naderman.de>
+ *     Jordi Boggiano <j.boggiano@seld.be>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Composer\DependencyResolver;
+
+use Composer\Repository\RepositoryInterface;
+use Composer\Package\PackageInterface;
+use Composer\DependencyResolver\Operation;
+
+/**
+ * @author Nils Adermann <naderman@naderman.de>
+ */
+class Solver
+{
+    protected $policy;
+    protected $pool;
+    protected $installed;
+    protected $rules;
+    protected $updateAll;
+
+    protected $ruleToJob = array();
+    protected $addedMap = array();
+    protected $updateMap = array();
+    protected $noObsoletes = array();
+    protected $watches = array();
+    protected $removeWatches = array();
+    protected $decisionMap;
+    protected $installedMap;
+
+    protected $packageToFeatureRule = array();
+
+    public function __construct(PolicyInterface $policy, Pool $pool, RepositoryInterface $installed)
+    {
+        $this->policy = $policy;
+        $this->pool = $pool;
+        $this->installed = $installed;
+        $this->rules = new RuleSet;
+    }
+
+    /**
+     * Creates a new rule for the requirements of a package
+     *
+     * This rule is of the form (-A|B|C), where B and C are the providers of
+     * one requirement of the package A.
+     *
+     * @param PackageInterface $package    The package with a requirement
+     * @param array            $providers  The providers of the requirement
+     * @param int              $reason     A RULE_* constant describing the
+     *                                     reason for generating this rule
+     * @param mixed            $reasonData Any data, e.g. the requirement name,
+     *                                     that goes with the reason
+     * @return Rule                        The generated rule or null if tautological
+     */
+    protected function createRequireRule(PackageInterface $package, array $providers, $reason, $reasonData = null)
+    {
+        $literals = array(new Literal($package, false));
+
+        foreach ($providers as $provider) {
+            // self fulfilling rule?
+            if ($provider === $package) {
+                return null;
+            }
+            $literals[] = new Literal($provider, true);
+        }
+
+        return new Rule($literals, $reason, $reasonData);
+    }
+
+    /**
+     * Create a new rule for updating a package
+     *
+     * If package A1 can be updated to A2 or A3 the rule is (A1|A2|A3).
+     *
+     * @param PackageInterface $package    The package to be updated
+     * @param array            $updates    An array of update candidate packages
+     * @param int              $reason     A RULE_* constant describing the
+     *                                     reason for generating this rule
+     * @param mixed            $reasonData Any data, e.g. the package name, that
+     *                                     goes with the reason
+     * @return Rule                        The generated rule or null if tautology
+     */
+    protected function createUpdateRule(PackageInterface $package, array $updates, $reason, $reasonData = null)
+    {
+        $literals = array(new Literal($package, true));
+
+        foreach ($updates as $update) {
+            $literals[] = new Literal($update, true);
+        }
+
+        return new Rule($literals, $reason, $reasonData);
+    }
+
+    /**
+     * Creates a new rule for installing a package
+     *
+     * The rule is simply (A) for a package A to be installed.
+     *
+     * @param PackageInterface $package    The package to be installed
+     * @param int              $reason     A RULE_* constant describing the
+     *                                     reason for generating this rule
+     * @param mixed            $reasonData Any data, e.g. the package name, that
+     *                                     goes with the reason
+     * @return Rule                        The generated rule
+     */
+    protected function createInstallRule(PackageInterface $package, $reason, $reasonData = null)
+    {
+        return new Rule(new Literal($package, true));
+    }
+
+    /**
+     * Creates a rule to install at least one of a set of packages
+     *
+     * The rule is (A|B|C) with A, B and C different packages. If the given
+     * set of packages is empty an impossible rule is generated.
+     *
+     * @param array   $packages   The set of packages to choose from
+     * @param int     $reason     A RULE_* constant describing the reason for
+     *                            generating this rule
+     * @param mixed   $reasonData Any data, e.g. the package name, that goes with
+     *                            the reason
+     * @return Rule               The generated rule
+     */
+    protected function createInstallOneOfRule(array $packages, $reason, $reasonData = null)
+    {
+        $literals = array();
+        foreach ($packages as $package) {
+            $literals[] = new Literal($package, true);
+        }
+
+        return new Rule($literals, $reason, $reasonData);
+    }
+
+    /**
+     * Creates a rule to remove a package
+     *
+     * The rule for a package A is (-A).
+     *
+     * @param PackageInterface $package    The package to be removed
+     * @param int              $reason     A RULE_* constant describing the
+     *                                     reason for generating this rule
+     * @param mixed            $reasonData Any data, e.g. the package name, that
+     *                                     goes with the reason
+     * @return Rule                        The generated rule
+     */
+    protected function createRemoveRule(PackageInterface $package, $reason, $reasonData = null)
+    {
+        return new Rule(array(new Literal($package, false)), $reason, $reasonData);
+    }
+
+    /**
+     * Creates a rule for two conflicting packages
+     *
+     * The rule for conflicting packages A and B is (-A|-B). A is called the issuer
+     * and B the provider.
+     *
+     * @param PackageInterface $issuer     The package declaring the conflict
+     * @param Package          $provider   The package causing the conflict
+     * @param int              $reason     A RULE_* constant describing the
+     *                                     reason for generating this rule
+     * @param mixed            $reasonData Any data, e.g. the package name, that
+     *                                     goes with the reason
+     * @return Rule                        The generated rule
+     */
+    protected function createConflictRule(PackageInterface $issuer, PackageInterface $provider, $reason, $reasonData = null)
+    {
+        // ignore self conflict
+        if ($issuer === $provider) {
+            return null;
+        }
+
+        return new Rule(array(new Literal($issuer, false), new Literal($provider, false)), $reason, $reasonData);
+    }
+
+    /**
+     * Adds a rule unless it duplicates an existing one of any type
+     *
+     * To be able to directly pass in the result of one of the rule creation
+     * methods the rule may also be null to indicate that no rule should be
+     * added.
+     *
+     * @param int  $type    A TYPE_* constant defining the rule type
+     * @param Rule $newRule The rule about to be added
+     */
+    private function addRule($type, Rule $newRule = null) {
+        if ($newRule) {
+            if ($this->rules->containsEqual($newRule)) {
+                return;
+            }
+
+            $this->rules->add($newRule, $type);
+        }
+    }
+
+    protected function addRulesForPackage(PackageInterface $package)
+    {
+        $workQueue = new \SplQueue;
+        $workQueue->enqueue($package);
+
+        while (!$workQueue->isEmpty()) {
+            $package = $workQueue->dequeue();
+            if (isset($this->addedMap[$package->getId()])) {
+                continue;
+            }
+
+            $this->addedMap[$package->getId()] = true;
+
+            if (!$this->policy->installable($this, $this->pool, $this->installedMap, $package)) {
+                $this->addRule(RuleSet::TYPE_PACKAGE, $this->createRemoveRule($package, Rule::RULE_NOT_INSTALLABLE, (string) $package));
+                continue;
+            }
+
+            foreach ($package->getRequires() as $link) {
+                $possibleRequires = $this->pool->whatProvides($link->getTarget(), $link->getConstraint());
+
+                $this->addRule(RuleSet::TYPE_PACKAGE, $rule = $this->createRequireRule($package, $possibleRequires, Rule::RULE_PACKAGE_REQUIRES, (string) $link));
+
+                foreach ($possibleRequires as $require) {
+                    $workQueue->enqueue($require);
+                }
+            }
+
+            foreach ($package->getConflicts() as $link) {
+                $possibleConflicts = $this->pool->whatProvides($link->getTarget(), $link->getConstraint());
+
+                foreach ($possibleConflicts as $conflict) {
+                    $this->addRule(RuleSet::TYPE_PACKAGE, $this->createConflictRule($package, $conflict, Rule::RULE_PACKAGE_CONFLICT, (string) $link));
+                }
+            }
+
+            // check obsoletes and implicit obsoletes of a package
+            // if ignoreinstalledsobsoletes is not set, we're also checking
+            // obsoletes of installed packages (like newer rpm versions)
+            //
+            /** TODO if ($this->noInstalledObsoletes) */
+            if (true) {
+                $noObsoletes = isset($this->noObsoletes[$package->getId()]);
+                $isInstalled = (isset($this->installedMap[$package->getId()]));
+
+                foreach ($package->getReplaces() as $link) {
+                    $obsoleteProviders = $this->pool->whatProvides($link->getTarget(), $link->getConstraint());
+
+                    foreach ($obsoleteProviders as $provider) {
+                        if ($provider === $package) {
+                            continue;
+                        }
+
+                        $reason = ($isInstalled) ? Rule::RULE_INSTALLED_PACKAGE_OBSOLETES : Rule::RULE_PACKAGE_OBSOLETES;
+                        $this->addRule(RuleSet::TYPE_PACKAGE, $this->createConflictRule($package, $provider, $reason, (string) $link));
+                    }
+                }
+
+                // check implicit obsoletes
+                // for installed packages we only need to check installed/installed problems,
+                // as the others are picked up when looking at the uninstalled package.
+                if (!$isInstalled) {
+                    $obsoleteProviders = $this->pool->whatProvides($package->getName(), null);
+
+                    foreach ($obsoleteProviders as $provider) {
+                        if ($provider === $package) {
+                            continue;
+                        }
+
+                        if ($isInstalled && !isset($this->installedMap[$provider->getId()])) {
+                            continue;
+                        }
+
+                        // obsolete same packages even when noObsoletes
+                        if ($noObsoletes && (!$package->equals($provider))) {
+                            continue;
+                        }
+
+                        $reason = ($package->getName() == $provider->getName()) ? Rule::RULE_PACKAGE_SAME_NAME : Rule::RULE_PACKAGE_IMPLICIT_OBSOLETES;
+                        $this->addRule(RuleSet::TYPE_PACKAGE, $rule = $this->createConflictRule($package, $provider, $reason, (string) $package));
+                    }
+                }
+            }
+
+            foreach ($package->getRecommends() as $link) {
+                foreach ($this->pool->whatProvides($link->getTarget(), $link->getConstraint()) as $recommend) {
+                    $workQueue->enqueue($recommend);
+                }
+            }
+
+            foreach ($package->getSuggests() as $link) {
+                foreach ($this->pool->whatProvides($link->getTarget(), $link->getConstraint()) as $suggest) {
+                    $workQueue->enqueue($suggest);
+                }
+            }
+        }
+    }
+
+    /**
+     * Adds all rules for all update packages of a given package
+     *
+     * @param PackageInterface $package  Rules for this package's updates are to
+     *                                   be added
+     * @param bool             $allowAll Whether downgrades are allowed
+     */
+    private function addRulesForUpdatePackages(PackageInterface $package)
+    {
+        $updates = $this->policy->findUpdatePackages($this, $this->pool, $this->installedMap, $package);
+
+        $this->addRulesForPackage($package);
+
+        foreach ($updates as $update) {
+            $this->addRulesForPackage($update);
+        }
+    }
+
+    /**
+     * Alters watch chains for a rule.
+     *
+     * Next1/2 always points to the next rule that is watching the same package.
+     * The watches array contains rules to start from for each package
+     *
+     */
+    private function addWatchesToRule(Rule $rule)
+    {
+        // skip simple assertions of the form (A) or (-A)
+        if ($rule->isAssertion()) {
+            return;
+        }
+
+        if (!isset($this->watches[$rule->watch1])) {
+            $this->watches[$rule->watch1] = null;
+        }
+
+        $rule->next1 = $this->watches[$rule->watch1];
+        $this->watches[$rule->watch1] = $rule;
+
+        if (!isset($this->watches[$rule->watch2])) {
+            $this->watches[$rule->watch2] = null;
+        }
+
+        $rule->next2 = $this->watches[$rule->watch2];
+        $this->watches[$rule->watch2] = $rule;
+    }
+
+    /**
+     * Put watch2 on rule's literal with highest level
+     */
+    private function watch2OnHighest(Rule $rule)
+    {
+        $literals = $rule->getLiterals();
+
+        // if there are only 2 elements, both are being watched anyway
+        if ($literals < 3) {
+            return;
+        }
+
+        $watchLevel = 0;
+
+        foreach ($literals as $literal) {
+            $level = abs($this->decisionMap[$literal->getPackageId()]);
+
+            if ($level > $watchLevel) {
+                $rule->watch2 = $literal->getId();
+                $watchLevel = $level;
+            }
+        }
+    }
+
+    private function findDecisionRule(PackageInterface $package)
+    {
+        foreach ($this->decisionQueue as $i => $literal) {
+            if ($package === $literal->getPackage()) {
+                return $this->decisionQueueWhy[$i];
+            }
+        }
+
+        return null;
+    }
+
+    // aka solver_makeruledecisions
+    private function makeAssertionRuleDecisions()
+    {
+        // do we need to decide a SYSTEMSOLVABLE at level 1?
+
+        $decisionStart = count($this->decisionQueue);
+
+        for ($ruleIndex = 0; $ruleIndex < count($this->rules); $ruleIndex++) {
+            $rule = $this->rules->ruleById($ruleIndex);
+
+            if ($rule->isWeak() || !$rule->isAssertion() || $rule->isDisabled()) {
+                continue;
+            }
+
+            $literals = $rule->getLiterals();
+            $literal = $literals[0];
+
+            if (!$this->decided($literal->getPackage())) {
+                $this->decisionQueue[] = $literal;
+                $this->decisionQueueWhy[] = $rule;
+                $this->addDecision($literal, 1);
+                continue;
+            }
+
+            if ($this->decisionsSatisfy($literal)) {
+                continue;
+            }
+
+            // found a conflict
+            if (RuleSet::TYPE_LEARNED === $rule->getType()) {
+                $rule->disable();
+                continue;
+            }
+
+            $conflict = $this->findDecisionRule($literal->getPackage());
+            /** TODO: handle conflict with systemsolvable? */
+
+            if ($conflict && RuleSet::TYPE_PACKAGE === $conflict->getType()) {
+
+                $problem = new Problem;
+
+                if ($rule->getType() == RuleSet::TYPE_JOB) {
+                    $job = $this->ruleToJob[$rule->getId()];
+
+                    $problem->addJobRule($job, $rule);
+                    $problem->addRule($conflict);
+                    $this->disableProblem($job);
+                } else {
+                    $problem->addRule($rule);
+                    $problem->addRule($conflict);
+                    $this->disableProblem($rule);
+                }
+                $this->problems[] = $problem;
+                continue;
+            }
+
+            // conflict with another job or update/feature rule
+            $problem = new Problem;
+            $problem->addRule($rule);
+            $problem->addRule($conflict);
+
+            // push all of our rules (can only be feature or job rules)
+            // asserting this literal on the problem stack
+            foreach ($this->rules->getIteratorFor(array(RuleSet::TYPE_JOB, RuleSet::TYPE_FEATURE)) as $assertRule) {
+                if ($assertRule->isDisabled() || !$assertRule->isAssertion() || $assertRule->isWeak()) {
+                    continue;
+                }
+
+                $assertRuleLiterals = $assertRule->getLiterals();
+                $assertRuleLiteral = $assertRuleLiterals[0];
+
+                if  ($literal->getPackageId() !== $assertRuleLiteral->getPackageId()) {
+                    continue;
+                }
+
+                if ($assertRule->getType() === RuleSet::TYPE_JOB) {
+                    $job = $this->ruleToJob[$assertRule->getId()];
+
+                    $problem->addJobRule($job, $assertRule);
+                    $this->disableProblem($job);
+                } else {
+                    $problem->addRule($assertRule);
+                    $this->disableProblem($assertRule);
+                }
+            }
+            $this->problems[] = $problem;
+
+            // start over
+            while (count($this->decisionQueue) > $decisionStart) {
+                $decisionLiteral = array_pop($this->decisionQueue);
+                array_pop($this->decisionQueueWhy);
+                unset($this->decisionQueueFree[count($this->decisionQueue)]);
+                $this->decisionMap[$decisionLiteral->getPackageId()] = 0;
+            }
+            $ruleIndex = -1;
+        }
+
+        foreach ($this->rules as $rule) {
+            if (!$rule->isWeak() || !$rule->isAssertion() || $rule->isDisabled()) {
+                continue;
+            }
+
+            $literals = $rule->getLiterals();
+            $literal = $literals[0];
+
+            if ($this->decisionMap[$literal->getPackageId()] == 0) {
+                $this->decisionQueue[] = $literal;
+                $this->decisionQueueWhy[] = $rule;
+                $this->addDecision($literal, 1);
+                continue;
+            }
+
+            if ($this->decisionsSatisfy($literals[0])) {
+                continue;
+            }
+
+            // conflict, but this is a weak rule => disable
+            if ($rule->getType() == RuleSet::TYPE_JOB) {
+                $why = $this->ruleToJob[$rule->getId()];
+            } else {
+                $why = $rule;
+            }
+
+            $this->disableProblem($why);
+            /** TODO solver_reenablepolicyrules(solv, -(v + 1)); */
+        }
+    }
+
+    protected function addChoiceRules()
+    {
+
+// void
+// solver_addchoicerules(Solver *solv)
+// {
+//   Pool *pool = solv->pool;
+//   Map m, mneg;
+//   Rule *r;
+//   Queue q, qi;
+//   int i, j, rid, havechoice;
+//   Id p, d, *pp;
+//   Id p2, pp2;
+//   Solvable *s, *s2;
+//
+//   solv->choicerules = solv->nrules;
+//   if (!pool->installed)
+//     {
+//       solv->choicerules_end = solv->nrules;
+//       return;
+//     }
+//   solv->choicerules_ref = sat_calloc(solv->rpmrules_end, sizeof(Id));
+//   queue_init(&q);
+//   queue_init(&qi);
+//   map_init(&m, pool->nsolvables);
+//   map_init(&mneg, pool->nsolvables);
+//   /* set up negative assertion map from infarch and dup rules */
+//   for (rid = solv->infarchrules, r = solv->rules + rid; rid < solv->infarchrules_end; rid++, r++)
+//     if (r->p < 0 && !r->w2 && (r->d == 0 || r->d == -1))
+//       MAPSET(&mneg, -r->p);
+//   for (rid = solv->duprules, r = solv->rules + rid; rid < solv->duprules_end; rid++, r++)
+//     if (r->p < 0 && !r->w2 && (r->d == 0 || r->d == -1))
+//       MAPSET(&mneg, -r->p);
+//   for (rid = 1; rid < solv->rpmrules_end ; rid++)
+//     {
+//       r = solv->rules + rid;
+//       if (r->p >= 0 || ((r->d == 0 || r->d == -1) && r->w2 < 0))
+//     continue;   /* only look at requires rules */
+//       // solver_printrule(solv, SAT_DEBUG_RESULT, r);
+//       queue_empty(&q);
+//       queue_empty(&qi);
+//       havechoice = 0;
+//       FOR_RULELITERALS(p, pp, r)
+//     {
+//       if (p < 0)
+//         continue;
+//       s = pool->solvables + p;
+//       if (!s->repo)
+//         continue;
+//       if (s->repo == pool->installed)
+//         {
+//           queue_push(&q, p);
+//           continue;
+//         }
+//       /* check if this package is "blocked" by a installed package */
+//       s2 = 0;
+//       FOR_PROVIDES(p2, pp2, s->name)
+//         {
+//           s2 = pool->solvables + p2;
+//           if (s2->repo != pool->installed)
+//         continue;
+//           if (!pool->implicitobsoleteusesprovides && s->name != s2->name)
+//             continue;
+//           if (pool->obsoleteusescolors && !pool_colormatch(pool, s, s2))
+//             continue;
+//           break;
+//         }
+//       if (p2)
+//         {
+//           /* found installed package p2 that we can update to p */
+//           if (MAPTST(&mneg, p))
+//         continue;
+//           if (policy_is_illegal(solv, s2, s, 0))
+//         continue;
+//           queue_push(&qi, p2);
+//           queue_push(&q, p);
+//           continue;
+//         }
+//       if (s->obsoletes)
+//         {
+//           Id obs, *obsp = s->repo->idarraydata + s->obsoletes;
+//           s2 = 0;
+//           while ((obs = *obsp++) != 0)
+//         {
+//           FOR_PROVIDES(p2, pp2, obs)
+//             {
+//               s2 = pool->solvables + p2;
+//               if (s2->repo != pool->installed)
+//             continue;
+//               if (!pool->obsoleteusesprovides && !pool_match_nevr(pool, pool->solvables + p2, obs))
+//             continue;
+//               if (pool->obsoleteusescolors && !pool_colormatch(pool, s, s2))
+//             continue;
+//               break;
+//             }
+//           if (p2)
+//             break;
+//         }
+//           if (obs)
+//         {
+//           /* found installed package p2 that we can update to p */
+//           if (MAPTST(&mneg, p))
+//             continue;
+//           if (policy_is_illegal(solv, s2, s, 0))
+//             continue;
+//           queue_push(&qi, p2);
+//           queue_push(&q, p);
+//           continue;
+//         }
+//         }
+//       /* package p is independent of the installed ones */
+//       havechoice = 1;
+//     }
+//       if (!havechoice || !q.count)
+//     continue;   /* no choice */
+//
+//       /* now check the update rules of the installed package.
+//        * if all packages of the update rules are contained in
+//        * the dependency rules, there's no need to set up the choice rule */
+//       map_empty(&m);
+//       FOR_RULELITERALS(p, pp, r)
+//         if (p > 0)
+//       MAPSET(&m, p);
+//       for (i = 0; i < qi.count; i++)
+//     {
+//       if (!qi.elements[i])
+//         continue;
+//       Rule *ur = solv->rules + solv->updaterules + (qi.elements[i] - pool->installed->start);
+//       if (!ur->p)
+//         ur = solv->rules + solv->featurerules + (qi.elements[i] - pool->installed->start);
+//       if (!ur->p)
+//         continue;
+//       FOR_RULELITERALS(p, pp, ur)
+//         if (!MAPTST(&m, p))
+//           break;
+//       if (p)
+//         break;
+//       for (j = i + 1; j < qi.count; j++)
+//         if (qi.elements[i] == qi.elements[j])
+//           qi.elements[j] = 0;
+//     }
+//       if (i == qi.count)
+//     {
+// #if 0
+//       printf("skipping choice ");
+//       solver_printrule(solv, SAT_DEBUG_RESULT, solv->rules + rid);
+// #endif
+//       continue;
+//     }
+//       d = q.count ? pool_queuetowhatprovides(pool, &q) : 0;
+//       solver_addrule(solv, r->p, d);
+//       queue_push(&solv->weakruleq, solv->nrules - 1);
+//       solv->choicerules_ref[solv->nrules - 1 - solv->choicerules] = rid;
+// #if 0
+//       printf("OLD ");
+//       solver_printrule(solv, SAT_DEBUG_RESULT, solv->rules + rid);
+//       printf("WEAK CHOICE ");
+//       solver_printrule(solv, SAT_DEBUG_RESULT, solv->rules + solv->nrules - 1);
+// #endif
+//     }
+//   queue_free(&q);
+//   queue_free(&qi);
+//   map_free(&m);
+//   map_free(&mneg);
+//   solv->choicerules_end = solv->nrules;
+// }
+    }
+
+/***********************************************************************
+ ***
+ ***  Policy rule disabling/reenabling
+ ***
+ ***  Disable all policy rules that conflict with our jobs. If a job
+ ***  gets disabled later on, reenable the involved policy rules again.
+ ***
+ *** /
+
+#define DISABLE_UPDATE  1
+#define DISABLE_INFARCH 2
+#define DISABLE_DUP 3
+*/
+    protected function jobToDisableQueue(array $job, array $disableQueue)
+    {
+        switch ($job['cmd']) {
+            case 'install':
+                foreach ($job['packages'] as $package) {
+                    if (isset($this->installedMap[$package->getId()])) {
+                        $disableQueue[] = array('type' => 'update', 'package' => $package);
+                    }
+
+      /* all job packages obsolete * /
+      qstart = q->count;
+      pass = 0;
+      memset(&omap, 0, sizeof(omap));
+      FOR_JOB_SELECT(p, pp, select, what)
+    {
+      Id p2, pp2;
+
+      if (pass == 1)
+        map_grow(&omap, installed->end - installed->start);
+      s = pool->solvables + p;
+      if (s->obsoletes)
+        {
+          Id obs, *obsp;
+          obsp = s->repo->idarraydata + s->obsoletes;
+          while ((obs = *obsp++) != 0)
+        FOR_PROVIDES(p2, pp2, obs)
+          {
+            Solvable *ps = pool->solvables + p2;
+            if (ps->repo != installed)
+              continue;
+            if (!pool->obsoleteusesprovides && !pool_match_nevr(pool, ps, obs))
+              continue;
+            if (pool->obsoleteusescolors && !pool_colormatch(pool, s, ps))
+              continue;
+            if (pass)
+              MAPSET(&omap, p2 - installed->start);
+            else
+              queue_push2(q, DISABLE_UPDATE, p2);
+          }
+        }
+      FOR_PROVIDES(p2, pp2, s->name)
+        {
+          Solvable *ps = pool->solvables + p2;
+          if (ps->repo != installed)
+        continue;
+          if (!pool->implicitobsoleteusesprovides && ps->name != s->name)
+        continue;
+          if (pool->obsoleteusescolors && !pool_colormatch(pool, s, ps))
+        continue;
+          if (pass)
+            MAPSET(&omap, p2 - installed->start);
+              else
+            queue_push2(q, DISABLE_UPDATE, p2);
+        }
+      if (pass)
+        {
+          for (i = j = qstart; i < q->count; i += 2)
+        {
+          if (MAPTST(&omap, q->elements[i + 1] - installed->start))
+            {
+              MAPCLR(&omap, q->elements[i + 1] - installed->start);
+              q->elements[j + 1] = q->elements[i + 1];
+              j += 2;
+            }
+        }
+          queue_truncate(q, j);
+        }
+      if (q->count == qstart)
+        break;
+      pass++;
+    }
+      if (omap.size)
+        map_free(&omap);
+
+      if (qstart == q->count)
+    return;     /* nothing to prune * /
+      if ((set & (SOLVER_SETEVR | SOLVER_SETARCH | SOLVER_SETVENDOR)) == (SOLVER_SETEVR | SOLVER_SETARCH | SOLVER_SETVENDOR))
+    return;     /* all is set */
+
+      /* now that we know which installed packages are obsoleted check each of them * /
+      for (i = j = qstart; i < q->count; i += 2)
+    {
+      Solvable *is = pool->solvables + q->elements[i + 1];
+      FOR_JOB_SELECT(p, pp, select, what)
+        {
+          int illegal = 0;
+          s = pool->solvables + p;
+          if ((set & SOLVER_SETEVR) != 0)
+        illegal |= POLICY_ILLEGAL_DOWNGRADE;    /* ignore * /
+          if ((set & SOLVER_SETARCH) != 0)
+        illegal |= POLICY_ILLEGAL_ARCHCHANGE;   /* ignore * /
+          if ((set & SOLVER_SETVENDOR) != 0)
+        illegal |= POLICY_ILLEGAL_VENDORCHANGE; /* ignore * /
+          illegal = policy_is_illegal(solv, is, s, illegal);
+          if (illegal && illegal == POLICY_ILLEGAL_DOWNGRADE && (set & SOLVER_SETEV) != 0)
+        {
+          /* it's ok if the EV is different * /
+          if (evrcmp(pool, is->evr, s->evr, EVRCMP_COMPARE_EVONLY) != 0)
+            illegal = 0;
+        }
+          if (illegal)
+        break;
+        }
+      if (!p)
+        {
+          /* no package conflicts with the update rule * /
+          /* thus keep the DISABLE_UPDATE * /
+          q->elements[j + 1] = q->elements[i + 1];
+          j += 2;
+        }
+    }
+      queue_truncate(q, j);
+      return;*/
+                }
+            break;
+
+            case 'remove':
+                foreach ($job['packages'] as $package) {
+                    if (isset($this->installedMap[$package->getId()])) {
+                        $disableQueue[] = array('type' => 'update', 'package' => $package);
+                    }
+                }
+            break;
+        }
+
+        return $disableQueue;
+    }
+
+    protected function disableUpdateRule($package)
+    {
+        if (isset($this->packageToFeatureRule[$package->getId()])) {
+            $this->packageToFeatureRule[$package->getId()]->disable();
+        }
+    }
+
+    /**
+    * Disables all policy rules that conflict with jobs
+    */
+    protected function disablePolicyRules()
+    {
+        $lastJob = null;
+        $allQueue = array();
+
+        $iterator = $this->rules->getIteratorFor(RuleSet::TYPE_JOB);
+        foreach ($iterator as $rule) {
+            if ($rule->isDisabled()) {
+                continue;
+            }
+
+            $job = $this->ruleToJob[$rule->getId()];
+
+            if ($job === $lastJob) {
+                continue;
+            }
+
+            $lastJob = $job;
+
+            $allQueue = $this->jobToDisableQueue($job, $allQueue);
+        }
+
+        foreach ($allQueue as $disable) {
+            switch ($disable['type']) {
+                case 'update':
+                    $this->disableUpdateRule($disable['package']);
+                break;
+                default:
+                    throw new \RuntimeException("Unsupported disable type: " . $disable['type']);
+            }
+        }
+    }
+
+    public function solve(Request $request)
+    {
+        $this->jobs = $request->getJobs();
+        $installedPackages = $this->installed->getPackages();
+        $this->installedMap = array();
+        foreach ($installedPackages as $package) {
+            $this->installedMap[$package->getId()] = $package;
+        }
+
+        if (version_compare(PHP_VERSION, '5.3.4', '>=')) {
+            $this->decisionMap = new \SplFixedArray($this->pool->getMaxId() + 1);
+        } else {
+            $this->decisionMap = array_fill(0, $this->pool->getMaxId() + 1, 0);
+        }
+
+        foreach ($this->jobs as $job) {
+            foreach ($job['packages'] as $package) {
+                switch ($job['cmd']) {
+                    case 'update':
+                        if (isset($this->installedMap[$package->getId()])) {
+                            $this->updateMap[$package->getId()] = true;
+                        }
+                        break;
+                }
+            }
+
+            switch ($job['cmd']) {
+                case 'update-all':
+                    foreach ($installedPackages as $package) {
+                        $this->updateMap[$package->getId()] = true;
+                    }
+                break;
+            }
+        }
+
+        foreach ($installedPackages as $package) {
+            $this->addRulesForPackage($package);
+        }
+
+        foreach ($installedPackages as $package) {
+            $this->addRulesForUpdatePackages($package);
+        }
+
+
+        foreach ($this->jobs as $job) {
+            foreach ($job['packages'] as $package) {
+                switch ($job['cmd']) {
+                    case 'install':
+                        $this->installCandidateMap[$package->getId()] = true;
+                        $this->addRulesForPackage($package);
+                    break;
+                }
+            }
+        }
+
+        // solver_addrpmrulesforweak(solv, &addedmap);
+
+        foreach ($installedPackages as $package) {
+            $updates = $this->policy->findUpdatePackages($this, $this->pool, $this->installedMap, $package);
+            $rule = $this->createUpdateRule($package, $updates, Rule::RULE_INTERNAL_ALLOW_UPDATE, (string) $package);
+
+            $rule->setWeak(true);
+            $this->addRule(RuleSet::TYPE_FEATURE, $rule);
+            $this->packageToFeatureRule[$package->getId()] = $rule;
+        }
+
+        foreach ($this->jobs as $job) {
+            switch ($job['cmd']) {
+                case 'install':
+                    if (empty($job['packages'])) {
+                        $problem = new Problem();
+                        $problem->addJobRule($job);
+                        $this->problems[] = $problem;
+                    } else {
+                        $rule = $this->createInstallOneOfRule($job['packages'], Rule::RULE_JOB_INSTALL, $job['packageName']);
+                        $this->addRule(RuleSet::TYPE_JOB, $rule);
+                        $this->ruleToJob[$rule->getId()] = $job;
+                    }
+                    break;
+                case 'remove':
+                    // remove all packages with this name including uninstalled
+                    // ones to make sure none of them are picked as replacements
+
+                    // todo: cleandeps
+                    foreach ($job['packages'] as $package) {
+                        $rule = $this->createRemoveRule($package, Rule::RULE_JOB_REMOVE);
+                        $this->addRule(RuleSet::TYPE_JOB, $rule);
+                        $this->ruleToJob[$rule->getId()] = $job;
+                    }
+                    break;
+                case 'lock':
+                    foreach ($job['packages'] as $package) {
+                        if (isset($this->installedMap[$package->getId()])) {
+                            $rule = $this->createInstallRule($package, Rule::RULE_JOB_LOCK);
+                        } else {
+                            $rule = $this->createRemoveRule($package, Rule::RULE_JOB_LOCK);
+                        }
+                        $this->addRule(RuleSet::TYPE_JOB, $rule);
+                        $this->ruleToJob[$rule->getId()] = $job;
+                    }
+                break;
+            }
+        }
+
+        $this->addChoiceRules();
+
+        foreach ($this->rules as $rule) {
+            $this->addWatchesToRule($rule);
+        }
+
+        /* disable update rules that conflict with our job */
+        $this->disablePolicyRules();
+
+        /* make decisions based on job/update assertions */
+        $this->makeAssertionRuleDecisions();
+
+        $installRecommended = 0;
+        $this->runSat(true, $installRecommended);
+        //$this->printDecisionMap();
+        //findrecommendedsuggested(solv);
+        //solver_prepare_solutions(solv);
+
+        if ($this->problems) {
+            throw new SolverProblemsException($this->problems);
+        }
+
+        return $this->createTransaction();
+    }
+
+    protected function createTransaction()
+    {
+        $transaction = array();
+        $installMeansUpdateMap = array();
+
+        foreach ($this->decisionQueue as $i => $literal) {
+            $package = $literal->getPackage();
+
+            // !wanted & installed
+            if (!$literal->isWanted() && isset($this->installedMap[$package->getId()])) {
+                $literals = array();
+
+                if (isset($this->packageToFeatureRule[$package->getId()])) {
+                    $literals = array_merge($literals, $this->packageToFeatureRule[$package->getId()]->getLiterals());
+                }
+
+                foreach ($literals as $updateLiteral) {
+                    if (!$updateLiteral->equals($literal)) {
+                        $installMeansUpdateMap[$updateLiteral->getPackageId()] = $package;
+                    }
+                }
+            }
+        }
+
+        foreach ($this->decisionQueue as $i => $literal) {
+            $package = $literal->getPackage();
+
+            // wanted & installed || !wanted & !installed
+            if ($literal->isWanted() == (isset($this->installedMap[$package->getId()]))) {
+                continue;
+            }
+
+            if ($literal->isWanted()) {
+                if (isset($installMeansUpdateMap[$literal->getPackageId()])) {
+                    $source = $installMeansUpdateMap[$literal->getPackageId()];
+
+                    $transaction[] = new Operation\UpdateOperation(
+                        $source, $package, $this->decisionQueueWhy[$i]
+                    );
+
+                    // avoid updates to one package from multiple origins
+                    unset($installMeansUpdateMap[$literal->getPackageId()]);
+                    $ignoreRemove[$source->getId()] = true;
+                } else {
+                    $transaction[] = new Operation\InstallOperation(
+                        $package, $this->decisionQueueWhy[$i]
+                    );
+                }
+            } else if (!isset($ignoreRemove[$package->getId()])) {
+                $transaction[] = new Operation\UninstallOperation(
+                    $package, $this->decisionQueueWhy[$i]
+                );
+            }
+        }
+
+        return array_reverse($transaction);
+    }
+
+    protected $decisionQueue = array();
+    protected $decisionQueueWhy = array();
+    protected $decisionQueueFree = array();
+    protected $propagateIndex;
+    protected $branches = array();
+    protected $problems = array();
+    protected $learnedPool = array();
+    protected $recommendsIndex;
+
+    protected function literalFromId($id)
+    {
+        $package = $this->pool->packageById(abs($id));
+        return new Literal($package, $id > 0);
+    }
+
+    protected function addDecision(Literal $l, $level)
+    {
+        assert($this->decisionMap[$l->getPackageId()] == 0);
+
+        if ($l->isWanted()) {
+            $this->decisionMap[$l->getPackageId()] = $level;
+        } else {
+            $this->decisionMap[$l->getPackageId()] = -$level;
+        }
+    }
+
+    protected function addDecisionId($literalId, $level)
+    {
+        $packageId = abs($literalId);
+
+        assert($this->decisionMap[$packageId] == 0);
+
+        if ($literalId > 0) {
+            $this->decisionMap[$packageId] = $level;
+        } else {
+            $this->decisionMap[$packageId] = -$level;
+        }
+    }
+
+    protected function decisionsContain(Literal $l)
+    {
+        return (
+            $this->decisionMap[$l->getPackageId()] > 0 && $l->isWanted() ||
+            $this->decisionMap[$l->getPackageId()] < 0 && !$l->isWanted()
+        );
+    }
+
+    protected function decisionsContainId($literalId)
+    {
+        $packageId = abs($literalId);
+        return (
+            $this->decisionMap[$packageId] > 0 && $literalId > 0 ||
+            $this->decisionMap[$packageId] < 0 && $literalId < 0
+        );
+    }
+
+    protected function decisionsSatisfy(Literal $l)
+    {
+        return ($l->isWanted() && $this->decisionMap[$l->getPackageId()] > 0) ||
+            (!$l->isWanted() && $this->decisionMap[$l->getPackageId()] <= 0);
+    }
+
+    protected function decisionsConflict(Literal $l)
+    {
+        return (
+            $this->decisionMap[$l->getPackageId()] > 0 && !$l->isWanted() ||
+            $this->decisionMap[$l->getPackageId()] < 0 && $l->isWanted()
+        );
+    }
+
+    protected function decisionsConflictId($literalId)
+    {
+        $packageId = abs($literalId);
+        return (
+            ($this->decisionMap[$packageId] > 0 && $literalId < 0) ||
+            ($this->decisionMap[$packageId] < 0 && $literalId > 0)
+        );
+    }
+
+    protected function decided(PackageInterface $p)
+    {
+        return $this->decisionMap[$p->getId()] != 0;
+    }
+
+    protected function undecided(PackageInterface $p)
+    {
+        return $this->decisionMap[$p->getId()] == 0;
+    }
+
+    protected function decidedInstall(PackageInterface $p) {
+        return $this->decisionMap[$p->getId()] > 0;
+    }
+
+    protected function decidedRemove(PackageInterface $p) {
+        return $this->decisionMap[$p->getId()] < 0;
+    }
+
+    /**
+     * Makes a decision and propagates it to all rules.
+     *
+     * Evaluates each term affected by the decision (linked through watches)
+     * If we find unit rules we make new decisions based on them
+     *
+     * @return Rule|null A rule on conflict, otherwise null.
+     */
+    protected function propagate($level)
+    {
+        while ($this->propagateIndex < count($this->decisionQueue)) {
+            // we invert the decided literal here, example:
+            // A was decided => (-A|B) now requires B to be true, so we look for
+            // rules which are fulfilled by -A, rather than A.
+
+            $literal = $this->decisionQueue[$this->propagateIndex]->inverted();
+
+            $this->propagateIndex++;
+
+            // /* foreach rule where 'pkg' is now FALSE */
+            //for (rp = watches + pkg; *rp; rp = next_rp)
+            if (!isset($this->watches[$literal->getId()])) {
+                continue;
+            }
+
+            $prevRule = null;
+            for ($rule = $this->watches[$literal->getId()]; $rule !== null; $prevRule = $rule, $rule = $nextRule) {
+                $nextRule = $rule->getNext($literal);
+
+                if ($rule->isDisabled()) {
+                    continue;
+                }
+
+                $otherWatch = $rule->getOtherWatch($literal);
+
+                if ($this->decisionsContainId($otherWatch)) {
+                    continue;
+                }
+
+                $ruleLiterals = $rule->getLiterals();
+
+                if (sizeof($ruleLiterals) > 2) {
+                    foreach ($ruleLiterals as $ruleLiteral) {
+                        if ($otherWatch !== $ruleLiteral->getId() &&
+                            !$this->decisionsConflict($ruleLiteral)) {
+
+                            if ($literal->getId() === $rule->watch1) {
+                                $rule->watch1 = $ruleLiteral->getId();
+                                $rule->next1 = (isset($this->watches[$ruleLiteral->getId()])) ? $this->watches[$ruleLiteral->getId()] : null;
+                            } else {
+                                $rule->watch2 = $ruleLiteral->getId();
+                                $rule->next2 = (isset($this->watches[$ruleLiteral->getId()])) ? $this->watches[$ruleLiteral->getId()] : null;
+                            }
+
+                            if ($prevRule) {
+                                if ($prevRule->next1 == $rule) {
+                                    $prevRule->next1 = $nextRule;
+                                } else {
+                                    $prevRule->next2 = $nextRule;
+                                }
+                            } else {
+                                $this->watches[$literal->getId()] = $nextRule;
+                            }
+
+                            $this->watches[$ruleLiteral->getId()] = $rule;
+
+                            $rule = $prevRule;
+                            continue 2;
+                        }
+                    }
+                }
+
+                // yay, we found a unit clause! try setting it to true
+                if ($this->decisionsConflictId($otherWatch)) {
+                    return $rule;
+                }
+
+                $this->addDecisionId($otherWatch, $level);
+
+                $this->decisionQueue[] = $this->literalFromId($otherWatch);
+                $this->decisionQueueWhy[] = $rule;
+            }
+        }
+
+        return null;
+    }
+
+    /**
+     * Reverts a decision at the given level.
+     */
+    private function revert($level)
+    {
+        while (!empty($this->decisionQueue)) {
+            $literal = $this->decisionQueue[count($this->decisionQueue) - 1];
+
+            if (!$this->decisionMap[$literal->getPackageId()]) {
+                break;
+            }
+
+            $decisionLevel = abs($this->decisionMap[$literal->getPackageId()]);
+
+            if ($decisionLevel <= $level) {
+                break;
+            }
+
+            /** TODO: implement recommendations
+             *if (v > 0 && solv->recommendations.count && v == solv->recommendations.elements[solv->recommendations.count - 1])
+             *  solv->recommendations.count--;
+             */
+
+            $this->decisionMap[$literal->getPackageId()] = 0;
+            array_pop($this->decisionQueue);
+            array_pop($this->decisionQueueWhy);
+
+            $this->propagateIndex = count($this->decisionQueue);
+        }
+
+        while (!empty($this->branches)) {
+            list($literals, $branchLevel) = $this->branches[count($this->branches) - 1];
+
+            if ($branchLevel >= $level) {
+                break;
+            }
+
+            array_pop($this->branches);
+        }
+
+        $this->recommendsIndex = -1;
+    }
+
+    /**-------------------------------------------------------------------
+     *
+     * setpropagatelearn
+     *
+     * add free decision (solvable to install) to decisionq
+     * increase level and propagate decision
+     * return if no conflict.
+     *
+     * in conflict case, analyze conflict rule, add resulting
+     * rule to learnt rule set, make decision from learnt
+     * rule (always unit) and re-propagate.
+     *
+     * returns the new solver level or 0 if unsolvable
+     *
+     */
+    private function setPropagateLearn($level, Literal $literal, $disableRules, Rule $rule)
+    {
+        assert($rule != null);
+        assert($literal != null);
+
+        $level++;
+
+        $this->addDecision($literal, $level);
+        $this->decisionQueue[] = $literal;
+        $this->decisionQueueWhy[] = $rule;
+        $this->decisionQueueFree[count($this->decisionQueueWhy) - 1] = true;
+
+        while (true) {
+            $rule = $this->propagate($level);
+
+            if (!$rule) {
+                break;
+            }
+
+            if ($level == 1) {
+                return $this->analyzeUnsolvable($rule, $disableRules);
+            }
+
+            // conflict
+            list($learnLiteral, $newLevel, $newRule, $why) = $this->analyze($level, $rule);
+
+            assert($newLevel > 0);
+            assert($newLevel < $level);
+
+            $level = $newLevel;
+
+            $this->revert($level);
+
+            assert($newRule != null);
+            $this->addRule(RuleSet::TYPE_LEARNED, $newRule);
+
+            $this->learnedWhy[$newRule->getId()] = $why;
+
+            $this->watch2OnHighest($newRule);
+            $this->addWatchesToRule($newRule);
+
+            $this->addDecision($learnLiteral, $level);
+            $this->decisionQueue[] = $learnLiteral;
+            $this->decisionQueueWhy[] = $newRule;
+        }
+
+        return $level;
+    }
+
+    private function selectAndInstall($level, array $decisionQueue, $disableRules, Rule $rule)
+    {
+        // choose best package to install from decisionQueue
+        $literals = $this->policy->selectPreferedPackages($this->pool, $this->installedMap, $decisionQueue);
+
+        $selectedLiteral = array_shift($literals);
+
+        // if there are multiple candidates, then branch
+        if (count($literals)) {
+            $this->branches[] = array($literals, $level);
+        }
+
+        return $this->setPropagateLearn($level, $selectedLiteral, $disableRules, $rule);
+    }
+
+    protected function analyze($level, $rule)
+    {
+        $ruleLevel = 1;
+        $num = 0;
+        $l1num = 0;
+        $seen = array();
+        $learnedLiterals = array(null);
+
+        $decisionId = count($this->decisionQueue);
+
+        $this->learnedPool[] = array();
+
+        while(true) {
+            $this->learnedPool[count($this->learnedPool) - 1][] = $rule;
+
+            foreach ($rule->getLiterals() as $literal) {
+                // skip the one true literal
+                if ($this->decisionsSatisfy($literal)) {
+                    continue;
+                }
+
+                if (isset($seen[$literal->getPackageId()])) {
+                    continue;
+                }
+                $seen[$literal->getPackageId()] = true;
+
+                $l = abs($this->decisionMap[$literal->getPackageId()]);
+
+                if (1 === $l) {
+                    $l1num++;
+                } else if ($level === $l) {
+                    $num++;
+                } else {
+                    // not level1 or conflict level, add to new rule
+                    $learnedLiterals[] = $literal;
+
+                    if ($l > $ruleLevel) {
+                        $ruleLevel = $l;
+                    }
+                }
+            }
+
+            $l1retry = true;
+            while ($l1retry) {
+                $l1retry = false;
+
+                if (!$num && !--$l1num) {
+                    // all level 1 literals done
+                    break 2;
+                }
+
+                while (true) {
+                    assert($decisionId > 0);
+                    $decisionId--;
+
+                    $literal = $this->decisionQueue[$decisionId];
+
+                    if (isset($seen[$literal->getPackageId()])) {
+                        break;
+                    }
+                }
+
+                unset($seen[$literal->getPackageId()]);
+
+                if ($num && 0 === --$num) {
+                    $learnedLiterals[0] = $this->literalFromId(-$literal->getPackageId());
+
+                    if (!$l1num) {
+                        break 2;
+                    }
+
+                    foreach ($learnedLiterals as $i => $learnedLiteral) {
+                        if ($i !== 0) {
+                            unset($seen[$literal->getPackageId()]);
+                        }
+                    }
+                    // only level 1 marks left
+                    $l1num++;
+                    $l1retry = true;
+                }
+
+                $rule = $this->decisionQueueWhy[$decisionId];
+            }
+        }
+
+        $why = count($this->learnedPool) - 1;
+        assert($learnedLiterals[0] !== null);
+        $newRule = new Rule($learnedLiterals, Rule::RULE_LEARNED, $why);
+
+        return array($learnedLiterals[0], $ruleLevel, $newRule, $why);
+    }
+
+    private function analyzeUnsolvableRule($problem, $conflictRule, &$lastWeakWhy)
+    {
+        $why = $conflictRule->getId();
+
+        if ($conflictRule->getType() == RuleSet::TYPE_LEARNED) {
+            $learnedWhy = $this->learnedWhy[$why];
+            $problemRules = $this->learnedPool[$learnedWhy];
+
+            foreach ($problemRules as $problemRule) {
+                $this->analyzeUnsolvableRule($problem, $problemRule, $lastWeakWhy);
+            }
+            return;
+        }
+
+        if ($conflictRule->getType() == RuleSet::TYPE_PACKAGE) {
+            // package rules cannot be part of a problem
+            return;
+        }
+
+        if ($conflictRule->isWeak()) {
+            /** TODO why > or < lastWeakWhy? */
+            if (!$lastWeakWhy || $why > $lastWeakWhy->getId()) {
+                $lastWeakWhy = $conflictRule;
+            }
+        }
+
+        if ($conflictRule->getType() == RuleSet::TYPE_JOB) {
+            $job = $this->ruleToJob[$conflictRule->getId()];
+            $problem->addJobRule($job, $conflictRule);
+        } else {
+            $problem->addRule($conflictRule);
+        }
+    }
+
+    private function analyzeUnsolvable($conflictRule, $disableRules)
+    {
+        $lastWeakWhy = null;
+        $problem = new Problem;
+        $problem->addRule($conflictRule);
+
+        $this->analyzeUnsolvableRule($problem, $conflictRule, $lastWeakWhy);
+
+        $this->problems[] = $problem;
+
+        $seen = array();
+        $literals = $conflictRule->getLiterals();
+
+/* unnecessary because unlike rule.d, watch2 == 2nd literal, unless watch2 changed
+        if (sizeof($literals) == 2) {
+            $literals[1] = $this->literalFromId($conflictRule->watch2);
+        }
+*/
+
+        foreach ($literals as $literal) {
+            // skip the one true literal
+            if ($this->decisionsSatisfy($literal)) {
+                continue;
+            }
+            $seen[$literal->getPackageId()] = true;
+        }
+
+        $decisionId = count($this->decisionQueue);
+
+        while ($decisionId > 0) {
+            $decisionId--;
+
+            $literal = $this->decisionQueue[$decisionId];
+
+            // skip literals that are not in this rule
+            if (!isset($seen[$literal->getPackageId()])) {
+                continue;
+            }
+
+            $why = $this->decisionQueueWhy[$decisionId];
+            $problem->addRule($why);
+
+            $this->analyzeUnsolvableRule($problem, $why, $lastWeakWhy);
+
+            $literals = $why->getLiterals();
+/* unnecessary because unlike rule.d, watch2 == 2nd literal, unless watch2 changed
+            if (sizeof($literals) == 2) {
+                $literals[1] = $this->literalFromId($why->watch2);
+            }
+*/
+
+            foreach ($literals as $literal) {
+                // skip the one true literal
+                if ($this->decisionsSatisfy($literal)) {
+                    continue;
+                }
+                $seen[$literal->getPackageId()] = true;
+            }
+        }
+
+        if ($lastWeakWhy) {
+            array_pop($this->problems);
+
+            if ($lastWeakWhy->getType() === RuleSet::TYPE_JOB) {
+                $why = $this->ruleToJob[$lastWeakWhy];
+            } else {
+                $why = $lastWeakWhy;
+            }
+
+            if ($lastWeakWhy->getType() == RuleSet::TYPE_CHOICE) {
+                $this->disableChoiceRules($lastWeakWhy);
+            }
+
+            $this->disableProblem($why);
+
+            /**
+@TODO what does v < 0 mean here? ($why == v)
+      if (v < 0)
+    solver_reenablepolicyrules(solv, -(v + 1));
+*/
+            $this->resetSolver();
+
+            return true;
+        }
+
+        if ($disableRules) {
+            foreach ($this->problems[count($this->problems) - 1] as $reason) {
+                if ($reason['job']) {
+                    $this->disableProblem($reason['job']);
+                } else {
+                    $this->disableProblem($reason['rule']);
+                }
+            }
+
+            $this->resetSolver();
+            return true;
+        }
+
+        return false;
+    }
+
+    private function disableProblem($why)
+    {
+        if ($why instanceof Rule) {
+            $why->disable();
+        } else if (is_array($why)) {
+
+            // disable all rules of this job
+            foreach ($this->ruleToJob as $ruleId => $job) {
+                if ($why === $job) {
+                    $this->rules->ruleById($ruleId)->disable();
+                }
+            }
+        }
+    }
+
+    private function resetSolver()
+    {
+        while ($literal = array_pop($this->decisionQueue)) {
+            $this->decisionMap[$literal->getPackageId()] = 0;
+        }
+
+        $this->decisionQueueWhy = array();
+        $this->decisionQueueFree = array();
+        $this->recommendsIndex = -1;
+        $this->propagateIndex = 0;
+        $this->recommendations = array();
+        $this->branches = array();
+
+        $this->enableDisableLearnedRules();
+        $this->makeAssertionRuleDecisions();
+    }
+
+    /*-------------------------------------------------------------------
+    * enable/disable learnt rules
+    *
+    * we have enabled or disabled some of our rules. We now reenable all
+    * of our learnt rules except the ones that were learnt from rules that
+    * are now disabled.
+    */
+    private function enableDisableLearnedRules()
+    {
+        foreach ($this->rules->getIteratorFor(RuleSet::TYPE_LEARNED) as $rule) {
+            $why = $this->learnedWhy[$rule->getId()];
+            $problemRules = $this->learnedPool[$why];
+
+            $foundDisabled = false;
+            foreach ($problemRules as $problemRule) {
+                if ($problemRule->disabled()) {
+                    $foundDisabled = true;
+                    break;
+                }
+            }
+
+            if ($foundDisabled && $rule->isEnabled()) {
+                $rule->disable();
+            } else if (!$foundDisabled && $rule->isDisabled()) {
+                $rule->enable();
+            }
+        }
+    }
+
+    private function runSat($disableRules = true, $installRecommended = false)
+    {
+        $this->propagateIndex = 0;
+
+        //   /*
+        //    * here's the main loop:
+        //    * 1) propagate new decisions (only needed once)
+        //    * 2) fulfill jobs
+        //    * 3) try to keep installed packages
+        //    * 4) fulfill all unresolved rules
+        //    * 5) install recommended packages
+        //    * 6) minimalize solution if we had choices
+        //    * if we encounter a problem, we rewind to a safe level and restart
+        //    * with step 1
+        //    */
+
+        $decisionQueue = array();
+        $decisionSupplementQueue = array();
+        $disableRules = array();
+
+        $level = 1;
+        $systemLevel = $level + 1;
+        $minimizationSteps = 0;
+        $installedPos = 0;
+
+        $this->installedPackages = $this->installed->getPackages();
+
+        while (true) {
+
+            if (1 === $level) {
+                $conflictRule = $this->propagate($level);
+                if ($conflictRule !== null) {
+                    if ($this->analyzeUnsolvable($conflictRule, $disableRules)) {
+                        continue;
+                    } else {
+                        return;
+                    }
+                }
+            }
+
+            // handle job rules
+            if ($level < $systemLevel) {
+                $iterator = $this->rules->getIteratorFor(RuleSet::TYPE_JOB);
+                foreach ($iterator as $rule) {
+                    if ($rule->isEnabled()) {
+                        $decisionQueue = array();
+                        $noneSatisfied = true;
+
+                        foreach ($rule->getLiterals() as $literal) {
+                            if ($this->decisionsSatisfy($literal)) {
+                                $noneSatisfied = false;
+                                break;
+                            }
+                            $decisionQueue[] = $literal;
+                        }
+
+                        if ($noneSatisfied && count($decisionQueue)) {
+                            // prune all update packages until installed version
+                            // except for requested updates
+                            if (count($this->installed) != count($this->updateMap)) {
+                                $prunedQueue = array();
+                                foreach ($decisionQueue as $literal) {
+                                    if (isset($this->installedMap[$literal->getPackageId()])) {
+                                        $prunedQueue[] = $literal;
+                                        if (isset($this->updateMap[$literal->getPackageId()])) {
+                                            $prunedQueue = $decisionQueue;
+                                            break;
+                                        }
+                                    }
+                                }
+                                $decisionQueue = $prunedQueue;
+                            }
+                        }
+
+                        if ($noneSatisfied && count($decisionQueue)) {
+
+                            $oLevel = $level;
+                            $level = $this->selectAndInstall($level, $decisionQueue, $disableRules, $rule);
+
+                            if (0 === $level) {
+                                return;
+                            }
+                            if ($level <= $oLevel) {
+                                break;
+                            }
+                        }
+                    }
+                }
+
+                $systemLevel = $level + 1;
+
+                // jobs left
+                $iterator->next();
+                if ($iterator->valid()) {
+                    continue;
+                }
+            }
+
+            // handle installed packages
+            if ($level < $systemLevel) {
+                // use two passes if any packages are being updated
+                // -> better user experience
+                for ($pass = (count($this->updateMap)) ? 0 : 1; $pass < 2; $pass++) {
+                    $passLevel = $level;
+                    for ($i = $installedPos, $n = 0; $n < count($this->installedPackages); $i++, $n++) {
+                        $repeat = false;
+
+                        if ($i == count($this->installedPackages)) {
+                            $i = 0;
+                        }
+                        $literal = new Literal($this->installedPackages[$i], true);
+
+                        if ($this->decisionsContain($literal)) {
+                            continue;
+                        }
+
+                        // only process updates in first pass
+                        /** TODO: && or || ? **/
+                        if (0 === $pass && !isset($this->updateMap[$literal->getPackageId()])) {
+                            continue;
+                        }
+
+                        $rule = null;
+
+                        if (isset($this->packageToFeatureRule[$literal->getPackageId()])) {
+                            $rule = $this->packageToFeatureRule[$literal->getPackageId()];
+                        }
+
+                        if (!$rule || $rule->isDisabled()) {
+                            continue;
+                        }
+
+                        $updateRuleLiterals = $rule->getLiterals();
+
+                        $decisionQueue = array();
+                        if (!isset($this->noUpdate[$literal->getPackageId()]) && (
+                            $this->decidedRemove($literal->getPackage()) ||
+                            isset($this->updateMap[$literal->getPackageId()]) ||
+                            !$literal->equals($updateRuleLiterals[0])
+                        )) {
+                            foreach ($updateRuleLiterals as $ruleLiteral) {
+                                if ($this->decidedInstall($ruleLiteral->getPackage())) {
+                                    // already fulfilled
+                                    $decisionQueue = array();
+                                    break;
+                                }
+                                if ($this->undecided($ruleLiteral->getPackage())) {
+                                    $decisionQueue[] = $ruleLiteral;
+                                }
+                            }
+                        }
+
+                        if (sizeof($decisionQueue)) {
+                            $oLevel = $level;
+                            $level = $this->selectAndInstall($level, $decisionQueue, $disableRules, $rule);
+
+                            if (0 === $level) {
+                                return;
+                            }
+
+                            if ($level <= $oLevel) {
+                                $repeat = true;
+                            }
+                        } else if (!$repeat && $this->undecided($literal->getPackage())) {
+                            // still undecided? keep package.
+                            $oLevel = $level;
+                            if (isset($this->cleanDepsMap[$literal->getPackageId()])) {
+                                // clean deps removes package
+                                $level = $this->setPropagateLearn($level, $literal->invert(), $disableRules, null);
+                            } else {
+                                // ckeeping package
+                                $level = $this->setPropagateLearn($level, $literal, $disableRules, $rule);
+                            }
+
+
+                            if (0 === $level) {
+                                return;
+                            }
+
+                            if ($level <= $oLevel) {
+                                $repeat = true;
+                            }
+                        }
+
+                        if ($repeat) {
+                            if (1 === $level || $level < $passLevel) {
+                                // trouble
+                                break;
+                            }
+                            if ($level < $oLevel) {
+                                // redo all
+                                $n = 0;
+                            }
+
+                            // repeat
+                            $i--;
+                            $n--;
+                            continue;
+                        }
+                    }
+
+                    if ($n < count($this->installedPackages)) {
+                        $installedPos = $i; // retry this problem next time
+                        break;
+                    }
+
+                    $installedPos = 0;
+                }
+
+                $systemLevel = $level + 1;
+
+                if ($pass < 2) {
+                    // had trouble => retry
+                    continue;
+                }
+            }
+
+            if ($level < $systemLevel) {
+                $systemLevel = $level;
+            }
+
+            for ($i = 0, $n = 0; $n < count($this->rules); $i++, $n++) {
+                if ($i == count($this->rules)) {
+                    $i = 0;
+                }
+
+                $rule = $this->rules->ruleById($i);
+                $literals = $rule->getLiterals();
+
+                if ($rule->isDisabled()) {
+                    continue;
+                }
+
+                $decisionQueue = array();
+
+                // make sure that
+                // * all negative literals are installed
+                // * no positive literal is installed
+                // i.e. the rule is not fulfilled and we
+                // just need to decide on the positive literals
+                //
+                foreach ($literals as $literal) {
+                    if (!$literal->isWanted()) {
+                        if (!$this->decidedInstall($literal->getPackage())) {
+                            continue 2; // next rule
+                        }
+                    } else {
+                        if ($this->decidedInstall($literal->getPackage())) {
+                            continue 2; // next rule
+                        }
+                        if ($this->undecided($literal->getPackage())) {
+                            $decisionQueue[] = $literal;
+                        }
+                    }
+                }
+
+                // need to have at least 2 item to pick from
+                if (count($decisionQueue) < 2) {
+                    continue;
+                }
+
+                $oLevel = $level;
+                $level = $this->selectAndInstall($level, $decisionQueue, $disableRules, $rule);
+
+                if (0 === $level) {
+                    return;
+                }
+
+                // open suse sat-solver uses this, but why is $level == 1 trouble?
+                // SYSTEMSOLVABLE related? we don't have that, so should work
+                //if ($level < $systemLevel || $level == 1) {
+
+                if ($level < $systemLevel) {
+                    break; // trouble
+                }
+
+                // something changed, so look at all rules again
+                $n = -1;
+            }
+
+            // minimization step
+            if (count($this->branches)) {
+
+                $lastLiteral = null;
+                $lastLevel = null;
+                $lastBranchIndex = 0;
+                $lastBranchOffset  = 0;
+
+                for ($i = count($this->branches) - 1; $i >= 0; $i--) {
+                    list($literals, $level) = $this->branches[$i];
+
+                    foreach ($literals as $offset => $literal) {
+                        if ($literal && $literal->isWanted() && $this->decisionMap[$literal->getPackageId()] > $level + 1) {
+                            $lastLiteral = $literal;
+                            $lastBranchIndex = $i;
+                            $lastBranchOffset = $offset;
+                            $lastLevel = $level;
+                        }
+                    }
+                }
+
+                if ($lastLiteral) {
+                    $this->branches[$lastBranchIndex][$lastBranchOffset] = null;
+                    $minimizationSteps++;
+
+                    $level = $lastLevel;
+                    $this->revert($level);
+
+                    $why = $this->decisionQueueWhy[count($this->decisionQueueWhy) - 1];
+
+                    $oLevel = $level;
+                    $level = $this->setPropagateLearn($level, $lastLiteral, $disableRules, $why);
+
+                    if ($level == 0) {
+                        return;
+                    }
+
+                    continue;
+                }
+            }
+
+            break;
+        }
+    }
+
+    private function printDecisionMap()
+    {
+        echo "\nDecisionMap: \n";
+        foreach ($this->decisionMap as $packageId => $level) {
+            if ($packageId === 0) {
+                continue;
+            }
+            if ($level > 0) {
+                echo '    +' . $this->pool->packageById($packageId)."\n";
+            } elseif ($level < 0) {
+                echo '    -' . $this->pool->packageById($packageId)."\n";
+            } else {
+                echo '    ?' . $this->pool->packageById($packageId)."\n";
+            }
+        }
+        echo "\n";
+    }
+
+    private function printDecisionQueue()
+    {
+        echo "DecisionQueue: \n";
+        foreach ($this->decisionQueue as $i => $literal) {
+            echo '    ' . $literal . ' ' . $this->decisionQueueWhy[$i]." level ".$this->decisionMap[$literal->getPackageId()]."\n";
+        }
+        echo "\n";
+    }
+
+    private function printWatches()
+    {
+        echo "\nWatches:\n";
+        foreach ($this->watches as $literalId => $watch) {
+            echo '  '.$this->literalFromId($literalId)."\n";
+            $queue = array(array('    ', $watch));
+
+            while (!empty($queue)) {
+                list($indent, $watch) = array_pop($queue);
+
+                echo $indent.$watch;
+
+                if ($watch) {
+                    echo ' [id='.$watch->getId().',watch1='.$this->literalFromId($watch->watch1).',watch2='.$this->literalFromId($watch->watch2)."]";
+                }
+
+                echo "\n";
+
+                if ($watch && ($watch->next1 == $watch || $watch->next2 == $watch)) {
+                    if ($watch->next1 == $watch) {
+                        echo $indent."    1 *RECURSION*";
+                    }
+                    if ($watch->next2 == $watch) {
+                        echo $indent."    2 *RECURSION*";
+                    }
+                } elseif ($watch && ($watch->next1 || $watch->next2)) {
+                    $indent = str_replace(array('1', '2'), ' ', $indent);
+
+                    array_push($queue, array($indent.'    2 ', $watch->next2));
+                    array_push($queue, array($indent.'    1 ', $watch->next1));
+                }
+            }
+
+            echo "\n";
+        }
+    }
+}
diff --git a/vendor/composer/composer/src/Composer/DependencyResolver/SolverProblemsException.php b/vendor/composer/composer/src/Composer/DependencyResolver/SolverProblemsException.php
new file mode 100644
index 0000000..d558aa1
--- /dev/null
+++ b/vendor/composer/composer/src/Composer/DependencyResolver/SolverProblemsException.php
@@ -0,0 +1,44 @@
+<?php
+
+/*
+ * This file is part of Composer.
+ *
+ * (c) Nils Adermann <naderman@naderman.de>
+ *     Jordi Boggiano <j.boggiano@seld.be>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Composer\DependencyResolver;
+
+/**
+ * @author Nils Adermann <naderman@naderman.de>
+ */
+class SolverProblemsException extends \RuntimeException
+{
+    protected $problems;
+
+    public function __construct(array $problems)
+    {
+        $this->problems = $problems;
+
+        parent::__construct($this->createMessage());
+    }
+
+    protected function createMessage()
+    {
+        $messages = array();
+
+        foreach ($this->problems as $problem) {
+            $messages[] = (string) $problem;
+        }
+
+        return "\n\tProblems:\n\t\t- ".implode("\n\t\t- ", $messages);
+    }
+
+    public function getProblems()
+    {
+        return $this->problems;
+    }
+}
diff --git a/vendor/composer/composer/src/Composer/Downloader/ArchiveDownloader.php b/vendor/composer/composer/src/Composer/Downloader/ArchiveDownloader.php
new file mode 100644
index 0000000..2395e8d
--- /dev/null
+++ b/vendor/composer/composer/src/Composer/Downloader/ArchiveDownloader.php
@@ -0,0 +1,107 @@
+<?php
+
+/*
+ * This file is part of Composer.
+ *
+ * (c) Nils Adermann <naderman@naderman.de>
+ *     Jordi Boggiano <j.boggiano@seld.be>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Composer\Downloader;
+
+use Composer\IO\IOInterface;
+use Composer\Package\PackageInterface;
+
+/**
+ * Base downloader for archives
+ *
+ * @author Kirill chEbba Chebunin <iam@chebba.org>
+ * @author Jordi Boggiano <j.boggiano@seld.be>
+ * @author François Pluchino <francois.pluchino@opendisplay.com>
+ */
+abstract class ArchiveDownloader extends FileDownloader
+{
+    /**
+     * {@inheritDoc}
+     */
+    public function download(PackageInterface $package, $path)
+    {
+        parent::download($package, $path);
+
+        $fileName = $this->getFileName($package, $path);
+        if ($this->io->isVerbose()) {
+            $this->io->write('    Unpacking archive');
+        }
+        try {
+            $this->extract($fileName, $path);
+
+            if ($this->io->isVerbose()) {
+                $this->io->write('    Cleaning up');
+            }
+            unlink($fileName);
+
+            // If we have only a one dir inside it suppose to be a package itself
+            $contentDir = glob($path . '/*');
+            if (1 === count($contentDir)) {
+                $contentDir = $contentDir[0];
+
+                // Rename the content directory to avoid error when moving up
+                // a child folder with the same name
+                $temporaryName = md5(time().rand());
+                rename($contentDir, $temporaryName);
+                $contentDir = $temporaryName;
+
+                foreach (array_merge(glob($contentDir . '/.*'), glob($contentDir . '/*')) as $file) {
+                    if (trim(basename($file), '.')) {
+                        rename($file, $path . '/' . basename($file));
+                    }
+                }
+                rmdir($contentDir);
+            }
+        } catch (\Exception $e) {
+            // clean up
+            $this->filesystem->removeDirectory($path);
+            throw $e;
+        }
+
+        $this->io->write('');
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    protected function getFileName(PackageInterface $package, $path)
+    {
+        return rtrim($path.'/'.md5($path.spl_object_hash($package)).'.'.pathinfo($package->getDistUrl(), PATHINFO_EXTENSION), '.');
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    protected function processUrl($url)
+    {
+        if (!extension_loaded('openssl') && (0 === strpos($url, 'https:') || 0 === strpos($url, 'http://github.com'))) {
+            // bypass https for github if openssl is disabled
+            if (preg_match('{^https?://(github.com/[^/]+/[^/]+/(zip|tar)ball/[^/]+)$}i', $url, $match)) {
+                $url = 'http://nodeload.'.$match[1];
+            } else {
+                throw new \RuntimeException('You must enable the openssl extension to download files via https');
+            }
+        }
+
+        return $url;
+    }
+
+    /**
+     * Extract file to directory
+     *
+     * @param string $file Extracted file
+     * @param string $path Directory
+     *
+     * @throws \UnexpectedValueException If can not extract downloaded file to path
+     */
+    abstract protected function extract($file, $path);
+}
diff --git a/vendor/composer/composer/src/Composer/Downloader/DownloadManager.php b/vendor/composer/composer/src/Composer/Downloader/DownloadManager.php
new file mode 100644
index 0000000..c208235
--- /dev/null
+++ b/vendor/composer/composer/src/Composer/Downloader/DownloadManager.php
@@ -0,0 +1,194 @@
+<?php
+
+/*
+ * This file is part of Composer.
+ *
+ * (c) Nils Adermann <naderman@naderman.de>
+ *     Jordi Boggiano <j.boggiano@seld.be>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Composer\Downloader;
+
+use Composer\Package\PackageInterface;
+use Composer\Downloader\DownloaderInterface;
+use Composer\Util\Filesystem;
+
+/**
+ * Downloaders manager.
+ *
+ * @author Konstantin Kudryashov <ever.zet@gmail.com>
+ */
+class DownloadManager
+{
+    private $preferSource = false;
+    private $downloaders  = array();
+
+    /**
+     * Initializes download manager.
+     *
+     * @param   Boolean $preferSource   prefer downloading from source
+     */
+    public function __construct($preferSource = false)
+    {
+        $this->preferSource = $preferSource;
+    }
+
+    /**
+     * Makes downloader prefer source installation over the dist.
+     *
+     * @param   Boolean $preferSource   prefer downloading from source
+     */
+    public function setPreferSource($preferSource)
+    {
+        $this->preferSource = $preferSource;
+    }
+
+    /**
+     * Sets installer downloader for a specific installation type.
+     *
+     * @param   string              $type       installation type
+     * @param   DownloaderInterface $downloader downloader instance
+     */
+    public function setDownloader($type, DownloaderInterface $downloader)
+    {
+        $this->downloaders[$type] = $downloader;
+    }
+
+    /**
+     * Returns downloader for a specific installation type.
+     *
+     * @param   string  $type   installation type
+     *
+     * @return  DownloaderInterface
+     *
+     * @throws  UnexpectedValueException    if downloader for provided type is not registeterd
+     */
+    public function getDownloader($type)
+    {
+        if (!isset($this->downloaders[$type])) {
+            throw new \InvalidArgumentException('Unknown downloader type: '.$type);
+        }
+
+        return $this->downloaders[$type];
+    }
+
+    /**
+     * Returns downloader for already installed package.
+     *
+     * @param   PackageInterface    $package    package instance
+     *
+     * @return  DownloaderInterface
+     *
+     * @throws  InvalidArgumentException        if package has no installation source specified
+     * @throws  LogicException                  if specific downloader used to load package with
+     *                                          wrong type
+     */
+    public function getDownloaderForInstalledPackage(PackageInterface $package)
+    {
+        $installationSource = $package->getInstallationSource();
+
+        if ('dist' === $installationSource) {
+            $downloader = $this->getDownloader($package->getDistType());
+        } elseif ('source' === $installationSource) {
+            $downloader = $this->getDownloader($package->getSourceType());
+        } else {
+            throw new \InvalidArgumentException(
+                'Package '.$package.' seems not been installed properly'
+            );
+        }
+
+        if ($installationSource !== $downloader->getInstallationSource()) {
+            throw new \LogicException(sprintf(
+                'Downloader "%s" is a %s type downloader and can not be used to download %s',
+                get_class($downloader), $downloader->getInstallationSource(), $installationSource
+            ));
+        }
+
+        return $downloader;
+    }
+
+    /**
+     * Downloads package into target dir.
+     *
+     * @param   PackageInterface    $package        package instance
+     * @param   string              $targetDir      target dir
+     * @param   Boolean             $preferSource   prefer installation from source
+     *
+     * @throws  InvalidArgumentException            if package have no urls to download from
+     */
+    public function download(PackageInterface $package, $targetDir, $preferSource = null)
+    {
+        $preferSource = null !== $preferSource ? $preferSource : $this->preferSource;
+        $sourceType   = $package->getSourceType();
+        $distType     = $package->getDistType();
+
+        if (!$package->isDev() && !($preferSource && $sourceType) && $distType) {
+            $package->setInstallationSource('dist');
+        } elseif ($sourceType) {
+            $package->setInstallationSource('source');
+        } elseif ($package->isDev()) {
+            throw new \InvalidArgumentException('Dev package '.$package.' must have a source specified');
+        } else {
+            throw new \InvalidArgumentException('Package '.$package.' must have a source or dist specified');
+        }
+
+        $fs = new Filesystem();
+        $fs->ensureDirectoryExists($targetDir);
+
+        $downloader = $this->getDownloaderForInstalledPackage($package);
+        $downloader->download($package, $targetDir);
+    }
+
+    /**
+     * Updates package from initial to target version.
+     *
+     * @param   PackageInterface    $initial    initial package version
+     * @param   PackageInterface    $target     target package version
+     * @param   string              $targetDir  target dir
+     *
+     * @throws  InvalidArgumentException        if initial package is not installed
+     */
+    public function update(PackageInterface $initial, PackageInterface $target, $targetDir)
+    {
+        $downloader = $this->getDownloaderForInstalledPackage($initial);
+        $installationSource = $initial->getInstallationSource();
+
+        if ('dist' === $installationSource) {
+            $initialType = $initial->getDistType();
+            $targetType  = $target->getDistType();
+        } else {
+            $initialType = $initial->getSourceType();
+            $targetType  = $target->getSourceType();
+        }
+
+        // upgrading from a dist stable package to a dev package, force source reinstall
+        if ($target->isDev() && 'dist' === $installationSource) {
+            $downloader->remove($initial, $targetDir);
+            $this->download($target, $targetDir);
+            return;
+        }
+
+        if ($initialType === $targetType) {
+            $target->setInstallationSource($installationSource);
+            $downloader->update($initial, $target, $targetDir);
+        } else {
+            $downloader->remove($initial, $targetDir);
+            $this->download($target, $targetDir, 'source' === $installationSource);
+        }
+    }
+
+    /**
+     * Removes package from target dir.
+     *
+     * @param   PackageInterface    $package    package instance
+     * @param   string              $targetDir  target dir
+     */
+    public function remove(PackageInterface $package, $targetDir)
+    {
+        $downloader = $this->getDownloaderForInstalledPackage($package);
+        $downloader->remove($package, $targetDir);
+    }
+}
diff --git a/vendor/composer/composer/src/Composer/Downloader/DownloaderInterface.php b/vendor/composer/composer/src/Composer/Downloader/DownloaderInterface.php
new file mode 100644
index 0000000..8c6ed4c
--- /dev/null
+++ b/vendor/composer/composer/src/Composer/Downloader/DownloaderInterface.php
@@ -0,0 +1,56 @@
+<?php
+
+/*
+ * This file is part of Composer.
+ *
+ * (c) Nils Adermann <naderman@naderman.de>
+ *     Jordi Boggiano <j.boggiano@seld.be>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Composer\Downloader;
+
+use Composer\Package\PackageInterface;
+
+/**
+ * Downloader interface.
+ *
+ * @author Konstantin Kudryashov <ever.zet@gmail.com>
+ * @author Jordi Boggiano <j.boggiano@seld.be>
+ */
+interface DownloaderInterface
+{
+    /**
+     * Returns installation source (either source or dist).
+     *
+     * @return  string                          "source" or "dist"
+     */
+    function getInstallationSource();
+
+    /**
+     * Downloads specific package into specific folder.
+     *
+     * @param   PackageInterface    $package    package instance
+     * @param   string              $path       download path
+     */
+    function download(PackageInterface $package, $path);
+
+    /**
+     * Updates specific package in specific folder from initial to target version.
+     *
+     * @param   PackageInterface    $initial    initial package
+     * @param   PackageInterface    $target     updated package
+     * @param   string              $path       download path
+     */
+    function update(PackageInterface $initial, PackageInterface $target, $path);
+
+    /**
+     * Removes specific package from specific folder.
+     *
+     * @param   PackageInterface    $package    package instance
+     * @param   string              $path       download path
+     */
+    function remove(PackageInterface $package, $path);
+}
diff --git a/vendor/composer/composer/src/Composer/Downloader/FileDownloader.php b/vendor/composer/composer/src/Composer/Downloader/FileDownloader.php
new file mode 100644
index 0000000..3569345
--- /dev/null
+++ b/vendor/composer/composer/src/Composer/Downloader/FileDownloader.php
@@ -0,0 +1,137 @@
+<?php
+
+/*
+ * This file is part of Composer.
+ *
+ * (c) Nils Adermann <naderman@naderman.de>
+ *     Jordi Boggiano <j.boggiano@seld.be>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Composer\Downloader;
+
+use Composer\IO\IOInterface;
+use Composer\Package\PackageInterface;
+use Composer\Util\Filesystem;
+use Composer\Util\RemoteFilesystem;
+
+/**
+ * Base downloader for files
+ *
+ * @author Kirill chEbba Chebunin <iam@chebba.org>
+ * @author Jordi Boggiano <j.boggiano@seld.be>
+ * @author François Pluchino <francois.pluchino@opendisplay.com>
+ */
+class FileDownloader implements DownloaderInterface
+{
+    protected $io;
+    protected $rfs;
+    protected $filesystem;
+
+    /**
+     * Constructor.
+     *
+     * @param IOInterface  $io  The IO instance
+     */
+    public function __construct(IOInterface $io, RemoteFilesystem $rfs = null, Filesystem $filesystem = null)
+    {
+        $this->io = $io;
+        $this->rfs = $rfs ?: new RemoteFilesystem($io);
+        $this->filesystem = $filesystem ?: new Filesystem();
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public function getInstallationSource()
+    {
+        return 'dist';
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public function download(PackageInterface $package, $path)
+    {
+        $url = $package->getDistUrl();
+        if (!$url) {
+            throw new \InvalidArgumentException('The given package is missing url information');
+        }
+
+        $this->filesystem->ensureDirectoryExists($path);
+
+        $fileName = $this->getFileName($package, $path);
+
+        $this->io->write("  - Package <info>" . $package->getName() . "</info> (<comment>" . $package->getPrettyVersion() . "</comment>)");
+
+        $processUrl = $this->processUrl($url);
+
+        try {
+            $this->rfs->copy($package->getSourceUrl(), $processUrl, $fileName);
+
+            if (!file_exists($fileName)) {
+                throw new \UnexpectedValueException($url.' could not be saved to '.$fileName.', make sure the'
+                    .' directory is writable and you have internet connectivity');
+            }
+
+            $checksum = $package->getDistSha1Checksum();
+            if ($checksum && hash_file('sha1', $fileName) !== $checksum) {
+                throw new \UnexpectedValueException('The checksum verification of the file failed (downloaded from '.$url.')');
+            }
+        } catch (\Exception $e) {
+            // clean up
+            $this->filesystem->removeDirectory($path);
+            throw $e;
+        }
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public function update(PackageInterface $initial, PackageInterface $target, $path)
+    {
+        $this->remove($initial, $path);
+        $this->download($target, $path);
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public function remove(PackageInterface $package, $path)
+    {
+        if (!$this->filesystem->removeDirectory($path)) {
+            throw new \RuntimeException('Could not completely delete '.$path.', aborting.');
+        }
+    }
+
+    /**
+     * Gets file name for specific package
+     *
+     * @param  PackageInterface $package   package instance
+     * @param  string           $path      download path
+     * @return string file name
+     */
+    protected function getFileName(PackageInterface $package, $path)
+    {
+        return $path.'/'.pathinfo($package->getDistUrl(), PATHINFO_BASENAME);
+    }
+
+    /**
+     * Process the download url
+     *
+     * @param  string           $url       download url
+     * @return string url
+     *
+     * @throws \RuntimeException If any problem with the url
+     */
+    protected function processUrl($url)
+    {
+        if (!extension_loaded('openssl') && 0 === strpos($url, 'https:')) {
+            throw new \RuntimeException('You must enable the openssl extension to download files via https');
+        }
+
+        return $url;
+    }
+}
diff --git a/vendor/composer/composer/src/Composer/Downloader/GitDownloader.php b/vendor/composer/composer/src/Composer/Downloader/GitDownloader.php
new file mode 100644
index 0000000..6f2434a
--- /dev/null
+++ b/vendor/composer/composer/src/Composer/Downloader/GitDownloader.php
@@ -0,0 +1,135 @@
+<?php
+
+/*
+ * This file is part of Composer.
+ *
+ * (c) Nils Adermann <naderman@naderman.de>
+ *     Jordi Boggiano <j.boggiano@seld.be>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Composer\Downloader;
+
+use Composer\Package\PackageInterface;
+use Composer\Util\ProcessExecutor;
+
+/**
+ * @author Jordi Boggiano <j.boggiano@seld.be>
+ */
+class GitDownloader extends VcsDownloader
+{
+    /**
+     * {@inheritDoc}
+     */
+    public function doDownload(PackageInterface $package, $path)
+    {
+        $ref = $package->getSourceReference();
+        $command = 'git clone %s %s && cd %2$s && git checkout %3$s && git reset --hard %3$s';
+        $this->io->write("    Cloning ".$package->getSourceReference());
+
+        $commandCallable = function($url) use ($ref, $path, $command) {
+            return sprintf($command, escapeshellarg($url), escapeshellarg($path), escapeshellarg($ref));
+        };
+
+        $this->runCommand($commandCallable, $package->getSourceUrl(), $path);
+        $this->setPushUrl($package, $path);
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public function doUpdate(PackageInterface $initial, PackageInterface $target, $path)
+    {
+        $ref = $target->getSourceReference();
+        $this->io->write("    Checking out ".$target->getSourceReference());
+        $command = 'cd %s && git remote set-url origin %s && git fetch origin && git fetch --tags origin && git checkout %3$s && git reset --hard %3$s';
+
+        $commandCallable = function($url) use ($ref, $path, $command) {
+            return sprintf($command, escapeshellarg($path), escapeshellarg($url), escapeshellarg($ref));
+        };
+
+        $this->runCommand($commandCallable, $target->getSourceUrl());
+        $this->setPushUrl($target, $path);
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    protected function enforceCleanDirectory($path)
+    {
+        $command = sprintf('cd %s && git status --porcelain', escapeshellarg($path));
+        if (0 !== $this->process->execute($command, $output)) {
+            throw new \RuntimeException('Failed to execute ' . $command . "\n\n" . $this->process->getErrorOutput());
+        }
+
+        if (trim($output)) {
+            throw new \RuntimeException('Source directory ' . $path . ' has uncommitted changes');
+        }
+    }
+
+    /**
+     * Runs a command doing attempts for each protocol supported by github.
+     *
+     * @param callable $commandCallable A callable building the command for the given url
+     * @param string $url
+     * @param string $path The directory to remove for each attempt (null if not needed)
+     * @throws \RuntimeException
+     */
+    protected function runCommand($commandCallable, $url, $path = null)
+    {
+        $handler = array($this, 'outputHandler');
+
+        // github, autoswitch protocols
+        if (preg_match('{^(?:https?|git)(://github.com/.*)}', $url, $match)) {
+            $protocols = array('git', 'https', 'http');
+            foreach ($protocols as $protocol) {
+                $url = $protocol . $match[1];
+                if (0 === $this->process->execute(call_user_func($commandCallable, $url), $handler)) {
+                    return;
+                }
+                if (null !== $path) {
+                    $this->filesystem->removeDirectory($path);
+                }
+            }
+
+            // failed to checkout, first check git accessibility
+            $this->throwException('Failed to clone ' . $url .' via git, https and http protocols, aborting.' . "\n\n" . $this->process->getErrorOutput(), $url);
+        }
+
+        $command = call_user_func($commandCallable, $url);
+        if (0 !== $this->process->execute($command, $handler)) {
+            $this->throwException('Failed to execute ' . $command . "\n\n" . $this->process->getErrorOutput(), $url);
+        }
+    }
+
+    public function outputHandler($type, $buffer)
+    {
+        if ($type !== 'out') {
+            return;
+        }
+        if ($this->io->isVerbose()) {
+            $this->io->write($buffer, false);
+        }
+    }
+
+    protected function throwException($message, $url)
+    {
+        if (0 !== $this->process->execute('git --version', $ignoredOutput)) {
+            throw new \RuntimeException('Failed to clone '.$url.', git was not found, check that it is installed and in your PATH env.' . "\n\n" . $this->process->getErrorOutput());
+        }
+
+        throw new \RuntimeException($message);
+    }
+
+    protected function setPushUrl(PackageInterface $package, $path)
+    {
+        // set push url for github projects
+        if (preg_match('{^(?:https?|git)://github.com/([^/]+)/([^/]+?)(?:\.git)?$}', $package->getSourceUrl(), $match)) {
+            $pushUrl = 'git@github.com:'.$match[1].'/'.$match[2].'.git';
+            $cmd = sprintf('git remote set-url --push origin %s', escapeshellarg($pushUrl));
+            $this->process->execute($cmd, $ignoredOutput, $path);
+        }
+    }
+}
diff --git a/vendor/composer/composer/src/Composer/Downloader/HgDownloader.php b/vendor/composer/composer/src/Composer/Downloader/HgDownloader.php
new file mode 100644
index 0000000..25431d1
--- /dev/null
+++ b/vendor/composer/composer/src/Composer/Downloader/HgDownloader.php
@@ -0,0 +1,63 @@
+<?php
+
+/*
+ * This file is part of Composer.
+ *
+ * (c) Nils Adermann <naderman@naderman.de>
+ *     Jordi Boggiano <j.boggiano@seld.be>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Composer\Downloader;
+
+use Composer\Package\PackageInterface;
+use Composer\Util\ProcessExecutor;
+
+/**
+ * @author Per Bernhardt <plb@webfactory.de>
+ */
+class HgDownloader extends VcsDownloader
+{
+    /**
+     * {@inheritDoc}
+     */
+    public function doDownload(PackageInterface $package, $path)
+    {
+        $url = escapeshellarg($package->getSourceUrl());
+        $ref = escapeshellarg($package->getSourceReference());
+        $path = escapeshellarg($path);
+        $this->io->write("    Cloning ".$package->getSourceReference());
+        $command = sprintf('hg clone %s %s && cd %2$s && hg up %s', $url, $path, $ref);
+        if (0 !== $this->process->execute($command, $ignoredOutput)) {
+            throw new \RuntimeException('Failed to execute ' . $command . "\n\n" . $this->process->getErrorOutput());
+        }
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public function doUpdate(PackageInterface $initial, PackageInterface $target, $path)
+    {
+        $url = escapeshellarg($target->getSourceUrl());
+        $ref = escapeshellarg($target->getSourceReference());
+        $path = escapeshellarg($path);
+        $this->io->write("    Updating to ".$target->getSourceReference());
+        $command = sprintf('cd %s && hg pull %s && hg up %s', $path, $url, $ref);
+        if (0 !== $this->process->execute($command, $ignoredOutput)) {
+            throw new \RuntimeException('Failed to execute ' . $command . "\n\n" . $this->process->getErrorOutput());
+        }
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    protected function enforceCleanDirectory($path)
+    {
+        $this->process->execute(sprintf('cd %s && hg st', escapeshellarg($path)), $output);
+        if (trim($output)) {
+            throw new \RuntimeException('Source directory ' . $path . ' has uncommitted changes');
+        }
+    }
+}
diff --git a/vendor/composer/composer/src/Composer/Downloader/PearDownloader.php b/vendor/composer/composer/src/Composer/Downloader/PearDownloader.php
new file mode 100644
index 0000000..dac33d9
--- /dev/null
+++ b/vendor/composer/composer/src/Composer/Downloader/PearDownloader.php
@@ -0,0 +1,38 @@
+<?php
+
+/*
+ * This file is part of Composer.
+ *
+ * (c) Nils Adermann <naderman@naderman.de>
+ *     Jordi Boggiano <j.boggiano@seld.be>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Composer\Downloader;
+
+use Composer\Package\PackageInterface;
+
+/**
+ * Downloader for pear packages
+ *
+ * @author Jordi Boggiano <j.boggiano@seld.be>
+ * @author Kirill chEbba Chebunin <iam@chebba.org>
+ */
+class PearDownloader extends TarDownloader
+{
+    /**
+     * {@inheritDoc}
+     */
+    protected function extract($file, $path)
+    {
+        parent::extract($file, $path);
+        if (file_exists($path . '/package.sig')) {
+            unlink($path . '/package.sig');
+        }
+        if (file_exists($path . '/package.xml')) {
+            unlink($path . '/package.xml');
+        }
+    }
+}
diff --git a/vendor/composer/composer/src/Composer/Downloader/PharDownloader.php b/vendor/composer/composer/src/Composer/Downloader/PharDownloader.php
new file mode 100644
index 0000000..94a52e0
--- /dev/null
+++ b/vendor/composer/composer/src/Composer/Downloader/PharDownloader.php
@@ -0,0 +1,38 @@
+<?php
+
+/*
+ * This file is part of Composer.
+ *
+ * (c) Nils Adermann <naderman@naderman.de>
+ *     Jordi Boggiano <j.boggiano@seld.be>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Composer\Downloader;
+
+use Composer\Package\PackageInterface;
+
+/**
+ * Downloader for phar files
+ *
+ * @author Kirill chEbba Chebunin <iam@chebba.org>
+ */
+class PharDownloader extends ArchiveDownloader
+{
+    /**
+     * {@inheritDoc}
+     */
+    protected function extract($file, $path)
+    {
+        // Can throw an UnexpectedValueException
+        $archive = new \Phar($file);
+        $archive->extractTo($path, null, true);
+        /* TODO: handle openssl signed phars
+         * https://github.com/composer/composer/pull/33#issuecomment-2250768
+         * https://github.com/koto/phar-util
+         * http://blog.kotowicz.net/2010/08/hardening-php-how-to-securely-include.html
+         */
+    }
+}
diff --git a/vendor/composer/composer/src/Composer/Downloader/SvnDownloader.php b/vendor/composer/composer/src/Composer/Downloader/SvnDownloader.php
new file mode 100644
index 0000000..4bc2e53
--- /dev/null
+++ b/vendor/composer/composer/src/Composer/Downloader/SvnDownloader.php
@@ -0,0 +1,83 @@
+<?php
+
+/*
+ * This file is part of Composer.
+ *
+ * (c) Nils Adermann <naderman@naderman.de>
+ *     Jordi Boggiano <j.boggiano@seld.be>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Composer\Downloader;
+
+use Composer\Package\PackageInterface;
+use Composer\Util\ProcessExecutor;
+use Composer\Util\Svn as SvnUtil;
+
+/**
+ * @author Ben Bieker <mail@ben-bieker.de>
+ * @author Till Klampaeckel <till@php.net>
+ */
+class SvnDownloader extends VcsDownloader
+{
+    /**
+     * {@inheritDoc}
+     */
+    public function doDownload(PackageInterface $package, $path)
+    {
+        $url =  $package->getSourceUrl();
+        $ref =  $package->getSourceReference();
+
+        $this->io->write("    Checking out ".$package->getSourceReference());
+        $this->execute($url, "svn co", sprintf("%s/%s", $url, $ref), null, $path);
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public function doUpdate(PackageInterface $initial, PackageInterface $target, $path)
+    {
+        $url = $target->getSourceUrl();
+        $ref = $target->getSourceReference();
+
+        $this->io->write("    Checking out " . $ref);
+        $this->execute($url, "svn switch", sprintf("%s/%s", $url, $ref), $path);
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    protected function enforceCleanDirectory($path)
+    {
+        $this->process->execute('svn status', $output, $path);
+        if (trim($output)) {
+            throw new \RuntimeException('Source directory ' . $path . ' has uncommitted changes');
+        }
+    }
+
+    /**
+     * Execute an SVN command and try to fix up the process with credentials
+     * if necessary.
+     *
+     * @param string $baseUrl Base URL of the repository
+     * @param string $command SVN command to run
+     * @param string $url     SVN url
+     * @param string $cwd     Working directory
+     * @param string $path    Target for a checkout
+     *
+     * @return string
+     */
+    protected function execute($baseUrl, $command, $url, $cwd = null, $path = null)
+    {
+        $util = new SvnUtil($baseUrl, $this->io);
+        try {
+            return $util->execute($command, $url, $cwd, $path, $this->io->isVerbose());
+        } catch (\RuntimeException $e) {
+            throw new \RuntimeException(
+                'Package could not be downloaded, '.$e->getMessage()
+            );
+        }
+    }
+}
diff --git a/vendor/composer/composer/src/Composer/Downloader/TarDownloader.php b/vendor/composer/composer/src/Composer/Downloader/TarDownloader.php
new file mode 100644
index 0000000..c9ea449
--- /dev/null
+++ b/vendor/composer/composer/src/Composer/Downloader/TarDownloader.php
@@ -0,0 +1,33 @@
+<?php
+
+/*
+ * This file is part of Composer.
+ *
+ * (c) Nils Adermann <naderman@naderman.de>
+ *     Jordi Boggiano <j.boggiano@seld.be>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Composer\Downloader;
+
+use Composer\Package\PackageInterface;
+
+/**
+ * Downloader for tar files: tar, tar.gz or tar.bz2
+ *
+ * @author Kirill chEbba Chebunin <iam@chebba.org>
+ */
+class TarDownloader extends ArchiveDownloader
+{
+    /**
+     * {@inheritDoc}
+     */
+    protected function extract($file, $path)
+    {
+        // Can throw an UnexpectedValueException
+        $archive = new \PharData($file);
+        $archive->extractTo($path, null, true);
+    }
+}
diff --git a/vendor/composer/composer/src/Composer/Downloader/TransportException.php b/vendor/composer/composer/src/Composer/Downloader/TransportException.php
new file mode 100644
index 0000000..61bd67d
--- /dev/null
+++ b/vendor/composer/composer/src/Composer/Downloader/TransportException.php
@@ -0,0 +1,20 @@
+<?php
+
+/*
+ * This file is part of Composer.
+ *
+ * (c) Nils Adermann <naderman@naderman.de>
+ *     Jordi Boggiano <j.boggiano@seld.be>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Composer\Downloader;
+
+/**
+ * @author Jordi Boggiano <j.boggiano@seld.be>
+ */
+class TransportException extends \Exception
+{
+}
diff --git a/vendor/composer/composer/src/Composer/Downloader/VcsDownloader.php b/vendor/composer/composer/src/Composer/Downloader/VcsDownloader.php
new file mode 100644
index 0000000..2d19bba
--- /dev/null
+++ b/vendor/composer/composer/src/Composer/Downloader/VcsDownloader.php
@@ -0,0 +1,108 @@
+<?php
+
+/*
+ * This file is part of Composer.
+ *
+ * (c) Nils Adermann <naderman@naderman.de>
+ *     Jordi Boggiano <j.boggiano@seld.be>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Composer\Downloader;
+
+use Composer\Package\PackageInterface;
+use Composer\Util\ProcessExecutor;
+use Composer\IO\IOInterface;
+use Composer\Util\Filesystem;
+
+/**
+ * @author Jordi Boggiano <j.boggiano@seld.be>
+ */
+abstract class VcsDownloader implements DownloaderInterface
+{
+    protected $io;
+    protected $process;
+    protected $filesystem;
+
+    public function __construct(IOInterface $io, ProcessExecutor $process = null, Filesystem $fs = null)
+    {
+        $this->io = $io;
+        $this->process = $process ?: new ProcessExecutor;
+        $this->filesystem = $fs ?: new Filesystem;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public function getInstallationSource()
+    {
+        return 'source';
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public function download(PackageInterface $package, $path)
+    {
+        if (!$package->getSourceReference()) {
+            throw new \InvalidArgumentException('Package '.$package->getPrettyName().' is missing reference information');
+        }
+
+        $this->io->write("  - Package <info>" . $package->getName() . "</info> (<comment>" . $package->getPrettyVersion() . "</comment>)");
+        $this->filesystem->removeDirectory($path);
+        $this->doDownload($package, $path);
+        $this->io->write('');
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public function update(PackageInterface $initial, PackageInterface $target, $path)
+    {
+        if (!$target->getSourceReference()) {
+            throw new \InvalidArgumentException('Package '.$target->getPrettyName().' is missing reference information');
+        }
+
+        $this->io->write("  - Package <info>" . $target->getName() . "</info> (<comment>" . $target->getPrettyVersion() . "</comment>)");
+        $this->enforceCleanDirectory($path);
+        $this->doUpdate($initial, $target, $path);
+        $this->io->write('');
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public function remove(PackageInterface $package, $path)
+    {
+        $this->enforceCleanDirectory($path);
+        if (!$this->filesystem->removeDirectory($path)) {
+            throw new \RuntimeException('Could not completely delete '.$path.', aborting.');
+        }
+    }
+
+    /**
+     * Downloads specific package into specific folder.
+     *
+     * @param   PackageInterface    $package    package instance
+     * @param   string              $path       download path
+     */
+    abstract protected function doDownload(PackageInterface $package, $path);
+
+    /**
+     * Updates specific package in specific folder from initial to target version.
+     *
+     * @param   PackageInterface    $initial    initial package
+     * @param   PackageInterface    $target     updated package
+     * @param   string              $path       download path
+     */
+    abstract protected function doUpdate(PackageInterface $initial, PackageInterface $target, $path);
+
+    /**
+     * Checks that no changes have been made to the local copy
+     *
+     * @throws \RuntimeException if the directory is not clean
+     */
+    abstract protected function enforceCleanDirectory($path);
+}
diff --git a/vendor/composer/composer/src/Composer/Downloader/ZipDownloader.php b/vendor/composer/composer/src/Composer/Downloader/ZipDownloader.php
new file mode 100644
index 0000000..fac30ee
--- /dev/null
+++ b/vendor/composer/composer/src/Composer/Downloader/ZipDownloader.php
@@ -0,0 +1,93 @@
+<?php
+
+/*
+ * This file is part of Composer.
+ *
+ * (c) Nils Adermann <naderman@naderman.de>
+ *     Jordi Boggiano <j.boggiano@seld.be>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Composer\Downloader;
+
+use Composer\Package\PackageInterface;
+use Composer\Util\ProcessExecutor;
+use Composer\IO\IOInterface;
+use ZipArchive;
+
+/**
+ * @author Jordi Boggiano <j.boggiano@seld.be>
+ */
+class ZipDownloader extends ArchiveDownloader
+{
+    protected $process;
+
+    public function __construct(IOInterface $io, ProcessExecutor $process = null)
+    {
+        $this->process = $process ?: new ProcessExecutor;
+        parent::__construct($io);
+    }
+
+    protected function extract($file, $path)
+    {
+        if (!class_exists('ZipArchive')) {
+            $error = 'You need the zip extension enabled to use the ZipDownloader';
+
+            // try to use unzip on *nix
+            if (!defined('PHP_WINDOWS_VERSION_BUILD')) {
+                $command = 'unzip '.escapeshellarg($file).' -d '.escapeshellarg($path);
+                if (0 === $this->process->execute($command, $ignoredOutput)) {
+                    return;
+                }
+
+                $error = 'Failed to execute ' . $command . "\n\n" . $this->process->getErrorOutput();
+            }
+
+            throw new \RuntimeException($error);
+        }
+
+        $zipArchive = new ZipArchive();
+
+        if (true !== ($retval = $zipArchive->open($file))) {
+            throw new \UnexpectedValueException($this->getErrorMessage($retval, $file));
+        }
+
+        $zipArchive->extractTo($path);
+        $zipArchive->close();
+    }
+
+    /**
+     * Give a meaningful error message to the user.
+     *
+     * @param int $retval
+     * @param string $file
+     * @return string
+     */
+    protected function getErrorMessage($retval, $file)
+    {
+        switch ($retval) {
+            case ZipArchive::ER_EXISTS:
+                return sprintf("File '%s' already exists.", $file);
+            case ZipArchive::ER_INCONS:
+                return sprintf("Zip archive '%s' is inconsistent.", $file);
+            case ZipArchive::ER_INVAL:
+                return sprintf("Invalid argument (%s)", $file);
+            case ZipArchive::ER_MEMORY:
+                return sprintf("Malloc failure (%s)", $file);
+            case ZipArchive::ER_NOENT:
+                return sprintf("No such zip file: '%s'", $file);
+            case ZipArchive::ER_NOZIP:
+                return sprintf("'%s' is not a zip archive.", $file);
+            case ZipArchive::ER_OPEN:
+                return sprintf("Can't open zip file: %s", $file);
+            case ZipArchive::ER_READ:
+                return sprintf("Zip read error (%s)", $file);
+            case ZipArchive::ER_SEEK:
+                return sprintf("Zip seek error (%s)", $file);
+            default:
+                return sprintf("'%s' is not a valid zip archive, got error code: %s", $file, $retval);
+        }
+    }
+}
diff --git a/vendor/composer/composer/src/Composer/Factory.php b/vendor/composer/composer/src/Composer/Factory.php
new file mode 100644
index 0000000..1db5c11
--- /dev/null
+++ b/vendor/composer/composer/src/Composer/Factory.php
@@ -0,0 +1,232 @@
+<?php
+
+/*
+ * This file is part of Composer.
+ *
+ * (c) Nils Adermann <naderman@naderman.de>
+ *     Jordi Boggiano <j.boggiano@seld.be>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Composer;
+
+use Composer\Json\JsonFile;
+use Composer\IO\IOInterface;
+use Composer\Repository\RepositoryManager;
+use Composer\Util\ProcessExecutor;
+use Composer\Util\RemoteFilesystem;
+
+/**
+ * Creates an configured instance of composer.
+ *
+ * @author Ryan Weaver <ryan@knplabs.com>
+ * @author Jordi Boggiano <j.boggiano@seld.be>
+ * @author Igor Wiedler <igor@wiedler.ch>
+ */
+class Factory
+{
+    public static function createConfig()
+    {
+        // load main Composer configuration
+        if (!$home = getenv('COMPOSER_HOME')) {
+            if (defined('PHP_WINDOWS_VERSION_MAJOR')) {
+                $home = getenv('APPDATA') . '/Composer';
+            } else {
+                $home = getenv('HOME') . '/.composer';
+            }
+        }
+
+        $config = new Config();
+
+        $file = new JsonFile($home.'/config.json');
+        if ($file->exists()) {
+            $config->merge($file->read());
+        }
+
+        // add home dir to the config
+        $config->merge(array('config' => array('home' => $home)));
+
+        return $config;
+    }
+
+    /**
+     * Creates a Composer instance
+     *
+     * @param IOInterface $io IO instance
+     * @param mixed $localConfig either a configuration array or a filename to read from, if null it will read from the default filename
+     * @return Composer
+     */
+    public function createComposer(IOInterface $io, $localConfig = null)
+    {
+        // load Composer configuration
+        if (null === $localConfig) {
+            $localConfig = getenv('COMPOSER') ?: 'composer.json';
+        }
+
+        if (is_string($localConfig)) {
+            $composerFile = $localConfig;
+            $file = new JsonFile($localConfig, new RemoteFilesystem($io));
+
+            if (!$file->exists()) {
+                if ($localConfig === 'composer.json') {
+                    $message = 'Composer could not find a composer.json file in '.getcwd();
+                } else {
+                    $message = 'Composer could not find the config file: '.$localConfig;
+                }
+                $instructions = 'To initialize a project, please create a composer.json file as described in the http://getcomposer.org/ "Getting Started" section';
+                throw new \InvalidArgumentException($message.PHP_EOL.$instructions);
+            }
+
+            $file->validateSchema(JsonFile::LAX_SCHEMA);
+            $localConfig = $file->read();
+        }
+
+        // Configuration defaults
+        $config = $this->createConfig();
+        $config->merge($localConfig);
+
+        $vendorDir = $config->get('vendor-dir');
+        $binDir = $config->get('bin-dir');
+
+        // setup process timeout
+        ProcessExecutor::setTimeout((int) $config->get('process-timeout'));
+
+        // initialize repository manager
+        $rm = $this->createRepositoryManager($io, $config);
+
+        // load default repository unless it's explicitly disabled
+        $localConfig = $this->addPackagistRepository($localConfig);
+
+        // load local repository
+        $this->addLocalRepository($rm, $vendorDir);
+
+        // load package
+        $loader  = new Package\Loader\RootPackageLoader($rm);
+        $package = $loader->load($localConfig);
+
+        // initialize download manager
+        $dm = $this->createDownloadManager($io);
+
+        // initialize installation manager
+        $im = $this->createInstallationManager($rm, $dm, $vendorDir, $binDir, $io);
+
+        // purge packages if they have been deleted on the filesystem
+        $this->purgePackages($rm, $im);
+
+        // initialize composer
+        $composer = new Composer();
+        $composer->setConfig($config);
+        $composer->setPackage($package);
+        $composer->setRepositoryManager($rm);
+        $composer->setDownloadManager($dm);
+        $composer->setInstallationManager($im);
+
+        // init locker if possible
+        if (isset($composerFile)) {
+            $lockFile = "json" === pathinfo($composerFile, PATHINFO_EXTENSION)
+                ? substr($composerFile, 0, -4).'lock'
+                : $composerFile . '.lock';
+            $locker = new Package\Locker(new JsonFile($lockFile, new RemoteFilesystem($io)), $rm, md5_file($composerFile));
+            $composer->setLocker($locker);
+        }
+
+        return $composer;
+    }
+
+    protected function createRepositoryManager(IOInterface $io, Config $config)
+    {
+        $rm = new RepositoryManager($io, $config);
+        $rm->setRepositoryClass('composer', 'Composer\Repository\ComposerRepository');
+        $rm->setRepositoryClass('vcs', 'Composer\Repository\VcsRepository');
+        $rm->setRepositoryClass('package', 'Composer\Repository\PackageRepository');
+        $rm->setRepositoryClass('pear', 'Composer\Repository\PearRepository');
+        $rm->setRepositoryClass('git', 'Composer\Repository\VcsRepository');
+        $rm->setRepositoryClass('svn', 'Composer\Repository\VcsRepository');
+        $rm->setRepositoryClass('hg', 'Composer\Repository\VcsRepository');
+
+        return $rm;
+    }
+
+    protected function addLocalRepository(RepositoryManager $rm, $vendorDir)
+    {
+        $rm->setLocalRepository(new Repository\InstalledFilesystemRepository(new JsonFile($vendorDir.'/.composer/installed.json')));
+    }
+
+    protected function addPackagistRepository(array $localConfig)
+    {
+        $loadPackagist = true;
+        $packagistConfig = array(
+            'type' => 'composer',
+            'url' => 'http://packagist.org'
+        );
+
+        if (isset($localConfig['repositories'])) {
+            foreach ($localConfig['repositories'] as $key => $repo) {
+                if (isset($repo['packagist'])) {
+                    if (true === $repo['packagist']) {
+                        $localConfig['repositories'][$key] = $packagistConfig;
+                    }
+
+                    $loadPackagist = false;
+                    break;
+                }
+            }
+        } else {
+            $localConfig['repositories'] = array();
+        }
+
+        if ($loadPackagist) {
+            $localConfig['repositories'][] = $packagistConfig;
+        }
+
+        return $localConfig;
+    }
+
+    public function createDownloadManager(IOInterface $io)
+    {
+        $dm = new Downloader\DownloadManager();
+        $dm->setDownloader('git', new Downloader\GitDownloader($io));
+        $dm->setDownloader('svn', new Downloader\SvnDownloader($io));
+        $dm->setDownloader('hg', new Downloader\HgDownloader($io));
+        $dm->setDownloader('pear', new Downloader\PearDownloader($io));
+        $dm->setDownloader('zip', new Downloader\ZipDownloader($io));
+        $dm->setDownloader('tar', new Downloader\TarDownloader($io));
+        $dm->setDownloader('phar', new Downloader\PharDownloader($io));
+        $dm->setDownloader('file', new Downloader\FileDownloader($io));
+
+        return $dm;
+    }
+
+    protected function createInstallationManager(Repository\RepositoryManager $rm, Downloader\DownloadManager $dm, $vendorDir, $binDir, IOInterface $io)
+    {
+        $im = new Installer\InstallationManager($vendorDir);
+        $im->addInstaller(new Installer\LibraryInstaller($vendorDir, $binDir, $dm, $rm->getLocalRepository(), $io, null));
+        $im->addInstaller(new Installer\InstallerInstaller($vendorDir, $binDir, $dm, $rm->getLocalRepository(), $io, $im));
+        $im->addInstaller(new Installer\MetapackageInstaller($rm->getLocalRepository(), $io));
+
+        return $im;
+    }
+
+    protected function purgePackages(Repository\RepositoryManager $rm, Installer\InstallationManager $im)
+    {
+        foreach ($rm->getLocalRepository()->getPackages() as $package) {
+            if (!$im->isPackageInstalled($package)) {
+                $rm->getLocalRepository()->removePackage($package);
+            }
+        }
+    }
+
+    /**
+     * @param IOInterface $io IO instance
+     * @param mixed $config either a configuration array or a filename to read from, if null it will read from the default filename
+     * @return Composer
+     */
+    static public function create(IOInterface $io, $config = null)
+    {
+        $factory = new static();
+
+        return $factory->createComposer($io, $config);
+    }
+}
diff --git a/vendor/composer/composer/src/Composer/IO/ConsoleIO.php b/vendor/composer/composer/src/Composer/IO/ConsoleIO.php
new file mode 100644
index 0000000..d11ed44
--- /dev/null
+++ b/vendor/composer/composer/src/Composer/IO/ConsoleIO.php
@@ -0,0 +1,228 @@
+<?php
+
+/*
+ * This file is part of Composer.
+ *
+ * (c) Nils Adermann <naderman@naderman.de>
+ *     Jordi Boggiano <j.boggiano@seld.be>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Composer\IO;
+
+use Symfony\Component\Console\Input\InputInterface;
+use Symfony\Component\Console\Input\InputDefinition;
+use Symfony\Component\Console\Output\OutputInterface;
+use Symfony\Component\Console\Formatter\OutputFormatterInterface;
+use Symfony\Component\Console\Helper\HelperSet;
+
+/**
+ * The Input/Output helper.
+ *
+ * @author François Pluchino <francois.pluchino@opendisplay.com>
+ */
+class ConsoleIO implements IOInterface
+{
+    protected $input;
+    protected $output;
+    protected $helperSet;
+    protected $authorizations = array();
+    protected $lastUsername;
+    protected $lastPassword;
+    protected $lastMessage;
+
+    /**
+     * Constructor.
+     *
+     * @param InputInterface  $input     The input instance
+     * @param OutputInterface $output    The output instance
+     * @param HelperSet       $helperSet The helperSet instance
+     */
+    public function __construct(InputInterface $input, OutputInterface $output, HelperSet $helperSet)
+    {
+        $this->input = $input;
+        $this->output = $output;
+        $this->helperSet = $helperSet;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public function isInteractive()
+    {
+        return $this->input->isInteractive();
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public function isVerbose()
+    {
+        return (Boolean) $this->input->getOption('verbose');
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public function write($messages, $newline = true)
+    {
+        $this->output->write($messages, $newline);
+        $this->lastMessage = join($newline ? "\n" : '', (array) $messages);
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public function overwrite($messages, $newline = true, $size = null)
+    {
+        // messages can be an array, let's convert it to string anyway
+        $messages = join($newline ? "\n" : '', (array) $messages);
+
+        // since overwrite is supposed to overwrite last message...
+        if (!isset($size)) {
+            // removing possible formatting of lastMessage with strip_tags
+            $size = strlen(strip_tags($this->lastMessage));
+        }
+        // ...let's fill its length with backspaces
+        $this->write(str_repeat("\x08", $size), false);
+
+        // write the new message
+        $this->write($messages, false);
+
+        $fill = $size - strlen(strip_tags($messages));
+        if ($fill > 0) {
+            // whitespace whatever has left
+            $this->write(str_repeat(' ', $fill), false);
+            // move the cursor back
+            $this->write(str_repeat("\x08", $fill), false);
+        }
+
+        if ($newline) {
+            $this->write('');
+        }
+        $this->lastMessage = $messages;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public function ask($question, $default = null)
+    {
+        return $this->helperSet->get('dialog')->ask($this->output, $question, $default);
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public function askConfirmation($question, $default = true)
+    {
+        return $this->helperSet->get('dialog')->askConfirmation($this->output, $question, $default);
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public function askAndValidate($question, $validator, $attempts = false, $default = null)
+    {
+        return $this->helperSet->get('dialog')->askAndValidate($this->output, $question, $validator, $attempts, $default);
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public function askAndHideAnswer($question)
+    {
+        // handle windows
+        if (defined('PHP_WINDOWS_VERSION_BUILD')) {
+            $exe = __DIR__.'\\hiddeninput.exe';
+
+            // handle code running from a phar
+            if ('phar:' === substr(__FILE__, 0, 5)) {
+                $tmpExe = sys_get_temp_dir().'/hiddeninput.exe';
+                copy($exe, $tmpExe);
+                $exe = $tmpExe;
+            }
+
+            $this->write($question, false);
+            $value = rtrim(shell_exec($exe));
+            $this->write('');
+
+            // clean up
+            if (isset($tmpExe)) {
+                unlink($tmpExe);
+            }
+
+            return $value;
+        }
+
+        // handle other OSs with bash if available to hide the answer
+        if ('OK' === rtrim(shell_exec("/usr/bin/env bash -c 'echo OK'"))) {
+            $this->write($question, false);
+            $command = "/usr/bin/env bash -c 'read -s mypassword && echo \$mypassword'";
+            $value = rtrim(shell_exec($command));
+            $this->write('');
+
+            return $value;
+        }
+
+        // not able to hide the answer, proceed with normal question handling
+        return $this->ask($question);
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public function getLastUsername()
+    {
+        return $this->lastUsername;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public function getLastPassword()
+    {
+        return $this->lastPassword;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public function getAuthorizations()
+    {
+        return $this->authorizations;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public function hasAuthorization($repositoryName)
+    {
+        $auths = $this->getAuthorizations();
+        return isset($auths[$repositoryName]);
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public function getAuthorization($repositoryName)
+    {
+        $auths = $this->getAuthorizations();
+        return isset($auths[$repositoryName]) ? $auths[$repositoryName] : array('username' => null, 'password' => null);
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public function setAuthorization($repositoryName, $username, $password = null)
+    {
+        $auths = $this->getAuthorizations();
+        $auths[$repositoryName] = array('username' => $username, 'password' => $password);
+
+        $this->authorizations = $auths;
+        $this->lastUsername = $username;
+        $this->lastPassword = $password;
+    }
+}
diff --git a/vendor/composer/composer/src/Composer/IO/IOInterface.php b/vendor/composer/composer/src/Composer/IO/IOInterface.php
new file mode 100644
index 0000000..5b54089
--- /dev/null
+++ b/vendor/composer/composer/src/Composer/IO/IOInterface.php
@@ -0,0 +1,151 @@
+<?php
+
+/*
+ * This file is part of Composer.
+ *
+ * (c) Nils Adermann <naderman@naderman.de>
+ *     Jordi Boggiano <j.boggiano@seld.be>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Composer\IO;
+
+/**
+ * The Input/Output helper interface.
+ *
+ * @author François Pluchino <francois.pluchino@opendisplay.com>
+ */
+interface IOInterface
+{
+    /**
+     * Is this input means interactive?
+     *
+     * @return Boolean
+     */
+    function isInteractive();
+
+    /**
+     * Is this input verbose?
+     *
+     * @return Boolean
+     */
+    function isVerbose();
+
+    /**
+     * Writes a message to the output.
+     *
+     * @param string|array $messages The message as an array of lines or a single string
+     * @param Boolean      $newline  Whether to add a newline or not
+     */
+    function write($messages, $newline = true);
+
+    /**
+     * Overwrites a previous message to the output.
+     *
+     * @param string|array $messages The message as an array of lines or a single string
+     * @param Boolean      $newline  Whether to add a newline or not
+     * @param integer      $size     The size of line
+     */
+    function overwrite($messages, $newline = true, $size = 80);
+
+    /**
+     * Asks a question to the user.
+     *
+     * @param string|array    $question The question to ask
+     * @param string          $default  The default answer if none is given by the user
+     *
+     * @return string The user answer
+     *
+     * @throws \RuntimeException If there is no data to read in the input stream
+     */
+    function ask($question, $default = null);
+
+    /**
+     * Asks a confirmation to the user.
+     *
+     * The question will be asked until the user answers by nothing, yes, or no.
+     *
+     * @param string|array    $question The question to ask
+     * @param Boolean         $default  The default answer if the user enters nothing
+     *
+     * @return Boolean true if the user has confirmed, false otherwise
+     */
+    function askConfirmation($question, $default = true);
+
+    /**
+     * Asks for a value and validates the response.
+     *
+     * The validator receives the data to validate. It must return the
+     * validated data when the data is valid and throw an exception
+     * otherwise.
+     *
+     * @param string|array    $question  The question to ask
+     * @param callback        $validator A PHP callback
+     * @param integer         $attempts  Max number of times to ask before giving up (false by default, which means infinite)
+     * @param string          $default  The default answer if none is given by the user
+     *
+     * @return mixed
+     *
+     * @throws \Exception When any of the validators return an error
+     */
+    function askAndValidate($question, $validator, $attempts = false, $default = null);
+
+    /**
+     * Asks a question to the user and hide the answer.
+     *
+     * @param string $question The question to ask
+     *
+     * @return string The answer
+     */
+    function askAndHideAnswer($question);
+
+    /**
+     * Get the last username entered.
+     *
+     * @return string The username
+     */
+    function getLastUsername();
+
+    /**
+     * Get the last password entered.
+     *
+     * @return string The password
+     */
+    function getLastPassword();
+
+    /**
+     * Get all authorization informations entered.
+     *
+     * @return array The map of authorization
+     */
+    function getAuthorizations();
+
+    /**
+     * Verify if the repository has a authorization informations.
+     *
+     * @param string $repositoryName The unique name of repository
+     *
+     * @return boolean
+     */
+    function hasAuthorization($repositoryName);
+
+    /**
+     * Get the username and password of repository.
+     *
+     * @param string $repositoryName The unique name of repository
+     *
+     * @return array The 'username' and 'password'
+     */
+    function getAuthorization($repositoryName);
+
+    /**
+     * Set the authorization informations for the repository.
+     *
+     * @param string $repositoryName The unique name of repository
+     * @param string $username       The username
+     * @param string $password       The password
+     */
+    function setAuthorization($repositoryName, $username, $password = null);
+}
diff --git a/vendor/composer/composer/src/Composer/IO/NullIO.php b/vendor/composer/composer/src/Composer/IO/NullIO.php
new file mode 100644
index 0000000..b57e420
--- /dev/null
+++ b/vendor/composer/composer/src/Composer/IO/NullIO.php
@@ -0,0 +1,130 @@
+<?php
+
+/*
+ * This file is part of Composer.
+ *
+ * (c) Nils Adermann <naderman@naderman.de>
+ *     Jordi Boggiano <j.boggiano@seld.be>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Composer\IO;
+
+/**
+ * IOInterface that is not interactive and never writes the output
+ *
+ * @author Christophe Coevoet <stof@notk.org>
+ */
+class NullIO implements IOInterface
+{
+    /**
+     * {@inheritDoc}
+     */
+    public function isInteractive()
+    {
+        return false;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public function isVerbose()
+    {
+        return false;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public function write($messages, $newline = true)
+    {
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public function overwrite($messages, $newline = true, $size = 80)
+    {
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public function ask($question, $default = null)
+    {
+        return $default;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public function askConfirmation($question, $default = true)
+    {
+        return $default;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public function askAndValidate($question, $validator, $attempts = false, $default = null)
+    {
+        return $default;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public function askAndHideAnswer($question)
+    {
+        return null;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public function getLastUsername()
+    {
+        return null;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public function getLastPassword()
+    {
+        return null;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public function getAuthorizations()
+    {
+        return array();
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public function hasAuthorization($repositoryName)
+    {
+        return false;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public function getAuthorization($repositoryName)
+    {
+        return array('username' => null, 'password' => null);
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public function setAuthorization($repositoryName, $username, $password = null)
+    {
+    }
+}
diff --git a/vendor/composer/composer/src/Composer/IO/hiddeninput.exe b/vendor/composer/composer/src/Composer/IO/hiddeninput.exe
new file mode 100644
index 0000000000000000000000000000000000000000..c8cf65e8d819e6e525121cf6b21f1c2429746038
GIT binary patch
literal 9216
zcmeHNe{@sVeZR8hV88~S)=Hp|Mpn({rC^@)BwNOI{ERJXC<cKY2UCNPrDscyEUE8@
zW18d)X2_x`UPyn?ZYQJhakpeUr0bS+aoQ#^m;p(lB}vQ3lAL%OOT>Ylx+k1K6PLHo
z_e!z_fhOzeA3JTX&-Z@s{r<Y&@Av+C@5!xO_pyA&m>FOgjEw<Pk$C-^s}$G^Zu`Lk
z_VnD7Wn-rGC(GJHVbvN}V!evL-x}~oqcP3eEn5{mY7IxN%^TaS{js22SzJ7?JY)J#
zk1ju1`}pbuS#Z4dZwFSP?|AFbffXDdJy65(%Lf{Om-=fCxPfaQZ#q!O>Blqjr!)9f
zjyHz`A+ni`!0Taby{Uj5Y>jQq(k5A+X})PLWAi|{IZbtc8n^^trM{GI=P_15U6d?l
zJJ3PW8XjfHpR}6`k{&5@JcEeH_SqQoQbU62o2YS30W)p_t&Fjy*RXQCZt$gCf|ao|
zx&3R}m6|-Lfi@pua=$26n(UlnWo$>K67*|+#(qL_An=?l0M02AhOSJDv3;~?1ORfw
z76EdK#MpSHqACH<c&s3>LcnJLIYlCSiX4eS@Pr8rN)Xwz0dk7O*y^0_C(Yks2Kvg!
z-d-fJ)F9@k?>)m(XqDKIe2OKfhCQde9fpO0ko24yn*4xzX7q+ze`Z*=aJgwV?D?73
zaJ8UkSk|NN>@-|mB*f`EIK7$ElgAB<7p<YzX@i?+M@Jk_wP56l+F~Y1OwW6F;@rVJ
z#zMO+@M#q5bR;55?3lUS3AW)1p)*R&P&ri<R9T5*d5kO{DIFEi+dF=LVP9eDSuD}c
ziN2Chp$*1v!=@8oPi&hGj?i*V#?6UsXJ6O_gKZsm85RNhwG-On+M{}*_}-d?e)fDx
zC<P0K#R=B=e+O~oK1f4gUf*r0E;4?;mXr35>&p`^Vuq$58#;?B^*Bz7&d$B#+AYUC
z(^m|`7{lqx&b^5$;i`j|S!+u|lcaQplp<W|SOM9}gJjLNvwC40+;f9lbL&GOYl}mK
zQbR}%nV;9zm)B-kh&Dn=Nf!SIvI&#nqMqTR92qW3QmO=Q3>_&Nb)!>r>vGh3wb!tW
zLq6%bkSt8jO|(vWH>LiPV(Xkp%BiGhl1q!PXXNKVKE!>Y5cHc2%cJOJA{-&ZsSn`T
z#8~TA#(HWH4m>uC<L6sP>d+kCMTFgMI*s*n3!iCOwEI`{vGcVhz<Hqkd}wSB;$ARt
zLVU62!OLi#UobSNEg1L__36S{_>Du!Lw%-Ea^JATtrF`q3`+#KvvYJ0vM~A}D#LOD
zlw`4ncB0U*Jji=--Wz#>I&5?hy;MgYW2u91d8ob=7MWfY`u;7Xe-J{Qsb0=0p|SM2
zG|=~mERIj4?gi)Ew|{LIN#oAsh20k_khIYjJBBN6rrIJ=eQO=nE;rTnPSiaQS$1$#
z+|JRh0!IbQIa*f1(TZ}QM;|WO0+jTy(e)ggN4>zqp2E>C>hGPLHjHBh--2%@{EZNE
zbUk{<3MABX&20QwK{MxK8`1Vk>^%dO5i@VTfu><uif~5vfzW44H6WtSK7?)sF|@Rd
zvQUoZP(2ASy$~`>NG3$K4NC=hSPsj9UYy`rNO}sBnB9QdKdIk7G+2_amnWstdTYVg
z7HgLJGC~XLZG`63GwH8PdO_+G(k6~?J8Wj5mQos#21kC4W#2)guQXI)!z^{@F)U)5
z*re+r(2dib3D4P~%Z6TL=$PIkpmm<_#isu%t=%DcIwNkJhMeJ|bpahHO%8h|y~Ccf
zUg#xVk+dyu>Q1O7JZ~8KS>tqi0qK**X*y6yHM71`bT=kFZ=@E%oe2!Km<CIS4s)pu
z$mpdrOU5sq>1^2sa>v+onZ%x_>aOJF+N0{i<Q(kSJmb{RF>~z|<(IzgT*{0PpQq}E
zQpU35@bm;qI?t_znGI&5&4sZV>+%m}w$(4hSDvLk)l<{5XyMlnCl7C%AjM3XnWvVz
z{NoFsX)JB)SoqABZxUa*Yq+^^(cbq4mL%^lO12c${z{pf+)|kTTI~nQywyYF6}6|8
zlsN9&{-vwTrTyu<5^90_AsIU-ID#ZG@6d%poU44<**%xVe?`uxf}_Mr$SLHLS|K_N
zQnw>(Lr2U=%$-<2D~RSzbG)2W2u^KMDnFFE?GmmbQ)V)fty957F`4OvQ_25E68ITr
z5?`suu`|v?r!y=gFOGj$<Akwn40$z{J<YS5_TO-k(PVRZNg`5SG7R|q<ZLL@2n7)s
z`sJi&I%7KFxjYlyMD8eQ$2MhGNU5Qhq*rX{&r6Ul+LNhwFxb$MMSQ&=?0m|KiHYxZ
zq+a8kB7|SuK_zvV6H2#FV1Mv=9J)}#Gdv_;#-%;Y+U|N`!`spie~8Uu)E?7{_fBYY
zFP$2t4S#+|$FS!zwrd?iP3qI4e%Y`Tp)F1smXZuE<ruL*ZV}0OE{dKhajN!`KIi$3
zuzY_0-gosm$)krROXg1{Tok~i(+L+1u-*5i7qM$Ks2R%!d3_(Rcky};ulMo#>%9IJ
zuTP=&2GcnoZZ0qSe6YL-*-lg>Q#>?Ew`a=GDc4vI#<1sNdKn?n7iSj0Orl$-#FMFi
zykr>X-Xvi>sVr;92+8*H!r|3L$#o~h<EedMC)Z7*^#EF95u3!$sgOo?|M1G#=NNkl
z@CM+)KVeJ(bOTxdPQcB8_bV8C8}JI?X~03ie!v0nsJsu|$#Oj2FM}<>Xa0z>AmF=z
z?|@FF;*S|S0yqsw0j>Z(3mX-HD!|{N-vYc9paC8Ld=|6?00!6(_%lERupO`&um*4k
z0b~W>e*uhTe4;V;mq>(ox$9FB`wLt!*DKj~!aOh|fL&#Pg*b??tm%5~_6M#02wqeC
zS~wO>TWGnSp^r<0&8f2V6W->w=C+p~daC5<hfV9AD0}b3`Sn||{TU0a>e5wNQM*(*
z66^}b0(!q3)zq$mu&VnbR#nr3;h5DS*o7{y66=!#;Dy4$pd1ZH<6WEOi0oJ8SxRL*
z*v-9@Z^2w%^S(w5dO{_9Duby%2RT~;ppxaE$l()x6&}>7Wcg=u_&>f`Vs8OJGTy{X
z2HpG=ThJz<{%|4Qq-~ad0qcrc87n88DHpM(nypwXIkZn<{zIT$ul&BQ?{ApCAZtyr
zs2YpNt@x(G*faTU*HCKnAk(G=Tl~>r1QK8LY~J8mFFGoN5iIkYSwlm4Lsj#g4dsE5
zU-4;*Kdh-zv!rT4N$O}Q&n)?v0-9Y)lRFz58^P-KtKonzrfQ1p@0V_10^0||cGRn9
zRG<-#_TEV2nn4{BOh{YVBR4e!V!D?0K%BAlQN!D%M#k1bHypiIHT)5tlj>p0Pp_;+
z!cqC-JIs@JRhB+#teGs$Cib_=(yjRo4OJg^YPg%58a<dGynuMCXj;)o*V0xbo%!+_
z8thqn|5uN)_N6Vbbg!wQLHM0mdTLICjJ5n*tVJH11Irlxw6=9Ld20l|4J;;~zhCY3
z$%A2hCi^z?`7q`E{&3W<^r~#R$rng-?lYxDdYErZAg-+mM>JVsC(LQ?W6%pn!<rl&
zVCFpD1iPOV%(i_ptAn*zv?tuFg|KgebfI8d{ugvrS)<dw->-#aMZwoPcopo^Rn6BE
z3=c5&W5~pP(C(-2r;PnH-S0{F`runM0ERCf3rESX$+S(MKOXmKJL9zXF}9-lf^xUs
z+bb)+P%L&gV@<4q{6w^xEJ>Y>TQFUeoz0o-yq)jUqww=?wjUO8Y{a5G;DJ0Jr!LL+
zWhgsLuzi&eDrGDn$2DJwpFfH-?SGWbr>qRb?v{P`_%)So)CQgzO^HQ%;y#tJ=knH4
z95jX;^bF#BiuTH^%-j}{<v9C6F1IPxANMQrj1XI4ZqJ5<n=v4(u=n@;wA2*^cW9P)
zhxyKE+A|sfe&TM=Oe?dPahBeY{c_$~wK<bWuOh23%G&cc>9VrZD=R%Q%wselH^p>5
z7d><ew}%6Fa{^;e=J?Xi7sA>gWB-st&3Fj%Mt*|tR5iK3J=`xhs&G)I7E>`FO@o7L
z@S$B!pYMuzz5DN@X!O4DPm5n@raPJn-Q#o*m*e^5lk$g?0esg%$;<xqv5OuN-FOTp
zDwQ;!J~ZLw{s#2Wb?Eq1G;1Ws4$=3a|Coe#fPBWzrUzihn;4^Sa@l@Gz7tX%td03l
zd)Q{Q*0POk1Nv)GuR)v2bLL-Mp%>>g5QW-|;c=H2GM}bo2tW^D924wmOkrUbWxcQ#
z#v6bP%Td<DVvwOPPbU1(;RMuh+|7UXc!_NSJuBY~9hC*RojB};p__hD*bI)J1;Mq#
zq5^t9S}J6Md`v652Ux>fe~jtCRzAL;-OahZ=#yvUixu2-9fD2j$*|YY`F?0wF-{a#
ztr<&kZjZ+81}6ZESqtgW)8kP#s@VLTSUR{}6?U^R*x7RE3Rl&n=VnFFqg<tZiDH}x
z=EM)LaOEJTF#HLk9pzr8J)-q<GxXMj-pe(bFjAcD<k{<m7A|784m5@5$ci6-Vvy{G
z4T_L*uma$KM|RYB7r?4DVI9ycl2qD{?A%cAH~CWuKL)wKt5`AYcwr}ok#*!u%ZY}@
znT^NF<IYBe_aL6bt97r<<c;#!j2KK<-F}Rm^?G&%;w<L7uN_>9Uqz1n@N9N|=9<4}
zuJfy^+}|D9X&vm3MAdqmu0&U<fsowqS6B3h14>Md^=K>b1hLAm_E!$rZC2b;;T~Dl
zI`Eo_yRY76uM})|6wk9->of(=9&4jLv5#p@OzS~Yl>@pG)^>6`R+KtL{<4ly<e*mx
z58(RhmDL$$F55E*Rl0=N%L8)68lk%0=2zG9M+L=Z)x(Vey3XruJ^qL)+wQ1aIb-{3
z<r(`q5+549Zsk?J)~%cgI-P@{9LKXJ9;~vl)MY7JV<y+L<7BhH777}|x6)Hrz3rZG
zRCL&^QC!mXw$|({RCYAs`KoDiyUjX~&3#R!Q0cG>4o9WiM!%p_pfROU354)e8PIeE
z1_s?#;OX6waNvvb&UQRN(WLbR+}&b#jo&WY-LlwCX}Q*$jGuKYuOGoIoyR(>e}}ix
z+t}Q^cEcC8Y{@h}>HmJ^gD!l@gzwHmiBKl26x_lZVZG2UY!`w;RJd122;US&geQdW
z3Qq}R!gIo5;ka;0I4c-Jq5X6A6?VzK&c4y!ZXdAUYu{r}*!SBXw?Aor+J4-A(*COb
zb^CwV-?3k`zi-cX*c`VzL`RLI(b4MgIr<!N$Fq(X9LF3#alGny&GDAw9moGTE;>GN
z%ojf`E*6)Gg1A9!7q^N##2zsss^V9~-Qt7d!{UDNZ^XY9pA^3@9ui*?e=7c5d`nD;
z?}~<Kc9uF9J8yF?bJjXnJCn{woPX^caUOL3v-7C)b?4j8E6!3^nQOZ%;M(I#xSnve
zRJB(5s_w6Pr0Sbhtoo+v;_BP0@2S48`cU=R>R(p>y1Kw!>|X4ycYEAkcZa*n-R%y!
zqi)Up756UpqwfE7=hfigw$k~G@25gaxF9UGTkV>C(7x1Rbx4jb#|}rxq0vQ!n-c#f
J0sQ~1{4brj`U(I5

literal 0
HcmV?d00001

diff --git a/vendor/composer/composer/src/Composer/Installer.php b/vendor/composer/composer/src/Composer/Installer.php
new file mode 100644
index 0000000..794d42e
--- /dev/null
+++ b/vendor/composer/composer/src/Composer/Installer.php
@@ -0,0 +1,453 @@
+<?php
+
+/*
+ * This file is part of Composer.
+ *
+ * (c) Nils Adermann <naderman@naderman.de>
+ *     Jordi Boggiano <j.boggiano@seld.be>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Composer;
+
+use Composer\Autoload\AutoloadGenerator;
+use Composer\DependencyResolver\DefaultPolicy;
+use Composer\DependencyResolver\Operation\UpdateOperation;
+use Composer\DependencyResolver\Pool;
+use Composer\DependencyResolver\Request;
+use Composer\DependencyResolver\Solver;
+use Composer\DependencyResolver\SolverProblemsException;
+use Composer\Downloader\DownloadManager;
+use Composer\Installer\InstallationManager;
+use Composer\IO\IOInterface;
+use Composer\Package\AliasPackage;
+use Composer\Package\Link;
+use Composer\Package\LinkConstraint\VersionConstraint;
+use Composer\Package\Locker;
+use Composer\Package\PackageInterface;
+use Composer\Repository\CompositeRepository;
+use Composer\Repository\PlatformRepository;
+use Composer\Repository\RepositoryInterface;
+use Composer\Repository\RepositoryManager;
+use Composer\Script\EventDispatcher;
+use Composer\Script\ScriptEvents;
+
+/**
+ * @author Jordi Boggiano <j.boggiano@seld.be>
+ * @author Beau Simensen <beau@dflydev.com>
+ * @author Konstantin Kudryashov <ever.zet@gmail.com>
+ */
+class Installer
+{
+    /**
+     * @var IOInterface
+     */
+    protected $io;
+
+    /**
+     * @var PackageInterface
+     */
+    protected $package;
+
+    /**
+     * @var DownloadManager
+     */
+    protected $downloadManager;
+
+    /**
+     * @var RepositoryManager
+     */
+    protected $repositoryManager;
+
+    /**
+     * @var Locker
+     */
+    protected $locker;
+
+    /**
+     * @var InstallationManager
+     */
+    protected $installationManager;
+
+    /**
+     * @var EventDispatcher
+     */
+    protected $eventDispatcher;
+
+    protected $preferSource = false;
+    protected $dryRun = false;
+    protected $verbose = false;
+    protected $installRecommends = true;
+    protected $installSuggests = false;
+    protected $update = false;
+
+    /**
+     * @var RepositoryInterface
+     */
+    protected $additionalInstalledRepository;
+
+    /**
+     * Constructor
+     *
+     * @param IOInterface $io
+     * @param PackageInterface $package
+     * @param DownloadManager $downloadManager
+     * @param RepositoryManager $repositoryManager
+     * @param Locker $locker
+     * @param InstallationManager $installationManager
+     * @param EventDispatcher $eventDispatcher
+     */
+    public function __construct(IOInterface $io, PackageInterface $package, DownloadManager $downloadManager, RepositoryManager $repositoryManager, Locker $locker, InstallationManager $installationManager, EventDispatcher $eventDispatcher)
+    {
+        $this->io = $io;
+        $this->package = $package;
+        $this->downloadManager = $downloadManager;
+        $this->repositoryManager = $repositoryManager;
+        $this->locker = $locker;
+        $this->installationManager = $installationManager;
+        $this->eventDispatcher = $eventDispatcher;
+    }
+
+    /**
+     * Run installation (or update)
+     */
+    public function run()
+    {
+        if ($this->dryRun) {
+            $this->verbose = true;
+        }
+
+        if ($this->preferSource) {
+            $this->downloadManager->setPreferSource(true);
+        }
+
+        // create local repo, this contains all packages that are installed in the local project
+        $localRepo = $this->repositoryManager->getLocalRepository();
+        // create installed repo, this contains all local packages + platform packages (php & extensions)
+        $installedRepo = new CompositeRepository(array($localRepo, new PlatformRepository()));
+        if ($this->additionalInstalledRepository) {
+            $installedRepo->addRepository($this->additionalInstalledRepository);
+        }
+
+        // prepare aliased packages
+        if (!$this->update && $this->locker->isLocked()) {
+            $aliases = $this->locker->getAliases();
+        } else {
+            $aliases = $this->package->getAliases();
+        }
+        foreach ($aliases as $alias) {
+            foreach ($this->repositoryManager->findPackages($alias['package'], $alias['version']) as $package) {
+                $package->setAlias($alias['alias_normalized']);
+                $package->setPrettyAlias($alias['alias']);
+                $package->getRepository()->addPackage(new AliasPackage($package, $alias['alias_normalized'], $alias['alias']));
+            }
+            foreach ($this->repositoryManager->getLocalRepository()->findPackages($alias['package'], $alias['version']) as $package) {
+                $package->setAlias($alias['alias_normalized']);
+                $package->setPrettyAlias($alias['alias']);
+                $this->repositoryManager->getLocalRepository()->addPackage(new AliasPackage($package, $alias['alias_normalized'], $alias['alias']));
+                $this->repositoryManager->getLocalRepository()->removePackage($package);
+            }
+        }
+
+        // creating repository pool
+        $pool = new Pool;
+        $pool->addRepository($installedRepo);
+        foreach ($this->repositoryManager->getRepositories() as $repository) {
+            $pool->addRepository($repository);
+        }
+
+        // dispatch pre event
+        if (!$this->dryRun) {
+            $eventName = $this->update ? ScriptEvents::PRE_UPDATE_CMD : ScriptEvents::PRE_INSTALL_CMD;
+            $this->eventDispatcher->dispatchCommandEvent($eventName);
+        }
+
+        // creating requirements request
+        $installFromLock = false;
+        $request = new Request($pool);
+        if ($this->update) {
+            $this->io->write('Updating dependencies');
+
+            $request->updateAll();
+
+            $links = $this->collectLinks();
+
+            foreach ($links as $link) {
+                $request->install($link->getTarget(), $link->getConstraint());
+            }
+        } elseif ($this->locker->isLocked()) {
+            $installFromLock = true;
+            $this->io->write('Installing from lock file');
+
+            if (!$this->locker->isFresh()) {
+                $this->io->write('<warning>Your lock file is out of sync with your composer.json, run "composer.phar update" to update dependencies</warning>');
+            }
+
+            foreach ($this->locker->getLockedPackages() as $package) {
+                $version = $package->getVersion();
+                foreach ($aliases as $alias) {
+                    if ($alias['package'] === $package->getName() && $alias['version'] === $package->getVersion()) {
+                        $version = $alias['alias'];
+                        break;
+                    }
+                }
+                $constraint = new VersionConstraint('=', $version);
+                $request->install($package->getName(), $constraint);
+            }
+        } else {
+            $this->io->write('Installing dependencies');
+
+            $links = $this->collectLinks();
+
+            foreach ($links as $link) {
+                $request->install($link->getTarget(), $link->getConstraint());
+            }
+        }
+
+        // prepare solver
+        $policy = new DefaultPolicy();
+        $solver = new Solver($policy, $pool, $installedRepo);
+
+        // solve dependencies
+        try {
+            $operations = $solver->solve($request);
+        } catch (SolverProblemsException $e) {
+            $this->io->write('<error>Your requirements could not be solved to an installable set of packages.</error>');
+            $this->io->write($e->getMessage());
+
+            return false;
+        }
+
+        // force dev packages to be updated if we update or install from a (potentially new) lock
+        if ($this->update || $installFromLock) {
+            foreach ($localRepo->getPackages() as $package) {
+                // skip non-dev packages
+                if (!$package->isDev()) {
+                    continue;
+                }
+
+                // skip packages that will be updated/uninstalled
+                foreach ($operations as $operation) {
+                    if (('update' === $operation->getJobType() && $operation->getInitialPackage()->equals($package))
+                        || ('uninstall' === $operation->getJobType() && $operation->getPackage()->equals($package))
+                    ) {
+                        continue 2;
+                    }
+                }
+
+                // force update to latest on update
+                if ($this->update) {
+                    $newPackage = $this->repositoryManager->findPackage($package->getName(), $package->getVersion());
+                    if ($newPackage && $newPackage->getSourceReference() !== $package->getSourceReference()) {
+                        $operations[] = new UpdateOperation($package, $newPackage);
+                    }
+                } elseif ($installFromLock) {
+                    // force update to locked version if it does not match the installed version
+                    $lockData = $this->locker->getLockData();
+                    unset($lockedReference);
+                    foreach ($lockData['packages'] as $lockedPackage) {
+                        if (!empty($lockedPackage['source-reference']) && strtolower($lockedPackage['package']) === $package->getName()) {
+                            $lockedReference = $lockedPackage['source-reference'];
+                            break;
+                        }
+                    }
+                    if (isset($lockedReference) && $lockedReference !== $package->getSourceReference()) {
+                        // changing the source ref to update to will be handled in the operations loop below
+                        $operations[] = new UpdateOperation($package, $package);
+                    }
+                }
+            }
+        }
+
+        // anti-alias local repository to allow updates to work fine
+        foreach ($this->repositoryManager->getLocalRepository()->getPackages() as $package) {
+            if ($package instanceof AliasPackage) {
+                $this->repositoryManager->getLocalRepository()->addPackage(clone $package->getAliasOf());
+                $this->repositoryManager->getLocalRepository()->removePackage($package);
+            }
+        }
+
+        // execute operations
+        if (!$operations) {
+            $this->io->write('<info>Nothing to install or update</info>');
+        }
+
+        foreach ($operations as $operation) {
+            if ($this->verbose) {
+                $this->io->write((string) $operation);
+            }
+            if (!$this->dryRun) {
+                $this->eventDispatcher->dispatchPackageEvent(constant('Composer\Script\ScriptEvents::PRE_PACKAGE_'.strtoupper($operation->getJobType())), $operation);
+
+                // if installing from lock, restore dev packages' references to their locked state
+                if ($installFromLock) {
+                    $package = null;
+                    if ('update' === $operation->getJobType()) {
+                        $package = $operation->getTargetPackage();
+                    } elseif ('install' === $operation->getJobType()) {
+                        $package = $operation->getPackage();
+                    }
+                    if ($package && $package->isDev()) {
+                        $lockData = $this->locker->getLockData();
+                        foreach ($lockData['packages'] as $lockedPackage) {
+                            if (!empty($lockedPackage['source-reference']) && strtolower($lockedPackage['package']) === $package->getName()) {
+                                $package->setSourceReference($lockedPackage['source-reference']);
+                                break;
+                            }
+                        }
+                    }
+                }
+                $this->installationManager->execute($operation);
+
+                $this->eventDispatcher->dispatchPackageEvent(constant('Composer\Script\ScriptEvents::POST_PACKAGE_'.strtoupper($operation->getJobType())), $operation);
+
+                $localRepo->write();
+            }
+        }
+
+        if (!$this->dryRun) {
+            if ($this->update || !$this->locker->isLocked()) {
+                if ($this->locker->setLockData($localRepo->getPackages(), $aliases)) {
+                    $this->io->write('<info>Writing lock file</info>');
+                }
+            }
+
+            $localRepo->write();
+
+            $this->io->write('<info>Generating autoload files</info>');
+            $generator = new AutoloadGenerator;
+            $generator->dump($localRepo, $this->package, $this->installationManager, $this->installationManager->getVendorPath().'/.composer');
+
+            // dispatch post event
+            $eventName = $this->update ? ScriptEvents::POST_UPDATE_CMD : ScriptEvents::POST_INSTALL_CMD;
+            $this->eventDispatcher->dispatchCommandEvent($eventName);
+        }
+
+        return true;
+    }
+
+    private function collectLinks()
+    {
+        $links = $this->package->getRequires();
+
+        if ($this->installRecommends) {
+            $links = array_merge($links, $this->package->getRecommends());
+        }
+
+        if ($this->installSuggests) {
+            $links = array_merge($links, $this->package->getSuggests());
+        }
+
+        return $links;
+    }
+
+    /**
+     * Create Installer
+     *
+     * @param IOInterface $io
+     * @param Composer $composer
+     * @param EventDispatcher $eventDispatcher
+     * @return Installer
+     */
+    static public function create(IOInterface $io, Composer $composer, EventDispatcher $eventDispatcher = null)
+    {
+        $eventDispatcher = $eventDispatcher ?: new EventDispatcher($composer, $io);
+
+        return new static(
+            $io,
+            $composer->getPackage(),
+            $composer->getDownloadManager(),
+            $composer->getRepositoryManager(),
+            $composer->getLocker(),
+            $composer->getInstallationManager(),
+            $eventDispatcher
+        );
+    }
+
+    public function setAdditionalInstalledRepository(RepositoryInterface $additionalInstalledRepository)
+    {
+        $this->additionalInstalledRepository = $additionalInstalledRepository;
+
+        return $this;
+    }
+
+    /**
+     * wether to run in drymode or not
+     *
+     * @param boolean $dryRun
+     * @return Installer
+     */
+    public function setDryRun($dryRun=true)
+    {
+        $this->dryRun = (boolean) $dryRun;
+
+        return $this;
+    }
+
+    /**
+     * install recommend packages
+     *
+     * @param boolean $noInstallRecommends
+     * @return Installer
+     */
+    public function setInstallRecommends($installRecommends=true)
+    {
+        $this->installRecommends = (boolean) $installRecommends;
+
+        return $this;
+    }
+
+    /**
+     * also install suggested packages
+     *
+     * @param boolean $installSuggests
+     * @return Installer
+     */
+    public function setInstallSuggests($installSuggests=true)
+    {
+        $this->installSuggests = (boolean) $installSuggests;
+
+        return $this;
+    }
+
+    /**
+     * prefer source installation
+     *
+     * @param boolean $preferSource
+     * @return Installer
+     */
+    public function setPreferSource($preferSource=true)
+    {
+        $this->preferSource = (boolean) $preferSource;
+
+        return $this;
+    }
+
+    /**
+     * update packages
+     *
+     * @param boolean $update
+     * @return Installer
+     */
+    public function setUpdate($update=true)
+    {
+        $this->update = (boolean) $update;
+
+        return $this;
+    }
+
+    /**
+     * run in verbose mode
+     *
+     * @param boolean $verbose
+     * @return Installer
+     */
+    public function setVerbose($verbose=true)
+    {
+        $this->verbose = (boolean) $verbose;
+
+        return $this;
+    }
+}
diff --git a/vendor/composer/composer/src/Composer/Installer/InstallationManager.php b/vendor/composer/composer/src/Composer/Installer/InstallationManager.php
new file mode 100644
index 0000000..c99dad5
--- /dev/null
+++ b/vendor/composer/composer/src/Composer/Installer/InstallationManager.php
@@ -0,0 +1,203 @@
+<?php
+
+/*
+ * This file is part of Composer.
+ *
+ * (c) Nils Adermann <naderman@naderman.de>
+ *     Jordi Boggiano <j.boggiano@seld.be>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Composer\Installer;
+
+use Composer\Package\PackageInterface;
+use Composer\Package\AliasPackage;
+use Composer\DependencyResolver\Operation\OperationInterface;
+use Composer\DependencyResolver\Operation\InstallOperation;
+use Composer\DependencyResolver\Operation\UpdateOperation;
+use Composer\DependencyResolver\Operation\UninstallOperation;
+use Composer\Util\Filesystem;
+
+/**
+ * Package operation manager.
+ *
+ * @author Konstantin Kudryashov <ever.zet@gmail.com>
+ * @author Jordi Boggiano <j.boggiano@seld.be>
+ */
+class InstallationManager
+{
+    private $installers = array();
+    private $cache = array();
+    private $vendorPath;
+
+    /**
+     * Creates an instance of InstallationManager
+     *
+     * @param    string    $vendorDir    Relative path to the vendor directory
+     * @throws   \InvalidArgumentException
+     */
+    public function __construct($vendorDir = 'vendor')
+    {
+        $fs = new Filesystem();
+
+        if ($fs->isAbsolutePath($vendorDir)) {
+            $basePath = getcwd();
+            $relativePath = $fs->findShortestPath($basePath.'/file', $vendorDir);
+            if ($fs->isAbsolutePath($relativePath)) {
+                throw new \InvalidArgumentException("Vendor dir ($vendorDir) must be accessible from the directory ($basePath).");
+            }
+            $this->vendorPath = $relativePath;
+        } else {
+            $this->vendorPath = rtrim($vendorDir, '/');
+        }
+    }
+
+    /**
+     * Adds installer
+     *
+     * @param   InstallerInterface  $installer  installer instance
+     */
+    public function addInstaller(InstallerInterface $installer)
+    {
+        array_unshift($this->installers, $installer);
+        $this->cache = array();
+    }
+
+    /**
+     * Returns installer for a specific package type.
+     *
+     * @param   string              $type       package type
+     *
+     * @return  InstallerInterface
+     *
+     * @throws  InvalidArgumentException        if installer for provided type is not registered
+     */
+    public function getInstaller($type)
+    {
+        $type = strtolower($type);
+
+        if (isset($this->cache[$type])) {
+            return $this->cache[$type];
+        }
+
+        foreach ($this->installers as $installer) {
+            if ($installer->supports($type)) {
+                return $this->cache[$type] = $installer;
+            }
+        }
+
+        throw new \InvalidArgumentException('Unknown installer type: '.$type);
+    }
+
+    /**
+     * Checks whether provided package is installed in one of the registered installers.
+     *
+     * @param   PackageInterface    $package    package instance
+     *
+     * @return  Boolean
+     */
+    public function isPackageInstalled(PackageInterface $package)
+    {
+        return $this->getInstaller($package->getType())->isInstalled($package);
+    }
+
+    /**
+     * Executes solver operation.
+     *
+     * @param   OperationInterface  $operation  operation instance
+     */
+    public function execute(OperationInterface $operation)
+    {
+        $method = $operation->getJobType();
+        $this->$method($operation);
+    }
+
+    /**
+     * Executes install operation.
+     *
+     * @param   InstallOperation    $operation  operation instance
+     */
+    public function install(InstallOperation $operation)
+    {
+        $package = $operation->getPackage();
+        if ($package instanceof AliasPackage) {
+            $package = $package->getAliasOf();
+            $package->setInstalledAsAlias(true);
+        }
+        $installer = $this->getInstaller($package->getType());
+        $installer->install($package);
+    }
+
+    /**
+     * Executes update operation.
+     *
+     * @param   InstallOperation    $operation  operation instance
+     */
+    public function update(UpdateOperation $operation)
+    {
+        $initial = $operation->getInitialPackage();
+        if ($initial instanceof AliasPackage) {
+            $initial = $initial->getAliasOf();
+        }
+        $target = $operation->getTargetPackage();
+        if ($target instanceof AliasPackage) {
+            $target = $target->getAliasOf();
+            $target->setInstalledAsAlias(true);
+        }
+
+        $initialType = $initial->getType();
+        $targetType  = $target->getType();
+
+        if ($initialType === $targetType) {
+            $installer = $this->getInstaller($initialType);
+            $installer->update($initial, $target);
+        } else {
+            $this->getInstaller($initialType)->uninstall($initial);
+            $this->getInstaller($targetType)->install($target);
+        }
+    }
+
+    /**
+     * Uninstalls package.
+     *
+     * @param   UninstallOperation  $operation  operation instance
+     */
+    public function uninstall(UninstallOperation $operation)
+    {
+        $package = $operation->getPackage();
+        if ($package instanceof AliasPackage) {
+            $package = $package->getAliasOf();
+        }
+        $installer = $this->getInstaller($package->getType());
+        $installer->uninstall($package);
+    }
+
+    /**
+     * Returns the installation path of a package
+     *
+     * @param   PackageInterface    $package
+     * @return  string path
+     */
+    public function getInstallPath(PackageInterface $package)
+    {
+        $installer = $this->getInstaller($package->getType());
+        return $installer->getInstallPath($package);
+    }
+
+    /**
+     * Returns the vendor path
+     *
+     * @param   boolean  $absolute  Whether or not to return an absolute path
+     * @return  string path
+     */
+    public function getVendorPath($absolute = false)
+    {
+        if (!$absolute) {
+            return $this->vendorPath;
+        }
+
+        return getcwd().DIRECTORY_SEPARATOR.$this->vendorPath;
+    }
+}
diff --git a/vendor/composer/composer/src/Composer/Installer/InstallerInstaller.php b/vendor/composer/composer/src/Composer/Installer/InstallerInstaller.php
new file mode 100644
index 0000000..a43d0f1
--- /dev/null
+++ b/vendor/composer/composer/src/Composer/Installer/InstallerInstaller.php
@@ -0,0 +1,103 @@
+<?php
+
+/*
+ * This file is part of Composer.
+ *
+ * (c) Nils Adermann <naderman@naderman.de>
+ *     Jordi Boggiano <j.boggiano@seld.be>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Composer\Installer;
+
+use Composer\IO\IOInterface;
+use Composer\Autoload\AutoloadGenerator;
+use Composer\Downloader\DownloadManager;
+use Composer\Repository\WritableRepositoryInterface;
+use Composer\DependencyResolver\Operation\OperationInterface;
+use Composer\Package\PackageInterface;
+
+/**
+ * Installer installation manager.
+ *
+ * @author Jordi Boggiano <j.boggiano@seld.be>
+ */
+class InstallerInstaller extends LibraryInstaller
+{
+    private $installationManager;
+    private static $classCounter = 0;
+
+    /**
+     * @param   string                      $vendorDir  relative path for packages home
+     * @param   string                      $binDir     relative path for binaries
+     * @param   DownloadManager             $dm         download manager
+     * @param   WritableRepositoryInterface $repository repository controller
+     * @param   IOInterface                 $io         io instance
+     */
+    public function __construct($vendorDir, $binDir, DownloadManager $dm, WritableRepositoryInterface $repository, IOInterface $io, InstallationManager $im)
+    {
+        parent::__construct($vendorDir, $binDir, $dm, $repository, $io, 'composer-installer');
+        $this->installationManager = $im;
+
+        foreach ($repository->getPackages() as $package) {
+            if ('composer-installer' === $package->getType()) {
+                $this->registerInstaller($package);
+            }
+        }
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public function install(PackageInterface $package)
+    {
+        $extra = $package->getExtra();
+        if (empty($extra['class'])) {
+            throw new \UnexpectedValueException('Error while installing '.$package->getPrettyName().', composer-installer packages should have a class defined in their extra key to be usable.');
+        }
+
+        parent::install($package);
+        $this->registerInstaller($package);
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public function update(PackageInterface $initial, PackageInterface $target)
+    {
+        $extra = $target->getExtra();
+        if (empty($extra['class'])) {
+            throw new \UnexpectedValueException('Error while installing '.$target->getPrettyName().', composer-installer packages should have a class defined in their extra key to be usable.');
+        }
+
+        parent::update($initial, $target);
+        $this->registerInstaller($target);
+    }
+
+    private function registerInstaller(PackageInterface $package)
+    {
+        $downloadPath = $this->getInstallPath($package);
+
+        $extra = $package->getExtra();
+        $class = $extra['class'];
+
+        $generator = new AutoloadGenerator;
+        $map = $generator->parseAutoloads(array(array($package, $downloadPath)));
+        $classLoader = $generator->createLoader($map);
+        $classLoader->register();
+
+        if (class_exists($class, false)) {
+            $code = file_get_contents($classLoader->findFile($class));
+            $code = preg_replace('{^class\s+(\S+)}mi', 'class $1_composer_tmp'.self::$classCounter, $code);
+            eval('?>'.$code);
+            $class .= '_composer_tmp'.self::$classCounter;
+            self::$classCounter++;
+        }
+
+        $extra = $package->getExtra();
+        $installer = new $class($this->vendorDir, $this->binDir, $this->downloadManager, $this->repository, $this->io);
+        $this->installationManager->addInstaller($installer);
+    }
+}
diff --git a/vendor/composer/composer/src/Composer/Installer/InstallerInterface.php b/vendor/composer/composer/src/Composer/Installer/InstallerInterface.php
new file mode 100644
index 0000000..36c023b
--- /dev/null
+++ b/vendor/composer/composer/src/Composer/Installer/InstallerInterface.php
@@ -0,0 +1,73 @@
+<?php
+
+/*
+ * This file is part of Composer.
+ *
+ * (c) Nils Adermann <naderman@naderman.de>
+ *     Jordi Boggiano <j.boggiano@seld.be>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Composer\Installer;
+
+use Composer\DependencyResolver\Operation\OperationInterface;
+use Composer\Package\PackageInterface;
+
+/**
+ * Interface for the package installation manager.
+ *
+ * @author Konstantin Kudryashov <ever.zet@gmail.com>
+ */
+interface InstallerInterface
+{
+    /**
+     * Decides if the installer supports the given type
+     *
+     * @param   string  $packageType
+     * @return  Boolean
+     */
+    function supports($packageType);
+
+    /**
+     * Checks that provided package is installed.
+     *
+     * @param   PackageInterface    $package    package instance
+     *
+     * @return  Boolean
+     */
+    function isInstalled(PackageInterface $package);
+
+    /**
+     * Installs specific package.
+     *
+     * @param   PackageInterface    $package    package instance
+     */
+    function install(PackageInterface $package);
+
+    /**
+     * Updates specific package.
+     *
+     * @param   PackageInterface    $initial    already installed package version
+     * @param   PackageInterface    $target     updated version
+     *
+     * @throws  InvalidArgumentException        if $from package is not installed
+     */
+    function update(PackageInterface $initial, PackageInterface $target);
+
+    /**
+     * Uninstalls specific package.
+     *
+     * @param   PackageInterface    $package    package instance
+     */
+    function uninstall(PackageInterface $package);
+
+    /**
+     * Returns the installation path of a package
+     *
+     * @param   PackageInterface    $package
+     * @return  string path
+     */
+    function getInstallPath(PackageInterface $package);
+}
diff --git a/vendor/composer/composer/src/Composer/Installer/LibraryInstaller.php b/vendor/composer/composer/src/Composer/Installer/LibraryInstaller.php
new file mode 100644
index 0000000..bef93cf
--- /dev/null
+++ b/vendor/composer/composer/src/Composer/Installer/LibraryInstaller.php
@@ -0,0 +1,249 @@
+<?php
+
+/*
+ * This file is part of Composer.
+ *
+ * (c) Nils Adermann <naderman@naderman.de>
+ *     Jordi Boggiano <j.boggiano@seld.be>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Composer\Installer;
+
+use Composer\IO\IOInterface;
+use Composer\Downloader\DownloadManager;
+use Composer\Repository\WritableRepositoryInterface;
+use Composer\DependencyResolver\Operation\OperationInterface;
+use Composer\Package\PackageInterface;
+use Composer\Util\Filesystem;
+
+/**
+ * Package installation manager.
+ *
+ * @author Jordi Boggiano <j.boggiano@seld.be>
+ * @author Konstantin Kudryashov <ever.zet@gmail.com>
+ */
+class LibraryInstaller implements InstallerInterface
+{
+    protected $vendorDir;
+    protected $binDir;
+    protected $downloadManager;
+    protected $repository;
+    protected $io;
+    private $type;
+    private $filesystem;
+
+    /**
+     * Initializes library installer.
+     *
+     * @param   string                      $vendorDir  relative path for packages home
+     * @param   string                      $binDir     relative path for binaries
+     * @param   DownloadManager             $dm         download manager
+     * @param   WritableRepositoryInterface $repository repository controller
+     * @param   IOInterface                 $io         io instance
+     * @param   string                      $type       package type that this installer handles
+     */
+    public function __construct($vendorDir, $binDir, DownloadManager $dm, WritableRepositoryInterface $repository, IOInterface $io, $type = 'library')
+    {
+        $this->downloadManager = $dm;
+        $this->repository = $repository;
+        $this->io = $io;
+        $this->type = $type;
+
+        $this->filesystem = new Filesystem();
+        $this->vendorDir = rtrim($vendorDir, '/');
+        $this->binDir = rtrim($binDir, '/');
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public function supports($packageType)
+    {
+        return $packageType === $this->type || null === $this->type;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public function isInstalled(PackageInterface $package)
+    {
+        return $this->repository->hasPackage($package) && is_readable($this->getInstallPath($package));
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public function install(PackageInterface $package)
+    {
+        $this->initializeVendorDir();
+        $downloadPath = $this->getInstallPath($package);
+
+        // remove the binaries if it appears the package files are missing
+        if (!is_readable($downloadPath) && $this->repository->hasPackage($package)) {
+            $this->removeBinaries($package);
+        }
+
+        $this->downloadManager->download($package, $downloadPath);
+        $this->installBinaries($package);
+        if (!$this->repository->hasPackage($package)) {
+            $this->repository->addPackage(clone $package);
+        }
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public function update(PackageInterface $initial, PackageInterface $target)
+    {
+        if (!$this->repository->hasPackage($initial)) {
+            throw new \InvalidArgumentException('Package is not installed: '.$initial);
+        }
+
+        $this->initializeVendorDir();
+        $downloadPath = $this->getInstallPath($initial);
+
+        $this->removeBinaries($initial);
+        $this->downloadManager->update($initial, $target, $downloadPath);
+        $this->installBinaries($target);
+        $this->repository->removePackage($initial);
+        if (!$this->repository->hasPackage($target)) {
+            $this->repository->addPackage(clone $target);
+        }
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public function uninstall(PackageInterface $package)
+    {
+        if (!$this->repository->hasPackage($package)) {
+            // TODO throw exception again here, when update is fixed and we don't have to remove+install (see #125)
+            return;
+            throw new \InvalidArgumentException('Package is not installed: '.$package);
+        }
+
+        $downloadPath = $this->getInstallPath($package);
+
+        $this->downloadManager->remove($package, $downloadPath);
+        $this->removeBinaries($package);
+        $this->repository->removePackage($package);
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public function getInstallPath(PackageInterface $package)
+    {
+        $targetDir = $package->getTargetDir();
+        return ($this->vendorDir ? $this->vendorDir.'/' : '') . $package->getPrettyName() . ($targetDir ? '/'.$targetDir : '');
+    }
+
+    protected function installBinaries(PackageInterface $package)
+    {
+        if (!$package->getBinaries()) {
+            return;
+        }
+        foreach ($package->getBinaries() as $bin) {
+            $this->initializeBinDir();
+            $link = $this->binDir.'/'.basename($bin);
+            if (file_exists($link)) {
+                if (is_link($link)) {
+                    // likely leftover from a previous install, make sure
+                    // that the target is still executable in case this
+                    // is a fresh install of the vendor.
+                    chmod($link, 0755);
+                }
+                $this->io->write('Skipped installation of '.$bin.' for package '.$package->getName().', name conflicts with an existing file');
+                continue;
+            }
+            $bin = $this->getInstallPath($package).'/'.$bin;
+
+            if (defined('PHP_WINDOWS_VERSION_BUILD')) {
+                // add unixy support for cygwin and similar environments
+                if ('.bat' !== substr($bin, -4)) {
+                    file_put_contents($link, $this->generateUnixyProxyCode($bin, $link));
+                    chmod($link, 0755);
+                    $link .= '.bat';
+                }
+                file_put_contents($link, $this->generateWindowsProxyCode($bin, $link));
+            } else {
+                try {
+                    // under linux symlinks are not always supported for example
+                    // when using it in smbfs mounted folder
+                    symlink($bin, $link);
+                } catch (\ErrorException $e) {
+                    file_put_contents($link, $this->generateUnixyProxyCode($bin, $link));
+                }
+
+            }
+            chmod($link, 0755);
+        }
+    }
+
+    protected function removeBinaries(PackageInterface $package)
+    {
+        if (!$package->getBinaries()) {
+            return;
+        }
+        foreach ($package->getBinaries() as $bin => $os) {
+            $link = $this->binDir.'/'.basename($bin);
+            if (!file_exists($link)) {
+                continue;
+            }
+            unlink($link);
+        }
+    }
+
+    protected function initializeVendorDir()
+    {
+        $this->filesystem->ensureDirectoryExists($this->vendorDir);
+        $this->vendorDir = realpath($this->vendorDir);
+    }
+
+    protected function initializeBinDir()
+    {
+        $this->filesystem->ensureDirectoryExists($this->binDir);
+        $this->binDir = realpath($this->binDir);
+    }
+
+    private function generateWindowsProxyCode($bin, $link)
+    {
+        $binPath = $this->filesystem->findShortestPath($link, $bin);
+        if ('.bat' === substr($bin, -4)) {
+            $caller = 'call';
+        } else {
+            $handle = fopen($bin, 'r');
+            $line = fgets($handle);
+            fclose($handle);
+            if (preg_match('{^#!/(?:usr/bin/env )?(?:[^/]+/)*(.+)$}m', $line, $match)) {
+                $caller = $match[1];
+            } else {
+                $caller = 'php';
+            }
+        }
+
+        return "@echo off\r\n".
+            "pushd .\r\n".
+            "cd %~dp0\r\n".
+            "cd ".escapeshellarg(dirname($binPath))."\r\n".
+            "set BIN_TARGET=%CD%\\".basename($binPath)."\r\n".
+            "popd\r\n".
+            $caller." %BIN_TARGET% %*\r\n";
+    }
+
+    private function generateUnixyProxyCode($bin, $link)
+    {
+        $binPath = $this->filesystem->findShortestPath($link, $bin);
+
+        return "#!/usr/bin/env sh\n".
+            'SRC_DIR=`pwd`'."\n".
+            'cd `dirname "$0"`'."\n".
+            'cd '.escapeshellarg(dirname($binPath))."\n".
+            'BIN_TARGET=`pwd`/'.basename($binPath)."\n".
+            'cd $SRC_DIR'."\n".
+            '$BIN_TARGET "$@"'."\n";
+    }
+}
diff --git a/vendor/composer/composer/src/Composer/Installer/MetapackageInstaller.php b/vendor/composer/composer/src/Composer/Installer/MetapackageInstaller.php
new file mode 100644
index 0000000..ceee0f1
--- /dev/null
+++ b/vendor/composer/composer/src/Composer/Installer/MetapackageInstaller.php
@@ -0,0 +1,97 @@
+<?php
+
+/*
+ * This file is part of Composer.
+ *
+ * (c) Nils Adermann <naderman@naderman.de>
+ *     Jordi Boggiano <j.boggiano@seld.be>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Composer\Installer;
+
+use Composer\IO\IOInterface;
+use Composer\Repository\WritableRepositoryInterface;
+use Composer\Package\PackageInterface;
+
+/**
+ * Metapackage installation manager.
+ *
+ * @author Martin Hasoň <martin.hason@gmail.com>
+ */
+class MetapackageInstaller implements InstallerInterface
+{
+    protected $repository;
+    protected $io;
+
+    /**
+     * @param   WritableRepositoryInterface $repository repository controller
+     * @param   IOInterface                 $io         io instance
+     */
+    public function __construct(WritableRepositoryInterface $repository, IOInterface $io)
+    {
+        $this->repository = $repository;
+        $this->io = $io;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public function supports($packageType)
+    {
+        return $packageType === 'metapackage';
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public function isInstalled(PackageInterface $package)
+    {
+        return $this->repository->hasPackage($package);
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public function install(PackageInterface $package)
+    {
+        $this->repository->addPackage(clone $package);
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public function update(PackageInterface $initial, PackageInterface $target)
+    {
+        if (!$this->repository->hasPackage($initial)) {
+            throw new \InvalidArgumentException('Package is not installed: '.$initial);
+        }
+
+        $this->repository->removePackage($initial);
+        $this->repository->addPackage(clone $target);
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public function uninstall(PackageInterface $package)
+    {
+        if (!$this->repository->hasPackage($package)) {
+            // TODO throw exception again here, when update is fixed and we don't have to remove+install (see #125)
+            return;
+            throw new \InvalidArgumentException('Package is not installed: '.$package);
+        }
+
+        $this->repository->removePackage($package);
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public function getInstallPath(PackageInterface $package)
+    {
+        return '';
+    }
+}
diff --git a/vendor/composer/composer/src/Composer/Installer/ProjectInstaller.php b/vendor/composer/composer/src/Composer/Installer/ProjectInstaller.php
new file mode 100644
index 0000000..da9236a
--- /dev/null
+++ b/vendor/composer/composer/src/Composer/Installer/ProjectInstaller.php
@@ -0,0 +1,111 @@
+<?php
+
+/*
+ * This file is part of Composer.
+ *
+ * (c) Nils Adermann <naderman@naderman.de>
+ *     Jordi Boggiano <j.boggiano@seld.be>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Composer\Installer;
+
+use Composer\DependencyResolver\Operation\OperationInterface;
+use Composer\Package\PackageInterface;
+use Composer\Downloader\DownloadManager;
+
+/**
+ * Project Installer is used to install a single package into a directory as
+ * root project.
+ *
+ * @author Benjamin Eberlei <kontakt@beberlei.de>
+ */
+class ProjectInstaller implements InstallerInterface
+{
+    private $installPath;
+    private $downloadManager;
+
+    public function __construct($installPath, DownloadManager $dm)
+    {
+        $this->installPath = $installPath;
+        $this->downloadManager = $dm;
+    }
+
+    /**
+     * Decides if the installer supports the given type
+     *
+     * @param   string  $packageType
+     * @return  Boolean
+     */
+    public function supports($packageType)
+    {
+        return true;
+    }
+
+    /**
+     * Checks that provided package is installed.
+     *
+     * @param   PackageInterface    $package    package instance
+     *
+     * @return  Boolean
+     */
+    public function isInstalled(PackageInterface $package)
+    {
+        return false;
+    }
+
+    /**
+     * Installs specific package.
+     *
+     * @param   PackageInterface    $package    package instance
+     */
+    public function install(PackageInterface $package)
+    {
+        $installPath = $this->installPath;
+        if (file_exists($installPath)) {
+            throw new \InvalidArgumentException("Project directory $installPath already exists.");
+        }
+        if (!file_exists(dirname($installPath))) {
+            throw new \InvalidArgumentException("Project root " . dirname($installPath) . " does not exist.");
+        }
+        mkdir($installPath, 0777);
+        $this->downloadManager->download($package, $installPath);
+    }
+
+    /**
+     * Updates specific package.
+     *
+     * @param   PackageInterface    $initial    already installed package version
+     * @param   PackageInterface    $target     updated version
+     *
+     * @throws  InvalidArgumentException        if $from package is not installed
+     */
+    public function update(PackageInterface $initial, PackageInterface $target)
+    {
+        throw new \InvalidArgumentException("not supported");
+    }
+
+    /**
+     * Uninstalls specific package.
+     *
+     * @param   PackageInterface    $package    package instance
+     */
+    public function uninstall(PackageInterface $package)
+    {
+        throw new \InvalidArgumentException("not supported");
+    }
+
+    /**
+     * Returns the installation path of a package
+     *
+     * @param   PackageInterface    $package
+     * @return  string path
+     */
+    public function getInstallPath(PackageInterface $package)
+    {
+        return $this->installPath;
+    }
+}
+
diff --git a/vendor/composer/composer/src/Composer/Json/JsonFile.php b/vendor/composer/composer/src/Composer/Json/JsonFile.php
new file mode 100644
index 0000000..63c21bd
--- /dev/null
+++ b/vendor/composer/composer/src/Composer/Json/JsonFile.php
@@ -0,0 +1,299 @@
+<?php
+
+/*
+ * This file is part of Composer.
+ *
+ * (c) Nils Adermann <naderman@naderman.de>
+ *     Jordi Boggiano <j.boggiano@seld.be>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Composer\Json;
+
+use Composer\Repository\RepositoryManager;
+use Composer\Composer;
+use JsonSchema\Validator;
+use Seld\JsonLint\JsonParser;
+use Composer\Util\StreamContextFactory;
+use Composer\Util\RemoteFilesystem;
+use Composer\Downloader\TransportException;
+
+/**
+ * Reads/writes json files.
+ *
+ * @author Konstantin Kudryashiv <ever.zet@gmail.com>
+ * @author Jordi Boggiano <j.boggiano@seld.be>
+ */
+class JsonFile
+{
+    const LAX_SCHEMA = 1;
+    const STRICT_SCHEMA = 2;
+
+    const JSON_UNESCAPED_SLASHES = 64;
+    const JSON_PRETTY_PRINT = 128;
+    const JSON_UNESCAPED_UNICODE = 256;
+
+    private $path;
+    private $rfs;
+
+    /**
+     * Initializes json file reader/parser.
+     *
+     * @param   string  $lockFile   path to a lockfile
+     * @param   RemoteFilesystem  $rfs   required for loading http/https json files
+     */
+    public function __construct($path, RemoteFilesystem $rfs = null)
+    {
+        $this->path = $path;
+
+        if (null === $rfs && preg_match('{^https?://}i', $path)) {
+            throw new \InvalidArgumentException('http urls require a RemoteFilesystem instance to be passed');
+        }
+        $this->rfs = $rfs;
+    }
+
+    public function getPath()
+    {
+        return $this->path;
+    }
+
+    /**
+     * Checks whether json file exists.
+     *
+     * @return  Boolean
+     */
+    public function exists()
+    {
+        return is_file($this->path);
+    }
+
+    /**
+     * Reads json file.
+     *
+     * @return  array
+     */
+    public function read()
+    {
+        try {
+            if ($this->rfs) {
+                $json = $this->rfs->getContents($this->path, $this->path, false);
+            } else {
+                $json = file_get_contents($this->path);
+            }
+        } catch (TransportException $e) {
+            throw new \RuntimeException('Could not read '.$this->path.', either you or the remote host is probably offline'."\n\n".$e->getMessage());
+        } catch (\Exception $e) {
+            throw new \RuntimeException('Could not read '.$this->path."\n\n".$e->getMessage());
+        }
+
+        return static::parseJson($json);
+    }
+
+    /**
+     * Writes json file.
+     *
+     * @param array $hash writes hash into json file
+     * @param int $options json_encode options (defaults to JSON_UNESCAPED_SLASHES | JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE)
+     */
+    public function write(array $hash, $options = 448)
+    {
+        $dir = dirname($this->path);
+        if (!is_dir($dir)) {
+            if (file_exists($dir)) {
+                throw new \UnexpectedValueException(
+                    $dir.' exists and is not a directory.'
+                );
+            }
+            if (!mkdir($dir, 0777, true)) {
+                throw new \UnexpectedValueException(
+                    $dir.' does not exist and could not be created.'
+                );
+            }
+        }
+        file_put_contents($this->path, static::encode($hash, $options). ($options & self::JSON_PRETTY_PRINT ? "\n" : ''));
+    }
+
+    /**
+     * Validates the schema of the current json file according to composer-schema.json rules
+     *
+     * @param int $schema a JsonFile::*_SCHEMA constant
+     * @return Boolean true on success
+     * @throws \UnexpectedValueException
+     */
+    public function validateSchema($schema = self::STRICT_SCHEMA)
+    {
+        $content = file_get_contents($this->path);
+        $data = json_decode($content);
+
+        if (null === $data && 'null' !== $content) {
+            self::validateSyntax($content);
+        }
+
+        $schemaFile = __DIR__ . '/../../../res/composer-schema.json';
+        $schemaData = json_decode(file_get_contents($schemaFile));
+
+        if ($schema === self::LAX_SCHEMA) {
+            $schemaData->additionalProperties = true;
+            $schemaData->properties->name->required = false;
+            $schemaData->properties->description->required = false;
+        }
+
+        $validator = new Validator();
+        $validator->check($data, $schemaData);
+
+        // TODO add more validation like check version constraints and such, perhaps build that into the arrayloader?
+
+        if (!$validator->isValid()) {
+            $errors = array();
+            foreach ((array) $validator->getErrors() as $error) {
+                $errors[] = ($error['property'] ? $error['property'].' : ' : '').$error['message'];
+            }
+            throw new JsonValidationException($errors);
+        }
+
+        return true;
+    }
+
+    /**
+     * Encodes an array into (optionally pretty-printed) JSON
+     *
+     * This code is based on the function found at:
+     *  http://recursive-design.com/blog/2008/03/11/format-json-with-php/
+     *
+     * @param mixed $data Data to encode into a formatted JSON string
+     * @param int $options json_encode options (defaults to JSON_UNESCAPED_SLASHES | JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE)
+     * @return string Encoded json
+     */
+    static public function encode($data, $options = 448)
+    {
+        if (version_compare(PHP_VERSION, '5.4', '>=')) {
+            return json_encode($data, $options);
+        }
+
+        $json = json_encode($data);
+
+        $prettyPrint = (Boolean) ($options & self::JSON_PRETTY_PRINT);
+        $unescapeUnicode = (Boolean) ($options & self::JSON_UNESCAPED_UNICODE);
+        $unescapeSlashes = (Boolean) ($options & self::JSON_UNESCAPED_SLASHES);
+
+        if (!$prettyPrint && !$unescapeUnicode && !$unescapeSlashes) {
+            return $json;
+        }
+
+        $result = '';
+        $pos = 0;
+        $strLen = strlen($json);
+        $indentStr = '    ';
+        $newLine = "\n";
+        $outOfQuotes = true;
+        $buffer = '';
+        $noescape = true;
+
+        for ($i = 0; $i <= $strLen; $i++) {
+            // Grab the next character in the string
+            $char = substr($json, $i, 1);
+
+            // Are we inside a quoted string?
+            if ('"' === $char && $noescape) {
+                $outOfQuotes = !$outOfQuotes;
+            }
+
+            if (!$outOfQuotes) {
+                $buffer .= $char;
+                $noescape = '\\' === $char ? !$noescape : true;
+                continue;
+            } elseif ('' !== $buffer) {
+                if ($unescapeSlashes) {
+                    $buffer = str_replace('\\/', '/', $buffer);
+                }
+
+                if ($unescapeUnicode && function_exists('mb_convert_encoding')) {
+                    // http://stackoverflow.com/questions/2934563/how-to-decode-unicode-escape-sequences-like-u00ed-to-proper-utf-8-encoded-cha
+                    $buffer = preg_replace_callback('/\\\\u([0-9a-f]{4})/i', function($match) {
+                        return mb_convert_encoding(pack('H*', $match[1]), 'UTF-8', 'UCS-2BE');
+                    }, $buffer);
+                }
+
+                $result .= $buffer.$char;
+                $buffer = '';
+                continue;
+            }
+
+            if (':' === $char) {
+                // Add a space after the : character
+                $char .= ' ';
+            } elseif (('}' === $char || ']' === $char)) {
+                $pos--;
+                $prevChar = substr($json, $i - 1, 1);
+
+                if ('{' !== $prevChar && '[' !== $prevChar) {
+                    // If this character is the end of an element,
+                    // output a new line and indent the next line
+                    $result .= $newLine;
+                    for ($j = 0; $j < $pos; $j++) {
+                        $result .= $indentStr;
+                    }
+                } else {
+                    // Collapse empty {} and []
+                    $result = rtrim($result);
+                }
+            }
+
+            $result .= $char;
+
+            // If the last character was the beginning of an element,
+            // output a new line and indent the next line
+            if (',' === $char || '{' === $char || '[' === $char) {
+                $result .= $newLine;
+
+                if ('{' === $char || '[' === $char) {
+                    $pos++;
+                }
+
+                for ($j = 0; $j < $pos; $j++) {
+                    $result .= $indentStr;
+                }
+            }
+        }
+
+        return $result;
+    }
+
+    /**
+     * Parses json string and returns hash.
+     *
+     * @param string $json json string
+     *
+     * @return  mixed
+     */
+    public static function parseJson($json)
+    {
+        $data = json_decode($json, true);
+        if (null === $data && 'null' !== $json) {
+            self::validateSyntax($json);
+        }
+
+        return $data;
+    }
+
+    /**
+     * Validates the syntax of a JSON string
+     *
+     * @param string $json
+     * @return Boolean true on success
+     * @throws \UnexpectedValueException
+     */
+    protected static function validateSyntax($json)
+    {
+        $parser = new JsonParser();
+        $result = $parser->lint($json);
+
+        if (null === $result) {
+            return true;
+        }
+
+        throw $result;
+    }
+}
diff --git a/vendor/composer/composer/src/Composer/Json/JsonValidationException.php b/vendor/composer/composer/src/Composer/Json/JsonValidationException.php
new file mode 100644
index 0000000..30bef88
--- /dev/null
+++ b/vendor/composer/composer/src/Composer/Json/JsonValidationException.php
@@ -0,0 +1,34 @@
+<?php
+
+/*
+ * This file is part of Composer.
+ *
+ * (c) Nils Adermann <naderman@naderman.de>
+ *     Jordi Boggiano <j.boggiano@seld.be>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Composer\Json;
+
+use Exception;
+
+/**
+ * @author Jordi Boggiano <j.boggiano@seld.be>
+ */
+class JsonValidationException extends Exception
+{
+    protected $errors;
+
+    public function __construct(array $errors)
+    {
+        parent::__construct(implode("\n", $errors));
+        $this->errors = $errors;
+    }
+
+    public function getErrors()
+    {
+        return $this->errors;
+    }
+}
diff --git a/vendor/composer/composer/src/Composer/Package/AliasPackage.php b/vendor/composer/composer/src/Composer/Package/AliasPackage.php
new file mode 100644
index 0000000..e453e30
--- /dev/null
+++ b/vendor/composer/composer/src/Composer/Package/AliasPackage.php
@@ -0,0 +1,277 @@
+<?php
+
+/*
+ * This file is part of Composer.
+ *
+ * (c) Nils Adermann <naderman@naderman.de>
+ *     Jordi Boggiano <j.boggiano@seld.be>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Composer\Package;
+
+use Composer\Package\LinkConstraint\LinkConstraintInterface;
+use Composer\Package\LinkConstraint\VersionConstraint;
+use Composer\Repository\RepositoryInterface;
+use Composer\Repository\PlatformRepository;
+use Composer\Package\Version\VersionParser;
+
+/**
+ * @author Jordi Boggiano <j.boggiano@seld.be>
+ */
+class AliasPackage extends BasePackage
+{
+    protected $version;
+    protected $prettyVersion;
+    protected $dev;
+    protected $aliasOf;
+
+    protected $requires;
+    protected $conflicts;
+    protected $provides;
+    protected $replaces;
+    protected $recommends;
+    protected $suggests;
+
+    /**
+     * All descendants' constructors should call this parent constructor
+     *
+     * @param PackageInterface $aliasOf The package this package is an alias of
+     * @param string $version The version the alias must report
+     * @param string $prettyVersion The alias's non-normalized version
+     */
+    public function __construct(PackageInterface $aliasOf, $version, $prettyVersion)
+    {
+        parent::__construct($aliasOf->getName());
+
+        $this->version = $version;
+        $this->prettyVersion = $prettyVersion;
+        $this->aliasOf = $aliasOf;
+        $this->dev = VersionParser::isDev($version);
+
+        // replace self.version dependencies
+        foreach (array('requires', 'recommends', 'suggests') as $type) {
+            $links = $aliasOf->{'get'.ucfirst($type)}();
+            foreach ($links as $index => $link) {
+                // link is self.version, but must be replacing also the replaced version
+                if ('self.version' === $link->getPrettyConstraint()) {
+                    $links[$index] = new Link($link->getSource(), $link->getTarget(), new VersionConstraint('=', $this->version), $type, $this->version);
+                }
+            }
+            $this->$type = $links;
+        }
+
+        // duplicate self.version provides
+        foreach (array('conflicts', 'provides', 'replaces') as $type) {
+            $links = $aliasOf->{'get'.ucfirst($type)}();
+            $newLinks = array();
+            foreach ($links as $link) {
+                // link is self.version, but must be replacing also the replaced version
+                if ('self.version' === $link->getPrettyConstraint()) {
+                    $newLinks[] = new Link($link->getSource(), $link->getTarget(), new VersionConstraint('=', $this->version), $type, $this->version);
+                }
+            }
+            $this->$type = array_merge($links, $newLinks);
+        }
+    }
+
+    public function getAliasOf()
+    {
+        return $this->aliasOf;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public function getVersion()
+    {
+        return $this->version;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public function getPrettyVersion()
+    {
+        return $this->prettyVersion;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public function isDev()
+    {
+        return $this->dev;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public function getRequires()
+    {
+        return $this->requires;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public function getConflicts()
+    {
+        return $this->conflicts;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public function getProvides()
+    {
+        return $this->provides;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public function getReplaces()
+    {
+        return $this->replaces;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public function getRecommends()
+    {
+        return $this->recommends;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public function getSuggests()
+    {
+        return $this->suggests;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public function getAlias()
+    {
+        return '';
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public function getPrettyAlias()
+    {
+        return '';
+    }
+
+    /***************************************
+     * Wrappers around the aliased package *
+     ***************************************/
+
+    public function getType()
+    {
+        return $this->aliasOf->getType();
+    }
+    public function getTargetDir()
+    {
+        return $this->aliasOf->getTargetDir();
+    }
+    public function getExtra()
+    {
+        return $this->aliasOf->getExtra();
+    }
+    public function setInstallationSource($type)
+    {
+        $this->aliasOf->setInstallationSource($type);
+    }
+    public function getInstallationSource()
+    {
+        return $this->aliasOf->getInstallationSource();
+    }
+    public function getSourceType()
+    {
+        return $this->aliasOf->getSourceType();
+    }
+    public function getSourceUrl()
+    {
+        return $this->aliasOf->getSourceUrl();
+    }
+    public function getSourceReference()
+    {
+        return $this->aliasOf->getSourceReference();
+    }
+    public function setSourceReference($reference)
+    {
+        return $this->aliasOf->setSourceReference($reference);
+    }
+    public function getDistType()
+    {
+        return $this->aliasOf->getDistType();
+    }
+    public function getDistUrl()
+    {
+        return $this->aliasOf->getDistUrl();
+    }
+    public function getDistReference()
+    {
+        return $this->aliasOf->getDistReference();
+    }
+    public function getDistSha1Checksum()
+    {
+        return $this->aliasOf->getDistSha1Checksum();
+    }
+    public function getScripts()
+    {
+        return $this->aliasOf->getScripts();
+    }
+    public function getLicense()
+    {
+        return $this->aliasOf->getLicense();
+    }
+    public function getAutoload()
+    {
+        return $this->aliasOf->getAutoload();
+    }
+    public function getIncludePaths()
+    {
+        return $this->aliasOf->getIncludePaths();
+    }
+    public function getRepositories()
+    {
+        return $this->aliasOf->getRepositories();
+    }
+    public function getReleaseDate()
+    {
+        return $this->aliasOf->getReleaseDate();
+    }
+    public function getBinaries()
+    {
+        return $this->aliasOf->getBinaries();
+    }
+    public function getKeywords()
+    {
+        return $this->aliasOf->getKeywords();
+    }
+    public function getDescription()
+    {
+        return $this->aliasOf->getDescription();
+    }
+    public function getHomepage()
+    {
+        return $this->aliasOf->getHomepage();
+    }
+    public function getAuthors()
+    {
+        return $this->aliasOf->getAuthors();
+    }
+    public function __toString()
+    {
+        return parent::__toString().' (alias of '.$this->aliasOf->getVersion().')';
+    }
+}
diff --git a/vendor/composer/composer/src/Composer/Package/BasePackage.php b/vendor/composer/composer/src/Composer/Package/BasePackage.php
new file mode 100644
index 0000000..90fb678
--- /dev/null
+++ b/vendor/composer/composer/src/Composer/Package/BasePackage.php
@@ -0,0 +1,194 @@
+<?php
+
+/*
+ * This file is part of Composer.
+ *
+ * (c) Nils Adermann <naderman@naderman.de>
+ *     Jordi Boggiano <j.boggiano@seld.be>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Composer\Package;
+
+use Composer\Package\LinkConstraint\LinkConstraintInterface;
+use Composer\Package\LinkConstraint\VersionConstraint;
+use Composer\Repository\RepositoryInterface;
+use Composer\Repository\PlatformRepository;
+
+/**
+ * Base class for packages providing name storage and default match implementation
+ *
+ * @author Nils Adermann <naderman@naderman.de>
+ */
+abstract class BasePackage implements PackageInterface
+{
+    public static $supportedLinkTypes = array(
+        'require'   => 'requires',
+        'conflict'  => 'conflicts',
+        'provide'   => 'provides',
+        'replace'   => 'replaces',
+        'recommend' => 'recommends',
+        'suggest'   => 'suggests',
+    );
+
+    protected $name;
+    protected $prettyName;
+
+    protected $repository;
+    protected $id;
+
+    /**
+     * All descendants' constructors should call this parent constructor
+     *
+     * @param string $name The package's name
+     */
+    public function __construct($name)
+    {
+        $this->prettyName = $name;
+        $this->name = strtolower($name);
+        $this->id = -1;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public function getName()
+    {
+        return $this->name;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public function getPrettyName()
+    {
+        return $this->prettyName;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public function getNames()
+    {
+        $names = array(
+            $this->getName() => true,
+        );
+
+        foreach ($this->getProvides() as $link) {
+            $names[$link->getTarget()] = true;
+        }
+
+        foreach ($this->getReplaces() as $link) {
+            $names[$link->getTarget()] = true;
+        }
+
+        return array_keys($names);
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public function setId($id)
+    {
+        $this->id = $id;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public function getId()
+    {
+        return $this->id;
+    }
+
+    /**
+     * Checks if the package matches the given constraint directly or through
+     * provided or replaced packages
+     *
+     * @param string                  $name       Name of the package to be matched
+     * @param LinkConstraintInterface $constraint The constraint to verify
+     * @return bool                               Whether this package matches the name and constraint
+     */
+    public function matches($name, LinkConstraintInterface $constraint)
+    {
+        if ($this->name === $name) {
+            return $constraint->matches(new VersionConstraint('==', $this->getVersion()));
+        }
+
+        foreach ($this->getProvides() as $link) {
+            if ($link->getTarget() === $name && $constraint->matches($link->getConstraint())) {
+                return true;
+            }
+        }
+
+        foreach ($this->getReplaces() as $link) {
+            if ($link->getTarget() === $name && $constraint->matches($link->getConstraint())) {
+                return true;
+            }
+        }
+
+        return false;
+    }
+
+    public function getRepository()
+    {
+        return $this->repository;
+    }
+
+    public function setRepository(RepositoryInterface $repository)
+    {
+        if ($this->repository) {
+            throw new \LogicException('A package can only be added to one repository');
+        }
+        $this->repository = $repository;
+    }
+
+    /**
+     * checks if this package is a platform package
+     *
+     * @return boolean
+     */
+    public function isPlatform()
+    {
+        return $this->getRepository() instanceof PlatformRepository;
+    }
+
+    /**
+     * Returns package unique name, constructed from name, version and release type.
+     *
+     * @return string
+     */
+    public function getUniqueName()
+    {
+        return $this->getName().'-'.$this->getVersion();
+    }
+
+    public function equals(PackageInterface $package)
+    {
+        $self = $this;
+        if ($this instanceof AliasPackage) {
+            $self = $this->getAliasOf();
+        }
+        if ($package instanceof AliasPackage) {
+            $package = $package->getAliasOf();
+        }
+        return $package === $self;
+    }
+
+    /**
+     * Converts the package into a readable and unique string
+     *
+     * @return string
+     */
+    public function __toString()
+    {
+        return $this->getUniqueName();
+    }
+
+    public function __clone()
+    {
+        $this->repository = null;
+    }
+}
diff --git a/vendor/composer/composer/src/Composer/Package/Dumper/ArrayDumper.php b/vendor/composer/composer/src/Composer/Package/Dumper/ArrayDumper.php
new file mode 100644
index 0000000..188d55c
--- /dev/null
+++ b/vendor/composer/composer/src/Composer/Package/Dumper/ArrayDumper.php
@@ -0,0 +1,90 @@
+<?php
+
+/*
+ * This file is part of Composer.
+ *
+ * (c) Nils Adermann <naderman@naderman.de>
+ *     Jordi Boggiano <j.boggiano@seld.be>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Composer\Package\Dumper;
+
+use Composer\Package\PackageInterface;
+
+/**
+ * @author Konstantin Kudryashiv <ever.zet@gmail.com>
+ * @author Jordi Boggiano <j.boggiano@seld.be>
+ */
+class ArrayDumper
+{
+    public function dump(PackageInterface $package)
+    {
+        $keys = array(
+            'binaries' => 'bin',
+            'scripts',
+            'type',
+            'names',
+            'extra',
+            'installationSource' => 'installation-source',
+            'license',
+            'authors',
+            'description',
+            'homepage',
+            'keywords',
+            'autoload',
+            'repositories',
+        );
+
+        $data = array();
+        $data['name'] = $package->getPrettyName();
+        $data['version'] = $package->getPrettyVersion();
+        $data['version_normalized'] = $package->getVersion();
+
+        if ($package->getTargetDir()) {
+            $data['target-dir'] = $package->getTargetDir();
+        }
+
+        if ($package->getReleaseDate()) {
+            $data['time'] = $package->getReleaseDate()->format('Y-m-d H:i:s');
+        }
+
+        if ($package->getSourceType()) {
+            $data['source']['type'] = $package->getSourceType();
+            $data['source']['url'] = $package->getSourceUrl();
+            $data['source']['reference'] = $package->getSourceReference();
+        }
+
+        if ($package->getDistType()) {
+            $data['dist']['type'] = $package->getDistType();
+            $data['dist']['url'] = $package->getDistUrl();
+            $data['dist']['reference'] = $package->getDistReference();
+            $data['dist']['shasum'] = $package->getDistSha1Checksum();
+        }
+
+        foreach (array('require', 'conflict', 'provide', 'replace', 'suggest', 'recommend') as $linkType) {
+            if ($links = $package->{'get'.ucfirst($linkType).'s'}()) {
+                foreach ($links as $link) {
+                    $data[$linkType][$link->getTarget()] = $link->getPrettyConstraint();
+                }
+            }
+        }
+
+        foreach ($keys as $method => $key) {
+            if (is_numeric($method)) {
+                $method = $key;
+            }
+
+            $getter = 'get'.ucfirst($method);
+            $value  = $package->$getter();
+
+            if (null !== $value && !(is_array($value) && 0 === count($value))) {
+                $data[$key] = $value;
+            }
+        }
+
+        return $data;
+    }
+}
diff --git a/vendor/composer/composer/src/Composer/Package/Link.php b/vendor/composer/composer/src/Composer/Package/Link.php
new file mode 100644
index 0000000..348bbce
--- /dev/null
+++ b/vendor/composer/composer/src/Composer/Package/Link.php
@@ -0,0 +1,74 @@
+<?php
+
+/*
+ * This file is part of Composer.
+ *
+ * (c) Nils Adermann <naderman@naderman.de>
+ *     Jordi Boggiano <j.boggiano@seld.be>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Composer\Package;
+
+use Composer\Package\LinkConstraint\LinkConstraintInterface;
+
+/**
+ * Represents a link between two packages, represented by their names
+ *
+ * @author Nils Adermann <naderman@naderman.de>
+ */
+class Link
+{
+    protected $source;
+    protected $target;
+    protected $constraint;
+    protected $description;
+
+    /**
+     * Creates a new package link.
+     *
+     * @param string                  $source
+     * @param string                  $target
+     * @param LinkConstraintInterface $constraint  Constraint applying to the target of this link
+     * @param string                  $description Used to create a descriptive string representation
+     */
+    public function __construct($source, $target, LinkConstraintInterface $constraint = null, $description = 'relates to', $prettyConstraint = null)
+    {
+        $this->source = strtolower($source);
+        $this->target = strtolower($target);
+        $this->constraint = $constraint;
+        $this->description = $description;
+        $this->prettyConstraint = $prettyConstraint;
+    }
+
+    public function getSource()
+    {
+        return $this->source;
+    }
+
+    public function getTarget()
+    {
+        return $this->target;
+    }
+
+    public function getConstraint()
+    {
+        return $this->constraint;
+    }
+
+    public function getPrettyConstraint()
+    {
+        if (null === $this->prettyConstraint) {
+            throw new \UnexpectedValueException(sprintf('Link %s has been misconfigured and had no prettyConstraint given.', $this));
+        }
+
+        return $this->prettyConstraint;
+    }
+
+    public function __toString()
+    {
+        return $this->source.' '.$this->description.' '.$this->target.' ('.$this->constraint.')';
+    }
+}
diff --git a/vendor/composer/composer/src/Composer/Package/LinkConstraint/LinkConstraintInterface.php b/vendor/composer/composer/src/Composer/Package/LinkConstraint/LinkConstraintInterface.php
new file mode 100644
index 0000000..052f18d
--- /dev/null
+++ b/vendor/composer/composer/src/Composer/Package/LinkConstraint/LinkConstraintInterface.php
@@ -0,0 +1,24 @@
+<?php
+
+/*
+ * This file is part of Composer.
+ *
+ * (c) Nils Adermann <naderman@naderman.de>
+ *     Jordi Boggiano <j.boggiano@seld.be>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Composer\Package\LinkConstraint;
+
+/**
+ * Defines a constraint on a link between two packages.
+ *
+ * @author Nils Adermann <naderman@naderman.de>
+ */
+interface LinkConstraintInterface
+{
+    function matches(LinkConstraintInterface $provider);
+    function __toString();
+}
diff --git a/vendor/composer/composer/src/Composer/Package/LinkConstraint/MultiConstraint.php b/vendor/composer/composer/src/Composer/Package/LinkConstraint/MultiConstraint.php
new file mode 100644
index 0000000..211f0ee
--- /dev/null
+++ b/vendor/composer/composer/src/Composer/Package/LinkConstraint/MultiConstraint.php
@@ -0,0 +1,53 @@
+<?php
+
+/*
+ * This file is part of Composer.
+ *
+ * (c) Nils Adermann <naderman@naderman.de>
+ *     Jordi Boggiano <j.boggiano@seld.be>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Composer\Package\LinkConstraint;
+
+/**
+ * Defines a conjunctive set of constraints on the target of a package link
+ *
+ * @author Nils Adermann <naderman@naderman.de>
+ */
+class MultiConstraint implements LinkConstraintInterface
+{
+    protected $constraints;
+
+    /**
+     * Sets operator and version to compare a package with
+     *
+     * @param array $constraints A conjunctive set of constraints
+     */
+    public function __construct(array $constraints)
+    {
+        $this->constraints = $constraints;
+    }
+
+    public function matches(LinkConstraintInterface $provider)
+    {
+        foreach ($this->constraints as $constraint) {
+            if (!$constraint->matches($provider)) {
+                return false;
+            }
+        }
+
+        return true;
+    }
+
+    public function __toString()
+    {
+        $constraints = array();
+        foreach ($this->constraints as $constraint) {
+            $constraints[] = $constraint->__toString();
+        }
+        return '['.implode(', ', $constraints).']';
+    }
+}
diff --git a/vendor/composer/composer/src/Composer/Package/LinkConstraint/SpecificConstraint.php b/vendor/composer/composer/src/Composer/Package/LinkConstraint/SpecificConstraint.php
new file mode 100644
index 0000000..e21048b
--- /dev/null
+++ b/vendor/composer/composer/src/Composer/Package/LinkConstraint/SpecificConstraint.php
@@ -0,0 +1,37 @@
+<?php
+
+/*
+ * This file is part of Composer.
+ *
+ * (c) Nils Adermann <naderman@naderman.de>
+ *     Jordi Boggiano <j.boggiano@seld.be>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Composer\Package\LinkConstraint;
+
+/**
+ * Provides a common basis for specific package link constraints
+ *
+ * @author Nils Adermann <naderman@naderman.de>
+ */
+abstract class SpecificConstraint implements LinkConstraintInterface
+{
+    public function matches(LinkConstraintInterface $provider)
+    {
+        if ($provider instanceof MultiConstraint) {
+            // turn matching around to find a match
+            return $provider->matches($this);
+        } elseif ($provider instanceof $this) {
+            return $this->matchSpecific($provider);
+        }
+
+        return true;
+    }
+
+    // implementations must implement a method of this format:
+    // not declared abstract here because type hinting violates parameter coherence (TODO right word?)
+    // public function matchSpecific(<SpecificConstraintType> $provider);
+}
diff --git a/vendor/composer/composer/src/Composer/Package/LinkConstraint/VersionConstraint.php b/vendor/composer/composer/src/Composer/Package/LinkConstraint/VersionConstraint.php
new file mode 100644
index 0000000..2590aa3
--- /dev/null
+++ b/vendor/composer/composer/src/Composer/Package/LinkConstraint/VersionConstraint.php
@@ -0,0 +1,75 @@
+<?php
+
+/*
+ * This file is part of Composer.
+ *
+ * (c) Nils Adermann <naderman@naderman.de>
+ *     Jordi Boggiano <j.boggiano@seld.be>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Composer\Package\LinkConstraint;
+
+/**
+ * Constrains a package link based on package version
+ *
+ * Version numbers must be compatible with version_compare
+ *
+ * @author Nils Adermann <naderman@naderman.de>
+ */
+class VersionConstraint extends SpecificConstraint
+{
+    private $operator;
+    private $version;
+
+    /**
+     * Sets operator and version to compare a package with
+     *
+     * @param string $operator A comparison operator
+     * @param string $version  A version to compare to
+     */
+    public function __construct($operator, $version)
+    {
+        if ('=' === $operator) {
+            $operator = '==';
+        }
+
+        $this->operator = $operator;
+        $this->version = $version;
+    }
+
+    /**
+     *
+     * @param VersionConstraint $provider
+     */
+    public function matchSpecific(VersionConstraint $provider)
+    {
+        $noEqualOp = str_replace('=', '', $this->operator);
+        $providerNoEqualOp = str_replace('=', '', $provider->operator);
+
+        // an example for the condition is <= 2.0 & < 1.0
+        // these kinds of comparisons always have a solution
+        if ($this->operator != '==' && $noEqualOp == $providerNoEqualOp) {
+            return true;
+        }
+
+        if (version_compare($provider->version, $this->version, $this->operator)) {
+            // special case, e.g. require >= 1.0 and provide < 1.0
+            // 1.0 >= 1.0 but 1.0 is outside of the provided interval
+            if ($provider->version == $this->version && $provider->operator == $providerNoEqualOp && $this->operator != $noEqualOp) {
+                return false;
+            }
+
+            return true;
+        }
+
+        return false;
+    }
+
+    public function __toString()
+    {
+        return $this->operator.' '.$this->version;
+    }
+}
diff --git a/vendor/composer/composer/src/Composer/Package/Loader/ArrayLoader.php b/vendor/composer/composer/src/Composer/Package/Loader/ArrayLoader.php
new file mode 100644
index 0000000..f3bd0d5
--- /dev/null
+++ b/vendor/composer/composer/src/Composer/Package/Loader/ArrayLoader.php
@@ -0,0 +1,193 @@
+<?php
+
+/*
+ * This file is part of Composer.
+ *
+ * (c) Nils Adermann <naderman@naderman.de>
+ *     Jordi Boggiano <j.boggiano@seld.be>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Composer\Package\Loader;
+
+use Composer\Package;
+use Composer\Package\Version\VersionParser;
+use Composer\Repository\RepositoryManager;
+
+/**
+ * @author Konstantin Kudryashiv <ever.zet@gmail.com>
+ * @author Jordi Boggiano <j.boggiano@seld.be>
+ */
+class ArrayLoader
+{
+    protected $versionParser;
+
+    public function __construct(VersionParser $parser = null)
+    {
+        if (!$parser) {
+            $parser = new VersionParser;
+        }
+        $this->versionParser = $parser;
+    }
+
+    public function load($config)
+    {
+        if (!isset($config['name'])) {
+            throw new \UnexpectedValueException('Unknown package has no name defined ('.json_encode($config).').');
+        }
+        if (!isset($config['version'])) {
+            throw new \UnexpectedValueException('Package '.$config['name'].' has no version defined.');
+        }
+
+        // handle already normalized versions
+        if (isset($config['version_normalized'])) {
+            $version = $config['version_normalized'];
+        } else {
+            $version = $this->versionParser->normalize($config['version']);
+        }
+        $package = new Package\MemoryPackage($config['name'], $version, $config['version']);
+        $package->setType(isset($config['type']) ? strtolower($config['type']) : 'library');
+
+        if (isset($config['target-dir'])) {
+            $package->setTargetDir($config['target-dir']);
+        }
+
+        if (isset($config['extra']) && is_array($config['extra'])) {
+            $package->setExtra($config['extra']);
+        }
+
+        if (isset($config['bin']) && is_array($config['bin'])) {
+            foreach ($config['bin'] as $key => $bin) {
+                $config['bin'][$key]= ltrim($bin, '/');
+            }
+            $package->setBinaries($config['bin']);
+        }
+
+        if (isset($config['scripts']) && is_array($config['scripts'])) {
+            foreach ($config['scripts'] as $event => $listeners) {
+                $config['scripts'][$event]= (array) $listeners;
+            }
+            $package->setScripts($config['scripts']);
+        }
+
+        if (!empty($config['description']) && is_string($config['description'])) {
+            $package->setDescription($config['description']);
+        }
+
+        if (!empty($config['homepage']) && is_string($config['homepage'])) {
+            $package->setHomepage($config['homepage']);
+        }
+
+        if (!empty($config['keywords'])) {
+            $package->setKeywords(is_array($config['keywords']) ? $config['keywords'] : array($config['keywords']));
+        }
+
+        if (!empty($config['license'])) {
+            $package->setLicense(is_array($config['license']) ? $config['license'] : array($config['license']));
+        }
+
+        if (!empty($config['time'])) {
+            try {
+                $date = new \DateTime($config['time']);
+                $date->setTimezone(new \DateTimeZone('UTC'));
+                $package->setReleaseDate($date);
+            } catch (\Exception $e) {
+            }
+        }
+
+        if (!empty($config['authors']) && is_array($config['authors'])) {
+            $package->setAuthors($config['authors']);
+        }
+
+        if (isset($config['installation-source'])) {
+            $package->setInstallationSource($config['installation-source']);
+        }
+
+        if (isset($config['source'])) {
+            if (!isset($config['source']['type']) || !isset($config['source']['url'])) {
+                throw new \UnexpectedValueException(sprintf(
+                    "package source should be specified as {\"type\": ..., \"url\": ...},\n%s given",
+                    json_encode($config['source'])
+                ));
+            }
+            $package->setSourceType($config['source']['type']);
+            $package->setSourceUrl($config['source']['url']);
+            $package->setSourceReference($config['source']['reference']);
+        }
+
+        if (isset($config['dist'])) {
+            if (!isset($config['dist']['type'])
+             || !isset($config['dist']['url'])) {
+                throw new \UnexpectedValueException(sprintf(
+                    "package dist should be specified as ".
+                    "{\"type\": ..., \"url\": ..., \"reference\": ..., \"shasum\": ...},\n%s given",
+                    json_encode($config['dist'])
+                ));
+            }
+            $package->setDistType($config['dist']['type']);
+            $package->setDistUrl($config['dist']['url']);
+            $package->setDistReference(isset($config['dist']['reference']) ? $config['dist']['reference'] : null);
+            $package->setDistSha1Checksum(isset($config['dist']['shasum']) ? $config['dist']['shasum'] : null);
+        }
+
+        // check for a branch alias (dev-master => 1.0.x-dev for example) if this is a named branch
+        if ('dev-' === substr($package->getPrettyVersion(), 0, 4) && isset($config['extra']['branch-alias']) && is_array($config['extra']['branch-alias'])) {
+            foreach ($config['extra']['branch-alias'] as $sourceBranch => $targetBranch) {
+                // ensure it is an alias to a -dev package
+                if ('-dev' !== substr($targetBranch, -4)) {
+                    continue;
+                }
+                // normalize without -dev and ensure it's a numeric branch that is parseable
+                $validatedTargetBranch = $this->versionParser->normalizeBranch(substr($targetBranch, 0, -4));
+                if ('-dev' !== substr($validatedTargetBranch, -4)) {
+                    continue;
+                }
+
+                // ensure that it is the current branch aliasing itself
+                if (strtolower($package->getPrettyVersion()) !== strtolower($sourceBranch)) {
+                    continue;
+                }
+
+                $package->setAlias($validatedTargetBranch);
+                $package->setPrettyAlias($targetBranch);
+                break;
+            }
+        }
+
+        foreach (Package\BasePackage::$supportedLinkTypes as $type => $description) {
+            if (isset($config[$type])) {
+                $method = 'set'.ucfirst($description);
+                $package->{$method}(
+                    $this->loadLinksFromConfig($package, $description, $config[$type])
+                );
+            }
+        }
+
+        if (isset($config['autoload'])) {
+            $package->setAutoload($config['autoload']);
+        }
+
+        if (isset($config['include-path'])) {
+            $package->setIncludePaths($config['include-path']);
+        }
+
+        return $package;
+    }
+
+    private function loadLinksFromConfig($package, $description, array $linksSpecs)
+    {
+        $links = array();
+        foreach ($linksSpecs as $packageName => $constraint) {
+            if ('self.version' === $constraint) {
+                $parsedConstraint = $this->versionParser->parseConstraints($package->getPrettyVersion());
+            } else {
+                $parsedConstraint = $this->versionParser->parseConstraints($constraint);
+            }
+            $links[] = new Package\Link($package->getName(), $packageName, $parsedConstraint, $description, $constraint);
+        }
+
+        return $links;
+    }
+}
diff --git a/vendor/composer/composer/src/Composer/Package/Loader/JsonLoader.php b/vendor/composer/composer/src/Composer/Package/Loader/JsonLoader.php
new file mode 100644
index 0000000..27ff7c1
--- /dev/null
+++ b/vendor/composer/composer/src/Composer/Package/Loader/JsonLoader.php
@@ -0,0 +1,34 @@
+<?php
+
+/*
+ * This file is part of Composer.
+ *
+ * (c) Nils Adermann <naderman@naderman.de>
+ *     Jordi Boggiano <j.boggiano@seld.be>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Composer\Package\Loader;
+
+use Composer\Json\JsonFile;
+
+/**
+ * @author Konstantin Kudryashiv <ever.zet@gmail.com>
+ */
+class JsonLoader extends ArrayLoader
+{
+    public function load($json)
+    {
+        if ($json instanceof JsonFile) {
+            $config = $json->read();
+        } elseif (file_exists($json)) {
+            $config = JsonFile::parseJson(file_get_contents($json));
+        } elseif (is_string($json)) {
+            $config = JsonFile::parseJson($json);
+        }
+
+        return parent::load($config);
+    }
+}
diff --git a/vendor/composer/composer/src/Composer/Package/Loader/RootPackageLoader.php b/vendor/composer/composer/src/Composer/Package/Loader/RootPackageLoader.php
new file mode 100644
index 0000000..734e28c
--- /dev/null
+++ b/vendor/composer/composer/src/Composer/Package/Loader/RootPackageLoader.php
@@ -0,0 +1,81 @@
+<?php
+
+/*
+ * This file is part of Composer.
+ *
+ * (c) Nils Adermann <naderman@naderman.de>
+ *     Jordi Boggiano <j.boggiano@seld.be>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Composer\Package\Loader;
+
+use Composer\Package\Version\VersionParser;
+use Composer\Repository\RepositoryManager;
+
+/**
+ * ArrayLoader built for the sole purpose of loading the root package
+ *
+ * Sets additional defaults and loads repositories
+ *
+ * @author Jordi Boggiano <j.boggiano@seld.be>
+ */
+class RootPackageLoader extends ArrayLoader
+{
+    private $manager;
+
+    public function __construct(RepositoryManager $manager, VersionParser $parser = null)
+    {
+        $this->manager = $manager;
+        parent::__construct($parser);
+    }
+
+    public function load($config)
+    {
+        if (!isset($config['name'])) {
+            $config['name'] = '__root__';
+        }
+        if (!isset($config['version'])) {
+            $config['version'] = '1.0.0';
+        }
+
+        $package = parent::load($config);
+
+        if (isset($config['require'])) {
+            $aliases = array();
+            foreach ($config['require'] as $reqName => $reqVersion) {
+                if (preg_match('{^([^,\s]+) +as +([^,\s]+)$}', $reqVersion, $match)) {
+                    $aliases[] = array(
+                        'package' => strtolower($reqName),
+                        'version' => $this->versionParser->normalize($match[1]),
+                        'alias' => $match[2],
+                        'alias_normalized' => $this->versionParser->normalize($match[2]),
+                    );
+                }
+            }
+
+            $package->setAliases($aliases);
+        }
+
+        if (isset($config['repositories'])) {
+            foreach ($config['repositories'] as $index => $repo) {
+                if (isset($repo['packagist']) && $repo['packagist'] === false) {
+                    continue;
+                }
+                if (!is_array($repo)) {
+                    throw new \UnexpectedValueException('Repository '.$index.' should be an array, '.gettype($repo).' given');
+                }
+                if (!isset($repo['type'])) {
+                    throw new \UnexpectedValueException('Repository '.$index.' ('.json_encode($repo).') must have a type defined');
+                }
+                $repository = $this->manager->createRepository($repo['type'], $repo);
+                $this->manager->addRepository($repository);
+            }
+            $package->setRepositories($config['repositories']);
+        }
+
+        return $package;
+    }
+}
diff --git a/vendor/composer/composer/src/Composer/Package/Locker.php b/vendor/composer/composer/src/Composer/Package/Locker.php
new file mode 100644
index 0000000..cc51128
--- /dev/null
+++ b/vendor/composer/composer/src/Composer/Package/Locker.php
@@ -0,0 +1,171 @@
+<?php
+
+/*
+ * This file is part of Composer.
+ *
+ * (c) Nils Adermann <naderman@naderman.de>
+ *     Jordi Boggiano <j.boggiano@seld.be>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Composer\Package;
+
+use Composer\Json\JsonFile;
+use Composer\Repository\RepositoryManager;
+use Composer\Package\AliasPackage;
+
+/**
+ * Reads/writes project lockfile (composer.lock).
+ *
+ * @author Konstantin Kudryashiv <ever.zet@gmail.com>
+ */
+class Locker
+{
+    private $lockFile;
+    private $repositoryManager;
+    private $hash;
+    private $lockDataCache;
+
+    /**
+     * Initializes packages locker.
+     *
+     * @param JsonFile            $lockFile           lockfile loader
+     * @param RepositoryManager   $repositoryManager  repository manager instance
+     * @param string              $hash               unique hash of the current composer configuration
+     */
+    public function __construct(JsonFile $lockFile, RepositoryManager $repositoryManager, $hash)
+    {
+        $this->lockFile          = $lockFile;
+        $this->repositoryManager = $repositoryManager;
+        $this->hash = $hash;
+    }
+
+    /**
+     * Checks whether locker were been locked (lockfile found).
+     *
+     * @return Boolean
+     */
+    public function isLocked()
+    {
+        return $this->lockFile->exists();
+    }
+
+    /**
+     * Checks whether the lock file is still up to date with the current hash
+     *
+     * @return Boolean
+     */
+    public function isFresh()
+    {
+        $lock = $this->lockFile->read();
+
+        return $this->hash === $lock['hash'];
+    }
+
+    /**
+     * Searches and returns an array of locked packages, retrieved from registered repositories.
+     *
+     * @return array
+     */
+    public function getLockedPackages()
+    {
+        $lockList = $this->getLockData();
+        $packages = array();
+        foreach ($lockList['packages'] as $info) {
+            $resolvedVersion = !empty($info['alias']) ? $info['alias'] : $info['version'];
+            $package = $this->repositoryManager->getLocalRepository()->findPackage($info['package'], $resolvedVersion);
+
+            if (!$package) {
+                $package = $this->repositoryManager->findPackage($info['package'], $info['version']);
+                if ($package && !empty($info['alias'])) {
+                    $package = new AliasPackage($package, $info['alias'], $info['alias']);
+                }
+            }
+
+            if (!$package) {
+                throw new \LogicException(sprintf(
+                    'Can not find "%s-%s" package in registered repositories',
+                    $info['package'], $info['version']
+                ));
+            }
+
+            $packages[] = $package;
+        }
+
+        return $packages;
+    }
+
+    public function getAliases()
+    {
+        $lockList = $this->getLockData();
+        return isset($lockList['aliases']) ? $lockList['aliases'] : array();
+    }
+
+    public function getLockData()
+    {
+        if (!$this->isLocked()) {
+            throw new \LogicException('No lockfile found. Unable to read locked packages');
+        }
+
+        if (null !== $this->lockDataCache) {
+            return $this->lockDataCache;
+        }
+
+        return $this->lockDataCache = $this->lockFile->read();
+    }
+
+    /**
+     * Locks provided data into lockfile.
+     *
+     * @param array $packages array of packages
+     * @param array $aliases array of aliases
+     *
+     * @return Boolean
+     */
+    public function setLockData(array $packages, array $aliases)
+    {
+        $lock = array(
+            'hash' => $this->hash,
+            'packages' => array(),
+            'aliases' => $aliases,
+        );
+
+        foreach ($packages as $package) {
+            $name    = $package->getPrettyName();
+            $version = $package->getPrettyVersion();
+
+            if (!$name || !$version) {
+                throw new \LogicException(sprintf(
+                    'Package "%s" has no version or name and can not be locked', $package
+                ));
+            }
+
+            $spec = array('package' => $name, 'version' => $version);
+
+            if ($package->isDev()) {
+                $spec['source-reference'] = $package->getSourceReference();
+            }
+
+            if ($package->getAlias() && $package->isInstalledAsAlias()) {
+                $spec['alias'] = $package->getAlias();
+            }
+
+            $lock['packages'][] = $spec;
+        }
+
+        usort($lock['packages'], function ($a, $b) {
+            return strcmp($a['package'], $b['package']);
+        });
+
+        if (!$this->isLocked() || $lock !== $this->getLockData()) {
+            $this->lockFile->write($lock);
+            $this->lockDataCache = null;
+
+            return true;
+        }
+
+        return false;
+    }
+}
diff --git a/vendor/composer/composer/src/Composer/Package/MemoryPackage.php b/vendor/composer/composer/src/Composer/Package/MemoryPackage.php
new file mode 100644
index 0000000..8944f9b
--- /dev/null
+++ b/vendor/composer/composer/src/Composer/Package/MemoryPackage.php
@@ -0,0 +1,645 @@
+<?php
+
+/*
+ * This file is part of Composer.
+ *
+ * (c) Nils Adermann <naderman@naderman.de>
+ *     Jordi Boggiano <j.boggiano@seld.be>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Composer\Package;
+
+use Composer\Package\Version\VersionParser;
+
+/**
+ * A package with setters for all members to create it dynamically in memory
+ *
+ * @author Nils Adermann <naderman@naderman.de>
+ */
+class MemoryPackage extends BasePackage
+{
+    protected $type;
+    protected $targetDir;
+    protected $installationSource;
+    protected $sourceType;
+    protected $sourceUrl;
+    protected $sourceReference;
+    protected $distType;
+    protected $distUrl;
+    protected $distReference;
+    protected $distSha1Checksum;
+    protected $version;
+    protected $prettyVersion;
+    protected $repositories;
+    protected $license = array();
+    protected $releaseDate;
+    protected $keywords;
+    protected $authors;
+    protected $description;
+    protected $homepage;
+    protected $extra = array();
+    protected $binaries = array();
+    protected $scripts = array();
+    protected $aliases = array();
+    protected $alias;
+    protected $prettyAlias;
+    protected $installedAsAlias;
+    protected $dev;
+
+    protected $requires = array();
+    protected $conflicts = array();
+    protected $provides = array();
+    protected $replaces = array();
+    protected $recommends = array();
+    protected $suggests = array();
+    protected $autoload = array();
+    protected $includePaths = array();
+
+    /**
+     * Creates a new in memory package.
+     *
+     * @param string $name        The package's name
+     * @param string $version     The package's version
+     * @param string $prettyVersion The package's non-normalized version
+     */
+    public function __construct($name, $version, $prettyVersion)
+    {
+        parent::__construct($name);
+
+        $this->version = $version;
+        $this->prettyVersion = $prettyVersion;
+
+        $this->dev = VersionParser::isDev($version);
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public function isDev()
+    {
+        return $this->dev;
+    }
+
+    /**
+     * @param string $type
+     */
+    public function setType($type)
+    {
+        $this->type = $type;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public function getType()
+    {
+        return $this->type ?: 'library';
+    }
+
+    /**
+     * @param string $targetDir
+     */
+    public function setTargetDir($targetDir)
+    {
+        $this->targetDir = $targetDir;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public function getTargetDir()
+    {
+        return $this->targetDir;
+    }
+
+    /**
+     * @param array $extra
+     */
+    public function setExtra(array $extra)
+    {
+        $this->extra = $extra;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public function getExtra()
+    {
+        return $this->extra;
+    }
+
+    /**
+     * @param array $binaries
+     */
+    public function setBinaries(array $binaries)
+    {
+        $this->binaries = $binaries;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public function getBinaries()
+    {
+        return $this->binaries;
+    }
+
+    /**
+     * @param array $scripts
+     */
+    public function setScripts(array $scripts)
+    {
+        $this->scripts = $scripts;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public function getScripts()
+    {
+        return $this->scripts;
+    }
+
+    /**
+     * @param array $aliases
+     */
+    public function setAliases(array $aliases)
+    {
+        $this->aliases = $aliases;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public function getAliases()
+    {
+        return $this->aliases;
+    }
+
+    /**
+     * @param string $alias
+     */
+    public function setAlias($alias)
+    {
+        $this->alias = $alias;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public function getAlias()
+    {
+        return $this->alias;
+    }
+
+    /**
+     * @param string $prettyAlias
+     */
+    public function setPrettyAlias($prettyAlias)
+    {
+        $this->prettyAlias = $prettyAlias;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public function getPrettyAlias()
+    {
+        return $this->prettyAlias;
+    }
+
+    /**
+     * Enabled if the package is installed from its alias package
+     *
+     * @param string $installedAsAlias
+     */
+    public function setInstalledAsAlias($installedAsAlias)
+    {
+        $this->installedAsAlias = $installedAsAlias;
+    }
+
+    /**
+     * @return string
+     */
+    public function isInstalledAsAlias()
+    {
+        return $this->installedAsAlias;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public function setInstallationSource($type)
+    {
+        $this->installationSource = $type;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public function getInstallationSource()
+    {
+        return $this->installationSource;
+    }
+
+    /**
+     * @param string $type
+     */
+    public function setSourceType($type)
+    {
+        $this->sourceType = $type;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public function getSourceType()
+    {
+        return $this->sourceType;
+    }
+
+    /**
+     * @param string $url
+     */
+    public function setSourceUrl($url)
+    {
+        $this->sourceUrl = $url;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public function getSourceUrl()
+    {
+        return $this->sourceUrl;
+    }
+
+    /**
+     * @param string $reference
+     */
+    public function setSourceReference($reference)
+    {
+        $this->sourceReference = $reference;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public function getSourceReference()
+    {
+        return $this->sourceReference;
+    }
+
+    /**
+     * @param string $type
+     */
+    public function setDistType($type)
+    {
+        $this->distType = $type;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public function getDistType()
+    {
+        return $this->distType;
+    }
+
+    /**
+     * @param string $url
+     */
+    public function setDistUrl($url)
+    {
+        $this->distUrl = $url;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public function getDistUrl()
+    {
+        return $this->distUrl;
+    }
+
+    /**
+     * @param string $reference
+     */
+    public function setDistReference($reference)
+    {
+        $this->distReference = $reference;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public function getDistReference()
+    {
+        return $this->distReference;
+    }
+
+    /**
+     * @param string $sha1checksum
+     */
+    public function setDistSha1Checksum($sha1checksum)
+    {
+        $this->distSha1Checksum = $sha1checksum;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public function getDistSha1Checksum()
+    {
+        return $this->distSha1Checksum;
+    }
+
+    /**
+     * Set the repositories
+     *
+     * @param string $repositories
+     */
+    public function setRepositories($repositories)
+    {
+        $this->repositories = $repositories;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public function getRepositories()
+    {
+        return $this->repositories;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public function getVersion()
+    {
+        return $this->version;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public function getPrettyVersion()
+    {
+        return $this->prettyVersion;
+    }
+
+    /**
+     * Set the license
+     *
+     * @param array $license
+     */
+    public function setLicense(array $license)
+    {
+        $this->license = $license;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public function getLicense()
+    {
+        return $this->license;
+    }
+
+    /**
+     * Set the required packages
+     *
+     * @param array $requires A set of package links
+     */
+    public function setRequires(array $requires)
+    {
+        $this->requires = $requires;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public function getRequires()
+    {
+        return $this->requires;
+    }
+
+    /**
+     * Set the conflicting packages
+     *
+     * @param array $conflicts A set of package links
+     */
+    public function setConflicts(array $conflicts)
+    {
+        $this->conflicts = $conflicts;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public function getConflicts()
+    {
+        return $this->conflicts;
+    }
+
+    /**
+     * Set the provided virtual packages
+     *
+     * @param array $provides A set of package links
+     */
+    public function setProvides(array $provides)
+    {
+        $this->provides = $provides;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public function getProvides()
+    {
+        return $this->provides;
+    }
+
+    /**
+     * Set the packages this one replaces
+     *
+     * @param array $replaces A set of package links
+     */
+    public function setReplaces(array $replaces)
+    {
+        $this->replaces = $replaces;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public function getReplaces()
+    {
+        return $this->replaces;
+    }
+
+    /**
+     * Set the recommended packages
+     *
+     * @param array $recommends A set of package links
+     */
+    public function setRecommends(array $recommends)
+    {
+        $this->recommends = $recommends;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public function getRecommends()
+    {
+        return $this->recommends;
+    }
+
+    /**
+     * Set the suggested packages
+     *
+     * @param array $suggests A set of package links
+     */
+    public function setSuggests(array $suggests)
+    {
+        $this->suggests = $suggests;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public function getSuggests()
+    {
+        return $this->suggests;
+    }
+
+    /**
+     * Set the releaseDate
+     *
+     * @param DateTime $releaseDate
+     */
+    public function setReleaseDate(\DateTime $releaseDate)
+    {
+        $this->releaseDate = $releaseDate;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public function getReleaseDate()
+    {
+        return $this->releaseDate;
+    }
+
+    /**
+     * Set the keywords
+     *
+     * @param array $keywords
+     */
+    public function setKeywords(array $keywords)
+    {
+        $this->keywords = $keywords;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public function getKeywords()
+    {
+        return $this->keywords;
+    }
+
+    /**
+     * Set the authors
+     *
+     * @param array $authors
+     */
+    public function setAuthors(array $authors)
+    {
+        $this->authors = $authors;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public function getAuthors()
+    {
+        return $this->authors;
+    }
+
+    /**
+     * Set the description
+     *
+     * @param string $description
+     */
+    public function setDescription($description)
+    {
+        $this->description = $description;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public function getDescription()
+    {
+        return $this->description;
+    }
+
+    /**
+     * Set the homepage
+     *
+     * @param string $homepage
+     */
+    public function setHomepage($homepage)
+    {
+        $this->homepage = $homepage;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public function getHomepage()
+    {
+        return $this->homepage;
+    }
+
+    /**
+     * Set the autoload mapping
+     *
+     * @param array $autoload Mapping of autoloading rules
+     */
+    public function setAutoload(array $autoload)
+    {
+        $this->autoload = $autoload;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public function getAutoload()
+    {
+        return $this->autoload;
+    }
+
+    /**
+     * Sets the list of paths added to PHP's include path.
+     *
+     * @param array $includePaths List of directories.
+     */
+    public function setIncludePaths(array $includePaths)
+    {
+        $this->includePaths = $includePaths;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public function getIncludePaths()
+    {
+        return $this->includePaths;
+    }
+}
diff --git a/vendor/composer/composer/src/Composer/Package/PackageInterface.php b/vendor/composer/composer/src/Composer/Package/PackageInterface.php
new file mode 100644
index 0000000..82a51e8
--- /dev/null
+++ b/vendor/composer/composer/src/Composer/Package/PackageInterface.php
@@ -0,0 +1,354 @@
+<?php
+
+/*
+ * This file is part of Composer.
+ *
+ * (c) Nils Adermann <naderman@naderman.de>
+ *     Jordi Boggiano <j.boggiano@seld.be>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Composer\Package;
+
+use Composer\Package\LinkConstraint\LinkConstraintInterface;
+use Composer\Repository\RepositoryInterface;
+
+/**
+ * @author Nils Adermann <naderman@naderman.de>
+ */
+interface PackageInterface
+{
+    /**
+     * Returns the package's name without version info, thus not a unique identifier
+     *
+     * @return string package name
+     */
+    function getName();
+
+    /**
+     * Returns the package's pretty (i.e. with proper case) name
+     *
+     * @return string package name
+     */
+    function getPrettyName();
+
+    /**
+     * Returns a set of names that could refer to this package
+     *
+     * No version or release type information should be included in any of the
+     * names. Provided or replaced package names need to be returned as well.
+     *
+     * @return array An array of strings referring to this package
+     */
+    function getNames();
+
+    /**
+     * Allows the solver to set an id for this package to refer to it.
+     *
+     * @param int $id
+     */
+    function setId($id);
+
+    /**
+     * Retrieves the package's id set through setId
+     *
+     * @return int The previously set package id
+     */
+    function getId();
+
+    /**
+     * Checks if the package matches the given constraint directly or through
+     * provided or replaced packages
+     *
+     * @param string                  $name       Name of the package to be matched
+     * @param LinkConstraintInterface $constraint The constraint to verify
+     * @return bool                               Whether this package matches the name and constraint
+     */
+    function matches($name, LinkConstraintInterface $constraint);
+
+    /**
+     * Returns whether the package is a development virtual package or a concrete one
+     *
+     * @return Boolean
+     */
+    function isDev();
+
+    /**
+     * Returns the package type, e.g. library
+     *
+     * @return string The package type
+     */
+    function getType();
+
+    /**
+     * Returns the package targetDir property
+     *
+     * @return string The package targetDir
+     */
+    function getTargetDir();
+
+    /**
+     * Returns the package extra data
+     *
+     * @return array The package extra data
+     */
+    function getExtra();
+
+    /**
+     * Sets source from which this package was installed (source/dist).
+     *
+     * @param   string  $type   source/dist
+     */
+    function setInstallationSource($type);
+
+    /**
+     * Returns source from which this package was installed (source/dist).
+     *
+     * @param   string  $type   source/dist
+     */
+    function getInstallationSource();
+
+    /**
+     * Returns the repository type of this package, e.g. git, svn
+     *
+     * @return string The repository type
+     */
+    function getSourceType();
+
+    /**
+     * Returns the repository url of this package, e.g. git://github.com/naderman/composer.git
+     *
+     * @return string The repository url
+     */
+    function getSourceUrl();
+
+    /**
+     * Returns the repository reference of this package, e.g. master, 1.0.0 or a commit hash for git
+     *
+     * @return string The repository reference
+     */
+    function getSourceReference();
+
+    /**
+     * Returns the type of the distribution archive of this version, e.g. zip, tarball
+     *
+     * @return string The repository type
+     */
+    function getDistType();
+
+    /**
+     * Returns the url of the distribution archive of this version
+     *
+     * @return string
+     */
+    function getDistUrl();
+
+    /**
+     * Returns the reference of the distribution archive of this version, e.g. master, 1.0.0 or a commit hash for git
+     *
+     * @return string
+     */
+    function getDistReference();
+
+    /**
+     * Returns the sha1 checksum for the distribution archive of this version
+     *
+     * @return string
+     */
+    function getDistSha1Checksum();
+
+    /**
+     * Returns the scripts of this package
+     *
+     * @return array array('script name' => array('listeners'))
+     */
+    function getScripts();
+
+    /**
+     * Returns the version of this package
+     *
+     * @return string version
+     */
+    function getVersion();
+
+    /**
+     * Returns the pretty (i.e. non-normalized) version string of this package
+     *
+     * @return string version
+     */
+    function getPrettyVersion();
+
+    /**
+     * Returns the package license, e.g. MIT, BSD, GPL
+     *
+     * @return array The package licenses
+     */
+    function getLicense();
+
+    /**
+     * Returns a set of links to packages which need to be installed before
+     * this package can be installed
+     *
+     * @return array An array of package links defining required packages
+     */
+    function getRequires();
+
+    /**
+     * Returns a set of links to packages which must not be installed at the
+     * same time as this package
+     *
+     * @return array An array of package links defining conflicting packages
+     */
+    function getConflicts();
+
+    /**
+     * Returns a set of links to virtual packages that are provided through
+     * this package
+     *
+     * @return array An array of package links defining provided packages
+     */
+    function getProvides();
+
+    /**
+     * Returns a set of links to packages which can alternatively be
+     * satisfied by installing this package
+     *
+     * @return array An array of package links defining replaced packages
+     */
+    function getReplaces();
+
+    /**
+     * Returns a set of links to packages which are recommended in
+     * combination with this package. These would most likely be installed
+     * automatically in combination with this package.
+     *
+     * @return array An array of package links defining recommended packages
+     */
+    function getRecommends();
+
+    /**
+     * Returns a set of links to packages which are suggested in combination
+     * with this package. These can be suggested to the user, but will not be
+     * automatically installed with this package.
+     *
+     * @return array An array of package links defining suggested packages
+     */
+    function getSuggests();
+
+    /**
+     * Returns an associative array of autoloading rules
+     *
+     * {"<type>": {"<namespace": "<directory>"}}
+     *
+     * Type is either "psr-0" or "pear". Namespaces are mapped to directories
+     * for autoloading using the type specified.
+     *
+     * @return array Mapping of autoloading rules
+     */
+    function getAutoload();
+
+    /**
+     * Returns a list of directories which should get added to PHP's
+     * include path.
+     *
+     * @return array
+     */
+    function getIncludePaths();
+
+    /**
+     * Returns an array of repositories
+     *
+     * {"<type>": {<config key/values>}}
+     *
+     * @return array Repositories
+     */
+    function getRepositories();
+
+    /**
+     * Stores a reference to the repository that owns the package
+     *
+     * @param RepositoryInterface $repository
+     */
+    function setRepository(RepositoryInterface $repository);
+
+    /**
+     * Returns a reference to the repository that owns the package
+     *
+     * @return RepositoryInterface
+     */
+    function getRepository();
+
+    /**
+     * Returns the release date of the package
+     *
+     * @return DateTime
+     */
+    function getReleaseDate();
+
+    /**
+     * Returns an array of keywords relating to the package
+     *
+     * @return array
+     */
+    function getKeywords();
+
+    /**
+     * Returns the package description
+     *
+     * @return string
+     */
+    function getDescription();
+
+    /**
+     * Returns the package binaries
+     *
+     * @return array
+     */
+    function getBinaries();
+
+    /**
+     * Returns the package homepage
+     *
+     * @return string
+     */
+    function getHomepage();
+
+    /**
+     * Returns an array of authors of the package
+     *
+     * Each item can contain name/homepage/email keys
+     *
+     * @return array
+     */
+    function getAuthors();
+
+    /**
+     * Returns a version this package should be aliased to
+     *
+     * @return string
+     */
+    function getAlias();
+
+    /**
+     * Returns a non-normalized version this package should be aliased to
+     *
+     * @return string
+     */
+    function getPrettyAlias();
+
+    /**
+     * Returns package unique name, constructed from name and version.
+     *
+     * @return string
+     */
+    function getUniqueName();
+
+    /**
+     * Converts the package into a readable and unique string
+     *
+     * @return string
+     */
+    function __toString();
+}
diff --git a/vendor/composer/composer/src/Composer/Package/Version/VersionParser.php b/vendor/composer/composer/src/Composer/Package/Version/VersionParser.php
new file mode 100644
index 0000000..0329514
--- /dev/null
+++ b/vendor/composer/composer/src/Composer/Package/Version/VersionParser.php
@@ -0,0 +1,197 @@
+<?php
+
+/*
+ * This file is part of Composer.
+ *
+ * (c) Nils Adermann <naderman@naderman.de>
+ *     Jordi Boggiano <j.boggiano@seld.be>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Composer\Package\Version;
+
+use Composer\Package\LinkConstraint\MultiConstraint;
+use Composer\Package\LinkConstraint\VersionConstraint;
+
+/**
+ * Version parser
+ *
+ * @author Jordi Boggiano <j.boggiano@seld.be>
+ */
+class VersionParser
+{
+    private $modifierRegex = '[.-]?(?:(beta|RC|alpha|patch|pl|p)(?:[.-]?(\d+))?)?([.-]?dev)?';
+
+    /**
+     * Checks if a version is dev or not
+     *
+     * @param string $version
+     * @return Boolean
+     */
+    static public function isDev($version)
+    {
+        return 'dev-' === substr($version, 0, 4) || '-dev' === substr($version, -4);
+    }
+
+    /**
+     * Normalizes a version string to be able to perform comparisons on it
+     *
+     * @param string $version
+     * @return array
+     */
+    public function normalize($version)
+    {
+        $version = trim($version);
+
+        // ignore aliases and just assume the alias is required instead of the source
+        if (preg_match('{^([^,\s]+) +as +([^,\s]+)$}', $version, $match)) {
+            $version = $match[2];
+        }
+
+        // match master-like branches
+        if (preg_match('{^(?:dev-)?(?:master|trunk|default)$}i', $version)) {
+            return '9999999-dev';
+        }
+
+        if ('dev-' === strtolower(substr($version, 0, 4))) {
+            return strtolower($version);
+        }
+
+        // match classical versioning
+        if (preg_match('{^v?(\d{1,3})(\.\d+)?(\.\d+)?(\.\d+)?'.$this->modifierRegex.'$}i', $version, $matches)) {
+            $version = $matches[1]
+                .(!empty($matches[2]) ? $matches[2] : '.0')
+                .(!empty($matches[3]) ? $matches[3] : '.0')
+                .(!empty($matches[4]) ? $matches[4] : '.0');
+            $index = 5;
+        } elseif (preg_match('{^v?(\d{4}(?:[.:-]?\d{2}){1,6}(?:[.:-]?\d{1,3})?)'.$this->modifierRegex.'$}i', $version, $matches)) { // match date-based versioning
+            $version = preg_replace('{\D}', '-', $matches[1]);
+            $index = 2;
+        }
+
+        // add version modifiers if a version was matched
+        if (isset($index)) {
+            if (!empty($matches[$index])) {
+                $mod = array('{^pl?$}i', '{^rc$}i');
+                $modNormalized = array('patch', 'RC');
+                $version .= '-'.preg_replace($mod, $modNormalized, strtolower($matches[$index]))
+                    . (!empty($matches[$index+1]) ? $matches[$index+1] : '');
+            }
+
+            if (!empty($matches[$index+2])) {
+                $version .= '-dev';
+            }
+
+            return $version;
+        }
+
+        if (preg_match('{(.*?)[.-]?dev$}i', $version, $match)) {
+            try {
+                return $this->normalizeBranch($match[1]);
+            } catch (\Exception $e) {}
+        }
+
+        throw new \UnexpectedValueException('Invalid version string '.$version);
+    }
+
+    /**
+     * Normalizes a branch name to be able to perform comparisons on it
+     *
+     * @param string $version
+     * @return array
+     */
+    public function normalizeBranch($name)
+    {
+        $name = trim($name);
+
+        if (in_array($name, array('master', 'trunk', 'default'))) {
+            return $this->normalize($name);
+        }
+
+        if (preg_match('#^v?(\d+)(\.(?:\d+|[x*]))?(\.(?:\d+|[x*]))?(\.(?:\d+|[x*]))?$#i', $name, $matches)) {
+            $version = '';
+            for ($i = 1; $i < 5; $i++) {
+                $version .= isset($matches[$i]) ? str_replace('*', 'x', $matches[$i]) : '.x';
+            }
+            return str_replace('x', '9999999', $version).'-dev';
+        }
+
+        return 'dev-'.$name;
+    }
+
+    /**
+     * Parses as constraint string into LinkConstraint objects
+     *
+     * @param string $constraints
+     * @return \Composer\Package\LinkConstraint\LinkConstraintInterface
+     */
+    public function parseConstraints($constraints)
+    {
+        $constraints = preg_split('{\s*,\s*}', trim($constraints));
+
+        if (count($constraints) > 1) {
+            $constraintObjects = array();
+            foreach ($constraints as $constraint) {
+                $constraintObjects = array_merge($constraintObjects, $this->parseConstraint($constraint));
+            }
+        } else {
+            $constraintObjects = $this->parseConstraint($constraints[0]);
+        }
+
+        if (1 === count($constraintObjects)) {
+            return $constraintObjects[0];
+        }
+
+        return new MultiConstraint($constraintObjects);
+    }
+
+    private function parseConstraint($constraint)
+    {
+        if (preg_match('{^[x*](\.[x*])*$}i', $constraint)) {
+            return array();
+        }
+
+        // match wildcard constraints
+        if (preg_match('{^(\d+)(?:\.(\d+))?(?:\.(\d+))?\.[x*]$}', $constraint, $matches)) {
+            if (isset($matches[3])) {
+                $highVersion = $matches[1] . '.' . $matches[2] . '.' . $matches[3] . '.9999999';
+                if ($matches[3] === '0') {
+                    $lowVersion = $matches[1] . '.' . ($matches[2] - 1) . '.9999999.9999999';
+                } else {
+                    $lowVersion = $matches[1] . '.' . $matches[2] . '.' . ($matches[3] - 1). '.9999999';
+                }
+            } elseif (isset($matches[2])) {
+                $highVersion = $matches[1] . '.' . $matches[2] . '.9999999.9999999';
+                if ($matches[2] === '0') {
+                    $lowVersion = ($matches[1] - 1) . '.9999999.9999999.9999999';
+                } else {
+                    $lowVersion = $matches[1] . '.' . ($matches[2] - 1) . '.9999999.9999999';
+                }
+            } else {
+                $highVersion = $matches[1] . '.9999999.9999999.9999999';
+                if ($matches[1] === '0') {
+                    return array(new VersionConstraint('<', $highVersion));
+                } else {
+                    $lowVersion = ($matches[1] - 1) . '.9999999.9999999.9999999';
+                }
+            }
+
+            return array(
+                new VersionConstraint('>', $lowVersion),
+                new VersionConstraint('<', $highVersion),
+            );
+        }
+
+        // match operators constraints
+        if (preg_match('{^(>=?|<=?|==?)?\s*(.*)}', $constraint, $matches)) {
+            try {
+                $version = $this->normalize($matches[2]);
+                return array(new VersionConstraint($matches[1] ?: '=', $version));
+            } catch (\Exception $e) {}
+        }
+
+        throw new \UnexpectedValueException('Could not parse version constraint '.$constraint);
+    }
+}
diff --git a/vendor/composer/composer/src/Composer/Repository/ArrayRepository.php b/vendor/composer/composer/src/Composer/Repository/ArrayRepository.php
new file mode 100644
index 0000000..1af73d3
--- /dev/null
+++ b/vendor/composer/composer/src/Composer/Repository/ArrayRepository.php
@@ -0,0 +1,156 @@
+<?php
+
+/*
+ * This file is part of Composer.
+ *
+ * (c) Nils Adermann <naderman@naderman.de>
+ *     Jordi Boggiano <j.boggiano@seld.be>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Composer\Repository;
+
+use Composer\Package\AliasPackage;
+use Composer\Package\PackageInterface;
+use Composer\Package\Version\VersionParser;
+
+/**
+ * A repository implementation that simply stores packages in an array
+ *
+ * @author Nils Adermann <naderman@naderman.de>
+ */
+class ArrayRepository implements RepositoryInterface
+{
+    protected $packages;
+
+    /**
+     * {@inheritDoc}
+     */
+    public function findPackage($name, $version)
+    {
+        // normalize version & name
+        $versionParser = new VersionParser();
+        $version = $versionParser->normalize($version);
+        $name = strtolower($name);
+
+        foreach ($this->getPackages() as $package) {
+            if ($name === $package->getName() && $version === $package->getVersion()) {
+                return $package;
+            }
+        }
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public function findPackages($name, $version = null)
+    {
+        // normalize name
+        $name = strtolower($name);
+
+        // normalize version
+        if (null !== $version) {
+            $versionParser = new VersionParser();
+            $version = $versionParser->normalize($version);
+        }
+
+        $packages = array();
+
+        foreach ($this->getPackages() as $package) {
+            if ($package->getName() === $name && (null === $version || $version === $package->getVersion())) {
+                $packages[] = $package;
+            }
+        }
+
+        return $packages;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public function hasPackage(PackageInterface $package)
+    {
+        $packageId = $package->getUniqueName();
+
+        foreach ($this->getPackages() as $repoPackage) {
+            if ($packageId === $repoPackage->getUniqueName()) {
+                return true;
+            }
+        }
+
+        return false;
+    }
+
+    /**
+     * Adds a new package to the repository
+     *
+     * @param PackageInterface $package
+     */
+    public function addPackage(PackageInterface $package)
+    {
+        if (null === $this->packages) {
+            $this->initialize();
+        }
+        $package->setRepository($this);
+        $this->packages[] = $package;
+
+        // create alias package on the fly if needed (installed repos manage aliases themselves)
+        if ($package->getAlias() && !$this instanceof InstalledRepositoryInterface) {
+            $this->addPackage($this->createAliasPackage($package));
+        }
+    }
+
+    protected function createAliasPackage(PackageInterface $package, $alias = null, $prettyAlias = null)
+    {
+        return new AliasPackage($package, $alias ?: $package->getAlias(), $prettyAlias ?: $package->getPrettyAlias());
+    }
+
+    /**
+     * Removes package from repository.
+     *
+     * @param   PackageInterface    $package    package instance
+     */
+    public function removePackage(PackageInterface $package)
+    {
+        $packageId = $package->getUniqueName();
+
+        foreach ($this->getPackages() as $key => $repoPackage) {
+            if ($packageId === $repoPackage->getUniqueName()) {
+                array_splice($this->packages, $key, 1);
+
+                return;
+            }
+        }
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public function getPackages()
+    {
+        if (null === $this->packages) {
+            $this->initialize();
+        }
+        return $this->packages;
+    }
+
+    /**
+     * Returns the number of packages in this repository
+     *
+     * @return int Number of packages
+     */
+    public function count()
+    {
+        return count($this->packages);
+    }
+
+    /**
+     * Initializes the packages array. Mostly meant as an extension point.
+     */
+    protected function initialize()
+    {
+        $this->packages = array();
+    }
+}
diff --git a/vendor/composer/composer/src/Composer/Repository/ComposerRepository.php b/vendor/composer/composer/src/Composer/Repository/ComposerRepository.php
new file mode 100644
index 0000000..9778f29
--- /dev/null
+++ b/vendor/composer/composer/src/Composer/Repository/ComposerRepository.php
@@ -0,0 +1,104 @@
+<?php
+
+/*
+ * This file is part of Composer.
+ *
+ * (c) Nils Adermann <naderman@naderman.de>
+ *     Jordi Boggiano <j.boggiano@seld.be>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Composer\Repository;
+
+use Composer\Package\Loader\ArrayLoader;
+use Composer\Package\LinkConstraint\VersionConstraint;
+use Composer\Json\JsonFile;
+use Composer\Cache;
+use Composer\Config;
+use Composer\IO\IOInterface;
+use Composer\Util\RemoteFilesystem;
+
+/**
+ * @author Jordi Boggiano <j.boggiano@seld.be>
+ */
+class ComposerRepository extends ArrayRepository
+{
+    protected $url;
+    protected $io;
+    protected $packages;
+    protected $cache;
+
+    public function __construct(array $repoConfig, IOInterface $io, Config $config)
+    {
+        if (!preg_match('{^\w+://}', $repoConfig['url'])) {
+            // assume http as the default protocol
+            $repoConfig['url'] = 'http://'.$repoConfig['url'];
+        }
+        $repoConfig['url'] = rtrim($repoConfig['url'], '/');
+        if (function_exists('filter_var') && !filter_var($repoConfig['url'], FILTER_VALIDATE_URL)) {
+            throw new \UnexpectedValueException('Invalid url given for Composer repository: '.$repoConfig['url']);
+        }
+
+        $this->url = $repoConfig['url'];
+        $this->io = $io;
+        $this->cache = new Cache($io, $config->get('home').'/cache/'.preg_replace('{[^a-z0-9.]}', '-', $this->url));
+    }
+
+    protected function initialize()
+    {
+        parent::initialize();
+
+        try {
+            $json = new JsonFile($this->url.'/packages.json', new RemoteFilesystem($this->io));
+            $data = $json->read();
+            $this->cache->write('packages.json', json_encode($data));
+        } catch (\Exception $e) {
+            if ($contents = $this->cache->read('packages.json')) {
+                $this->io->write('<warning>'.$this->url.' could not be loaded, package information was loaded from the local cache and may be out of date</warning>');
+                $data = json_decode($contents, true);
+            } else {
+                throw $e;
+            }
+        }
+
+        $loader = new ArrayLoader();
+        $this->loadRepository($loader, $data);
+    }
+
+    protected function loadRepository(ArrayLoader $loader, $data)
+    {
+        // legacy repo handling
+        if (!isset($data['packages']) && !isset($data['includes'])) {
+            foreach ($data as $pkg) {
+                foreach ($pkg['versions'] as $metadata) {
+                    $this->addPackage($loader->load($metadata));
+                }
+            }
+
+            return;
+        }
+
+        if (isset($data['packages'])) {
+            foreach ($data['packages'] as $package => $versions) {
+                foreach ($versions as $version => $metadata) {
+                    $this->addPackage($loader->load($metadata));
+                }
+            }
+        }
+
+        if (isset($data['includes'])) {
+            foreach ($data['includes'] as $include => $metadata) {
+                if ($this->cache->sha1($include) === $metadata['sha1']) {
+                    $includedData = json_decode($this->cache->read($include), true);
+                } else {
+                    $json = new JsonFile($this->url.'/'.$include, new RemoteFilesystem($this->io));
+                    $includedData = $json->read();
+                    $this->cache->write($include, json_encode($includedData));
+                }
+                $this->loadRepository($loader, $includedData);
+            }
+        }
+    }
+}
diff --git a/vendor/composer/composer/src/Composer/Repository/CompositeRepository.php b/vendor/composer/composer/src/Composer/Repository/CompositeRepository.php
new file mode 100644
index 0000000..e000d97
--- /dev/null
+++ b/vendor/composer/composer/src/Composer/Repository/CompositeRepository.php
@@ -0,0 +1,115 @@
+<?php
+
+/*
+ * This file is part of Composer.
+ *
+ * (c) Nils Adermann <naderman@naderman.de>
+ *     Jordi Boggiano <j.boggiano@seld.be>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Composer\Repository;
+
+use Composer\Package\PackageInterface;
+
+/**
+ * Composite repository.
+ *
+ * @author Beau Simensen <beau@dflydev.com>
+ */
+class CompositeRepository implements RepositoryInterface
+{
+    /**
+     * List of repositories
+     * @var array
+     */
+    private $repositories;
+
+    /**
+     * Constructor
+     * @param array $repositories
+     */
+    public function __construct(array $repositories)
+    {
+        $this->repositories = $repositories;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function hasPackage(PackageInterface $package)
+    {
+        foreach ($this->repositories as $repository) {
+            /* @var $repository RepositoryInterface */
+            if ($repository->hasPackage($package)) {
+                return true;
+            }
+        }
+        return false;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function findPackage($name, $version)
+    {
+        foreach ($this->repositories as $repository) {
+            /* @var $repository RepositoryInterface */
+            $package = $repository->findPackage($name, $version);
+            if (null !== $package) {
+                return $package;
+            }
+        }
+        return null;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function findPackages($name, $version = null)
+    {
+        $packages = array();
+        foreach ($this->repositories as $repository) {
+            /* @var $repository RepositoryInterface */
+            $packages[] = $repository->findPackages($name, $version);
+        }
+        return call_user_func_array('array_merge', $packages);
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getPackages()
+    {
+        $packages = array();
+        foreach ($this->repositories as $repository) {
+            /* @var $repository RepositoryInterface */
+            $packages[] = $repository->getPackages();
+        }
+        return call_user_func_array('array_merge', $packages);
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function count()
+    {
+        $total = 0;
+        foreach ($this->repositories as $repository) {
+            /* @var $repository RepositoryInterface */
+            $total += $repository->count();
+        }
+        return $total;
+    }
+
+    /**
+     * Add a repository.
+     * @param RepositoryInterface $repository
+     */
+    public function addRepository(RepositoryInterface $repository)
+    {
+        $this->repositories[] = $repository;
+    }
+}
\ No newline at end of file
diff --git a/vendor/composer/composer/src/Composer/Repository/FilesystemRepository.php b/vendor/composer/composer/src/Composer/Repository/FilesystemRepository.php
new file mode 100644
index 0000000..95cb11b
--- /dev/null
+++ b/vendor/composer/composer/src/Composer/Repository/FilesystemRepository.php
@@ -0,0 +1,91 @@
+<?php
+
+/*
+ * This file is part of Composer.
+ *
+ * (c) Nils Adermann <naderman@naderman.de>
+ *     Jordi Boggiano <j.boggiano@seld.be>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Composer\Repository;
+
+use Composer\Json\JsonFile;
+use Composer\Package\PackageInterface;
+use Composer\Package\Loader\ArrayLoader;
+use Composer\Package\Dumper\ArrayDumper;
+
+/**
+ * Filesystem repository.
+ *
+ * @author Konstantin Kudryashov <ever.zet@gmail.com>
+ */
+class FilesystemRepository extends ArrayRepository implements WritableRepositoryInterface
+{
+    private $file;
+
+    /**
+     * Initializes filesystem repository.
+     *
+     * @param   JsonFile    $repositoryFile repository json file
+     */
+    public function __construct(JsonFile $repositoryFile)
+    {
+        $this->file = $repositoryFile;
+    }
+
+    /**
+     * Initializes repository (reads file, or remote address).
+     */
+    protected function initialize()
+    {
+        parent::initialize();
+
+        if (!$this->file->exists()) {
+            return;
+        }
+
+        $packages = $this->file->read();
+
+        if (!is_array($packages)) {
+            throw new \UnexpectedValueException('Could not parse package list from the '.$this->file->getPath().' repository');
+        }
+
+        $loader = new ArrayLoader();
+        foreach ($packages as $packageData) {
+            $package = $loader->load($packageData);
+
+            // package was installed as alias, so we only add the alias
+            if ($this instanceof InstalledRepositoryInterface && !empty($packageData['installed-as-alias'])) {
+                $alias = $packageData['installed-as-alias'];
+                $package->setAlias($alias);
+                $package->setPrettyAlias($alias);
+                $package->setInstalledAsAlias(true);
+                $this->addPackage($this->createAliasPackage($package, $alias, $alias));
+            } else {
+                // only add regular package - if it's not an installed repo the alias will be created on the fly
+                $this->addPackage($package);
+            }
+        }
+    }
+
+    /**
+     * Writes writable repository.
+     */
+    public function write()
+    {
+        $packages = array();
+        $dumper   = new ArrayDumper();
+        foreach ($this->getPackages() as $package) {
+            $data = $dumper->dump($package);
+            if ($this instanceof InstalledRepositoryInterface && $package->isInstalledAsAlias()) {
+                $data['installed-as-alias'] = $package->getAlias();
+            }
+            $packages[] = $data;
+        }
+
+        $this->file->write($packages);
+    }
+}
diff --git a/vendor/composer/composer/src/Composer/Repository/InstalledFilesystemRepository.php b/vendor/composer/composer/src/Composer/Repository/InstalledFilesystemRepository.php
new file mode 100644
index 0000000..7bb70d6
--- /dev/null
+++ b/vendor/composer/composer/src/Composer/Repository/InstalledFilesystemRepository.php
@@ -0,0 +1,27 @@
+<?php
+
+/*
+ * This file is part of Composer.
+ *
+ * (c) Nils Adermann <naderman@naderman.de>
+ *     Jordi Boggiano <j.boggiano@seld.be>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Composer\Repository;
+
+use Composer\Json\JsonFile;
+use Composer\Package\PackageInterface;
+use Composer\Package\Loader\ArrayLoader;
+use Composer\Package\Dumper\ArrayDumper;
+
+/**
+ * Installed filesystem repository.
+ *
+ * @author Jordi Boggiano <j.boggiano@seld.be>
+ */
+class InstalledFilesystemRepository extends FilesystemRepository implements InstalledRepositoryInterface
+{
+}
diff --git a/vendor/composer/composer/src/Composer/Repository/InstalledRepositoryInterface.php b/vendor/composer/composer/src/Composer/Repository/InstalledRepositoryInterface.php
new file mode 100644
index 0000000..de71d23
--- /dev/null
+++ b/vendor/composer/composer/src/Composer/Repository/InstalledRepositoryInterface.php
@@ -0,0 +1,26 @@
+<?php
+
+/*
+ * This file is part of Composer.
+ *
+ * (c) Nils Adermann <naderman@naderman.de>
+ *     Jordi Boggiano <j.boggiano@seld.be>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Composer\Repository;
+
+use Composer\Package\PackageInterface;
+
+/**
+ * Installable repository interface.
+ *
+ * Just used to tag installed repositories so the base classes can act differently on Alias packages
+ *
+ * @author Jordi Boggiano <j.boggiano@seld.be>
+ */
+interface InstalledRepositoryInterface
+{
+}
diff --git a/vendor/composer/composer/src/Composer/Repository/PackageRepository.php b/vendor/composer/composer/src/Composer/Repository/PackageRepository.php
new file mode 100644
index 0000000..0bace24
--- /dev/null
+++ b/vendor/composer/composer/src/Composer/Repository/PackageRepository.php
@@ -0,0 +1,57 @@
+<?php
+
+/*
+ * This file is part of Composer.
+ *
+ * (c) Nils Adermann <naderman@naderman.de>
+ *     Jordi Boggiano <j.boggiano@seld.be>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Composer\Repository;
+
+use Composer\Json\JsonFile;
+use Composer\Package\PackageInterface;
+use Composer\Package\Loader\ArrayLoader;
+use Composer\Package\Dumper\ArrayDumper;
+
+/**
+ * Package repository.
+ *
+ * @author Jordi Boggiano <j.boggiano@seld.be>
+ */
+class PackageRepository extends ArrayRepository
+{
+    private $config;
+
+    /**
+     * Initializes filesystem repository.
+     *
+     * @param array $config package definition
+     */
+    public function __construct(array $config)
+    {
+        $this->config = $config['package'];
+
+        // make sure we have an array of package definitions
+        if (!is_numeric(key($this->config))) {
+            $this->config = array($this->config);
+        }
+    }
+
+    /**
+     * Initializes repository (reads file, or remote address).
+     */
+    protected function initialize()
+    {
+        parent::initialize();
+
+        $loader = new ArrayLoader();
+        foreach ($this->config as $package) {
+            $package = $loader->load($package);
+            $this->addPackage($package);
+        }
+    }
+}
diff --git a/vendor/composer/composer/src/Composer/Repository/PearRepository.php b/vendor/composer/composer/src/Composer/Repository/PearRepository.php
new file mode 100644
index 0000000..9c4bf7b
--- /dev/null
+++ b/vendor/composer/composer/src/Composer/Repository/PearRepository.php
@@ -0,0 +1,380 @@
+<?php
+
+/*
+ * This file is part of Composer.
+ *
+ * (c) Nils Adermann <naderman@naderman.de>
+ *     Jordi Boggiano <j.boggiano@seld.be>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Composer\Repository;
+
+use Composer\IO\IOInterface;
+use Composer\Package\Loader\ArrayLoader;
+use Composer\Util\RemoteFilesystem;
+use Composer\Json\JsonFile;
+use Composer\Config;
+use Composer\Downloader\TransportException;
+
+/**
+ * @author Benjamin Eberlei <kontakt@beberlei.de>
+ * @author Jordi Boggiano <j.boggiano@seld.be>
+ */
+class PearRepository extends ArrayRepository
+{
+    private static $channelNames = array();
+
+    private $url;
+    private $channel;
+    private $io;
+    private $rfs;
+
+    public function __construct(array $repoConfig, IOInterface $io, Config $config, RemoteFilesystem $rfs = null)
+    {
+        if (!preg_match('{^https?://}', $repoConfig['url'])) {
+            $repoConfig['url'] = 'http://'.$repoConfig['url'];
+        }
+
+        if (function_exists('filter_var') && !filter_var($repoConfig['url'], FILTER_VALIDATE_URL)) {
+            throw new \UnexpectedValueException('Invalid url given for PEAR repository: '.$repoConfig['url']);
+        }
+
+        $this->url = rtrim($repoConfig['url'], '/');
+        $this->channel = !empty($repoConfig['channel']) ? $repoConfig['channel'] : null;
+        $this->io = $io;
+        $this->rfs = $rfs ?: new RemoteFilesystem($this->io);
+    }
+
+    protected function initialize()
+    {
+        parent::initialize();
+
+        $this->io->write('Initializing PEAR repository '.$this->url);
+        $this->initializeChannel();
+        $this->io->write('Packages names will be prefixed with: pear-'.$this->channel.'/');
+
+        // try to load as a composer repo
+        try {
+            $json     = new JsonFile($this->url.'/packages.json', new RemoteFilesystem($this->io));
+            $packages = $json->read();
+
+            if ($this->io->isVerbose()) {
+                $this->io->write('Repository is Composer-compatible, loading via packages.json instead of PEAR protocol');
+            }
+
+            $loader = new ArrayLoader();
+            foreach ($packages as $data) {
+                foreach ($data['versions'] as $rev) {
+                    $rev['name'] = 'pear-'.$this->channel.'/'.$rev['name'];
+                    $this->addPackage($loader->load($rev));
+                }
+            }
+
+            return;
+        } catch (\Exception $e) {
+        }
+
+        $this->fetchFromServer();
+    }
+
+    protected function initializeChannel()
+    {
+        $channelXML = $this->requestXml($this->url . "/channel.xml");
+        if (!$this->channel) {
+            $this->channel = $channelXML->getElementsByTagName("suggestedalias")->item(0)->nodeValue
+                                    ?: $channelXML->getElementsByTagName("name")->item(0)->nodeValue;
+        }
+
+        self::$channelNames[$channelXML->getElementsByTagName("name")->item(0)->nodeValue] = $this->channel;
+    }
+
+    protected function fetchFromServer()
+    {
+        $categoryXML = $this->requestXml($this->url . "/rest/c/categories.xml");
+        $categories = $categoryXML->getElementsByTagName("c");
+
+        foreach ($categories as $category) {
+            $link = '/' . ltrim($category->getAttribute("xlink:href"), '/');
+            try {
+                $packagesLink = str_replace("info.xml", "packagesinfo.xml", $link);
+                $this->fetchPear2Packages($this->url . $packagesLink);
+            } catch (TransportException $e) {
+                if (false === strpos($e->getMessage(), '404')) {
+                    throw $e;
+                }
+                $categoryLink = str_replace("info.xml", "packages.xml", $link);
+                $this->fetchPearPackages($this->url . $categoryLink);
+            }
+
+        }
+    }
+
+    /**
+     * @param   string $categoryLink
+     * @throws  TransportException
+     * @throws  InvalidArgumentException
+     */
+    private function fetchPearPackages($categoryLink)
+    {
+        $packagesXML = $this->requestXml($categoryLink);
+        $packages = $packagesXML->getElementsByTagName('p');
+        $loader = new ArrayLoader();
+        foreach ($packages as $package) {
+            $packageName = $package->nodeValue;
+            $fullName = 'pear-'.$this->channel.'/'.$packageName;
+
+            $packageLink = $package->getAttribute('xlink:href');
+            $releaseLink = $this->url . str_replace("/rest/p/", "/rest/r/", $packageLink);
+            $allReleasesLink = $releaseLink . "/allreleases2.xml";
+
+            try {
+                $releasesXML = $this->requestXml($allReleasesLink);
+            } catch (TransportException $e) {
+                if (strpos($e->getMessage(), '404')) {
+                    continue;
+                }
+                throw $e;
+            }
+
+            $releases = $releasesXML->getElementsByTagName('r');
+
+            foreach ($releases as $release) {
+                /* @var $release \DOMElement */
+                $pearVersion = $release->getElementsByTagName('v')->item(0)->nodeValue;
+
+                $packageData = array(
+                    'name' => $fullName,
+                    'type' => 'library',
+                    'dist' => array('type' => 'pear', 'url' => $this->url.'/get/'.$packageName.'-'.$pearVersion.".tgz"),
+                    'version' => $pearVersion,
+                    'autoload' => array(
+                        'classmap' => array(''),
+                    ),
+                );
+
+                try {
+                    $deps = $this->rfs->getContents($this->url, $releaseLink . "/deps.".$pearVersion.".txt", false);
+                } catch (TransportException $e) {
+                    if (strpos($e->getMessage(), '404')) {
+                        continue;
+                    }
+                    throw $e;
+                }
+
+                $packageData += $this->parseDependencies($deps);
+
+                try {
+                    $this->addPackage($loader->load($packageData));
+                    if ($this->io->isVerbose()) {
+                        $this->io->write('Loaded '.$packageData['name'].' '.$packageData['version']);
+                    }
+                } catch (\UnexpectedValueException $e) {
+                    if ($this->io->isVerbose()) {
+                        $this->io->write('Could not load '.$packageData['name'].' '.$packageData['version'].': '.$e->getMessage());
+                    }
+                    continue;
+                }
+            }
+        }
+    }
+
+    /**
+     * @param   array $data
+     * @return  string
+     */
+    private function parseVersion(array $data)
+    {
+        if (!isset($data['min']) && !isset($data['max'])) {
+            return '*';
+        }
+        $versions = array();
+        if (isset($data['min'])) {
+            $versions[] = '>=' . $data['min'];
+        }
+        if (isset($data['max'])) {
+            $versions[] = '<=' . $data['max'];
+        }
+        return implode(',', $versions);
+    }
+
+    /**
+     * @todo    Improve dependencies resolution of pear packages.
+     * @param   array $options
+     * @return  array
+     */
+    private function parseDependenciesOptions(array $depsOptions)
+    {
+        $data = array();
+        foreach ($depsOptions as $name => $options) {
+            // make sure single deps are wrapped in an array
+            if (isset($options['name'])) {
+                $options = array($options);
+            }
+            if ('php' == $name) {
+                $data[$name] = $this->parseVersion($options);
+            } elseif ('package' == $name) {
+                foreach ($options as $key => $value) {
+                    if (isset($value['providesextension'])) {
+                        // skip PECL dependencies
+                        continue;
+                    }
+                    if (isset($value['uri'])) {
+                        // skip uri-based dependencies
+                        continue;
+                    }
+
+                    if (is_array($value)) {
+                        $dataKey = $value['name'];
+                        if (false === strpos($dataKey, '/')) {
+                            $dataKey = $this->getChannelShorthand($value['channel']).'/'.$dataKey;
+                        }
+                        $data['pear-'.$dataKey] = $this->parseVersion($value);
+                    }
+                }
+            } elseif ('extension' == $name) {
+                foreach ($options as $key => $value) {
+                    $dataKey = 'ext-' . $value['name'];
+                    $data[$dataKey] = $this->parseVersion($value);
+                }
+            }
+        }
+        return $data;
+    }
+
+    /**
+     * @param   string $deps
+     * @return  array
+     * @throws  InvalidArgumentException
+     */
+    private function parseDependencies($deps)
+    {
+        if (preg_match('((O:([0-9])+:"([^"]+)"))', $deps, $matches)) {
+            if (strlen($matches[3]) == $matches[2]) {
+                throw new \InvalidArgumentException("Invalid dependency data, it contains serialized objects.");
+            }
+        }
+        $deps = (array) @unserialize($deps);
+        unset($deps['required']['pearinstaller']);
+
+        $depsData = array();
+        if (!empty($deps['required'])) {
+            $depsData['require'] = $this->parseDependenciesOptions($deps['required']);
+        }
+
+        if (!empty($deps['optional'])) {
+            $depsData['suggest'] = $this->parseDependenciesOptions($deps['optional']);
+        }
+
+        return $depsData;
+    }
+
+    /**
+     * @param   string $packagesLink
+     * @return  void
+     * @throws  InvalidArgumentException
+     */
+    private function fetchPear2Packages($packagesLink)
+    {
+        $loader = new ArrayLoader();
+        $packagesXml = $this->requestXml($packagesLink);
+
+        $informations = $packagesXml->getElementsByTagName('pi');
+        foreach ($informations as $information) {
+            $package = $information->getElementsByTagName('p')->item(0);
+
+            $packageName = $package->getElementsByTagName('n')->item(0)->nodeValue;
+            $fullName = 'pear-'.$this->channel.'/'.$packageName;
+            $packageData = array(
+                'name' => $fullName,
+                'type' => 'library',
+                'autoload' => array(
+                    'classmap' => array(''),
+                ),
+            );
+            $packageKeys = array('l' => 'license', 'd' => 'description');
+            foreach ($packageKeys as $pear => $composer) {
+                if ($package->getElementsByTagName($pear)->length > 0
+                        && ($pear = $package->getElementsByTagName($pear)->item(0)->nodeValue)) {
+                    $packageData[$composer] = $pear;
+                }
+            }
+
+            $depsData = array();
+            foreach ($information->getElementsByTagName('deps') as $depElement) {
+                $depsVersion = $depElement->getElementsByTagName('v')->item(0)->nodeValue;
+                $depsData[$depsVersion] = $this->parseDependencies(
+                    $depElement->getElementsByTagName('d')->item(0)->nodeValue
+                );
+            }
+
+            $releases = $information->getElementsByTagName('a')->item(0);
+            if (!$releases) {
+                continue;
+            }
+
+            $releases = $releases->getElementsByTagName('r');
+            $packageUrl = $this->url . '/get/' . $packageName;
+            foreach ($releases as $release) {
+                $version = $release->getElementsByTagName('v')->item(0)->nodeValue;
+                $releaseData = array(
+                    'dist' => array(
+                        'type' => 'pear',
+                        'url' => $packageUrl . '-' . $version . '.tgz'
+                    ),
+                    'version' => $version
+                );
+                if (isset($depsData[$version])) {
+                    $releaseData += $depsData[$version];
+                }
+
+                $package = $packageData + $releaseData;
+                try {
+                    $this->addPackage($loader->load($package));
+                    if ($this->io->isVerbose()) {
+                        $this->io->write('Loaded '.$package['name'].' '.$package['version']);
+                    }
+                } catch (\UnexpectedValueException $e) {
+                    if ($this->io->isVerbose()) {
+                        $this->io->write('Could not load '.$package['name'].' '.$package['version'].': '.$e->getMessage());
+                    }
+                    continue;
+                }
+            }
+        }
+    }
+
+    /**
+     * @param  string $url
+     * @return DOMDocument
+     */
+    private function requestXml($url)
+    {
+        $content = $this->rfs->getContents($this->url, $url, false);
+        if (!$content) {
+            throw new \UnexpectedValueException('The PEAR channel at '.$url.' did not respond.');
+        }
+        $dom = new \DOMDocument('1.0', 'UTF-8');
+        $dom->loadXML($content);
+
+        return $dom;
+    }
+
+    private function getChannelShorthand($url)
+    {
+        if (!isset(self::$channelNames[$url])) {
+            try {
+                $channelXML = $this->requestXml('http://'.$url."/channel.xml");
+                $shorthand = $channelXML->getElementsByTagName("suggestedalias")->item(0)->nodeValue
+                    ?: $channelXML->getElementsByTagName("name")->item(0)->nodeValue;
+                self::$channelNames[$url] = $shorthand;
+            } catch (\Exception $e) {
+                self::$channelNames[$url] = substr($url, 0, strpos($url, '.'));
+            }
+        }
+
+        return self::$channelNames[$url];
+    }
+}
diff --git a/vendor/composer/composer/src/Composer/Repository/PlatformRepository.php b/vendor/composer/composer/src/Composer/Repository/PlatformRepository.php
new file mode 100644
index 0000000..4951552
--- /dev/null
+++ b/vendor/composer/composer/src/Composer/Repository/PlatformRepository.php
@@ -0,0 +1,61 @@
+<?php
+
+/*
+ * This file is part of Composer.
+ *
+ * (c) Nils Adermann <naderman@naderman.de>
+ *     Jordi Boggiano <j.boggiano@seld.be>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Composer\Repository;
+
+use Composer\Package\MemoryPackage;
+use Composer\Package\Version\VersionParser;
+
+/**
+ * @author Jordi Boggiano <j.boggiano@seld.be>
+ */
+class PlatformRepository extends ArrayRepository
+{
+
+    protected function initialize()
+    {
+        parent::initialize();
+
+        $versionParser = new VersionParser();
+
+        try {
+            $prettyVersion = PHP_VERSION;
+            $version = $versionParser->normalize($prettyVersion);
+        } catch (\UnexpectedValueException $e) {
+            $prettyVersion = preg_replace('#^(.+?)(-.+)?$#', '$1', PHP_VERSION);
+            $version = $versionParser->normalize($prettyVersion);
+        }
+
+        $php = new MemoryPackage('php', $version, $prettyVersion);
+        $php->setDescription('The PHP interpreter');
+        parent::addPackage($php);
+
+        foreach (get_loaded_extensions() as $name) {
+            if (in_array($name, array('standard', 'Core'))) {
+                continue;
+            }
+
+            $reflExt = new \ReflectionExtension($name);
+            try {
+                $prettyVersion = $reflExt->getVersion();
+                $version = $versionParser->normalize($prettyVersion);
+            } catch (\UnexpectedValueException $e) {
+                $prettyVersion = '0';
+                $version = $versionParser->normalize($prettyVersion);
+            }
+
+            $ext = new MemoryPackage('ext-'.$name, $version, $prettyVersion);
+            $ext->setDescription('The '.$name.' PHP extension');
+            parent::addPackage($ext);
+        }
+    }
+}
diff --git a/vendor/composer/composer/src/Composer/Repository/RepositoryInterface.php b/vendor/composer/composer/src/Composer/Repository/RepositoryInterface.php
new file mode 100644
index 0000000..e4a7969
--- /dev/null
+++ b/vendor/composer/composer/src/Composer/Repository/RepositoryInterface.php
@@ -0,0 +1,60 @@
+<?php
+
+/*
+ * This file is part of Composer.
+ *
+ * (c) Nils Adermann <naderman@naderman.de>
+ *     Jordi Boggiano <j.boggiano@seld.be>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Composer\Repository;
+
+use Composer\Package\PackageInterface;
+
+/**
+ * Repository interface.
+ *
+ * @author Nils Adermann <naderman@naderman.de>
+ * @author Konstantin Kudryashov <ever.zet@gmail.com>
+ */
+interface RepositoryInterface extends \Countable
+{
+    /**
+     * Checks if specified package registered (installed).
+     *
+     * @param   PackageInterface    $package    package instance
+     *
+     * @return  Boolean
+     */
+    function hasPackage(PackageInterface $package);
+
+    /**
+     * Searches for the first match of a package by name and version.
+     *
+     * @param   string  $name       package name
+     * @param   string  $version    package version
+     *
+     * @return  PackageInterface|null
+     */
+    function findPackage($name, $version);
+
+    /**
+     * Searches for all packages matching a name and optionally a version.
+     *
+     * @param   string  $name       package name
+     * @param   string  $version    package version
+     *
+     * @return  array
+     */
+    function findPackages($name, $version = null);
+
+    /**
+     * Returns list of registered packages.
+     *
+     * @return  array
+     */
+    function getPackages();
+}
diff --git a/vendor/composer/composer/src/Composer/Repository/RepositoryManager.php b/vendor/composer/composer/src/Composer/Repository/RepositoryManager.php
new file mode 100644
index 0000000..8dd6840
--- /dev/null
+++ b/vendor/composer/composer/src/Composer/Repository/RepositoryManager.php
@@ -0,0 +1,143 @@
+<?php
+
+/*
+ * This file is part of Composer.
+ *
+ * (c) Nils Adermann <naderman@naderman.de>
+ *     Jordi Boggiano <j.boggiano@seld.be>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Composer\Repository;
+
+use Composer\IO\IOInterface;
+use Composer\Config;
+
+/**
+ * Repositories manager.
+ *
+ * @author Jordi Boggiano <j.boggiano@seld.be>
+ * @author Konstantin Kudryashov <ever.zet@gmail.com>
+ * @author François Pluchino <francois.pluchino@opendisplay.com>
+ */
+class RepositoryManager
+{
+    private $localRepository;
+    private $repositories = array();
+    private $repositoryClasses = array();
+    private $io;
+    private $config;
+
+    public function __construct(IOInterface $io, Config $config)
+    {
+        $this->io = $io;
+        $this->config = $config;
+    }
+
+    /**
+     * Searches for a package by it's name and version in managed repositories.
+     *
+     * @param   string  $name       package name
+     * @param   string  $version    package version
+     *
+     * @return  PackageInterface|null
+     */
+    public function findPackage($name, $version)
+    {
+        foreach ($this->repositories as $repository) {
+            if ($package = $repository->findPackage($name, $version)) {
+                return $package;
+            }
+        }
+    }
+
+    /**
+     * Searches for all packages matching a name and optionally a version in managed repositories.
+     *
+     * @param   string  $name       package name
+     * @param   string  $version    package version
+     *
+     * @return  array
+     */
+    public function findPackages($name, $version)
+    {
+        $packages = array();
+
+        foreach ($this->repositories as $repository) {
+            $packages = array_merge($packages, $repository->findPackages($name, $version));
+        }
+
+        return $packages;
+    }
+
+    /**
+     * Adds repository
+     *
+     * @param   RepositoryInterface $repository repository instance
+     */
+    public function addRepository(RepositoryInterface $repository)
+    {
+        $this->repositories[] = $repository;
+    }
+
+    /**
+     * Returns a new repository for a specific installation type.
+     *
+     * @param   string $type repository type
+     * @param   string $config repository configuration
+     * @return  RepositoryInterface
+     * @throws  InvalidArgumentException     if repository for provided type is not registeterd
+     */
+    public function createRepository($type, $config)
+    {
+        if (!isset($this->repositoryClasses[$type])) {
+            throw new \InvalidArgumentException('Repository type is not registered: '.$type);
+        }
+
+        $class = $this->repositoryClasses[$type];
+        return new $class($config, $this->io, $this->config);
+    }
+
+    /**
+     * Stores repository class for a specific installation type.
+     *
+     * @param   string  $type   installation type
+     * @param   string  $class  class name of the repo implementation
+     */
+    public function setRepositoryClass($type, $class)
+    {
+        $this->repositoryClasses[$type] = $class;
+    }
+
+    /**
+     * Returns all repositories, except local one.
+     *
+     * @return  array
+     */
+    public function getRepositories()
+    {
+        return $this->repositories;
+    }
+
+    /**
+     * Sets local repository for the project.
+     *
+     * @param   RepositoryInterface $repository repository instance
+     */
+    public function setLocalRepository(RepositoryInterface $repository)
+    {
+        $this->localRepository = $repository;
+    }
+
+    /**
+     * Returns local repository for the project.
+     *
+     * @return  RepositoryInterface
+     */
+    public function getLocalRepository()
+    {
+        return $this->localRepository;
+    }
+}
diff --git a/vendor/composer/composer/src/Composer/Repository/Vcs/GitBitbucketDriver.php b/vendor/composer/composer/src/Composer/Repository/Vcs/GitBitbucketDriver.php
new file mode 100644
index 0000000..c0132cd
--- /dev/null
+++ b/vendor/composer/composer/src/Composer/Repository/Vcs/GitBitbucketDriver.php
@@ -0,0 +1,161 @@
+<?php
+
+/*
+ * This file is part of Composer.
+ *
+ * (c) Nils Adermann <naderman@naderman.de>
+ *     Jordi Boggiano <j.boggiano@seld.be>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Composer\Repository\Vcs;
+
+use Composer\Json\JsonFile;
+use Composer\IO\IOInterface;
+
+/**
+ * @author Per Bernhardt <plb@webfactory.de>
+ */
+class GitBitbucketDriver extends VcsDriver implements VcsDriverInterface
+{
+    protected $owner;
+    protected $repository;
+    protected $tags;
+    protected $branches;
+    protected $rootIdentifier;
+    protected $infoCache = array();
+
+    public function __construct($url, IOInterface $io)
+    {
+        preg_match('#^https://bitbucket\.org/([^/]+)/(.+?)\.git$#', $url, $match);
+        $this->owner = $match[1];
+        $this->repository = $match[2];
+
+        parent::__construct($url, $io);
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public function initialize()
+    {
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public function getRootIdentifier()
+    {
+        if (null === $this->rootIdentifier) {
+            $repoData = JsonFile::parseJson($this->getContents($this->getScheme() . '://api.bitbucket.org/1.0/repositories/'.$this->owner.'/'.$this->repository));
+            $this->rootIdentifier = !empty($repoData['main_branch']) ? $repoData['main_branch'] : 'master';
+        }
+
+        return $this->rootIdentifier;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public function getUrl()
+    {
+        return $this->url;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public function getSource($identifier)
+    {
+        $label = array_search($identifier, $this->getTags()) ?: $identifier;
+
+        return array('type' => 'git', 'url' => $this->getUrl(), 'reference' => $label);
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public function getDist($identifier)
+    {
+        $label = array_search($identifier, $this->getTags()) ?: $identifier;
+        $url = $this->getScheme() . '://bitbucket.org/'.$this->owner.'/'.$this->repository.'/get/'.$label.'.zip';
+
+        return array('type' => 'zip', 'url' => $url, 'reference' => $label, 'shasum' => '');
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public function getComposerInformation($identifier)
+    {
+        if (!isset($this->infoCache[$identifier])) {
+            $composer = $this->getContents($this->getScheme() . '://bitbucket.org/'.$this->owner.'/'.$this->repository.'/raw/'.$identifier.'/composer.json');
+            if (!$composer) {
+                return;
+            }
+
+            $composer = JsonFile::parseJson($composer);
+
+            if (!isset($composer['time'])) {
+                $changeset = JsonFile::parseJson($this->getContents($this->getScheme() . '://api.bitbucket.org/1.0/repositories/'.$this->owner.'/'.$this->repository.'/changesets/'.$identifier));
+                $composer['time'] = $changeset['timestamp'];
+            }
+            $this->infoCache[$identifier] = $composer;
+        }
+
+        return $this->infoCache[$identifier];
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public function getTags()
+    {
+        if (null === $this->tags) {
+            $tagsData = JsonFile::parseJson($this->getContents($this->getScheme() . '://api.bitbucket.org/1.0/repositories/'.$this->owner.'/'.$this->repository.'/tags'));
+            $this->tags = array();
+            foreach ($tagsData as $tag => $data) {
+                $this->tags[$tag] = $data['raw_node'];
+            }
+        }
+
+        return $this->tags;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public function getBranches()
+    {
+        if (null === $this->branches) {
+            $branchData = JsonFile::parseJson($this->getContents($this->getScheme() . '://api.bitbucket.org/1.0/repositories/'.$this->owner.'/'.$this->repository.'/branches'));
+            $this->branches = array();
+            foreach ($branchData as $branch => $data) {
+                $this->branches[$branch] = $data['raw_node'];
+            }
+        }
+
+        return $this->branches;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public static function supports(IOInterface $io, $url, $deep = false)
+    {
+        if (!preg_match('#^https://bitbucket\.org/([^/]+)/(.+?)\.git$#', $url)) {
+            return false;
+        }
+
+        if (!extension_loaded('openssl')) {
+            if ($io->isVerbose()) {
+                $io->write('Skipping Bitbucket git driver for '.$url.' because the OpenSSL PHP extension is missing.');
+            }
+            return false;
+        }
+
+        return true;
+    }
+}
diff --git a/vendor/composer/composer/src/Composer/Repository/Vcs/GitDriver.php b/vendor/composer/composer/src/Composer/Repository/Vcs/GitDriver.php
new file mode 100644
index 0000000..73f9e1a
--- /dev/null
+++ b/vendor/composer/composer/src/Composer/Repository/Vcs/GitDriver.php
@@ -0,0 +1,207 @@
+<?php
+
+/*
+ * This file is part of Composer.
+ *
+ * (c) Nils Adermann <naderman@naderman.de>
+ *     Jordi Boggiano <j.boggiano@seld.be>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Composer\Repository\Vcs;
+
+use Composer\Json\JsonFile;
+use Composer\Util\ProcessExecutor;
+use Composer\Util\Filesystem;
+use Composer\IO\IOInterface;
+
+/**
+ * @author Jordi Boggiano <j.boggiano@seld.be>
+ */
+class GitDriver extends VcsDriver
+{
+    protected $tags;
+    protected $branches;
+    protected $rootIdentifier;
+    protected $repoDir;
+    protected $infoCache = array();
+
+    public function __construct($url, IOInterface $io, ProcessExecutor $process = null)
+    {
+        parent::__construct($url, $io, $process);
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public function initialize()
+    {
+        if (static::isLocalUrl($this->url)) {
+            $this->repoDir = str_replace('file://', '', $this->url);
+        } else {
+            $this->repoDir = sys_get_temp_dir() . '/composer-' . preg_replace('{[^a-z0-9.]}i', '-', $this->url) . '/';
+
+            // update the repo if it is a valid git repository
+            if (is_dir($this->repoDir) && 0 === $this->process->execute('git remote', $output, $this->repoDir)) {
+                $this->process->execute('git remote update --prune origin', $output, $this->repoDir);
+            } else {
+                // clean up directory and do a fresh clone into it
+                $fs = new Filesystem();
+                $fs->removeDirectory($this->repoDir);
+
+                $command = sprintf('git clone --mirror %s %s', escapeshellarg($this->url), escapeshellarg($this->repoDir));
+                if (0 !== $this->process->execute($command, $output)) {
+                    $output = $this->process->getErrorOutput();
+
+                    if (0 !== $this->process->execute('git --version', $ignoredOutput)) {
+                        throw new \RuntimeException('Failed to clone '.$this->url.', git was not found, check that it is installed and in your PATH env.' . "\n\n" . $this->process->getErrorOutput());
+                    }
+
+                    throw new \RuntimeException('Failed to clone '.$this->url.', could not read packages from it' . "\n\n" .$output);
+                }
+            }
+        }
+
+        $this->getTags();
+        $this->getBranches();
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public function getRootIdentifier()
+    {
+        if (null === $this->rootIdentifier) {
+            $this->rootIdentifier = 'master';
+
+            // select currently checked out branch if master is not available
+            $this->process->execute('git branch --no-color', $output, $this->repoDir);
+            $branches = $this->process->splitLines($output);
+            if (!in_array('* master', $branches)) {
+                foreach ($branches as $branch) {
+                    if ($branch && preg_match('{^\* +(\S+)}', $branch, $match)) {
+                        $this->rootIdentifier = $match[1];
+                        break;
+                    }
+                }
+            }
+        }
+
+        return $this->rootIdentifier;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public function getUrl()
+    {
+        return $this->url;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public function getSource($identifier)
+    {
+        $label = array_search($identifier, (array) $this->tags) ?: $identifier;
+
+        return array('type' => 'git', 'url' => $this->getUrl(), 'reference' => $label);
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public function getDist($identifier)
+    {
+        return null;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public function getComposerInformation($identifier)
+    {
+        if (!isset($this->infoCache[$identifier])) {
+            $this->process->execute(sprintf('git show %s:composer.json', escapeshellarg($identifier)), $composer, $this->repoDir);
+
+            if (!trim($composer)) {
+                return;
+            }
+
+            $composer = JsonFile::parseJson($composer);
+
+            if (!isset($composer['time'])) {
+                $this->process->execute(sprintf('git log -1 --format=%%at %s', escapeshellarg($identifier)), $output, $this->repoDir);
+                $date = new \DateTime('@'.trim($output));
+                $composer['time'] = $date->format('Y-m-d H:i:s');
+            }
+            $this->infoCache[$identifier] = $composer;
+        }
+
+        return $this->infoCache[$identifier];
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public function getTags()
+    {
+        if (null === $this->tags) {
+            $this->process->execute('git tag', $output, $this->repoDir);
+            $output = $this->process->splitLines($output);
+            $this->tags = $output ? array_combine($output, $output) : array();
+        }
+
+        return $this->tags;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public function getBranches()
+    {
+        if (null === $this->branches) {
+            $branches = array();
+
+            $this->process->execute('git branch --no-color --no-abbrev -v', $output, $this->repoDir);
+            foreach ($this->process->splitLines($output) as $branch) {
+                if ($branch && !preg_match('{^ *[^/]+/HEAD }', $branch)) {
+                    preg_match('{^(?:\* )? *(?:[^/ ]+?/)?(\S+) *([a-f0-9]+) .*$}', $branch, $match);
+                    $branches[$match[1]] = $match[2];
+                }
+            }
+
+            $this->branches = $branches;
+        }
+
+        return $this->branches;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public static function supports(IOInterface $io, $url, $deep = false)
+    {
+        if (preg_match('#(^git://|\.git$|git@|//git\.|//github.com/)#i', $url)) {
+            return true;
+        }
+
+        // local filesystem
+        if (static::isLocalUrl($url)) {
+            $process = new ProcessExecutor();
+            // check whether there is a git repo in that path
+            if ($process->execute('git tag', $output, $url) === 0) {
+                return true;
+            }
+        }
+
+        if (!$deep) {
+            return false;
+        }
+
+        // TODO try to connect to the server
+        return false;
+    }
+}
diff --git a/vendor/composer/composer/src/Composer/Repository/Vcs/GitHubDriver.php b/vendor/composer/composer/src/Composer/Repository/Vcs/GitHubDriver.php
new file mode 100644
index 0000000..42633aa
--- /dev/null
+++ b/vendor/composer/composer/src/Composer/Repository/Vcs/GitHubDriver.php
@@ -0,0 +1,270 @@
+<?php
+
+/*
+ * This file is part of Composer.
+ *
+ * (c) Nils Adermann <naderman@naderman.de>
+ *     Jordi Boggiano <j.boggiano@seld.be>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Composer\Repository\Vcs;
+
+use Composer\Downloader\TransportException;
+use Composer\Json\JsonFile;
+use Composer\IO\IOInterface;
+use Composer\Util\ProcessExecutor;
+use Composer\Util\RemoteFilesystem;
+
+/**
+ * @author Jordi Boggiano <j.boggiano@seld.be>
+ */
+class GitHubDriver extends VcsDriver
+{
+    protected $owner;
+    protected $repository;
+    protected $tags;
+    protected $branches;
+    protected $rootIdentifier;
+    protected $infoCache = array();
+    protected $isPrivate = false;
+
+    /**
+     * Git Driver
+     *
+     * @var GitDriver
+     */
+    protected $gitDriver;
+
+    /**
+     * Constructor
+     *
+     * @param string $url
+     * @param IOInterface $io
+     * @param ProcessExecutor $process
+     * @param RemoteFilesystem $remoteFilesystem
+     */
+    public function __construct($url, IOInterface $io, ProcessExecutor $process = null, RemoteFilesystem $remoteFilesystem = null)
+    {
+        preg_match('#^(?:https?|git)://github\.com/([^/]+)/(.+?)(?:\.git)?$#', $url, $match);
+        $this->owner = $match[1];
+        $this->repository = $match[2];
+
+        parent::__construct($url, $io, $process, $remoteFilesystem);
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public function initialize()
+    {
+        $this->fetchRootIdentifier();
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public function getRootIdentifier()
+    {
+        if ($this->gitDriver) {
+            return $this->gitDriver->getRootIdentifier();
+        }
+        return $this->rootIdentifier;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public function getUrl()
+    {
+        if ($this->gitDriver) {
+            return $this->gitDriver->getUrl();
+        }
+        return $this->url;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public function getSource($identifier)
+    {
+        if ($this->gitDriver) {
+            return $this->gitDriver->getSource($identifier);
+        }
+        $label = array_search($identifier, $this->getTags()) ?: $identifier;
+        if ($this->isPrivate) {
+            // Private GitHub repositories should be accessed using the
+            // SSH version of the URL.
+            $url = $this->generateSshUrl();
+        } else {
+            $url = $this->getUrl();
+        }
+
+        return array('type' => 'git', 'url' => $url, 'reference' => $label);
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public function getDist($identifier)
+    {
+        if ($this->gitDriver) {
+            return $this->gitDriver->getDist($identifier);
+        }
+        $label = array_search($identifier, $this->getTags()) ?: $identifier;
+        $url = $this->getScheme() . '://github.com/'.$this->owner.'/'.$this->repository.'/zipball/'.$label;
+
+        return array('type' => 'zip', 'url' => $url, 'reference' => $label, 'shasum' => '');
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public function getComposerInformation($identifier)
+    {
+        if ($this->gitDriver) {
+            return $this->gitDriver->getComposerInformation($identifier);
+        }
+        if (!isset($this->infoCache[$identifier])) {
+            $composer = $this->getContents($this->getScheme() . '://raw.github.com/'.$this->owner.'/'.$this->repository.'/'.$identifier.'/composer.json');
+            if (!$composer) {
+                return;
+            }
+
+            $composer = JsonFile::parseJson($composer);
+
+            if (!isset($composer['time'])) {
+                $commit = JsonFile::parseJson($this->getContents($this->getScheme() . '://api.github.com/repos/'.$this->owner.'/'.$this->repository.'/commits/'.$identifier));
+                $composer['time'] = $commit['commit']['committer']['date'];
+            }
+            $this->infoCache[$identifier] = $composer;
+        }
+
+        return $this->infoCache[$identifier];
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public function getTags()
+    {
+        if ($this->gitDriver) {
+            return $this->gitDriver->getTags();
+        }
+        if (null === $this->tags) {
+            $tagsData = JsonFile::parseJson($this->getContents($this->getScheme() . '://api.github.com/repos/'.$this->owner.'/'.$this->repository.'/tags'));
+            $this->tags = array();
+            foreach ($tagsData as $tag) {
+                $this->tags[$tag['name']] = $tag['commit']['sha'];
+            }
+        }
+
+        return $this->tags;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public function getBranches()
+    {
+        if ($this->gitDriver) {
+            return $this->gitDriver->getBranches();
+        }
+        if (null === $this->branches) {
+            $branchData = JsonFile::parseJson($this->getContents($this->getScheme() . '://api.github.com/repos/'.$this->owner.'/'.$this->repository.'/git/refs/heads'));
+            $this->branches = array();
+            foreach ($branchData as $branch) {
+                $name = substr($branch['ref'], 11);
+                $this->branches[$name] = $branch['object']['sha'];
+            }
+        }
+
+        return $this->branches;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public static function supports(IOInterface $io, $url, $deep = false)
+    {
+        if (!preg_match('#^(?:https?|git)://github\.com/([^/]+)/(.+?)(?:\.git)?$#', $url)) {
+            return false;
+        }
+
+        if (!extension_loaded('openssl')) {
+            if ($io->isVerbose()) {
+                $io->write('Skipping GitHub driver for '.$url.' because the OpenSSL PHP extension is missing.');
+            }
+            return false;
+        }
+
+        return true;
+    }
+
+    /**
+     * Generate an SSH URL
+     *
+     * @return string
+     */
+    protected function generateSshUrl()
+    {
+        return 'git@github.com:'.$this->owner.'/'.$this->repository.'.git';
+    }
+
+    /**
+     * Fetch root identifier from GitHub
+     *
+     * @throws TransportException
+     */
+    protected function fetchRootIdentifier()
+    {
+        $repoDataUrl = $this->getScheme() . '://api.github.com/repos/'.$this->owner.'/'.$this->repository;
+        $attemptCounter = 0;
+        while (null === $this->rootIdentifier) {
+            if (5 == $attemptCounter++) {
+                throw new \RuntimeException("Either you have entered invalid credentials or this GitHub repository does not exists (404)");
+            }
+            try {
+                $repoData = JsonFile::parseJson($this->getContents($repoDataUrl));
+                if (isset($repoData['default_branch'])) {
+                    $this->rootIdentifier = $repoData['default_branch'];
+                } elseif (isset($repoData['master_branch'])) {
+                    $this->rootIdentifier = $repoData['master_branch'];
+                } else {
+                    $this->rootIdentifier = 'master';
+                }
+            } catch (TransportException $e) {
+                switch($e->getCode()) {
+                    case 401:
+                    case 404:
+                        $this->isPrivate = true;
+                        if (!$this->io->isInteractive()) {
+                            // If this repository may be private (hard to say for sure,
+                            // GitHub returns 404 for private repositories) and we
+                            // cannot ask for authentication credentials (because we
+                            // are not interactive) then we fallback to GitDriver.
+                            $this->gitDriver = new GitDriver(
+                                $this->generateSshUrl(),
+                                $this->io,
+                                $this->process,
+                                $this->remoteFilesystem
+                            );
+                            $this->gitDriver->initialize();
+                            return;
+                        }
+                        $this->io->write('Authentication required (<info>'.$this->url.'</info>):');
+                        $username = $this->io->ask('Username: ');
+                        $password = $this->io->askAndHideAnswer('Password: ');
+                        $this->io->setAuthorization($this->url, $username, $password);
+                        break;
+
+                    default:
+                        throw $e;
+                        break;
+                }
+            }
+        }
+    }
+}
diff --git a/vendor/composer/composer/src/Composer/Repository/Vcs/HgBitbucketDriver.php b/vendor/composer/composer/src/Composer/Repository/Vcs/HgBitbucketDriver.php
new file mode 100644
index 0000000..993ece8
--- /dev/null
+++ b/vendor/composer/composer/src/Composer/Repository/Vcs/HgBitbucketDriver.php
@@ -0,0 +1,161 @@
+<?php
+
+/*
+ * This file is part of Composer.
+ *
+ * (c) Nils Adermann <naderman@naderman.de>
+ *     Jordi Boggiano <j.boggiano@seld.be>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Composer\Repository\Vcs;
+
+use Composer\Json\JsonFile;
+use Composer\IO\IOInterface;
+
+/**
+ * @author Per Bernhardt <plb@webfactory.de>
+ */
+class HgBitbucketDriver extends VcsDriver
+{
+    protected $owner;
+    protected $repository;
+    protected $tags;
+    protected $branches;
+    protected $rootIdentifier;
+    protected $infoCache = array();
+
+    public function __construct($url, IOInterface $io)
+    {
+        preg_match('#^https://bitbucket\.org/([^/]+)/([^/]+)/?$#', $url, $match);
+        $this->owner = $match[1];
+        $this->repository = $match[2];
+
+        parent::__construct($url, $io);
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public function initialize()
+    {
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public function getRootIdentifier()
+    {
+        if (null === $this->rootIdentifier) {
+            $repoData = JsonFile::parseJson($this->getContents($this->getScheme() . '://api.bitbucket.org/1.0/repositories/'.$this->owner.'/'.$this->repository.'/tags'));
+            $this->rootIdentifier = $repoData['tip']['raw_node'];
+        }
+
+        return $this->rootIdentifier;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public function getUrl()
+    {
+        return $this->url;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public function getSource($identifier)
+    {
+        $label = array_search($identifier, $this->getTags()) ?: $identifier;
+
+        return array('type' => 'hg', 'url' => $this->getUrl(), 'reference' => $label);
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public function getDist($identifier)
+    {
+        $label = array_search($identifier, $this->getTags()) ?: $identifier;
+        $url = $this->getScheme() . '://bitbucket.org/'.$this->owner.'/'.$this->repository.'/get/'.$label.'.zip';
+
+        return array('type' => 'zip', 'url' => $url, 'reference' => $label, 'shasum' => '');
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public function getComposerInformation($identifier)
+    {
+        if (!isset($this->infoCache[$identifier])) {
+            $composer = $this->getContents($this->getScheme() . '://bitbucket.org/'.$this->owner.'/'.$this->repository.'/raw/'.$identifier.'/composer.json');
+            if (!$composer) {
+                return;
+            }
+
+            $composer = JsonFile::parseJson($composer);
+
+            if (!isset($composer['time'])) {
+                $changeset = JsonFile::parseJson($this->getContents($this->getScheme() . '://api.bitbucket.org/1.0/repositories/'.$this->owner.'/'.$this->repository.'/changesets/'.$identifier));
+                $composer['time'] = $changeset['timestamp'];
+            }
+            $this->infoCache[$identifier] = $composer;
+        }
+
+        return $this->infoCache[$identifier];
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public function getTags()
+    {
+        if (null === $this->tags) {
+            $tagsData = JsonFile::parseJson($this->getContents($this->getScheme() . '://api.bitbucket.org/1.0/repositories/'.$this->owner.'/'.$this->repository.'/tags'));
+            $this->tags = array();
+            foreach ($tagsData as $tag => $data) {
+                $this->tags[$tag] = $data['raw_node'];
+            }
+        }
+
+        return $this->tags;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public function getBranches()
+    {
+        if (null === $this->branches) {
+            $branchData = JsonFile::parseJson($this->getContents($this->getScheme() . '://api.bitbucket.org/1.0/repositories/'.$this->owner.'/'.$this->repository.'/branches'));
+            $this->branches = array();
+            foreach ($branchData as $branch => $data) {
+                $this->branches[$branch] = $data['raw_node'];
+            }
+        }
+
+        return $this->branches;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public static function supports(IOInterface $io, $url, $deep = false)
+    {
+        if (!preg_match('#^https://bitbucket\.org/([^/]+)/([^/]+)/?$#', $url)) {
+            return false;
+        }
+
+        if (!extension_loaded('openssl')) {
+            if ($io->isVerbose()) {
+                $io->write('Skipping Bitbucket hg driver for '.$url.' because the OpenSSL PHP extension is missing.');
+            }
+            return false;
+        }
+
+        return true;
+    }
+}
diff --git a/vendor/composer/composer/src/Composer/Repository/Vcs/HgDriver.php b/vendor/composer/composer/src/Composer/Repository/Vcs/HgDriver.php
new file mode 100644
index 0000000..833669c
--- /dev/null
+++ b/vendor/composer/composer/src/Composer/Repository/Vcs/HgDriver.php
@@ -0,0 +1,179 @@
+<?php
+
+/*
+ * This file is part of Composer.
+ *
+ * (c) Nils Adermann <naderman@naderman.de>
+ *     Jordi Boggiano <j.boggiano@seld.be>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Composer\Repository\Vcs;
+
+use Composer\Json\JsonFile;
+use Composer\Util\ProcessExecutor;
+use Composer\IO\IOInterface;
+
+/**
+ * @author Per Bernhardt <plb@webfactory.de>
+ */
+class HgDriver extends VcsDriver
+{
+    protected $tags;
+    protected $branches;
+    protected $rootIdentifier;
+    protected $infoCache = array();
+
+    public function __construct($url, IOInterface $io, ProcessExecutor $process = null)
+    {
+        $this->tmpDir = sys_get_temp_dir() . '/composer-' . preg_replace('{[^a-z0-9]}i', '-', $url) . '/';
+
+        parent::__construct($url, $io, $process);
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public function initialize()
+    {
+        $url = escapeshellarg($this->url);
+        $tmpDir = escapeshellarg($this->tmpDir);
+        if (is_dir($this->tmpDir)) {
+            $this->process->execute(sprintf('cd %s && hg pull -u', $tmpDir), $output);
+        } else {
+            $this->process->execute(sprintf('cd %s && hg clone %s %s', escapeshellarg(sys_get_temp_dir()), $url, $tmpDir), $output);
+        }
+
+        $this->getTags();
+        $this->getBranches();
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public function getRootIdentifier()
+    {
+        $tmpDir = escapeshellarg($this->tmpDir);
+        if (null === $this->rootIdentifier) {
+            $this->process->execute(sprintf('cd %s && hg tip --template "{node}"', $tmpDir), $output);
+            $output = $this->process->splitLines($output);
+            $this->rootIdentifier = $output[0];
+        }
+
+        return $this->rootIdentifier;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public function getUrl()
+    {
+        return $this->url;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public function getSource($identifier)
+    {
+        $label = array_search($identifier, (array)$this->tags) ? : $identifier;
+
+        return array('type' => 'hg', 'url' => $this->getUrl(), 'reference' => $label);
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public function getDist($identifier)
+    {
+        return null;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public function getComposerInformation($identifier)
+    {
+        if (!isset($this->infoCache[$identifier])) {
+            $this->process->execute(sprintf('cd %s && hg cat -r %s composer.json', escapeshellarg($this->tmpDir), escapeshellarg($identifier)), $composer);
+
+            if (!trim($composer)) {
+                return;
+            }
+
+            $composer = JsonFile::parseJson($composer);
+
+            if (!isset($composer['time'])) {
+                $this->process->execute(sprintf('cd %s && hg log --template "{date|rfc822date}" -r %s', escapeshellarg($this->tmpDir), escapeshellarg($identifier)), $output);
+                $date = new \DateTime(trim($output));
+                $composer['time'] = $date->format('Y-m-d H:i:s');
+            }
+            $this->infoCache[$identifier] = $composer;
+        }
+
+        return $this->infoCache[$identifier];
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public function getTags()
+    {
+        if (null === $this->tags) {
+            $tags = array();
+
+            $this->process->execute(sprintf('cd %s && hg tags', escapeshellarg($this->tmpDir)), $output);
+            foreach ($this->process->splitLines($output) as $tag) {
+                if ($tag && preg_match('(^([^\s]+)\s+\d+:(.*)$)', $tag, $match)) {
+                    $tags[$match[1]] = $match[2];
+                }
+            }
+            unset($tags['tip']);
+
+            $this->tags = $tags;
+        }
+
+        return $this->tags;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public function getBranches()
+    {
+        if (null === $this->branches) {
+            $branches = array();
+
+            $this->process->execute(sprintf('cd %s && hg branches', escapeshellarg($this->tmpDir)), $output);
+            foreach ($this->process->splitLines($output) as $branch) {
+                if ($branch && preg_match('(^([^\s]+)\s+\d+:(.*)$)', $branch, $match)) {
+                    $branches[$match[1]] = $match[2];
+                }
+            }
+
+            $this->branches = $branches;
+        }
+
+        return $this->branches;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public static function supports(IOInterface $io, $url, $deep = false)
+    {
+        if (preg_match('#(^(?:https?|ssh)://(?:[^@]@)?bitbucket.org|https://(?:.*?)\.kilnhg.com)#i', $url)) {
+            return true;
+        }
+
+        if (!$deep) {
+            return false;
+        }
+
+        $processExecutor = new ProcessExecutor();
+        $exit = $processExecutor->execute(sprintf('cd %s && hg identify %s', escapeshellarg(sys_get_temp_dir()), escapeshellarg($url)), $ignored);
+        return $exit === 0;
+    }
+}
diff --git a/vendor/composer/composer/src/Composer/Repository/Vcs/SvnDriver.php b/vendor/composer/composer/src/Composer/Repository/Vcs/SvnDriver.php
new file mode 100644
index 0000000..6f13296
--- /dev/null
+++ b/vendor/composer/composer/src/Composer/Repository/Vcs/SvnDriver.php
@@ -0,0 +1,270 @@
+<?php
+
+/*
+ * This file is part of Composer.
+ *
+ * (c) Nils Adermann <naderman@naderman.de>
+ *     Jordi Boggiano <j.boggiano@seld.be>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Composer\Repository\Vcs;
+
+use Composer\Json\JsonFile;
+use Composer\Util\ProcessExecutor;
+use Composer\Util\Filesystem;
+use Composer\Util\Svn as SvnUtil;
+use Composer\IO\IOInterface;
+use Composer\Downloader\TransportException;
+
+/**
+ * @author Jordi Boggiano <j.boggiano@seld.be>
+ * @author Till Klampaeckel <till@php.net>
+ */
+class SvnDriver extends VcsDriver
+{
+    protected $baseUrl;
+    protected $tags;
+    protected $branches;
+    protected $infoCache = array();
+
+    /**
+     * @var \Composer\Util\Svn
+     */
+    protected $util;
+
+    /**
+     * @param string          $url
+     * @param IOInterface     $io
+     * @param ProcessExecutor $process
+     *
+     * @return $this
+     */
+    public function __construct($url, IOInterface $io, ProcessExecutor $process = null)
+    {
+        $url = self::normalizeUrl($url);
+        parent::__construct($this->baseUrl = rtrim($url, '/'), $io, $process);
+
+        if (false !== ($pos = strrpos($url, '/trunk'))) {
+            $this->baseUrl = substr($url, 0, $pos);
+        }
+        $this->util    = new SvnUtil($this->baseUrl, $io, $this->process);
+    }
+
+    /**
+     * Execute an SVN command and try to fix up the process with credentials
+     * if necessary.
+     *
+     * @param string $command The svn command to run.
+     * @param string $url     The SVN URL.
+     *
+     * @return string
+     */
+    protected function execute($command, $url)
+    {
+        try {
+            return $this->util->execute($command, $url);
+        } catch (\RuntimeException $e) {
+            throw new \RuntimeException(
+                'Repository '.$this->url.' could not be processed, '.$e->getMessage()
+            );
+        }
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public function initialize()
+    {
+        $this->getBranches();
+        $this->getTags();
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public function getRootIdentifier()
+    {
+        return 'trunk';
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public function getUrl()
+    {
+        return $this->url;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public function getSource($identifier)
+    {
+        return array('type' => 'svn', 'url' => $this->baseUrl, 'reference' => $identifier);
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public function getDist($identifier)
+    {
+        return null;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public function getComposerInformation($identifier)
+    {
+        $identifier = '/' . trim($identifier, '/') . '/';
+        if (!isset($this->infoCache[$identifier])) {
+            preg_match('{^(.+?)(@\d+)?/$}', $identifier, $match);
+            if (!empty($match[2])) {
+                $identifier = $match[1];
+                $rev = $match[2];
+            } else {
+                $rev = '';
+            }
+
+            try {
+                $output = $this->execute('svn cat', $this->baseUrl . $identifier . 'composer.json' . $rev);
+                if (!trim($output)) {
+                    return;
+                }
+            } catch (\RuntimeException $e) {
+                throw new TransportException($e->getMessage());
+            }
+
+            $composer = JsonFile::parseJson($output);
+
+            if (!isset($composer['time'])) {
+                $output = $this->execute('svn info', $this->baseUrl . $identifier . $rev);
+                foreach ($this->process->splitLines($output) as $line) {
+                    if ($line && preg_match('{^Last Changed Date: ([^(]+)}', $line, $match)) {
+                        $date = new \DateTime($match[1]);
+                        $composer['time'] = $date->format('Y-m-d H:i:s');
+                        break;
+                    }
+                }
+            }
+            $this->infoCache[$identifier] = $composer;
+        }
+
+        return $this->infoCache[$identifier];
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public function getTags()
+    {
+        if (null === $this->tags) {
+            $this->tags = array();
+
+            $output = $this->execute('svn ls', $this->baseUrl . '/tags');
+            if ($output) {
+                foreach ($this->process->splitLines($output) as $tag) {
+                    if ($tag) {
+                        $this->tags[rtrim($tag, '/')] = '/tags/'.$tag;
+                    }
+                }
+            }
+        }
+
+        return $this->tags;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public function getBranches()
+    {
+        if (null === $this->branches) {
+            $this->branches = array();
+
+            $output = $this->execute('svn ls --verbose', $this->baseUrl . '/');
+            if ($output) {
+                foreach ($this->process->splitLines($output) as $line) {
+                    $line = trim($line);
+                    if ($line && preg_match('{^\s*(\S+).*?(\S+)\s*$}', $line, $match)) {
+                        if (isset($match[1]) && isset($match[2]) && $match[2] === 'trunk/') {
+                            $this->branches['trunk'] = '/trunk/@'.$match[1];
+                            break;
+                        }
+                    }
+                }
+            }
+            unset($output);
+
+            $output = $this->execute('svn ls --verbose', $this->baseUrl . '/branches');
+            if ($output) {
+                foreach ($this->process->splitLines(trim($output)) as $line) {
+                    $line = trim($line);
+                    if ($line && preg_match('{^\s*(\S+).*?(\S+)\s*$}', $line, $match)) {
+                        if (isset($match[1]) && isset($match[2]) && $match[2] !== './') {
+                            $this->branches[rtrim($match[2], '/')] = '/branches/'.$match[2].'@'.$match[1];
+                        }
+                    }
+                }
+            }
+        }
+
+        return $this->branches;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public static function supports(IOInterface $io, $url, $deep = false)
+    {
+        $url = self::normalizeUrl($url);
+        if (preg_match('#(^svn://|^svn\+ssh://|svn\.)#i', $url)) {
+            return true;
+        }
+
+        // proceed with deep check for local urls since they are fast to process
+        if (!$deep && !static::isLocalUrl($url)) {
+            return false;
+        }
+
+        $processExecutor = new ProcessExecutor();
+
+        $exit = $processExecutor->execute(
+            "svn info --non-interactive {$url}",
+            $ignoredOutput
+        );
+
+        if ($exit === 0) {
+            // This is definitely a Subversion repository.
+            return true;
+        }
+
+        if (false !== stripos($processExecutor->getErrorOutput(), 'authorization failed:')) {
+            // This is likely a remote Subversion repository that requires
+            // authentication. We will handle actual authentication later.
+            return true;
+        }
+
+        return false;
+    }
+
+    /**
+     * An absolute path (leading '/') is converted to a file:// url.
+     *
+     * @param string $url
+     *
+     * @return string
+     */
+    protected static function normalizeUrl($url)
+    {
+        $fs = new Filesystem();
+        if ($fs->isAbsolutePath($url)) {
+            return 'file://' . strtr($url, '\\', '/');
+        }
+
+        return $url;
+    }
+}
diff --git a/vendor/composer/composer/src/Composer/Repository/Vcs/VcsDriver.php b/vendor/composer/composer/src/Composer/Repository/Vcs/VcsDriver.php
new file mode 100644
index 0000000..99c705c
--- /dev/null
+++ b/vendor/composer/composer/src/Composer/Repository/Vcs/VcsDriver.php
@@ -0,0 +1,93 @@
+<?php
+
+/*
+ * This file is part of Composer.
+ *
+ * (c) Nils Adermann <naderman@naderman.de>
+ *     Jordi Boggiano <j.boggiano@seld.be>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Composer\Repository\Vcs;
+
+use Composer\Downloader\TransportException;
+use Composer\IO\IOInterface;
+use Composer\Util\ProcessExecutor;
+use Composer\Util\RemoteFilesystem;
+
+/**
+ * A driver implementation for driver with authorization interaction.
+ *
+ * @author François Pluchino <francois.pluchino@opendisplay.com>
+ */
+abstract class VcsDriver implements VcsDriverInterface
+{
+    protected $url;
+    protected $io;
+    protected $process;
+    protected $remoteFilesystem;
+
+    /**
+     * Constructor.
+     *
+     * @param string      $url The URL
+     * @param IOInterface $io  The IO instance
+     * @param ProcessExecutor $process  Process instance, injectable for mocking
+     * @param callable $remoteFilesystem Remote Filesystem, injectable for mocking
+     */
+    public function __construct($url, IOInterface $io, ProcessExecutor $process = null, $remoteFilesystem = null)
+    {
+        $this->url = $url;
+        $this->io = $io;
+        $this->process = $process ?: new ProcessExecutor;
+        $this->remoteFilesystem = $remoteFilesystem ?: new RemoteFilesystem($io);
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public function hasComposerFile($identifier)
+    {
+        try {
+            return (Boolean) $this->getComposerInformation($identifier);
+        } catch (TransportException $e) {
+        }
+
+        return false;
+    }
+
+
+    /**
+     * Get the https or http protocol depending on SSL support.
+     *
+     * Call this only if you know that the server supports both.
+     *
+     * @return string The correct type of protocol
+     */
+    protected function getScheme()
+    {
+        if (extension_loaded('openssl')) {
+            return 'https';
+        }
+        return 'http';
+    }
+
+    /**
+     * Get the remote content.
+     *
+     * @param string $url The URL of content
+     *
+     * @return mixed The result
+     */
+    protected function getContents($url)
+    {
+        return $this->remoteFilesystem->getContents($this->url, $url, false);
+    }
+
+    protected static function isLocalUrl($url)
+    {
+        return (Boolean) preg_match('{^(file://|/|[a-z]:[\\\\/])}i', $url);
+    }
+}
diff --git a/vendor/composer/composer/src/Composer/Repository/Vcs/VcsDriverInterface.php b/vendor/composer/composer/src/Composer/Repository/Vcs/VcsDriverInterface.php
new file mode 100644
index 0000000..472461e
--- /dev/null
+++ b/vendor/composer/composer/src/Composer/Repository/Vcs/VcsDriverInterface.php
@@ -0,0 +1,93 @@
+<?php
+
+/*
+ * This file is part of Composer.
+ *
+ * (c) Nils Adermann <naderman@naderman.de>
+ *     Jordi Boggiano <j.boggiano@seld.be>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Composer\Repository\Vcs;
+
+use Composer\IO\IOInterface;
+
+/**
+ * @author Jordi Boggiano <j.boggiano@seld.be>
+ */
+interface VcsDriverInterface
+{
+    /**
+     * Initializes the driver (git clone, svn checkout, fetch info etc)
+     */
+    function initialize();
+
+    /**
+     * Return the composer.json file information
+     *
+     * @param string $identifier Any identifier to a specific branch/tag/commit
+     * @return array containing all infos from the composer.json file
+     */
+    function getComposerInformation($identifier);
+
+    /**
+     * Return the root identifier (trunk, master, default/tip ..)
+     *
+     * @return string Identifier
+     */
+    function getRootIdentifier();
+
+    /**
+     * Return list of branches in the repository
+     *
+     * @return array Branch names as keys, identifiers as values
+     */
+    function getBranches();
+
+    /**
+     * Return list of tags in the repository
+     *
+     * @return array Tag names as keys, identifiers as values
+     */
+    function getTags();
+
+    /**
+     * @param string $identifier Any identifier to a specific branch/tag/commit
+     * @return array With type, url reference and shasum keys.
+     */
+    function getDist($identifier);
+
+    /**
+     * @param string $identifier Any identifier to a specific branch/tag/commit
+     * @return array With type, url and reference keys.
+     */
+    function getSource($identifier);
+
+    /**
+     * Return the URL of the repository
+     *
+     * @return string
+     */
+    function getUrl();
+
+    /**
+     * Return true if the repository has a composer file for a given identifier,
+     * false otherwise.
+     *
+     * @param string $identifier Any identifier to a specific branch/tag/commit
+     * @return boolean Whether the repository has a composer file for a given identifier.
+     */
+    function hasComposerFile($identifier);
+
+    /**
+     * Checks if this driver can handle a given url
+     *
+     * @param IOInterface $io IO instance
+     * @param string $url
+     * @param Boolean $shallow unless true, only shallow checks (url matching typically) should be done
+     * @return Boolean
+     */
+    static function supports(IOInterface $io, $url, $deep = false);
+}
diff --git a/vendor/composer/composer/src/Composer/Repository/VcsRepository.php b/vendor/composer/composer/src/Composer/Repository/VcsRepository.php
new file mode 100644
index 0000000..00499b5
--- /dev/null
+++ b/vendor/composer/composer/src/Composer/Repository/VcsRepository.php
@@ -0,0 +1,250 @@
+<?php
+
+/*
+ * This file is part of Composer.
+ *
+ * (c) Nils Adermann <naderman@naderman.de>
+ *     Jordi Boggiano <j.boggiano@seld.be>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Composer\Repository;
+
+use Composer\Downloader\TransportException;
+use Composer\Repository\Vcs\VcsDriverInterface;
+use Composer\Package\Version\VersionParser;
+use Composer\Package\PackageInterface;
+use Composer\Package\AliasPackage;
+use Composer\Package\Loader\ArrayLoader;
+use Composer\IO\IOInterface;
+use Composer\Config;
+
+/**
+ * @author Jordi Boggiano <j.boggiano@seld.be>
+ */
+class VcsRepository extends ArrayRepository
+{
+    protected $url;
+    protected $packageName;
+    protected $verbose;
+    protected $io;
+    protected $versionParser;
+    protected $type;
+
+    public function __construct(array $repoConfig, IOInterface $io, Config $config = null, array $drivers = null)
+    {
+        $this->drivers = $drivers ?: array(
+            'github'        => 'Composer\Repository\Vcs\GitHubDriver',
+            'git-bitbucket' => 'Composer\Repository\Vcs\GitBitbucketDriver',
+            'git'           => 'Composer\Repository\Vcs\GitDriver',
+            'svn'           => 'Composer\Repository\Vcs\SvnDriver',
+            'hg-bitbucket'  => 'Composer\Repository\Vcs\HgBitbucketDriver',
+            'hg'            => 'Composer\Repository\Vcs\HgDriver',
+        );
+
+        $this->url = $repoConfig['url'];
+        $this->io = $io;
+        $this->type = isset($repoConfig['type']) ? $repoConfig['type'] : 'vcs';
+        $this->verbose = $io->isVerbose();
+    }
+
+    public function getDriver()
+    {
+        if (isset($this->drivers[$this->type])) {
+            $class = $this->drivers[$this->type];
+            $driver = new $class($this->url, $this->io);
+            $driver->initialize();
+            return $driver;
+        }
+
+        foreach ($this->drivers as $driver) {
+            if ($driver::supports($this->io, $this->url)) {
+                $driver = new $driver($this->url, $this->io);
+                $driver->initialize();
+                return $driver;
+            }
+        }
+
+        foreach ($this->drivers as $driver) {
+            if ($driver::supports($this->io, $this->url, true)) {
+                $driver = new $driver($this->url, $this->io);
+                $driver->initialize();
+                return $driver;
+            }
+        }
+    }
+
+    protected function initialize()
+    {
+        parent::initialize();
+
+        $verbose = $this->verbose;
+
+        $driver = $this->getDriver();
+        if (!$driver) {
+            throw new \InvalidArgumentException('No driver found to handle VCS repository '.$this->url);
+        }
+
+        $this->versionParser = new VersionParser;
+        $loader = new ArrayLoader();
+
+        try {
+            if ($driver->hasComposerFile($driver->getRootIdentifier())) {
+                $data = $driver->getComposerInformation($driver->getRootIdentifier());
+                $this->packageName = !empty($data['name']) ? $data['name'] : null;
+            }
+        } catch (\Exception $e) {
+            if ($verbose) {
+                $this->io->write('Skipped parsing '.$driver->getRootIdentifier().', '.$e->getMessage());
+            }
+        }
+
+        foreach ($driver->getTags() as $tag => $identifier) {
+            $msg = 'Get composer info for <info>' . ($this->packageName ?: $this->url) . '</info> (<comment>' . $tag . '</comment>)';
+            if ($verbose) {
+                $this->io->write($msg);
+            } else {
+                $this->io->overwrite($msg, false);
+            }
+
+            if (!$parsedTag = $this->validateTag($tag)) {
+                if ($verbose) {
+                    $this->io->write('Skipped tag '.$tag.', invalid tag name');
+                }
+                continue;
+            }
+
+            try {
+                if (!$data = $driver->getComposerInformation($identifier)) {
+                    if ($verbose) {
+                        $this->io->write('Skipped tag '.$tag.', no composer file');
+                    }
+                    continue;
+                }
+            } catch (\Exception $e) {
+                if ($verbose) {
+                    $this->io->write('Skipped tag '.$tag.', '.($e instanceof TransportException ? 'no composer file was found' : $e->getMessage()));
+                }
+                continue;
+            }
+
+            // manually versioned package
+            if (isset($data['version'])) {
+                $data['version_normalized'] = $this->versionParser->normalize($data['version']);
+            } else {
+                // auto-versionned package, read value from tag
+                $data['version'] = $tag;
+                $data['version_normalized'] = $parsedTag;
+            }
+
+            // make sure tag packages have no -dev flag
+            $data['version'] = preg_replace('{[.-]?dev$}i', '', $data['version']);
+            $data['version_normalized'] = preg_replace('{(^dev-|[.-]?dev$)}i', '', $data['version_normalized']);
+
+            // broken package, version doesn't match tag
+            if ($data['version_normalized'] !== $parsedTag) {
+                if ($verbose) {
+                    $this->io->write('Skipped tag '.$tag.', tag ('.$parsedTag.') does not match version ('.$data['version_normalized'].') in composer.json');
+                }
+                continue;
+            }
+
+            if ($verbose) {
+                $this->io->write('Importing tag '.$tag.' ('.$data['version_normalized'].')');
+            }
+
+            $this->addPackage($loader->load($this->preProcess($driver, $data, $identifier)));
+        }
+
+        $this->io->overwrite('', false);
+
+        foreach ($driver->getBranches() as $branch => $identifier) {
+            $msg = 'Get composer info for <info>' . ($this->packageName ?: $this->url) . '</info> (<comment>' . $branch . '</comment>)';
+            if ($verbose) {
+                $this->io->write($msg);
+            } else {
+                $this->io->overwrite($msg, false);
+            }
+
+            if (!$parsedBranch = $this->validateBranch($branch)) {
+                if ($verbose) {
+                    $this->io->write('Skipped branch '.$branch.', invalid name');
+                }
+                continue;
+            }
+
+            try {
+                if (!$data = $driver->getComposerInformation($identifier)) {
+                    if ($verbose) {
+                        $this->io->write('Skipped branch '.$branch.', no composer file');
+                    }
+                    continue;
+                }
+            } catch (TransportException $e) {
+                if ($verbose) {
+                    $this->io->write('Skipped branch '.$branch.', no composer file was found');
+                }
+                continue;
+            } catch (\Exception $e) {
+                $this->io->write('Skipped branch '.$branch.', '.$e->getMessage());
+                continue;
+            }
+
+            // branches are always auto-versionned, read value from branch name
+            $data['version'] = $branch;
+            $data['version_normalized'] = $parsedBranch;
+
+            // make sure branch packages have a dev flag
+            if ('dev-' === substr($parsedBranch, 0, 4) || '9999999-dev' === $parsedBranch) {
+                $data['version'] = 'dev-' . $data['version'];
+            } else {
+                $data['version'] = $data['version'] . '-dev';
+            }
+
+            if ($verbose) {
+                $this->io->write('Importing branch '.$branch.' ('.$data['version'].')');
+            }
+
+            $this->addPackage($loader->load($this->preProcess($driver, $data, $identifier)));
+        }
+
+        $this->io->overwrite('', false);
+    }
+
+    private function preProcess(VcsDriverInterface $driver, array $data, $identifier)
+    {
+        // keep the name of the main identifier for all packages
+        $data['name'] = $this->packageName ?: $data['name'];
+
+        if (!isset($data['dist'])) {
+            $data['dist'] = $driver->getDist($identifier);
+        }
+        if (!isset($data['source'])) {
+            $data['source'] = $driver->getSource($identifier);
+        }
+
+        return $data;
+    }
+
+    private function validateBranch($branch)
+    {
+        try {
+            return $this->versionParser->normalizeBranch($branch);
+        } catch (\Exception $e) {
+        }
+
+        return false;
+    }
+
+    private function validateTag($version)
+    {
+        try {
+            return $this->versionParser->normalize($version);
+        } catch (\Exception $e) {
+        }
+
+        return false;
+    }
+}
diff --git a/vendor/composer/composer/src/Composer/Repository/WritableRepositoryInterface.php b/vendor/composer/composer/src/Composer/Repository/WritableRepositoryInterface.php
new file mode 100644
index 0000000..77291e8
--- /dev/null
+++ b/vendor/composer/composer/src/Composer/Repository/WritableRepositoryInterface.php
@@ -0,0 +1,42 @@
+<?php
+
+/*
+ * This file is part of Composer.
+ *
+ * (c) Nils Adermann <naderman@naderman.de>
+ *     Jordi Boggiano <j.boggiano@seld.be>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Composer\Repository;
+
+use Composer\Package\PackageInterface;
+
+/**
+ * Writable repository interface.
+ *
+ * @author Konstantin Kudryashov <ever.zet@gmail.com>
+ */
+interface WritableRepositoryInterface extends RepositoryInterface
+{
+    /**
+     * Writes repository (f.e. to the disc).
+     */
+    function write();
+
+    /**
+     * Adds package to the repository.
+     *
+     * @param   PackageInterface    $package    package instance
+     */
+    function addPackage(PackageInterface $package);
+
+    /**
+     * Removes package from the repository.
+     *
+     * @param   PackageInterface    $package    package instance
+     */
+    function removePackage(PackageInterface $package);
+}
diff --git a/vendor/composer/composer/src/Composer/Script/CommandEvent.php b/vendor/composer/composer/src/Composer/Script/CommandEvent.php
new file mode 100644
index 0000000..2526a99
--- /dev/null
+++ b/vendor/composer/composer/src/Composer/Script/CommandEvent.php
@@ -0,0 +1,26 @@
+<?php
+
+/*
+ * This file is part of Composer.
+ *
+ * (c) Nils Adermann <naderman@naderman.de>
+ *     Jordi Boggiano <j.boggiano@seld.be>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Composer\Script;
+
+use Composer\Composer;
+use Composer\IO\IOInterface;
+use Composer\Package\PackageInterface;
+
+/**
+ * The Command Event.
+ *
+ * @author François Pluchino <francois.pluchino@opendisplay.com>
+ */
+class CommandEvent extends Event
+{
+}
diff --git a/vendor/composer/composer/src/Composer/Script/Event.php b/vendor/composer/composer/src/Composer/Script/Event.php
new file mode 100644
index 0000000..239d494
--- /dev/null
+++ b/vendor/composer/composer/src/Composer/Script/Event.php
@@ -0,0 +1,83 @@
+<?php
+
+/*
+ * This file is part of Composer.
+ *
+ * (c) Nils Adermann <naderman@naderman.de>
+ *     Jordi Boggiano <j.boggiano@seld.be>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Composer\Script;
+
+use Composer\Composer;
+use Composer\IO\IOInterface;
+
+/**
+ * The base event class
+ *
+ * @author François Pluchino <francois.pluchino@opendisplay.com>
+ */
+class Event
+{
+    /**
+     * @var string This event's name
+     */
+    private $name;
+
+    /**
+     * @var Composer The composer instance
+     */
+    private $composer;
+
+    /**
+     * @var IOInterface The IO instance
+     */
+    private $io;
+
+    /**
+     * Constructor.
+     *
+     * @param string      $name     The event name
+     * @param Composer    $composer The composer objet
+     * @param IOInterface $io       The IOInterface object
+     */
+    public function __construct($name, Composer $composer, IOInterface $io)
+    {
+        $this->name = $name;
+        $this->composer = $composer;
+        $this->io = $io;
+    }
+
+    /**
+     * Returns the event's name.
+     *
+     * @return string The event name
+     */
+    public function getName()
+    {
+        return $this->name;
+    }
+
+    /**
+     * Returns the composer instance.
+     *
+     * @return Composer
+     */
+    public function getComposer()
+    {
+        return $this->composer;
+    }
+
+    /**
+     * Returns the IO instance.
+     *
+     * @return IOInterface
+     */
+    public function getIO()
+    {
+        return $this->io;
+    }
+}
diff --git a/vendor/composer/composer/src/Composer/Script/EventDispatcher.php b/vendor/composer/composer/src/Composer/Script/EventDispatcher.php
new file mode 100644
index 0000000..83b4fb5
--- /dev/null
+++ b/vendor/composer/composer/src/Composer/Script/EventDispatcher.php
@@ -0,0 +1,124 @@
+<?php
+
+/*
+ * This file is part of Composer.
+ *
+ * (c) Nils Adermann <naderman@naderman.de>
+ *     Jordi Boggiano <j.boggiano@seld.be>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Composer\Script;
+
+use Composer\Json\JsonFile;
+use Composer\Repository\FilesystemRepository;
+use Composer\Autoload\AutoloadGenerator;
+use Composer\Package\PackageInterface;
+use Composer\IO\IOInterface;
+use Composer\Composer;
+use Composer\DependencyResolver\Operation\OperationInterface;
+
+/**
+ * The Event Dispatcher.
+ *
+ * Example in command:
+ *     $dispatcher = new EventDispatcher($this->getComposer(), $this->getApplication()->getIO());
+ *     // ...
+ *     $dispatcher->dispatch(ScriptEvents::POST_INSTALL_CMD);
+ *     // ...
+ *
+ * @author François Pluchino <francois.pluchino@opendisplay.com>
+ * @author Jordi Boggiano <j.boggiano@seld.be>
+ */
+class EventDispatcher
+{
+    protected $composer;
+    protected $io;
+    protected $loader;
+
+    /**
+     * Constructor.
+     *
+     * @param Composer    $composer The composer instance
+     * @param IOInterface $io       The IOInterface instance
+     */
+    public function __construct(Composer $composer, IOInterface $io)
+    {
+        $this->composer = $composer;
+        $this->io = $io;
+    }
+
+    /**
+     * Dispatch a package event.
+     *
+     * @param string $eventName The constant in ScriptEvents
+     * @param OperationInterface $operation The package being installed/updated/removed
+     */
+    public function dispatchPackageEvent($eventName, OperationInterface $operation)
+    {
+        $this->doDispatch(new PackageEvent($eventName, $this->composer, $this->io, $operation));
+    }
+
+    /**
+     * Dispatch a command event.
+     *
+     * @param string $eventName The constant in ScriptEvents
+     */
+    public function dispatchCommandEvent($eventName)
+    {
+        $this->doDispatch(new CommandEvent($eventName, $this->composer, $this->io));
+    }
+
+    /**
+     * Triggers the listeners of an event.
+     *
+     * @param Event $event The event object to pass to the event handlers/listeners.
+     */
+    protected function doDispatch(Event $event)
+    {
+        $listeners = $this->getListeners($event);
+
+        foreach ($listeners as $callable) {
+            $className = substr($callable, 0, strpos($callable, '::'));
+            $methodName = substr($callable, strpos($callable, '::') + 2);
+
+            if (!class_exists($className)) {
+                throw new \UnexpectedValueException('Class '.$className.' is not autoloadable, can not call '.$event->getName().' script');
+            }
+            if (!is_callable($callable)) {
+                throw new \UnexpectedValueException('Method '.$callable.' is not callable, can not call '.$event->getName().' script');
+            }
+
+            $className::$methodName($event);
+        }
+    }
+
+    /**
+     * @param Event $event Event object
+     * @return array Listeners
+     */
+    protected function getListeners(Event $event)
+    {
+        $package = $this->composer->getPackage();
+        $scripts = $package->getScripts();
+
+        if (empty($scripts[$event->getName()])) {
+            return array();
+        }
+
+        if ($this->loader) {
+            $this->loader->unregister();
+        }
+
+        $generator = new AutoloadGenerator;
+        $packages = $this->composer->getRepositoryManager()->getLocalRepository()->getPackages();
+        $packageMap = $generator->buildPackageMap($this->composer->getInstallationManager(), $package, $packages);
+        $map = $generator->parseAutoloads($packageMap);
+        $this->loader = $generator->createLoader($map);
+        $this->loader->register();
+
+        return $scripts[$event->getName()];
+    }
+}
diff --git a/vendor/composer/composer/src/Composer/Script/PackageEvent.php b/vendor/composer/composer/src/Composer/Script/PackageEvent.php
new file mode 100644
index 0000000..7d0e394
--- /dev/null
+++ b/vendor/composer/composer/src/Composer/Script/PackageEvent.php
@@ -0,0 +1,54 @@
+<?php
+
+/*
+ * This file is part of Composer.
+ *
+ * (c) Nils Adermann <naderman@naderman.de>
+ *     Jordi Boggiano <j.boggiano@seld.be>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Composer\Script;
+
+use Composer\Composer;
+use Composer\IO\IOInterface;
+use Composer\DependencyResolver\Operation\OperationInterface;
+
+/**
+ * The Package Event.
+ *
+ * @author Jordi Boggiano <j.boggiano@seld.be>
+ */
+class PackageEvent extends Event
+{
+    /**
+     * @var OperationInterface The package instance
+     */
+    private $operation;
+
+    /**
+     * Constructor.
+     *
+     * @param string      $name     The event name
+     * @param Composer    $composer The composer objet
+     * @param IOInterface $io       The IOInterface object
+     * @param OperationInterface $operation The operation object
+     */
+    public function __construct($name, Composer $composer, IOInterface $io, OperationInterface $operation)
+    {
+        parent::__construct($name, $composer, $io);
+        $this->operation = $operation;
+    }
+
+    /**
+     * Returns the package instance.
+     *
+     * @return OperationInterface
+     */
+    public function getOperation()
+    {
+        return $this->operation;
+    }
+}
diff --git a/vendor/composer/composer/src/Composer/Script/ScriptEvents.php b/vendor/composer/composer/src/Composer/Script/ScriptEvents.php
new file mode 100644
index 0000000..9f51313
--- /dev/null
+++ b/vendor/composer/composer/src/Composer/Script/ScriptEvents.php
@@ -0,0 +1,112 @@
+<?php
+
+/*
+ * This file is part of Composer.
+ *
+ * (c) Nils Adermann <naderman@naderman.de>
+ *     Jordi Boggiano <j.boggiano@seld.be>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Composer\Script;
+
+/**
+ * The Script Events.
+ *
+ * @author François Pluchino <francois.pluchino@opendisplay.com>
+ * @author Jordi Boggiano <j.boggiano@seld.be>
+ */
+class ScriptEvents
+{
+    /**
+     * The PRE_INSTALL_CMD event occurs before the install command is executed.
+     *
+     * The event listener method receives a Composer\Script\CommandEvent instance.
+     *
+     * @var string
+     */
+    const PRE_INSTALL_CMD = 'pre-install-cmd';
+
+    /**
+     * The POST_INSTALL_CMD event occurs after the install command is executed.
+     *
+     * The event listener method receives a Composer\Script\CommandEvent instance.
+     *
+     * @var string
+     */
+    const POST_INSTALL_CMD = 'post-install-cmd';
+
+    /**
+     * The PRE_UPDATE_CMD event occurs before the update command is executed.
+     *
+     * The event listener method receives a Composer\Script\CommandEvent instance.
+     *
+     * @var string
+     */
+    const PRE_UPDATE_CMD = 'pre-update-cmd';
+
+    /**
+     * The POST_UPDATE_CMD event occurs after the update command is executed.
+     *
+     * The event listener method receives a Composer\Script\CommandEvent instance.
+     *
+     * @var string
+     */
+    const POST_UPDATE_CMD = 'post-update-cmd';
+
+    /**
+     * The PRE_PACKAGE_INSTALL event occurs before a package is installed.
+     *
+     * The event listener method receives a Composer\Script\PackageEvent instance.
+     *
+     * @var string
+     */
+    const PRE_PACKAGE_INSTALL = 'pre-package-install';
+
+    /**
+     * The POST_PACKAGE_INSTALL event occurs after a package is installed.
+     *
+     * The event listener method receives a Composer\Script\PackageEvent instance.
+     *
+     * @var string
+     */
+    const POST_PACKAGE_INSTALL = 'post-package-install';
+
+    /**
+     * The PRE_PACKAGE_UPDATE event occurs before a package is updated.
+     *
+     * The event listener method receives a Composer\Script\PackageEvent instance.
+     *
+     * @var string
+     */
+    const PRE_PACKAGE_UPDATE = 'pre-package-update';
+
+    /**
+     * The POST_PACKAGE_UPDATE event occurs after a package is updated.
+     *
+     * The event listener method receives a Composer\Script\PackageEvent instance.
+     *
+     * @var string
+     */
+    const POST_PACKAGE_UPDATE = 'post-package-update';
+
+    /**
+     * The PRE_PACKAGE_UNINSTALL event occurs before a package has been uninstalled.
+     *
+     * The event listener method receives a Composer\Script\PackageEvent instance.
+     *
+     * @var string
+     */
+    const PRE_PACKAGE_UNINSTALL = 'pre-package-uninstall';
+
+    /**
+     * The POST_PACKAGE_UNINSTALL event occurs after a package has been uninstalled.
+     *
+     * The event listener method receives a Composer\Script\PackageEvent instance.
+     *
+     * @var string
+     */
+    const POST_PACKAGE_UNINSTALL = 'post-package-uninstall';
+}
diff --git a/vendor/composer/composer/src/Composer/Util/ErrorHandler.php b/vendor/composer/composer/src/Composer/Util/ErrorHandler.php
new file mode 100644
index 0000000..d179e2c
--- /dev/null
+++ b/vendor/composer/composer/src/Composer/Util/ErrorHandler.php
@@ -0,0 +1,57 @@
+<?php
+
+/*
+ * This file is part of Composer.
+ *
+ * (c) Nils Adermann <naderman@naderman.de>
+ *     Jordi Boggiano <j.boggiano@seld.be>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Composer\Util;
+
+/**
+ * Convert PHP errors into exceptions
+ *
+ * @author Artem Lopata <biozshock@gmail.com>
+ */
+class ErrorHandler
+{
+    /**
+     * Error handler
+     *
+     * @param int    $level   Level of the error raised
+     * @param string $message Error message
+     * @param string $file    Filename that the error was raised in
+     * @param int    $line    Line number the error was raised at
+     *
+     * @static
+     * @throws \ErrorException
+     */
+    public static function handle($level, $message, $file, $line)
+    {
+        // respect error_reporting being disabled
+        if (!error_reporting()) {
+            return;
+        }
+
+        if (ini_get('xdebug.scream')) {
+            $message .= "\n\nWarning: You have xdebug.scream enabled, the warning above may be".
+            "\na legitimately suppressed error that you were not supposed to see.";
+        }
+
+        throw new \ErrorException($message, 0, $level, $file, $line);
+    }
+
+    /**
+     * Register error handler
+     *
+     * @static
+     */
+    public static function register()
+    {
+        set_error_handler(array(__CLASS__, 'handle'));
+    }
+}
diff --git a/vendor/composer/composer/src/Composer/Util/Filesystem.php b/vendor/composer/composer/src/Composer/Util/Filesystem.php
new file mode 100644
index 0000000..fd60cd2
--- /dev/null
+++ b/vendor/composer/composer/src/Composer/Util/Filesystem.php
@@ -0,0 +1,151 @@
+<?php
+
+/*
+ * This file is part of Composer.
+ *
+ * (c) Nils Adermann <naderman@naderman.de>
+ *     Jordi Boggiano <j.boggiano@seld.be>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Composer\Util;
+
+/**
+ * @author Jordi Boggiano <j.boggiano@seld.be>
+ */
+class Filesystem
+{
+    public function removeDirectory($directory)
+    {
+        if (!is_dir($directory)) {
+            return true;
+        }
+
+        if (defined('PHP_WINDOWS_VERSION_BUILD')) {
+            $cmd = sprintf('rmdir /S /Q %s', escapeshellarg(realpath($directory)));
+        } else {
+            $cmd = sprintf('rm -rf %s', escapeshellarg($directory));
+        }
+
+        $result = $this->getProcess()->execute($cmd) === 0;
+
+        // clear stat cache because external processes aren't tracked by the php stat cache
+        clearstatcache();
+
+        return $result && !is_dir($directory);
+    }
+
+    public function ensureDirectoryExists($directory)
+    {
+        if (!is_dir($directory)) {
+            if (file_exists($directory)) {
+                throw new \RuntimeException(
+                    $directory.' exists and is not a directory.'
+                );
+            }
+            if (!mkdir($directory, 0777, true)) {
+                throw new \RuntimeException(
+                    $directory.' does not exist and could not be created.'
+                );
+            }
+        }
+    }
+
+    /**
+     * Returns the shortest path from $from to $to
+     *
+     * @param string $from
+     * @param string $to
+     * @param Boolean $directories if true, the source/target are considered to be directories
+     * @return string
+     */
+    public function findShortestPath($from, $to, $directories = false)
+    {
+        if (!$this->isAbsolutePath($from) || !$this->isAbsolutePath($to)) {
+            throw new \InvalidArgumentException('from and to must be absolute paths');
+        }
+
+        $from = lcfirst(rtrim(strtr($from, '\\', '/'), '/'));
+        $to = lcfirst(rtrim(strtr($to, '\\', '/'), '/'));
+
+        if ($directories) {
+            $from .= '/dummy_file';
+        }
+
+        if (dirname($from) === dirname($to)) {
+            return './'.basename($to);
+        }
+
+        $commonPath = $to;
+        while (strpos($from, $commonPath) !== 0 && '/' !== $commonPath && !preg_match('{^[a-z]:/?$}i', $commonPath) && '.' !== $commonPath) {
+            $commonPath = strtr(dirname($commonPath), '\\', '/');
+        }
+
+        if (0 !== strpos($from, $commonPath) || '/' === $commonPath || '.' === $commonPath) {
+            return $to;
+        }
+
+        $commonPath = rtrim($commonPath, '/') . '/';
+        $sourcePathDepth = substr_count(substr($from, strlen($commonPath)), '/');
+        $commonPathCode = str_repeat('../', $sourcePathDepth);
+        return ($commonPathCode . substr($to, strlen($commonPath))) ?: './';
+    }
+
+    /**
+     * Returns PHP code that, when executed in $from, will return the path to $to
+     *
+     * @param string $from
+     * @param string $to
+     * @param Boolean $directories if true, the source/target are considered to be directories
+     * @return string
+     */
+    public function findShortestPathCode($from, $to, $directories = false)
+    {
+        if (!$this->isAbsolutePath($from) || !$this->isAbsolutePath($to)) {
+            throw new \InvalidArgumentException('from and to must be absolute paths');
+        }
+
+        $from = lcfirst(strtr($from, '\\', '/'));
+        $to = lcfirst(strtr($to, '\\', '/'));
+
+        if ($from === $to) {
+            return $directories ? '__DIR__' : '__FILE__';
+        }
+
+        $commonPath = $to;
+        while (strpos($from, $commonPath) !== 0 && '/' !== $commonPath && !preg_match('{^[a-z]:/?$}i', $commonPath) && '.' !== $commonPath) {
+            $commonPath = strtr(dirname($commonPath), '\\', '/');
+        }
+
+        if (0 !== strpos($from, $commonPath) || '/' === $commonPath || '.' === $commonPath) {
+            return var_export($to, true);
+        }
+
+        $commonPath = rtrim($commonPath, '/') . '/';
+        if (strpos($to, $from.'/') === 0) {
+            return '__DIR__ . '.var_export(substr($to, strlen($from)), true);
+        }
+        $sourcePathDepth = substr_count(substr($from, strlen($commonPath)), '/') + $directories;
+        $commonPathCode = str_repeat('dirname(', $sourcePathDepth).'__DIR__'.str_repeat(')', $sourcePathDepth);
+        $relTarget = substr($to, strlen($commonPath));
+        return $commonPathCode . (strlen($relTarget) ? '.' . var_export('/' . $relTarget, true) : '');
+    }
+
+    /**
+     * Checks if the given path is absolute
+     *
+     * @param string $path
+     * @return Boolean
+     */
+    public function isAbsolutePath($path)
+    {
+        return substr($path, 0, 1) === '/' || substr($path, 1, 1) === ':';
+    }
+
+    protected function getProcess()
+    {
+        return new ProcessExecutor;
+    }
+}
diff --git a/vendor/composer/composer/src/Composer/Util/ProcessExecutor.php b/vendor/composer/composer/src/Composer/Util/ProcessExecutor.php
new file mode 100644
index 0000000..34e195f
--- /dev/null
+++ b/vendor/composer/composer/src/Composer/Util/ProcessExecutor.php
@@ -0,0 +1,87 @@
+<?php
+
+/*
+ * This file is part of Composer.
+ *
+ * (c) Nils Adermann <naderman@naderman.de>
+ *     Jordi Boggiano <j.boggiano@seld.be>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Composer\Util;
+
+use Symfony\Component\Process\Process;
+
+/**
+ * @author Robert Schönthal <seroscho@googlemail.com>
+ */
+class ProcessExecutor
+{
+    static protected $timeout = 300;
+
+    protected $captureOutput;
+    protected $errorOutput;
+
+    /**
+     * runs a process on the commandline
+     *
+     * @param string $command the command to execute
+     * @param mixed  $output  the output will be written into this var if passed by ref
+     *                        if a callable is passed it will be used as output handler
+     * @param string $cwd     the working directory
+     * @return int statuscode
+     */
+    public function execute($command, &$output = null, $cwd = null)
+    {
+        $this->captureOutput = count(func_get_args()) > 1;
+        $this->errorOutput = null;
+        $process = new Process($command, $cwd, null, null, static::getTimeout());
+
+        $callback = is_callable($output) ? $output : array($this, 'outputHandler');
+        $process->run($callback);
+
+        if ($this->captureOutput && !is_callable($output)) {
+            $output = $process->getOutput();
+        }
+
+        $this->errorOutput = $process->getErrorOutput();
+
+        return $process->getExitCode();
+    }
+
+    public function splitLines($output)
+    {
+        return ((string) $output === '') ? array() : preg_split('{\r?\n}', $output);
+    }
+
+    /**
+     * Get any error output from the last command
+     *
+     * @return string
+     */
+    public function getErrorOutput()
+    {
+        return $this->errorOutput;
+    }
+
+    public function outputHandler($type, $buffer)
+    {
+        if ($this->captureOutput) {
+            return;
+        }
+
+        echo $buffer;
+    }
+
+    static public function getTimeout()
+    {
+        return static::$timeout;
+    }
+
+    static public function setTimeout($timeout)
+    {
+        static::$timeout = $timeout;
+    }
+}
diff --git a/vendor/composer/composer/src/Composer/Util/RemoteFilesystem.php b/vendor/composer/composer/src/Composer/Util/RemoteFilesystem.php
new file mode 100644
index 0000000..f6cfa67
--- /dev/null
+++ b/vendor/composer/composer/src/Composer/Util/RemoteFilesystem.php
@@ -0,0 +1,234 @@
+<?php
+
+/*
+ * This file is part of Composer.
+ *
+ * (c) Nils Adermann <naderman@naderman.de>
+ *     Jordi Boggiano <j.boggiano@seld.be>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Composer\Util;
+
+use Composer\Composer;
+use Composer\IO\IOInterface;
+use Composer\Downloader\TransportException;
+
+/**
+ * @author François Pluchino <francois.pluchino@opendisplay.com>
+ */
+class RemoteFilesystem
+{
+    private $io;
+    private $firstCall;
+    private $bytesMax;
+    private $originUrl;
+    private $fileUrl;
+    private $fileName;
+    private $result;
+    private $progress;
+    private $lastProgress;
+
+    /**
+     * Constructor.
+     *
+     * @param IOInterface  $io  The IO instance
+     */
+    public function __construct(IOInterface $io)
+    {
+        $this->io = $io;
+    }
+
+    /**
+     * Copy the remote file in local.
+     *
+     * @param string  $originUrl The orgin URL
+     * @param string  $fileUrl   The file URL
+     * @param string  $fileName  the local filename
+     * @param boolean $progress  Display the progression
+     *
+     * @return Boolean true
+     */
+    public function copy($originUrl, $fileUrl, $fileName, $progress = true)
+    {
+        $this->get($originUrl, $fileUrl, $fileName, $progress);
+
+        return $this->result;
+    }
+
+    /**
+     * Get the content.
+     *
+     * @param string  $originUrl The orgin URL
+     * @param string  $fileUrl   The file URL
+     * @param boolean $progress  Display the progression
+     *
+     * @return string The content
+     */
+    public function getContents($originUrl, $fileUrl, $progress = true)
+    {
+        $this->get($originUrl, $fileUrl, null, $progress);
+
+        return $this->result;
+    }
+
+    /**
+     * Get file content or copy action.
+     *
+     * @param string  $originUrl The orgin URL
+     * @param string  $fileUrl   The file URL
+     * @param string  $fileName  the local filename
+     * @param boolean $progress  Display the progression
+     *
+     * @throws TransportException When the file could not be downloaded
+     */
+    protected function get($originUrl, $fileUrl, $fileName = null, $progress = true)
+    {
+        $this->bytesMax = 0;
+        $this->result = null;
+        $this->originUrl = $originUrl;
+        $this->fileUrl = $fileUrl;
+        $this->fileName = $fileName;
+        $this->progress = $progress;
+        $this->lastProgress = null;
+
+        $options = $this->getOptionsForUrl($originUrl);
+        $ctx = StreamContextFactory::getContext($options, array('notification' => array($this, 'callbackGet')));
+
+        if ($this->progress) {
+            $this->io->write("    Downloading: <comment>connection...</comment>", false);
+        }
+
+        $result = @file_get_contents($fileUrl, false, $ctx);
+
+        // fix for 5.4.0 https://bugs.php.net/bug.php?id=61336
+        if (!empty($http_response_header[0]) && preg_match('{^HTTP/\S+ 404}i', $http_response_header[0])) {
+            $result = false;
+        }
+
+        // decode gzip
+        if (false !== $result && extension_loaded('zlib') && substr($fileUrl, 0, 4) === 'http') {
+            $decode = false;
+            foreach ($http_response_header as $header) {
+                if (preg_match('{^content-encoding: *gzip *$}i', $header)) {
+                    $decode = true;
+                    continue;
+                } elseif (preg_match('{^HTTP/}i', $header)) {
+                    $decode = false;
+                }
+            }
+
+            if ($decode) {
+                if (version_compare(PHP_VERSION, '5.4.0', '>=')) {
+                    $result = zlib_decode($result);
+                } else {
+                    // work around issue with gzuncompress & co that do not work with all gzip checksums
+                    $result = file_get_contents('compress.zlib://data:application/octet-stream;base64,'.base64_encode($result));
+                }
+            }
+        }
+
+        if ($this->progress) {
+            $this->io->overwrite("    Downloading: <comment>100%</comment>");
+        }
+
+        // handle copy command if download was successful
+        if (false !== $result && null !== $fileName) {
+            $result = (Boolean) @file_put_contents($fileName, $result);
+            if (false === $result) {
+                throw new TransportException('The "'.$fileUrl.'" file could not be written to '.$fileName);
+            }
+        }
+
+        // avoid overriding if content was loaded by a sub-call to get()
+        if (null === $this->result) {
+            $this->result = $result;
+        }
+
+        if (false === $this->result) {
+            throw new TransportException('The "'.$fileUrl.'" file could not be downloaded');
+        }
+    }
+
+    /**
+     * Get notification action.
+     *
+     * @param integer $notificationCode The notification code
+     * @param integer $severity         The severity level
+     * @param string  $message          The message
+     * @param integer $messageCode      The message code
+     * @param integer $bytesTransferred The loaded size
+     * @param integer $bytesMax         The total size
+     */
+    protected function callbackGet($notificationCode, $severity, $message, $messageCode, $bytesTransferred, $bytesMax)
+    {
+        switch ($notificationCode) {
+            case STREAM_NOTIFY_FAILURE:
+                throw new TransportException('The "'.$this->fileUrl.'" file could not be downloaded ('.trim($message).')', $messageCode);
+                break;
+
+            case STREAM_NOTIFY_AUTH_REQUIRED:
+                if (401 === $messageCode) {
+                    if (!$this->io->isInteractive()) {
+                        $message = "The '" . $this->fileUrl . "' URL required authentication.\nYou must be using the interactive console";
+
+                        throw new TransportException($message, 401);
+                    }
+
+                    $this->io->overwrite('    Authentication required (<info>'.parse_url($this->fileUrl, PHP_URL_HOST).'</info>):');
+                    $username = $this->io->ask('      Username: ');
+                    $password = $this->io->askAndHideAnswer('      Password: ');
+                    $this->io->setAuthorization($this->originUrl, $username, $password);
+
+                    $this->get($this->originUrl, $this->fileUrl, $this->fileName, $this->progress);
+                }
+                break;
+
+            case STREAM_NOTIFY_FILE_SIZE_IS:
+                if ($this->bytesMax < $bytesMax) {
+                    $this->bytesMax = $bytesMax;
+                }
+                break;
+
+            case STREAM_NOTIFY_PROGRESS:
+                if ($this->bytesMax > 0 && $this->progress) {
+                    $progression = 0;
+
+                    if ($this->bytesMax > 0) {
+                        $progression = round($bytesTransferred / $this->bytesMax * 100);
+                    }
+
+                    if ((0 === $progression % 5) && $progression !== $this->lastProgress) {
+                        $this->lastProgress = $progression;
+                        $this->io->overwrite("    Downloading: <comment>$progression%</comment>", false);
+                    }
+                }
+                break;
+
+            default:
+                break;
+        }
+    }
+
+    protected function getOptionsForUrl($originUrl)
+    {
+        $options['http']['header'] = 'User-Agent: Composer/'.Composer::VERSION."\r\n";
+        if (extension_loaded('zlib')) {
+            $options['http']['header'] .= 'Accept-Encoding: gzip'."\r\n";
+        }
+
+        if ($this->io->hasAuthorization($originUrl)) {
+            $auth = $this->io->getAuthorization($originUrl);
+            $authStr = base64_encode($auth['username'] . ':' . $auth['password']);
+            $options['http']['header'] .= "Authorization: Basic $authStr\r\n";
+        } elseif (null !== $this->io->getLastUsername()) {
+            $authStr = base64_encode($this->io->getLastUsername() . ':' . $this->io->getLastPassword());
+            $options['http']['header'] .= "Authorization: Basic $authStr\r\n";
+            $this->io->setAuthorization($originUrl, $this->io->getLastUsername(), $this->io->getLastPassword());
+        }
+
+        return $options;
+    }
+}
diff --git a/vendor/composer/composer/src/Composer/Util/StreamContextFactory.php b/vendor/composer/composer/src/Composer/Util/StreamContextFactory.php
new file mode 100644
index 0000000..6541d81
--- /dev/null
+++ b/vendor/composer/composer/src/Composer/Util/StreamContextFactory.php
@@ -0,0 +1,56 @@
+<?php
+
+/*
+ * This file is part of Composer.
+ *
+ * (c) Nils Adermann <naderman@naderman.de>
+ *     Jordi Boggiano <j.boggiano@seld.be>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Composer\Util;
+
+/**
+ * Allows the creation of a basic context supporting http proxy
+ *
+ * @author Jordan Alliot <jordan.alliot@gmail.com>
+ */
+final class StreamContextFactory
+{
+    /**
+     * Creates a context supporting HTTP proxies
+     *
+     * @param array $defaultOptions Options to merge with the default
+     * @param array $defaultParams  Parameters to specify on the context
+     * @return resource Default context
+     * @throws \RuntimeException if https proxy required and OpenSSL uninstalled
+     */
+    static public function getContext(array $defaultOptions = array(), array $defaultParams = array())
+    {
+        $options = array('http' => array());
+
+        // Handle system proxy
+        if (isset($_SERVER['HTTP_PROXY']) || isset($_SERVER['http_proxy'])) {
+            // Some systems seem to rely on a lowercased version instead...
+            $proxy = isset($_SERVER['http_proxy']) ? $_SERVER['http_proxy'] : $_SERVER['HTTP_PROXY'];
+
+            // http(s):// is not supported in proxy
+            $proxy = str_replace(array('http://', 'https://'), array('tcp://', 'ssl://'), $proxy);
+
+            if (0 === strpos($proxy, 'ssl:') && !extension_loaded('openssl')) {
+                throw new \RuntimeException('You must enable the openssl extension to use a proxy over https');
+            }
+
+            $options['http'] = array(
+                'proxy'           => $proxy,
+                'request_fulluri' => true,
+            );
+        }
+
+        $options = array_merge_recursive($options, $defaultOptions);
+        
+        return stream_context_create($options, $defaultParams);
+    }
+}
diff --git a/vendor/composer/composer/src/Composer/Util/Svn.php b/vendor/composer/composer/src/Composer/Util/Svn.php
new file mode 100644
index 0000000..62da6e1
--- /dev/null
+++ b/vendor/composer/composer/src/Composer/Util/Svn.php
@@ -0,0 +1,259 @@
+<?php
+
+/*
+ * This file is part of Composer.
+ *
+ * (c) Nils Adermann <naderman@naderman.de>
+ *     Jordi Boggiano <j.boggiano@seld.be>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Composer\Util;
+
+use Composer\IO\IOInterface;
+
+/**
+ * @author Till Klampaeckel <till@php.net>
+ * @author Jordi Boggiano <j.boggiano@seld.be>
+ */
+class Svn
+{
+    /**
+     * @var array
+     */
+    protected $credentials;
+
+    /**
+     * @var bool
+     */
+    protected $hasAuth;
+
+    /**
+     * @var \Composer\IO\IOInterface
+     */
+    protected $io;
+
+    /**
+     * @var string
+     */
+    protected $url;
+
+    /**
+     * @var bool
+     */
+    protected $cacheCredentials = true;
+
+    /**
+     * @var ProcessExecutor
+     */
+    protected $process;
+
+    /**
+     * @param string                   $url
+     * @param \Composer\IO\IOInterface $io
+     * @param ProcessExecutor          $process
+     */
+    public function __construct($url, IOInterface $io, ProcessExecutor $process = null)
+    {
+        $this->url = $url;
+        $this->io  = $io;
+        $this->process = $process ?: new ProcessExecutor;
+    }
+
+    /**
+     * Execute an SVN command and try to fix up the process with credentials
+     * if necessary.
+     *
+     * @param string $command SVN command to run
+     * @param string $url     SVN url
+     * @param string $cwd     Working directory
+     * @param string $path    Target for a checkout
+     * @param Boolean $verbose Output all output to the user
+     *
+     * @return string
+     *
+     * @throws \RuntimeException
+     */
+    public function execute($command, $url, $cwd = null, $path = null, $verbose = false)
+    {
+        $svnCommand = $this->getCommand($command, $url, $path);
+        $output = null;
+        $io = $this->io;
+        $handler = function ($type, $buffer) use (&$output, $io, $verbose) {
+            if ($type !== 'out') {
+                return;
+            }
+            $output .= $buffer;
+            if ($verbose) {
+                $io->write($buffer, false);
+            }
+        };
+        $status = $this->process->execute($svnCommand, $handler, $cwd);
+        if (0 === $status) {
+            return $output;
+        }
+
+        if (empty($output)) {
+            $output = $this->process->getErrorOutput();
+        }
+
+        // the error is not auth-related
+        if (false === stripos($output, 'authorization failed:')) {
+            throw new \RuntimeException($output);
+        }
+
+        // no auth supported for non interactive calls
+        if (!$this->io->isInteractive()) {
+            throw new \RuntimeException(
+                'can not ask for authentication in non interactive mode ('.$output.')'
+            );
+        }
+
+        // TODO keep a count of user auth attempts and ask 5 times before
+        // failing hard (currently it fails hard directly if the URL has credentials)
+
+        // try to authenticate
+        if (!$this->hasAuth()) {
+            $this->doAuthDance();
+
+            // restart the process
+            return $this->execute($command, $url, $cwd, $path, $verbose);
+        }
+
+        throw new \RuntimeException(
+            'wrong credentials provided ('.$output.')'
+        );
+    }
+
+    /**
+     * Repositories requests credentials, let's put them in.
+     *
+     * @return \Composer\Util\Svn
+     */
+    protected function doAuthDance()
+    {
+        $this->io->write("The Subversion server ({$this->url}) requested credentials:");
+
+        $this->hasAuth = true;
+        $this->credentials['username'] = $this->io->ask("Username: ");
+        $this->credentials['password'] = $this->io->askAndHideAnswer("Password: ");
+
+        $this->cacheCredentials = $this->io->askConfirmation("Should Subversion cache these credentials? (yes/no) ", true);
+
+        return $this;
+    }
+
+    /**
+     * A method to create the svn commands run.
+     *
+     * @param string $cmd  Usually 'svn ls' or something like that.
+     * @param string $url  Repo URL.
+     * @param string $path Target for a checkout
+     *
+     * @return string
+     */
+    protected function getCommand($cmd, $url, $path = null)
+    {
+        $cmd = sprintf('%s %s%s %s',
+            $cmd,
+            '--non-interactive ',
+            $this->getCredentialString(),
+            escapeshellarg($url)
+        );
+
+        if ($path) {
+            $cmd .= ' ' . escapeshellarg($path);
+        }
+
+        return $cmd;
+    }
+
+    /**
+     * Return the credential string for the svn command.
+     *
+     * Adds --no-auth-cache when credentials are present.
+     *
+     * @return string
+     */
+    protected function getCredentialString()
+    {
+        if (!$this->hasAuth()) {
+            return '';
+        }
+
+        return sprintf(
+            ' %s--username %s --password %s ',
+            $this->getAuthCache(),
+            escapeshellarg($this->getUsername()),
+            escapeshellarg($this->getPassword())
+        );
+    }
+
+    /**
+     * Get the password for the svn command. Can be empty.
+     *
+     * @return string
+     * @throws \LogicException
+     */
+    protected function getPassword()
+    {
+        if ($this->credentials === null) {
+            throw new \LogicException("No svn auth detected.");
+        }
+
+        return isset($this->credentials['password']) ? $this->credentials['password'] : '';
+    }
+
+    /**
+     * Get the username for the svn command.
+     *
+     * @return string
+     * @throws \LogicException
+     */
+    protected function getUsername()
+    {
+        if ($this->credentials === null) {
+            throw new \LogicException("No svn auth detected.");
+        }
+
+        return $this->credentials['username'];
+    }
+
+    /**
+     * Detect Svn Auth.
+     *
+     * @param string $url
+     *
+     * @return Boolean
+     */
+    protected function hasAuth()
+    {
+        if (null !== $this->hasAuth) {
+            return $this->hasAuth;
+        }
+
+        $uri = parse_url($this->url);
+        if (empty($uri['user'])) {
+            return $this->hasAuth = false;
+        }
+
+        $this->credentials['username'] = $uri['user'];
+        if (!empty($uri['pass'])) {
+            $this->credentials['password'] = $uri['pass'];
+        }
+
+        return $this->hasAuth = true;
+    }
+
+    /**
+     * Return the no-auth-cache switch.
+     *
+     * @return string
+     */
+    protected function getAuthCache()
+    {
+        return $this->cacheCredentials ? '' : '--no-auth-cache ';
+    }
+}
\ No newline at end of file
diff --git a/vendor/composer/composer/src/bootstrap.php b/vendor/composer/composer/src/bootstrap.php
new file mode 100644
index 0000000..b9c5094
--- /dev/null
+++ b/vendor/composer/composer/src/bootstrap.php
@@ -0,0 +1,25 @@
+<?php
+
+/*
+ * This file is part of Composer.
+ *
+ * (c) Nils Adermann <naderman@naderman.de>
+ *     Jordi Boggiano <j.boggiano@seld.be>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+function includeIfExists($file) {
+    if (file_exists($file)) {
+        return include $file;
+    }
+}
+
+if ((!$loader = includeIfExists(__DIR__.'/../../../.composer/autoload.php')) && (!$loader = includeIfExists(__DIR__.'/../vendor/.composer/autoload.php'))) {
+    die('You must set up the project dependencies, run the following commands:'.PHP_EOL.
+        'curl -s http://getcomposer.org/installer | php'.PHP_EOL.
+        'php composer.phar install'.PHP_EOL);
+}
+
+return $loader;
\ No newline at end of file
diff --git a/vendor/composer/composer/vendor/justinrainbow/json-schema/LICENSE b/vendor/composer/composer/vendor/justinrainbow/json-schema/LICENSE
new file mode 100644
index 0000000..6210e7c
--- /dev/null
+++ b/vendor/composer/composer/vendor/justinrainbow/json-schema/LICENSE
@@ -0,0 +1,29 @@
+Copyright (c) 2008, Gradua Networks
+Author: Bruno Prieto Reis
+All rights reserved.
+
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+
+ * Redistributions of source code must retain the above copyright notice, this
+   list of conditions and the following disclaimer.
+
+ * Redistributions in binary form must reproduce the above copyright notice,
+   this list of conditions and the following disclaimer in the documentation
+   and/or other materials provided with the distribution.
+
+ * Neither the name of the Gradua Networks nor the names of its contributors
+   may be used to endorse or promote products derived from this software
+   without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
+FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
diff --git a/vendor/composer/composer/vendor/justinrainbow/json-schema/README.md b/vendor/composer/composer/vendor/justinrainbow/json-schema/README.md
new file mode 100644
index 0000000..b165098
--- /dev/null
+++ b/vendor/composer/composer/vendor/justinrainbow/json-schema/README.md
@@ -0,0 +1,44 @@
+# JSON Schema for PHP [![Build Status](https://secure.travis-ci.org/justinrainbow/json-schema.png)](http://travis-ci.org/justinrainbow/json-schema)
+
+A PHP Implementation for validating `JSON` Structures against a given `Schema`.
+
+See [json-schema](http://json-schema.org/) for more details.
+
+## Installation
+
+### Library
+
+    $ git clone https://github.com/justinrainbow/json-schema.git
+
+### Dependencies
+
+#### via `submodules` (*will use the Symfony ClassLoader Component*)
+
+    $ git submodule update --init
+
+#### via [`composer`](https://github.com/composer/composer) (*will use the Composer ClassLoader*)
+
+    $ wget http://getcomposer.org/composer.phar
+    $ php composer.phar install
+
+## Usage
+
+```php
+<?php
+
+$validator = new JsonSchema\Validator();
+$validator->check(json_decode($json), json_decode($schema));
+
+if ($validator->isValid()) {
+    echo "The supplied JSON validates against the schema.\n";
+} else {
+    echo "JSON does not validate. Violations:\n";
+    foreach ($validator->getErrors() as $error) {
+        echo sprintf("[%s] %s\n",$error['property'], $error['message']);
+    }
+}
+```
+
+## Running the tests
+
+    $ phpunit
diff --git a/vendor/composer/composer/vendor/justinrainbow/json-schema/composer.json b/vendor/composer/composer/vendor/justinrainbow/json-schema/composer.json
new file mode 100644
index 0000000..dbf8c50
--- /dev/null
+++ b/vendor/composer/composer/vendor/justinrainbow/json-schema/composer.json
@@ -0,0 +1,33 @@
+{
+    "name": "justinrainbow/json-schema",
+    "description": "A library to validate a json schema.",
+    "keywords": ["json", "schema"],
+    "homepage": "https://github.com/justinrainbow/json-schema",
+    "type": "library",
+    "license": "NewBSD",
+    "version": "1.1.0",
+    "authors": [
+        {
+            "name": "Bruno Prieto Reis",
+            "email": "bruno.p.reis@gmail.com"
+        },
+        {
+            "name": "Justin Rainbow",
+            "email": "justin.rainbow@gmail.com"
+        },
+        {
+            "name": "Igor Wiedler",
+            "email": "igor@wiedler.ch"
+        },
+        {
+            "name": "Robert Schönthal",
+            "email": "seroscho@googlemail.com"
+        }
+    ],
+    "require": {
+        "php": ">=5.3.0"
+    },
+    "autoload": {
+        "psr-0": { "JsonSchema": "src/" }
+    }
+}
diff --git a/vendor/composer/composer/vendor/justinrainbow/json-schema/phpunit.xml.dist b/vendor/composer/composer/vendor/justinrainbow/json-schema/phpunit.xml.dist
new file mode 100644
index 0000000..af9b0c9
--- /dev/null
+++ b/vendor/composer/composer/vendor/justinrainbow/json-schema/phpunit.xml.dist
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<phpunit backupGlobals="false"
+         backupStaticAttributes="false"
+         colors="true"
+         convertErrorsToExceptions="true"
+         convertNoticesToExceptions="true"
+         convertWarningsToExceptions="true"
+         processIsolation="false"
+         stopOnFailure="false"
+         syntaxCheck="false"
+         bootstrap="tests/bootstrap.php"
+         verbose="true"
+>
+    <testsuites>
+        <testsuite name="JSON Schema Test Suite">
+            <directory>tests</directory>
+        </testsuite>
+    </testsuites>
+
+    <filter>
+        <whitelist>
+            <directory>./src/JsonSchema/</directory>
+        </whitelist>
+    </filter>
+</phpunit>
diff --git a/vendor/composer/composer/vendor/justinrainbow/json-schema/src/JsonSchema/Constraints/Collection.php b/vendor/composer/composer/vendor/justinrainbow/json-schema/src/JsonSchema/Constraints/Collection.php
new file mode 100644
index 0000000..a3d9953
--- /dev/null
+++ b/vendor/composer/composer/vendor/justinrainbow/json-schema/src/JsonSchema/Constraints/Collection.php
@@ -0,0 +1,95 @@
+<?php
+
+namespace JsonSchema\Constraints;
+
+/**
+ * The Collection Constraints, validates an array against a given schema
+ *
+ * @author Robert Schönthal <seroscho@googlemail.com>
+ * @author Bruno Prieto Reis <bruno.p.reis@gmail.com>
+ */
+class Collection extends Constraint
+{
+    /**
+     * {inheritDoc}
+     */
+    public function check($value, $schema = null, $path = null, $i = null)
+    {
+        // verify minItems
+        if (isset($schema->minItems) && count($value) < $schema->minItems) {
+            $this->addError($path, "There must be a minimum of " . $schema->minItems . " in the array");
+        }
+        // verify maxItems
+        if (isset($schema->maxItems) && count($value) > $schema->maxItems) {
+            $this->addError($path, "There must be a maximum of " . $schema->maxItems . " in the array");
+        }
+        // verify uniqueItems
+        //TODO array_unique doesnt work with objects
+        if (isset($schema->uniqueItems) && array_unique($value) != $value) {
+            $this->addError($path, "There are no duplicates allowed in the array");
+        }
+
+        //verify items
+        if (isset($schema->items)) {
+            $this->validateItems($value, $schema, $path, $i);
+        }
+    }
+
+    /**
+     * validates the items
+     *
+     * @param array $value
+     * @param \stdClass $schema
+     * @param string $path
+     * @param string $i
+     */
+    protected function validateItems($value, $schema = null, $path = null, $i = null)
+    {
+        if (!is_array($schema->items)) {
+            // just one type definition for the whole array
+            foreach ($value as $k => $v) {
+                $initErrors = $this->getErrors();
+
+                //first check if its defined in "items"
+                if (!isset($schema->additionalItems) || $schema->additionalItems === false) {
+                    $this->checkUndefined($v, $schema->items, $path, $k);
+                }
+
+                //recheck with "additionalItems" if the first test fails
+                if (count($initErrors) < count($this->getErrors()) && (isset($schema->additionalItems) && $schema->additionalItems !== false)) {
+                    $secondErrors = $this->getErrors();
+                    $this->checkUndefined($v, $schema->additionalItems, $path, $k);
+                }
+
+                //reset errors if needed
+                if (isset($secondErrors) && count($secondErrors) < $this->getErrors()) {
+                    $this->errors = $secondErrors;
+                } elseif (isset($secondErrors) && count($secondErrors) == count($this->getErrors())) {
+                    $this->errors = $initErrors;
+                }
+            }
+        } else {
+            //defined item type definitions
+            foreach ($value as $k => $v) {
+                if (array_key_exists($k, $schema->items)) {
+                    $this->checkUndefined($v, $schema->items[$k], $path, $k);
+                } else {
+                    // additional items
+                    if (array_key_exists('additionalItems', $schema) && $schema->additionalItems !== false) {
+                        $this->checkUndefined($v, $schema->additionalItems, $path, $k);
+                    } else {
+                        $this->addError(
+                            $path,
+                            'The item ' . $i . '[' . $k . '] is not defined in the objTypeDef and the objTypeDef does not allow additional properties'
+                        );
+                    }
+                }
+            }
+
+            // treat when we have more schema definitions than values
+            for ($k = count($value); $k < count($schema->items); $k++) {
+                $this->checkUndefined(new Undefined(), $schema->items[$k], $path, $k);
+            }
+        }
+    }
+}
\ No newline at end of file
diff --git a/vendor/composer/composer/vendor/justinrainbow/json-schema/src/JsonSchema/Constraints/Constraint.php b/vendor/composer/composer/vendor/justinrainbow/json-schema/src/JsonSchema/Constraints/Constraint.php
new file mode 100644
index 0000000..a6f57ae
--- /dev/null
+++ b/vendor/composer/composer/vendor/justinrainbow/json-schema/src/JsonSchema/Constraints/Constraint.php
@@ -0,0 +1,198 @@
+<?php
+
+namespace JsonSchema\Constraints;
+
+/**
+ * The Base Constraints, all Validators should extend this class
+ *
+ * @author Robert Schönthal <seroscho@googlemail.com>
+ * @author Bruno Prieto Reis <bruno.p.reis@gmail.com>
+ */
+abstract class Constraint implements ConstraintInterface
+{
+    protected $checkMode = self::CHECK_MODE_NORMAL;
+    protected $errors = array();
+    protected $inlineSchemaProperty = '$schema';
+
+    const CHECK_MODE_NORMAL = 1;
+    const CHECK_MODE_TYPE_CAST = 2;
+
+    /**
+     * @param int $checkMode
+     */
+    public function __construct($checkMode = self::CHECK_MODE_NORMAL)
+    {
+        $this->checkMode = $checkMode;
+    }
+
+    /**
+     * {inheritDoc}
+     */
+    public function addError($path, $message)
+    {
+        $this->errors[] = array(
+            'property' => $path,
+            'message' => $message
+        );
+    }
+
+    /**
+     * {inheritDoc}
+     */
+    public function addErrors(array $errors)
+    {
+        $this->errors = array_merge($this->errors, $errors);
+    }
+
+    /**
+     * {inheritDoc}
+     */
+    public function getErrors()
+    {
+        return array_unique($this->errors, SORT_REGULAR);
+    }
+
+    /**
+     * bubble down the path
+     *
+     * @param string $path
+     * @param mixed $i
+     * @return string
+     */
+    protected function incrementPath($path, $i)
+    {
+        if ($path !== '') {
+            if (is_int($i)) {
+                $path .= '[' . $i . ']';
+            } else if ($i == '') {
+                $path .= '';
+            } else {
+                $path .= '.' . $i;
+            }
+        } else {
+            $path = $i;
+        }
+
+        return $path;
+    }
+
+    /**
+     * validates an array
+     *
+     * @param mixed $value
+     * @param mixed $schema
+     * @param mixed $path
+     * @param mixed $i
+     */
+    protected function checkArray($value, $schema = null, $path = null, $i = null)
+    {
+        $validator = new Collection($this->checkMode);
+        $validator->check($value, $schema, $path, $i);
+
+        $this->addErrors($validator->getErrors());
+    }
+
+    /**
+     * validates an object
+     *
+     * @param mixed $value
+     * @param mixed $schema
+     * @param mixed $path
+     * @param mixed $i
+     */
+    protected function checkObject($value, $schema = null, $path = null, $i = null)
+    {
+        $validator = new Object($this->checkMode);
+        $validator->check($value, $schema, $path, $i);
+
+        $this->addErrors($validator->getErrors());
+    }
+
+    /**
+     * validates the type of a property
+     *
+     * @param mixed $value
+     * @param mixed $schema
+     * @param mixed $path
+     * @param mixed $i
+     */
+    protected function checkType($value, $schema = null, $path = null, $i = null)
+    {
+        $validator = new Type($this->checkMode);
+        $validator->check($value, $schema, $path, $i);
+
+        $this->addErrors($validator->getErrors());
+    }
+
+    /**
+     * checks a undefined element
+     *
+     * @param mixed $value
+     * @param mixed $schema
+     * @param mixed $path
+     * @param mixed $i
+     */
+    protected function checkUndefined($value, $schema = null, $path = null, $i = null)
+    {
+        $validator = new Undefined($this->checkMode);
+        $validator->check($value, $schema, $path, $i);
+
+        $this->addErrors($validator->getErrors());
+    }
+
+    /**
+     * checks a string element
+     *
+     * @param mixed $value
+     * @param mixed $schema
+     * @param mixed $path
+     * @param mixed $i
+     */
+    protected function checkString($value, $schema = null, $path = null, $i = null)
+    {
+        $validator = new String($this->checkMode);
+        $validator->check($value, $schema, $path, $i);
+
+        $this->addErrors($validator->getErrors());
+    }
+
+    /**
+     * checks a number element
+     *
+     * @param mixed $value
+     * @param mixed $schema
+     * @param mixed $path
+     * @param mixed $i
+     */
+    protected function checkNumber($value, $schema = null, $path = null, $i = null)
+    {
+        $validator = new Number($this->checkMode);
+        $validator->check($value, $schema, $path, $i);
+
+        $this->addErrors($validator->getErrors());
+    }
+
+    /**
+     * checks a enum element
+     *
+     * @param mixed $value
+     * @param mixed $schema
+     * @param mixed $path
+     * @param mixed $i
+     */
+    protected function checkEnum($value, $schema = null, $path = null, $i = null)
+    {
+        $validator = new Enum($this->checkMode);
+        $validator->check($value, $schema, $path, $i);
+
+        $this->addErrors($validator->getErrors());
+    }
+
+    /**
+     * {inheritDoc}
+     */
+    public function isValid()
+    {
+        return !$this->getErrors();
+    }
+}
\ No newline at end of file
diff --git a/vendor/composer/composer/vendor/justinrainbow/json-schema/src/JsonSchema/Constraints/ConstraintInterface.php b/vendor/composer/composer/vendor/justinrainbow/json-schema/src/JsonSchema/Constraints/ConstraintInterface.php
new file mode 100644
index 0000000..97c533c
--- /dev/null
+++ b/vendor/composer/composer/vendor/justinrainbow/json-schema/src/JsonSchema/Constraints/ConstraintInterface.php
@@ -0,0 +1,51 @@
+<?php
+
+namespace JsonSchema\Constraints;
+
+/**
+ * The Constraints Interface
+ *
+ * @author Robert Schönthal <seroscho@googlemail.com>
+ */
+interface ConstraintInterface
+{
+    /**
+     * returns all collected errors
+     *
+     * @return array
+     */
+    function getErrors();
+
+    /**
+     * adds errors to this validator
+     *
+     * @param array $errors
+     */
+    function addErrors(array $errors);
+
+    /**
+     * adds an error
+     *
+     * @param $path
+     * @param $message
+     */
+    function addError($path, $message);
+
+    /**
+     * checks if the validator has not raised errors
+     *
+     * @return boolean
+     */
+    function isValid();
+
+    /**
+     * invokes the validation of an element
+     *
+     * @abstract
+     * @param mixed $value
+     * @param null $schema
+     * @param null $path
+     * @param null $i
+     */
+    function check($value, $schema = null, $path = null, $i = null);
+}
\ No newline at end of file
diff --git a/vendor/composer/composer/vendor/justinrainbow/json-schema/src/JsonSchema/Constraints/Enum.php b/vendor/composer/composer/vendor/justinrainbow/json-schema/src/JsonSchema/Constraints/Enum.php
new file mode 100644
index 0000000..ba0d55c
--- /dev/null
+++ b/vendor/composer/composer/vendor/justinrainbow/json-schema/src/JsonSchema/Constraints/Enum.php
@@ -0,0 +1,29 @@
+<?php
+
+namespace JsonSchema\Constraints;
+
+/**
+ * The Enum Constraints, validates an element against a given set of possibilities
+ *
+ * @author Robert Schönthal <seroscho@googlemail.com>
+ * @author Bruno Prieto Reis <bruno.p.reis@gmail.com>
+ */
+class Enum extends Constraint
+{
+    /**
+     * {inheritDoc}
+     */
+    public function check($element, $schema = null, $path = null, $i = null)
+    {
+        foreach ($schema->enum as $possibleValue) {
+            if ($possibleValue == $element) {
+                $found = true;
+                break;
+            }
+        }
+
+        if (!isset($found)) {
+            $this->addError($path, "does not have a value in the enumeration " . implode(', ', $schema->enum));
+        }
+    }
+}
\ No newline at end of file
diff --git a/vendor/composer/composer/vendor/justinrainbow/json-schema/src/JsonSchema/Constraints/Number.php b/vendor/composer/composer/vendor/justinrainbow/json-schema/src/JsonSchema/Constraints/Number.php
new file mode 100644
index 0000000..00331cd
--- /dev/null
+++ b/vendor/composer/composer/vendor/justinrainbow/json-schema/src/JsonSchema/Constraints/Number.php
@@ -0,0 +1,33 @@
+<?php
+
+namespace JsonSchema\Constraints;
+
+/**
+ * The Number Constraints, validates an number against a given schema
+ *
+ * @author Robert Schönthal <seroscho@googlemail.com>
+ * @author Bruno Prieto Reis <bruno.p.reis@gmail.com>
+ */
+class Number extends Constraint
+{
+    /**
+     * {inheritDoc}
+     */
+    public function check($element, $schema = null, $path = null, $i = null)
+    {
+        //verify minimum
+        if (isset($schema->minimum) && $element < $schema->minimum) {
+            $this->addError($path, "must have a minimum value of " . $schema->minimum);
+        }
+
+        //verify maximum
+        if (isset($schema->maximum) && $element > $schema->maximum) {
+            $this->addError($path, "must have a maximum value of " . $schema->maximum);
+        }
+
+        //verify divisibleBy
+        if (isset($schema->divisibleBy) && $element % $schema->divisibleBy != 0) {
+            $this->addError($path, "is not divisible by " . $schema->divisibleBy);
+        }
+    }
+}
\ No newline at end of file
diff --git a/vendor/composer/composer/vendor/justinrainbow/json-schema/src/JsonSchema/Constraints/Object.php b/vendor/composer/composer/vendor/justinrainbow/json-schema/src/JsonSchema/Constraints/Object.php
new file mode 100644
index 0000000..12456d2
--- /dev/null
+++ b/vendor/composer/composer/vendor/justinrainbow/json-schema/src/JsonSchema/Constraints/Object.php
@@ -0,0 +1,98 @@
+<?php
+
+namespace JsonSchema\Constraints;
+
+/**
+ * The Object Constraints, validates an object against a given schema
+ *
+ * @author Robert Schönthal <seroscho@googlemail.com>
+ * @author Bruno Prieto Reis <bruno.p.reis@gmail.com>
+ */
+class Object extends Constraint
+{
+    /**
+     * {inheritDoc}
+     */
+    function check($element, $definition = null, $path = null, $additionalProp = null)
+    {
+        // validate the definition properties
+        $this->validateDefinition($element, $definition, $path);
+
+        // additional the element properties
+        $this->validateElement($element, $definition, $path, $additionalProp);
+    }
+
+    /**
+     * validates the element properties
+     *
+     * @param \stdClass $element
+     * @param \stdClass $objectDefinition
+     * @param string $path
+     * @param mixed $additionalProp
+     */
+    public function validateElement($element, $objectDefinition = null, $path = null, $additionalProp = null)
+    {
+        foreach ($element as $i => $value) {
+
+            $property = $this->getProperty($element, $i, new Undefined());
+            $definition = $this->getProperty($objectDefinition, $i);
+
+            //required property
+            if ($this->getProperty($definition, 'required') && !$property) {
+                $this->addError($path, "the property " . $i . " is required");
+            }
+
+            //no additional properties allowed
+            if ($additionalProp === false && $this->inlineSchemaProperty !== $i && !$definition) {
+                $this->addError($path, "The property " . $i . " is not defined and the definition does not allow additional properties");
+            }
+
+            // additional properties defined
+            if ($additionalProp && !$definition) {
+                $this->checkUndefined($value, $additionalProp, $path, $i);
+            }
+
+            // property requires presence of another
+            $require = $this->getProperty($definition, 'requires');
+            if ($require && !$this->getProperty($element, $require)) {
+                $this->addError($path, "the presence of the property " . $i . " requires that " . $require . " also be present");
+            }
+
+            //normal property verification
+            $this->checkUndefined($value, $definition ? : new \stdClass(), $path, $i);
+        }
+    }
+
+    /**
+     * validates the definition properties
+     *
+     * @param \stdClass $element
+     * @param \stdClass $objectDefinition
+     * @param string $path
+     */
+    public function validateDefinition($element, $objectDefinition = null, $path = null)
+    {
+        foreach ($objectDefinition as $i => $value) {
+            $property = $this->getProperty($element, $i, new Undefined());
+            $definition = $this->getProperty($objectDefinition, $i);
+            $this->checkUndefined($property, $definition, $path, $i);
+        }
+    }
+
+    /**
+     * retrieves a property from an object or array
+     *
+     * @param mixed $element
+     * @param string $property
+     * @param mixed $fallback
+     * @return mixed
+     */
+    protected function getProperty($element, $property, $fallback = null)
+    {
+        if (is_array($element) /*$this->checkMode == self::CHECK_MODE_TYPE_CAST*/) {
+            return array_key_exists($property, $element) ? $element[$property] : $fallback;
+        } else {
+            return isset($element->$property) ? $element->$property : $fallback;
+        }
+    }
+}
\ No newline at end of file
diff --git a/vendor/composer/composer/vendor/justinrainbow/json-schema/src/JsonSchema/Constraints/Schema.php b/vendor/composer/composer/vendor/justinrainbow/json-schema/src/JsonSchema/Constraints/Schema.php
new file mode 100644
index 0000000..20800fd
--- /dev/null
+++ b/vendor/composer/composer/vendor/justinrainbow/json-schema/src/JsonSchema/Constraints/Schema.php
@@ -0,0 +1,28 @@
+<?php
+
+namespace JsonSchema\Constraints;
+
+/**
+ * The Schema Constraints, validates an element against a given schema
+ *
+ * @author Robert Schönthal <seroscho@googlemail.com>
+ * @author Bruno Prieto Reis <bruno.p.reis@gmail.com>
+ */
+class Schema extends Constraint
+{
+    /**
+     * {inheritDoc}
+     */
+    public function check($element, $schema = null, $path = null, $i = null)
+    {
+        if ($schema !== null) {
+            // passed schema
+            $this->checkUndefined($element, $schema, '', '');
+        } elseif (isset($element->{$this->inlineSchemaProperty})) {
+            // inline schema
+            $this->checkUndefined($element, $element->{$this->inlineSchemaProperty}, '', '');
+        } else {
+            throw new \InvalidArgumentException('no schema found to verify against');
+        }
+    }
+}
\ No newline at end of file
diff --git a/vendor/composer/composer/vendor/justinrainbow/json-schema/src/JsonSchema/Constraints/String.php b/vendor/composer/composer/vendor/justinrainbow/json-schema/src/JsonSchema/Constraints/String.php
new file mode 100644
index 0000000..a9c25dc
--- /dev/null
+++ b/vendor/composer/composer/vendor/justinrainbow/json-schema/src/JsonSchema/Constraints/String.php
@@ -0,0 +1,33 @@
+<?php
+
+namespace JsonSchema\Constraints;
+
+/**
+ * The String Constraints, validates an string against a given schema
+ *
+ * @author Robert Schönthal <seroscho@googlemail.com>
+ * @author Bruno Prieto Reis <bruno.p.reis@gmail.com>
+ */
+class String extends Constraint
+{
+    /**
+     * {inheritDoc}
+     */
+    public function check($element, $schema = null, $path = null, $i = null)
+    {
+        // verify maxLength
+        if (isset($schema->maxLength) && strlen($element) > $schema->maxLength) {
+            $this->addError($path, "must be at most " . $schema->maxLength . " characters long");
+        }
+
+        //verify minLength
+        if (isset($schema->minLength) && strlen($element) < $schema->minLength) {
+            $this->addError($path, "must be at least " . $schema->minLength . " characters long");
+        }
+
+        // verify a regex pattern
+        if (isset($schema->pattern) && !preg_match('/' . $schema->pattern . '/', $element)) {
+            $this->addError($path, "does not match the regex pattern " . $schema->pattern);
+        }
+    }
+}
\ No newline at end of file
diff --git a/vendor/composer/composer/vendor/justinrainbow/json-schema/src/JsonSchema/Constraints/Type.php b/vendor/composer/composer/vendor/justinrainbow/json-schema/src/JsonSchema/Constraints/Type.php
new file mode 100644
index 0000000..7e3f70c
--- /dev/null
+++ b/vendor/composer/composer/vendor/justinrainbow/json-schema/src/JsonSchema/Constraints/Type.php
@@ -0,0 +1,90 @@
+<?php
+
+namespace JsonSchema\Constraints;
+
+/**
+ * The Type Constraints, validates an element against a given type
+ *
+ * @author Robert Schönthal <seroscho@googlemail.com>
+ * @author Bruno Prieto Reis <bruno.p.reis@gmail.com>
+ */
+class Type extends Constraint
+{
+    /**
+     * {inheritDoc}
+     */
+    function check($value = null, $schema = null, $path = null, $i = null)
+    {
+        $type = isset($schema->type) ? $schema->type : null;
+        $isValid = true;
+
+        if (is_array($type)) {
+            //TODO refactor
+            $validatedOneType = false;
+            $errors = array();
+            foreach ($type as $tp) {
+                $validator = new Type($this->checkMode);
+                $subSchema = new \stdClass();
+                $subSchema->type = $tp;
+                $validator->check($value, $subSchema, $path, null);
+                $error = $validator->getErrors();
+
+                if (!count($error)) {
+                    $validatedOneType = true;
+                    break;
+                } else {
+                    $errors = $error;
+                }
+            }
+            if (!$validatedOneType) {
+                return $this->addErrors($errors);
+            }
+        } elseif (is_object($type)) {
+            $this->checkUndefined($value, $type, $path);
+        } else {
+            $isValid = $this->validateType($value, $type);
+        }
+
+        if ($isValid === false) {
+            $this->addError($path, gettype($value) . " value found, but a " . $type . " is required");
+        }
+    }
+
+    /**
+     * verifies that a given value is of a certain type
+     *
+     * @param string $type
+     * @param mixed $value
+     * @return boolean
+     * @throws \InvalidArgumentException
+     */
+    protected function validateType($value, $type)
+    {
+        //mostly the case for inline schema
+        if (!$type) {
+            return true;
+        }
+
+        switch ($type) {
+            case 'integer' :
+                return (integer)$value == $value ? true : is_int($value);
+            case 'number' :
+                return is_numeric($value);
+            case 'boolean' :
+                return is_bool($value);
+            case 'object' :
+                return is_object($value);
+            //return ($this::CHECK_MODE_TYPE_CAST == $this->checkMode) ? is_array($value) : is_object($value);
+            case 'array' :
+                return is_array($value);
+            case 'string' :
+                return is_string($value);
+            case 'null' :
+                return is_null($value);
+            case 'any' :
+                return true;
+            default:
+                throw new \InvalidArgumentException((is_object($value) ? 'object' : $value) . ' is a invalid type for ' . $type);
+        }
+    }
+}
\ No newline at end of file
diff --git a/vendor/composer/composer/vendor/justinrainbow/json-schema/src/JsonSchema/Constraints/Undefined.php b/vendor/composer/composer/vendor/justinrainbow/json-schema/src/JsonSchema/Constraints/Undefined.php
new file mode 100644
index 0000000..524bf83
--- /dev/null
+++ b/vendor/composer/composer/vendor/justinrainbow/json-schema/src/JsonSchema/Constraints/Undefined.php
@@ -0,0 +1,107 @@
+<?php
+
+namespace JsonSchema\Constraints;
+
+/**
+ * The Undefined Constraints
+ *
+ * @author Robert Schönthal <seroscho@googlemail.com>
+ * @author Bruno Prieto Reis <bruno.p.reis@gmail.com>
+ */
+class Undefined extends Constraint
+{
+    /**
+     * {inheritDoc}
+     */
+    function check($value, $schema = null, $path = null, $i = null)
+    {
+        if (!is_object($schema)) {
+            return;
+        }
+
+        $path = $this->incrementPath($path, $i);
+
+        // check special properties
+        $this->validateCommonProperties($value, $schema, $path);
+
+        // check known types
+        $this->validateTypes($value, $schema, $path, $i);
+
+
+    }
+
+    /**
+     * validates the value against the types
+     *
+     * @param $value
+     * @param null $schema
+     * @param null $path
+     * @param null $i
+     */
+    public function validateTypes($value, $schema = null, $path = null, $i = null)
+    {
+        // check array
+        if (is_array($value)) {
+            $this->checkArray($value, $schema, $path, $i);
+        }
+
+        // check object
+        if (is_object($value) && isset($schema->properties)) {
+            $this->checkObject($value, $schema->properties, $path, isset($schema->additionalProperties) ? $schema->additionalProperties : null);
+        }
+
+        // check string
+        if (is_string($value)) {
+            $this->checkString($value, $schema, $path, $i);
+        }
+
+        // check numeric
+        if (is_numeric($value)) {
+            $this->checkNumber($value, $schema, $path, $i);
+        }
+
+        // check enum
+        if (isset($schema->enum)) {
+            $this->checkEnum($value, $schema, $path, $i);
+        }
+    }
+
+    /**
+     * validates common properties
+     *
+     * @param $value
+     * @param null $schema
+     * @param null $path
+     * @param null $i
+     */
+    protected function validateCommonProperties($value, $schema = null, $path = null, $i = null)
+    {
+        // if it extends another schema, it must pass that schema as well
+        if (isset($schema->extends)) {
+            $this->checkUndefined($value, $schema->extends, $path, $i);
+        }
+
+        // verify required values
+        if (is_object($value) && $value instanceOf Undefined) {
+            if (isset($schema->required) && $schema->required) {
+                $this->addError($path, "is missing and it is required");
+            }
+        } else {
+            $this->checkType($value, $schema, $path);
+        }
+
+        //verify disallowed items
+        if (isset($schema->disallow)) {
+            $initErrors = $this->getErrors();
+
+            $this->checkUndefined($value, $schema->disallow, $path);
+
+            //if no new errors were raised it must be a disallowed value
+            if (count($this->getErrors()) == count($initErrors)) {
+                $this->addError($path, " disallowed value was matched");
+            } else {
+                $this->errors = $initErrors;
+            }
+        }
+    }
+}
\ No newline at end of file
diff --git a/vendor/composer/composer/vendor/justinrainbow/json-schema/src/JsonSchema/Validator.php b/vendor/composer/composer/vendor/justinrainbow/json-schema/src/JsonSchema/Validator.php
new file mode 100644
index 0000000..9d49e45
--- /dev/null
+++ b/vendor/composer/composer/vendor/justinrainbow/json-schema/src/JsonSchema/Validator.php
@@ -0,0 +1,30 @@
+<?php
+
+namespace JsonSchema;
+
+use JsonSchema\Constraints\Schema;
+use JsonSchema\Constraints\Constraint;
+
+/**
+ * A JsonSchema Constraint
+ *
+ * @see README.md
+ * @author Robert Schönthal <seroscho@googlemail.com>
+ * @author Bruno Prieto Reis <bruno.p.reis@gmail.com>
+ */
+class Validator extends Constraint
+{
+    /**
+     * validates the given data against the schema and returns an object containing the results
+     * Both the php object and the schema are supposed to be a result of a json_decode call.
+     * The validation works as defined by the schema proposal in http://json-schema.org
+     *
+     * {inheritDoc}
+     */
+    function check($value, $schema = null, $path = null, $i = null)
+    {
+        $validator = new Schema($this->checkMode);
+        $validator->check($value, $schema);
+        $this->addErrors($validator->getErrors());
+    }
+}
\ No newline at end of file
diff --git a/vendor/composer/composer/vendor/seld/jsonlint/LICENSE b/vendor/composer/composer/vendor/seld/jsonlint/LICENSE
new file mode 100644
index 0000000..c234487
--- /dev/null
+++ b/vendor/composer/composer/vendor/seld/jsonlint/LICENSE
@@ -0,0 +1,19 @@
+Copyright (c) 2011 Jordi Boggiano
+
+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.
diff --git a/vendor/composer/composer/vendor/seld/jsonlint/README.mdown b/vendor/composer/composer/vendor/seld/jsonlint/README.mdown
new file mode 100644
index 0000000..2f78979
--- /dev/null
+++ b/vendor/composer/composer/vendor/seld/jsonlint/README.mdown
@@ -0,0 +1,54 @@
+JSON Lint
+=========
+
+[![Build Status](https://secure.travis-ci.org/Seldaek/jsonlint.png)](http://travis-ci.org/Seldaek/jsonlint)
+
+Usage
+-----
+
+    use Seld\JsonLint\JsonParser;
+
+    $parser = new JsonParser();
+    
+    // returns null if it's valid json, or a ParsingException object. Call
+    // ->getDetails() on the exception to get more info.
+    $parser->lint($json);
+
+    // returns parsed json, like json_decode() does, but slower, throws
+    // exceptions on failure.
+    $parser->parse($json);
+
+Installation
+------------
+
+JSON Lint can easily be used within another app if you have a PSR-0 autoloader, or
+it can be installed through [Composer](http://packagist.org/) for use as a CLI util.
+Once installed via Composer you can run the following command to lint a json file or URL:
+
+    $ bin/jsonlint file.json
+
+Requirements
+------------
+
+- PHP 5.3+
+- [optional] PHPUnit 3.5+ to execute the test suite (phpunit --version)
+
+Submitting bugs and feature requests
+------------------------------------
+
+Bugs and feature request are tracked on [GitHub](https://github.com/Seldaek/jsonlint/issues)
+
+Author
+------
+
+Jordi Boggiano - <j.boggiano@seld.be> - <http://twitter.com/seldaek>
+
+License
+-------
+
+JSON Lint is licensed under the MIT License - see the LICENSE file for details
+
+Acknowledgements
+----------------
+
+This library is a port of the JavaScript [jsonlint](https://github.com/zaach/jsonlint) library.
diff --git a/vendor/composer/composer/vendor/seld/jsonlint/bin/jsonlint b/vendor/composer/composer/vendor/seld/jsonlint/bin/jsonlint
new file mode 100755
index 0000000..22fcb10
--- /dev/null
+++ b/vendor/composer/composer/vendor/seld/jsonlint/bin/jsonlint
@@ -0,0 +1,43 @@
+#!/usr/bin/env php
+<?php
+
+/*
+ * This file is part of the JSON Lint package.
+ *
+ * (c) Jordi Boggiano <j.boggiano@seld.be>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+if ((!@include __DIR__.'/../../../.composer/autoload.php') && (!@include __DIR__.'/../vendor/.composer/autoload.php')) {
+    die('You must set up the project dependencies, run the following commands:'.PHP_EOL.
+        'curl -s http://getcomposer.org/installer | php'.PHP_EOL.
+        'php composer.phar install'.PHP_EOL);
+}
+
+use Seld\JsonLint\JsonParser;
+
+if (!isset($_SERVER['argv'][1])) {
+    echo 'Usage: jsonlint file'.PHP_EOL;
+    exit;
+}
+
+$file = $_SERVER['argv'][1];
+if (!preg_match('{^https?://}i', $file)) {
+    if (!file_exists($file)) {
+        echo 'File not found: '.$file.PHP_EOL;
+        exit(1);
+    }
+    if (!is_readable($file)) {
+        echo 'File not readable: '.$file.PHP_EOL;
+        exit(1);
+    }
+}
+
+$parser = new JsonParser();
+if ($err = $parser->lint(file_get_contents($file))) {
+    echo $err->getMessage().PHP_EOL;
+    exit(1);
+}
+echo 'Valid JSON'.PHP_EOL;
\ No newline at end of file
diff --git a/vendor/composer/composer/vendor/seld/jsonlint/composer.json b/vendor/composer/composer/vendor/seld/jsonlint/composer.json
new file mode 100644
index 0000000..baa93b2
--- /dev/null
+++ b/vendor/composer/composer/vendor/seld/jsonlint/composer.json
@@ -0,0 +1,21 @@
+{
+    "name": "seld/jsonlint",
+    "description": "JSON Linter",
+    "keywords": ["json", "parser", "linter", "validator"],
+    "type": "library",
+    "license": "MIT",
+    "authors": [
+        {
+            "name": "Jordi Boggiano",
+            "email": "j.boggiano@seld.be",
+            "homepage": "http://seld.be"
+        }
+    ],
+    "require": {
+        "php": ">=5.3.0"
+    },
+    "autoload": {
+        "psr-0": { "Seld\\JsonLint": "src/" }
+    },
+    "bin": ["bin/jsonlint"]
+}
diff --git a/vendor/composer/composer/vendor/seld/jsonlint/phpunit.xml.dist b/vendor/composer/composer/vendor/seld/jsonlint/phpunit.xml.dist
new file mode 100644
index 0000000..5de888b
--- /dev/null
+++ b/vendor/composer/composer/vendor/seld/jsonlint/phpunit.xml.dist
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<phpunit backupGlobals="false"
+         backupStaticAttributes="false"
+         colors="true"
+         convertErrorsToExceptions="true"
+         convertNoticesToExceptions="true"
+         convertWarningsToExceptions="true"
+         processIsolation="false"
+         stopOnFailure="false"
+         syntaxCheck="false"
+         bootstrap="tests/bootstrap.php"
+>
+    <testsuites>
+        <testsuite name="JSON Lint Test Suite">
+            <directory>./tests/</directory>
+        </testsuite>
+    </testsuites>
+
+    <filter>
+        <whitelist>
+            <directory>./src/Seld/JsonLint/</directory>
+        </whitelist>
+    </filter>
+</phpunit>
diff --git a/vendor/composer/composer/vendor/seld/jsonlint/src/Seld/JsonLint/JsonParser.php b/vendor/composer/composer/vendor/seld/jsonlint/src/Seld/JsonLint/JsonParser.php
new file mode 100644
index 0000000..318f8bd
--- /dev/null
+++ b/vendor/composer/composer/vendor/seld/jsonlint/src/Seld/JsonLint/JsonParser.php
@@ -0,0 +1,405 @@
+<?php
+
+/*
+ * This file is part of the JSON Lint package.
+ *
+ * (c) Jordi Boggiano <j.boggiano@seld.be>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Seld\JsonLint;
+
+use stdClass;
+
+/**
+ * Parser class
+ *
+ * Example:
+ *
+ * $parser = new JsonParser();
+ * // returns null if it's valid json, or an error object
+ * $parser->lint($json);
+ * // returns parsed json, like json_decode does, but slower, throws exceptions on failure.
+ * $parser->parse($json);
+ *
+ * Ported from https://github.com/zaach/jsonlint
+ */
+class JsonParser
+{
+    private $stack;
+    private $vstack; // semantic value stack
+    private $lstack; // location stack
+
+    private $yy;
+    private $symbols = array(
+        'error'                 => 2,
+        'JSONString'            => 3,
+        'STRING'                => 4,
+        'JSONNumber'            => 5,
+        'NUMBER'                => 6,
+        'JSONNullLiteral'       => 7,
+        'NULL'                  => 8,
+        'JSONBooleanLiteral'    => 9,
+        'TRUE'                  => 10,
+        'FALSE'                 => 11,
+        'JSONText'              => 12,
+        'JSONValue'             => 13,
+        'EOF'                   => 14,
+        'JSONObject'            => 15,
+        'JSONArray'             => 16,
+        '{'                     => 17,
+        '}'                     => 18,
+        'JSONMemberList'        => 19,
+        'JSONMember'            => 20,
+        ':'                     => 21,
+        ','                     => 22,
+        '['                     => 23,
+        ']'                     => 24,
+        'JSONElementList'       => 25,
+        '$accept'               => 0,
+        '$end'                  => 1,
+    );
+
+    private $terminals_ = array(
+        2   => "error",
+        4   => "STRING",
+        6   => "NUMBER",
+        8   => "NULL",
+        10  => "TRUE",
+        11  => "FALSE",
+        14  => "EOF",
+        17  => "{",
+        18  => "}",
+        21  => ":",
+        22  => ",",
+        23  => "[",
+        24  => "]",
+    );
+
+    private $productions_ = array(
+        0,
+        array(3, 1),
+        array(5, 1),
+        array(7, 1),
+        array(9, 1),
+        array(9, 1),
+        array(12, 2),
+        array(13, 1),
+        array(13, 1),
+        array(13, 1),
+        array(13, 1),
+        array(13, 1),
+        array(13, 1),
+        array(15, 2),
+        array(15, 3),
+        array(20, 3),
+        array(19, 1),
+        array(19, 3),
+        array(16, 2),
+        array(16, 3),
+        array(25, 1),
+        array(25, 3)
+    );
+
+    private $table = array(array(3 => 5, 4 => array(1,12), 5 => 6, 6 => array(1,13), 7 => 3, 8 => array(1,9), 9 => 4, 10 => array(1,10), 11 => array(1,11), 12 => 1, 13 => 2, 15 => 7, 16 => 8, 17 => array(1,14), 23 => array(1,15)), array( 1 => array(3)), array( 14 => array(1,16)), array( 14 => array(2,7), 18 => array(2,7), 22 => array(2,7), 24 => array(2,7)), array( 14 => array(2,8), 18 => array(2,8), 22 => array(2,8), 24 => array(2,8)), array( 14 => array(2,9), 18 => array(2,9), 22 => array(2,9), 24 => array(2,9)), array( 14 => array(2,10), 18 => array(2,10), 22 => array(2,10), 24 => array(2,10)), array( 14 => array(2,11), 18 => array(2,11), 22 => array(2,11), 24 => array(2,11)), array( 14 => array(2,12), 18 => array(2,12), 22 => array(2,12), 24 => array(2,12)), array( 14 => array(2,3), 18 => array(2,3), 22 => array(2,3), 24 => array(2,3)), array( 14 => array(2,4), 18 => array(2,4), 22 => array(2,4), 24 => array(2,4)), array( 14 => array(2,5), 18 => array(2,5), 22 => array(2,5), 24 => array(2,5)), array( 14 => array(2,1), 18 => array(2,1), 21 => array(2,1), 22 => array(2,1), 24 => array(2,1)), array( 14 => array(2,2), 18 => array(2,2), 22 => array(2,2), 24 => array(2,2)), array( 3 => 20, 4 => array(1,12), 18 => array(1,17), 19 => 18, 20 => 19 ), array( 3 => 5, 4 => array(1,12), 5 => 6, 6 => array(1,13), 7 => 3, 8 => array(1,9), 9 => 4, 10 => array(1,10), 11 => array(1,11), 13 => 23, 15 => 7, 16 => 8, 17 => array(1,14), 23 => array(1,15), 24 => array(1,21), 25 => 22 ), array( 1 => array(2,6)), array( 14 => array(2,13), 18 => array(2,13), 22 => array(2,13), 24 => array(2,13)), array( 18 => array(1,24), 22 => array(1,25)), array( 18 => array(2,16), 22 => array(2,16)), array( 21 => array(1,26)), array( 14 => array(2,18), 18 => array(2,18), 22 => array(2,18), 24 => array(2,18)), array( 22 => array(1,28), 24 => array(1,27)), array( 22 => array(2,20), 24 => array(2,20)), array( 14 => array(2,14), 18 => array(2,14), 22 => array(2,14), 24 => array(2,14)), array( 3 => 20, 4 => array(1,12), 20 => 29 ), array( 3 => 5, 4 => array(1,12), 5 => 6, 6 => array(1,13), 7 => 3, 8 => array(1,9), 9 => 4, 10 => array(1,10), 11 => array(1,11), 13 => 30, 15 => 7, 16 => 8, 17 => array(1,14), 23 => array(1,15)), array( 14 => array(2,19), 18 => array(2,19), 22 => array(2,19), 24 => array(2,19)), array( 3 => 5, 4 => array(1,12), 5 => 6, 6 => array(1,13), 7 => 3, 8 => array(1,9), 9 => 4, 10 => array(1,10), 11 => array(1,11), 13 => 31, 15 => 7, 16 => 8, 17 => array(1,14), 23 => array(1,15)), array( 18 => array(2,17), 22 => array(2,17)), array( 18 => array(2,15), 22 => array(2,15)), array( 22 => array(2,21), 24 => array(2,21)),
+    );
+
+    private $defaultActions = array(
+        16 => array(2, 6)
+    );
+
+    /**
+     * @param string $input JSON string
+     * @return null|ParsingException null if no error is found, a ParsingException containing all details otherwise
+     */
+    public function lint($input)
+    {
+        try {
+            $this->parse($input);
+        } catch (ParsingException $e) {
+            return $e;
+        }
+    }
+
+    /**
+     * @param string $input JSON string
+     * @return mixed
+     * @throws ParsingException
+     */
+    public function parse($input)
+    {
+        $this->stack = array(0);
+        $this->vstack = array(null);
+        $this->lstack = array();
+
+        $yytext = '';
+        $yylineno = 0;
+        $yyleng = 0;
+        $recovering = 0;
+        $TERROR = 2;
+        $EOF = 1;
+
+        $this->lexer = new Lexer();
+        $this->lexer->setInput($input);
+
+        $yyloc = $this->lexer->yylloc;
+        $this->lstack[] = $yyloc;
+
+        $symbol = null;
+        $preErrorSymbol = null;
+        $state = null;
+        $action = null;
+        $a = null;
+        $r = null;
+        $yyval = new stdClass;
+        $p = null;
+        $len = null;
+        $newState = null;
+        $expected = null;
+        $errStr = null;
+
+        while (true) {
+            // retreive state number from top of stack
+            $state = $this->stack[count($this->stack)-1];
+
+            // use default actions if available
+            if (isset($this->defaultActions[$state])) {
+                $action = $this->defaultActions[$state];
+            } else {
+                if ($symbol == null) {
+                    $symbol = $this->lex();
+                }
+                // read action for current state and first input
+                $action = isset($this->table[$state][$symbol]) ? $this->table[$state][$symbol] : false;
+            }
+
+            // handle parse error
+            if (!$action || !$action[0]) {
+                if (!$recovering) {
+                    // Report error
+                    $expected = array();
+                    foreach ($this->table[$state] as $p => $ignore) {
+                        if (isset($this->terminals_[$p]) && $p > 2) {
+                            $expected[] = "'" . $this->terminals_[$p] . "'";
+                        }
+                    }
+
+                    $errStr = 'Parse error on line ' . ($yylineno+1) . ":\n" . $this->lexer->showPosition() . "\nExpected one of: " . implode(', ', $expected);
+                    $this->parseError($errStr, array(
+                        'text' => $this->lexer->match,
+                        'token' => !empty($this->terminals_[$symbol]) ? $this->terminals_[$symbol] : $symbol,
+                        'line' => $this->lexer->yylineno,
+                        'loc' => $yyloc,
+                        'expected' => $expected,
+                    ));
+                }
+
+                // just recovered from another error
+                if ($recovering == 3) {
+                    if ($symbol == $EOF) {
+                        throw new ParsingException($errStr ?: 'Parsing halted.');
+                    }
+
+                    // discard current lookahead and grab another
+                    $yyleng = $this->lexer->yyleng;
+                    $yytext = $this->lexer->yytext;
+                    $yylineno = $this->lexer->yylineno;
+                    $yyloc = $this->lexer->yylloc;
+                    $symbol = $this->lex();
+                }
+
+                // try to recover from error
+                while (true) {
+                    // check for error recovery rule in this state
+                    if (array_key_exists($TERROR, $this->table[$state])) {
+                        break;
+                    }
+                    if ($state == 0) {
+                        throw new ParsingException($errStr ?: 'Parsing halted.');
+                    }
+                    $this->popStack(1);
+                    $state = $this->stack[count($this->stack)-1];
+                }
+
+                $preErrorSymbol = $symbol; // save the lookahead token
+                $symbol = $TERROR;         // insert generic error symbol as new lookahead
+                $state = $this->stack[count($this->stack)-1];
+                $action = isset($this->table[$state][$TERROR]) ? $this->table[$state][$TERROR] : false;
+                $recovering = 3; // allow 3 real symbols to be shifted before reporting a new error
+            }
+
+            // this shouldn't happen, unless resolve defaults are off
+            if (is_array($action[0]) && count($action) > 1) {
+                throw new ParsingException('Parse Error: multiple actions possible at state: ' . $state . ', token: ' . $symbol);
+            }
+
+            switch ($action[0]) {
+                case 1: // shift
+                    $this->stack[] = $symbol;
+                    $this->vstack[] = $this->lexer->yytext;
+                    $this->lstack[] = $this->lexer->yylloc;
+                    $this->stack[] = $action[1]; // push state
+                    $symbol = null;
+                    if (!$preErrorSymbol) { // normal execution/no error
+                        $yyleng = $this->lexer->yyleng;
+                        $yytext = $this->lexer->yytext;
+                        $yylineno = $this->lexer->yylineno;
+                        $yyloc = $this->lexer->yylloc;
+                        if ($recovering > 0) {
+                            $recovering--;
+                        }
+                    } else { // error just occurred, resume old lookahead f/ before error
+                        $symbol = $preErrorSymbol;
+                        $preErrorSymbol = null;
+                    }
+                    break;
+
+                case 2: // reduce
+                    $len = $this->productions_[$action[1]][1];
+
+                    // perform semantic action
+                    $yyval->token = $this->vstack[count($this->vstack) - $len]; // default to $$ = $1
+                    // default location, uses first token for firsts, last for lasts
+                    $yyval->store = array( // _$ = store
+                        'first_line' => $this->lstack[count($this->lstack) - ($len ?: 1)]['first_line'],
+                        'last_line' => $this->lstack[count($this->lstack) - 1]['last_line'],
+                        'first_column' => $this->lstack[count($this->lstack) - ($len ?: 1)]['first_column'],
+                        'last_column' => $this->lstack[count($this->lstack) - 1]['last_column'],
+                    );
+                    $r = $this->performAction($yyval, $yytext, $yyleng, $yylineno, $action[1], $this->vstack, $this->lstack);
+
+                    if (!$r instanceof Undefined) {
+                        return $r;
+                    }
+
+                    if ($len) {
+                        $this->popStack($len);
+                    }
+
+                    $this->stack[] = $this->productions_[$action[1]][0];    // push nonterminal (reduce)
+                    $this->vstack[] = $yyval->token;
+                    $this->lstack[] = $yyval->store;
+                    $newState = $this->table[$this->stack[count($this->stack)-2]][$this->stack[count($this->stack)-1]];
+                    $this->stack[] = $newState;
+                    break;
+
+                case 3: // accept
+                    return true;
+            }
+        }
+        return true;
+    }
+
+    protected function parseError($str, $hash)
+    {
+        throw new ParsingException($str, $hash);
+    }
+
+    // $$ = $tokens // needs to be passed by ref?
+    // $ = $token
+    // _$ removed, useless?
+    private function performAction(stdClass $yyval, $yytext, $yyleng, $yylineno, $yystate, &$tokens) {
+        // $0 = $len
+        $len = count($tokens) - 1;
+        switch ($yystate) {
+        case 1:
+            $yytext =preg_replace_callback('{(?:\\\\["bfnrt/\\\\]|\\\\u[a-fA-F0-9]{4})}', array($this, 'stringInterpolation'), $yytext);
+            $yyval->token = $yytext;
+            break;
+        case 2:
+            if (strpos($yytext, 'e') !== false || strpos($yytext, 'E') !== false) {
+                $yyval->token = floatval($yytext);
+            } else {
+                $yyval->token = strpos($yytext, '.') === false ? intval($yytext) : floatval($yytext);
+            }
+            break;
+        case 3:
+            $yyval->token = null;
+            break;
+        case 4:
+            $yyval->token = true;
+            break;
+        case 5:
+            $yyval->token = false;
+            break;
+        case 6:
+            return $yyval->token = $tokens[$len-1];
+        case 13:
+            $yyval->token = new stdClass;
+            break;
+        case 14:
+            $yyval->token = $tokens[$len-1];
+            break;
+        case 15:
+            $yyval->token = array($tokens[$len-2], $tokens[$len]);
+            break;
+        case 16:
+            $yyval->token = new stdClass;
+            $property = $tokens[$len][0] === '' ? '_empty_' : $tokens[$len][0];
+            $yyval->token->$property = $tokens[$len][1];
+            break;
+        case 17:
+            $yyval->token = $tokens[$len-2];
+            $tokens[$len-2]->{$tokens[$len][0]} = $tokens[$len][1];
+            break;
+        case 18:
+            $yyval->token = array();
+            break;
+        case 19:
+            $yyval->token = $tokens[$len-1];
+            break;
+        case 20:
+            $yyval->token = array($tokens[$len]);
+            break;
+        case 21:
+            $tokens[$len-2][] = $tokens[$len];
+            $yyval->token = $tokens[$len-2];
+            break;
+        }
+
+        return new Undefined();
+    }
+
+    private function stringInterpolation($match)
+    {
+        switch ($match[0]) {
+        case '\\\\':
+            return '\\';
+        case '\"':
+            return '"';
+        case '\b':
+            return chr(8);
+        case '\f':
+            return chr(12);
+        case '\n':
+            return "\n";
+        case '\r':
+            return "\r";
+        case '\t':
+            return "\t";
+        case '\/':
+            return "/";
+        default:
+            return html_entity_decode('&#x'.ltrim(substr($match[0], 2), '0').';', 0, 'UTF-8');
+        }
+    }
+
+    private function popStack($n)
+    {
+        $this->stack = array_slice($this->stack, 0, - (2 * $n));
+        $this->vstack = array_slice($this->vstack, 0, - $n);
+        $this->lstack = array_slice($this->lstack, 0, - $n);
+    }
+
+    private function lex()
+    {
+        $token = $this->lexer->lex() ?: 1; // $end = 1
+        // if token isn't its numeric value, convert
+        if (!is_numeric($token)) {
+            $token = isset($this->symbols[$token]) ? $this->symbols[$token] : $token;
+        }
+        return $token;
+    }
+}
diff --git a/vendor/composer/composer/vendor/seld/jsonlint/src/Seld/JsonLint/Lexer.php b/vendor/composer/composer/vendor/seld/jsonlint/src/Seld/JsonLint/Lexer.php
new file mode 100644
index 0000000..76a69c4
--- /dev/null
+++ b/vendor/composer/composer/vendor/seld/jsonlint/src/Seld/JsonLint/Lexer.php
@@ -0,0 +1,236 @@
+<?php
+
+/*
+ * This file is part of the JSON Lint package.
+ *
+ * (c) Jordi Boggiano <j.boggiano@seld.be>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Seld\JsonLint;
+
+/**
+ * Lexer class
+ *
+ * Ported from https://github.com/zaach/jsonlint
+ */
+class Lexer
+{
+    private $EOF = 1;
+    private $rules = array(
+        0 => '/^\s+/',
+        1 => '/^-?([0-9]|[1-9][0-9]+)(\.[0-9]+)?([eE][+-]?[0-9]+)?\b/',
+        2 => '{^"(\\\\["bfnrt/\\\\]|\\\\u[a-fA-F0-9]{4}|[^\0-\x09\x0a-\x1f\\\\"])*"}',
+        3 => '/^\{/',
+        4 => '/^\}/',
+        5 => '/^\[/',
+        6 => '/^\]/',
+        7 => '/^,/',
+        8 => '/^:/',
+        9 => '/^true\b/',
+        10 => '/^false\b/',
+        11 => '/^null\b/',
+        12 => '/^$/',
+        13 => '/^./',
+    );
+
+    private $conditions = array(
+        "INITIAL" => array(
+            "rules" => array(0,1,2,3,4,5,6,7,8,9,10,11,12,13),
+            "inclusive" => true,
+        ),
+    );
+
+    public function lex()
+    {
+        $r = $this->next();
+        if (!$r instanceof Undefined) {
+            return $r;
+        }
+        return $this->lex();
+    }
+
+    public function setInput($input)
+    {
+        $this->_input = $input;
+        $this->_more = $this->_less = $this->done = false;
+        $this->yylineno = $this->yyleng = 0;
+        $this->yytext = $this->matched = $this->match = '';
+        $this->conditionStack = array('INITIAL');
+        $this->yylloc = array('first_line' => 1, 'first_column' => 0, 'last_line' => 1, 'last_column' => 0);
+
+        return $this;
+    }
+
+    public function showPosition()
+    {
+        $pre = $this->pastInput();
+        $c = str_repeat('-', strlen($pre)); // new Array(pre.length + 1).join("-");
+        return $pre . $this->upcomingInput() . "\n" . $c . "^";
+    }
+
+    protected function parseError($str, $hash)
+    {
+        throw new \Exception($str);
+    }
+
+    private function input()
+    {
+        $ch = $this->_input[0];
+        $this->yytext += $ch;
+        $this->yyleng++;
+        $this->match += $ch;
+        $this->matched += $ch;
+        if (strpos($ch, "\n") !== false) {
+            $this->yylineno++;
+        }
+        array_shift($this->_input); // slice(1)
+        return $ch;
+    }
+
+    private function unput($ch)
+    {
+        $this->_input = $ch . $this->_input;
+        return $this;
+    }
+
+    private function more()
+    {
+        $this->_more = true;
+        return $this;
+    }
+
+    private function pastInput()
+    {
+        $past = substr($this->matched, 0, strlen($this->matched) - strlen($this->match));
+        return (strlen($past) > 20 ? '...' : '') . str_replace("\n", '', substr($past, -20));
+    }
+
+    private function upcomingInput()
+    {
+        $next = $this->match;
+        if (strlen($next) < 20) {
+            $next += substr($this->_input, 0, 20 - strlen($next));
+        }
+        return str_replace("\n", '', substr($next, 0, 20) . (strlen($next) > 20 ? '...' : ''));
+    }
+
+    private function next()
+    {
+        if ($this->done) {
+            return $this->EOF;
+        }
+        if (!$this->_input) {
+            $this->done = true;
+        }
+
+        $token = null;
+        $match = null;
+        $col = null;
+        $lines = null;
+
+        if (!$this->_more) {
+            $this->yytext = '';
+            $this->match = '';
+        }
+
+        $rules = $this->_currentRules();
+        $rulesLen = count($rules);
+
+        for ($i=0; $i < $rulesLen; $i++) {
+            if (preg_match($this->rules[$rules[$i]], $this->_input, $match)) {
+                preg_match_all('/\n.*/', $match[0], $lines);
+                $lines = $lines[0];
+                if ($lines) {
+                    $this->yylineno += count($lines);
+                }
+
+                $this->yylloc = array(
+                    'first_line' => $this->yylloc['last_line'],
+                    'last_line' => $this->yylineno+1,
+                    'first_column' => $this->yylloc['last_column'],
+                    'last_column' => $lines ? strlen($lines[count($lines) - 1]) - 1 : $this->yylloc['last_column'] + strlen($match[0]),
+                );
+                $this->yytext .= $match[0];
+                $this->match .= $match[0];
+                $this->matches = $match;
+                $this->yyleng = strlen($this->yytext);
+                $this->_more = false;
+                $this->_input = substr($this->_input, strlen($match[0]));
+                $this->matched .= $match[0];
+                $token = $this->performAction($rules[$i], $this->conditionStack[count($this->conditionStack)-1]);
+                if ($token) {
+                    return $token;
+                }
+                return new Undefined();
+            }
+        }
+
+        if ($this->_input === "") {
+            return $this->EOF;
+        }
+
+        $this->parseError(
+            'Lexical error on line ' . ($this->yylineno+1) . ". Unrecognized text.\n" . $this->showPosition(),
+            array(
+                'text' => "",
+                'token' => null,
+                'line' => $this->yylineno,
+            )
+        );
+    }
+
+    private function begin($condition)
+    {
+        $this->conditionStack[] = $condition;
+    }
+
+    private function popState()
+    {
+        return array_pop($this->conditionStack);
+    }
+
+    private function _currentRules()
+    {
+        return $this->conditions[$this->conditionStack[count($this->conditionStack)-1]]['rules'];
+    }
+
+    private function performAction($avoiding_name_collisions, $YY_START)
+    {
+        $YYSTATE = $YY_START;
+        switch ($avoiding_name_collisions) {
+        case 0:/* skip whitespace */
+            break;
+        case 1:
+            return 6;
+           break;
+        case 2:
+            $this->yytext = substr($this->yytext, 1, $this->yyleng-2);
+            return 4;
+        case 3:
+            return 17;
+        case 4:
+            return 18;
+        case 5:
+            return 23;
+        case 6:
+            return 24;
+        case 7:
+            return 22;
+        case 8:
+            return 21;
+        case 9:
+            return 10;
+        case 10:
+            return 11;
+        case 11:
+            return 8;
+        case 12:
+            return 14;
+        case 13:
+            return 'INVALID';
+        }
+    }
+}
diff --git a/vendor/composer/composer/vendor/seld/jsonlint/src/Seld/JsonLint/ParsingException.php b/vendor/composer/composer/vendor/seld/jsonlint/src/Seld/JsonLint/ParsingException.php
new file mode 100644
index 0000000..e014fc3
--- /dev/null
+++ b/vendor/composer/composer/vendor/seld/jsonlint/src/Seld/JsonLint/ParsingException.php
@@ -0,0 +1,28 @@
+<?php
+
+/*
+ * This file is part of the JSON Lint package.
+ *
+ * (c) Jordi Boggiano <j.boggiano@seld.be>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Seld\JsonLint;
+
+class ParsingException extends \Exception
+{
+    protected $details;
+
+    public function __construct($message, $details = array())
+    {
+        $this->details = $details;
+        parent::__construct($message);
+    }
+
+    public function getDetails()
+    {
+        return $this->details;
+    }
+}
\ No newline at end of file
diff --git a/vendor/composer/composer/vendor/seld/jsonlint/src/Seld/JsonLint/Undefined.php b/vendor/composer/composer/vendor/seld/jsonlint/src/Seld/JsonLint/Undefined.php
new file mode 100644
index 0000000..e83d5be
--- /dev/null
+++ b/vendor/composer/composer/vendor/seld/jsonlint/src/Seld/JsonLint/Undefined.php
@@ -0,0 +1,16 @@
+<?php
+
+/*
+ * This file is part of the JSON Lint package.
+ *
+ * (c) Jordi Boggiano <j.boggiano@seld.be>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Seld\JsonLint;
+
+class Undefined
+{
+}
