diff --git a/core/composer.json b/core/composer.json
index 87e60b4..e9f29c7 100644
--- a/core/composer.json
+++ b/core/composer.json
@@ -13,7 +13,8 @@
     "symfony/yaml": "<2.4",
     "twig/twig": "1.*@stable",
     "doctrine/common": "2.3.*@stable",
-    "guzzle/http": "*",
+    "guzzle/http": "3.0.*@stable",
+    "guzzle/plugin-backoff": "3.0.*@stable",
     "kriswallsmith/assetic": "1.1.*@alpha"
   },
   "minimum-stability": "dev"
diff --git a/core/composer.lock b/core/composer.lock
index 1894ab3..e2eaf5b 100644
--- a/core/composer.lock
+++ b/core/composer.lock
@@ -1,5 +1,5 @@
 {
-    "hash": "5d17aee0bd24c24563c2c864600fc5bd",
+    "hash": "57fc937de5df0f3f093520f39327af02",
     "packages": [
         {
             "name": "doctrine/common",
@@ -73,26 +73,31 @@
         },
         {
             "name": "guzzle/common",
-            "version": "dev-master",
+            "version": "v3.0.7",
             "target-dir": "Guzzle/Common",
             "source": {
                 "type": "git",
                 "url": "git://github.com/guzzle/common.git",
-                "reference": "23162d56daa85b1ee6f1d73d9b5a5ecda2d70849"
+                "reference": "v3.0.7"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://github.com/guzzle/common/archive/23162d56daa85b1ee6f1d73d9b5a5ecda2d70849.zip",
-                "reference": "23162d56daa85b1ee6f1d73d9b5a5ecda2d70849",
+                "url": "https://github.com/guzzle/common/archive/v3.0.7.zip",
+                "reference": "v3.0.7",
                 "shasum": ""
             },
             "require": {
                 "php": ">=5.3.2",
                 "symfony/event-dispatcher": ">=2.1"
             },
-            "time": "2012-12-06 02:26:39",
+            "time": "2012-12-19 23:06:35",
             "type": "library",
-            "installation-source": "source",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "3.0-dev"
+                }
+            },
+            "installation-source": "dist",
             "autoload": {
                 "psr-0": {
                     "Guzzle\\Common": ""
@@ -113,28 +118,34 @@
         },
         {
             "name": "guzzle/http",
-            "version": "dev-master",
+            "version": "v3.0.7",
             "target-dir": "Guzzle/Http",
             "source": {
                 "type": "git",
                 "url": "git://github.com/guzzle/http.git",
-                "reference": "v3.0.5"
+                "reference": "v3.0.7"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://github.com/guzzle/http/archive/v3.0.5.zip",
-                "reference": "v3.0.5",
+                "url": "https://github.com/guzzle/http/archive/v3.0.7.zip",
+                "reference": "v3.0.7",
                 "shasum": ""
             },
             "require": {
                 "php": ">=5.3.2",
+                "ext-curl": "*",
                 "guzzle/common": "self.version",
                 "guzzle/parser": "self.version",
                 "guzzle/stream": "self.version"
             },
-            "time": "2012-11-18 05:28:55",
+            "time": "2012-12-14 00:49:17",
             "type": "library",
-            "installation-source": "source",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "3.0-dev"
+                }
+            },
+            "installation-source": "dist",
             "autoload": {
                 "psr-0": {
                     "Guzzle\\Http": ""
@@ -162,26 +173,84 @@
             ]
         },
         {
+            "name": "guzzle/log",
+            "version": "v3.0.7",
+            "target-dir": "Guzzle/Log",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/guzzle/log",
+                "reference": "v3.0.7"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://github.com/guzzle/log/archive/v3.0.7.zip",
+                "reference": "v3.0.7",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=5.3.2"
+            },
+            "suggest": {
+                "guzzle/http": "v3.0.7"
+            },
+            "time": "2012-12-07 16:45:11",
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "3.0-dev"
+                }
+            },
+            "installation-source": "dist",
+            "autoload": {
+                "psr-0": {
+                    "Guzzle\\Log": ""
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Michael Dowling",
+                    "email": "mtdowling@gmail.com",
+                    "homepage": "https://github.com/mtdowling"
+                }
+            ],
+            "description": "Guzzle log adapter component",
+            "homepage": "http://guzzlephp.org/",
+            "keywords": [
+                "log",
+                "Guzzle",
+                "adapter"
+            ]
+        },
+        {
             "name": "guzzle/parser",
-            "version": "dev-master",
+            "version": "v3.0.7",
             "target-dir": "Guzzle/Parser",
             "source": {
                 "type": "git",
                 "url": "git://github.com/guzzle/parser.git",
-                "reference": "v3.0.5"
+                "reference": "v3.0.7"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://github.com/guzzle/parser/archive/v3.0.5.zip",
-                "reference": "v3.0.5",
+                "url": "https://github.com/guzzle/parser/archive/v3.0.7.zip",
+                "reference": "v3.0.7",
                 "shasum": ""
             },
             "require": {
                 "php": ">=5.3.2"
             },
-            "time": "2012-11-19 00:07:13",
+            "time": "2012-12-07 16:45:11",
             "type": "library",
-            "installation-source": "source",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "3.0-dev"
+                }
+            },
+            "installation-source": "dist",
             "autoload": {
                 "psr-0": {
                     "Guzzle\\Parser": ""
@@ -202,27 +271,83 @@
             ]
         },
         {
+            "name": "guzzle/plugin-backoff",
+            "version": "v3.0.7",
+            "target-dir": "Guzzle/Plugin/Backoff",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/guzzle/plugin-backoff",
+                "reference": "v3.0.7"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://github.com/guzzle/plugin-backoff/archive/v3.0.7.zip",
+                "reference": "v3.0.7",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=5.3.2",
+                "guzzle/http": "self.version",
+                "guzzle/log": "self.version"
+            },
+            "time": "2012-12-07 16:45:11",
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "3.0-dev"
+                }
+            },
+            "installation-source": "dist",
+            "autoload": {
+                "psr-0": {
+                    "Guzzle\\Plugin\\Backoff": ""
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Michael Dowling",
+                    "email": "mtdowling@gmail.com",
+                    "homepage": "https://github.com/mtdowling"
+                }
+            ],
+            "description": "Guzzle backoff retry plugins",
+            "homepage": "http://guzzlephp.org/",
+            "keywords": [
+                "plugin",
+                "Guzzle"
+            ]
+        },
+        {
             "name": "guzzle/stream",
-            "version": "dev-master",
+            "version": "v3.0.7",
             "target-dir": "Guzzle/Stream",
             "source": {
                 "type": "git",
                 "url": "https://github.com/guzzle/stream",
-                "reference": "v3.0.5"
+                "reference": "v3.0.7"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://github.com/guzzle/stream/archive/v3.0.5.zip",
-                "reference": "v3.0.5",
+                "url": "https://github.com/guzzle/stream/archive/v3.0.7.zip",
+                "reference": "v3.0.7",
                 "shasum": ""
             },
             "require": {
                 "php": ">=5.3.2",
                 "guzzle/common": "self.version"
             },
-            "time": "2012-11-11 23:54:57",
+            "time": "2012-12-07 16:45:11",
             "type": "library",
-            "installation-source": "source",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "3.0-dev"
+                }
+            },
+            "installation-source": "dist",
             "autoload": {
                 "psr-0": {
                     "Guzzle\\Stream": ""
@@ -848,6 +973,8 @@
     "stability-flags": {
         "twig/twig": 0,
         "doctrine/common": 0,
+        "guzzle/http": 0,
+        "guzzle/plugin-backoff": 0,
         "kriswallsmith/assetic": 15
     }
 }
diff --git a/core/vendor/autoload.php b/core/vendor/autoload.php
index daa7ee7..b648a19 100644
--- a/core/vendor/autoload.php
+++ b/core/vendor/autoload.php
@@ -4,4 +4,4 @@
 
 require_once __DIR__ . '/composer' . '/autoload_real.php';
 
-return ComposerAutoloaderInit295209ab8f7c3b45c210d28fa6db3592::getLoader();
+return ComposerAutoloaderInitf2a0d0ee37670adda3c34a7a8a20bb5a::getLoader();
diff --git a/core/vendor/composer/autoload_namespaces.php b/core/vendor/composer/autoload_namespaces.php
index 9072401..730b312 100644
--- a/core/vendor/composer/autoload_namespaces.php
+++ b/core/vendor/composer/autoload_namespaces.php
@@ -17,7 +17,9 @@
     'Symfony\\Component\\DependencyInjection\\' => $vendorDir . '/symfony/dependency-injection/',
     'Symfony\\Component\\ClassLoader\\' => $vendorDir . '/symfony/class-loader/',
     'Guzzle\\Stream' => $vendorDir . '/guzzle/stream/',
+    'Guzzle\\Plugin\\Backoff' => $vendorDir . '/guzzle/plugin-backoff/',
     'Guzzle\\Parser' => $vendorDir . '/guzzle/parser/',
+    'Guzzle\\Log' => $vendorDir . '/guzzle/log/',
     'Guzzle\\Http' => $vendorDir . '/guzzle/http/',
     'Guzzle\\Common' => $vendorDir . '/guzzle/common/',
     'Doctrine\\Common' => $vendorDir . '/doctrine/common/lib/',
diff --git a/core/vendor/composer/autoload_real.php b/core/vendor/composer/autoload_real.php
index dbe463c..c079d7f 100644
--- a/core/vendor/composer/autoload_real.php
+++ b/core/vendor/composer/autoload_real.php
@@ -2,7 +2,7 @@
 
 // autoload_real.php generated by Composer
 
-class ComposerAutoloaderInit295209ab8f7c3b45c210d28fa6db3592
+class ComposerAutoloaderInitf2a0d0ee37670adda3c34a7a8a20bb5a
 {
     private static $loader;
 
@@ -19,9 +19,9 @@ public static function getLoader()
             return static::$loader;
         }
 
-        spl_autoload_register(array('ComposerAutoloaderInit295209ab8f7c3b45c210d28fa6db3592', 'loadClassLoader'));
+        spl_autoload_register(array('ComposerAutoloaderInitf2a0d0ee37670adda3c34a7a8a20bb5a', 'loadClassLoader'));
         static::$loader = $loader = new \Composer\Autoload\ClassLoader();
-        spl_autoload_unregister(array('ComposerAutoloaderInit295209ab8f7c3b45c210d28fa6db3592', 'loadClassLoader'));
+        spl_autoload_unregister(array('ComposerAutoloaderInitf2a0d0ee37670adda3c34a7a8a20bb5a', 'loadClassLoader'));
 
         $vendorDir = dirname(__DIR__);
         $baseDir = dirname($vendorDir);
diff --git a/core/vendor/composer/installed.json b/core/vendor/composer/installed.json
index aaa926b..b7d6229 100644
--- a/core/vendor/composer/installed.json
+++ b/core/vendor/composer/installed.json
@@ -675,27 +675,32 @@
     },
     {
         "name": "guzzle/common",
-        "version": "dev-master",
-        "version_normalized": "9999999-dev",
+        "version": "v3.0.7",
+        "version_normalized": "3.0.7.0",
         "target-dir": "Guzzle/Common",
         "source": {
             "type": "git",
             "url": "git://github.com/guzzle/common.git",
-            "reference": "23162d56daa85b1ee6f1d73d9b5a5ecda2d70849"
+            "reference": "v3.0.7"
         },
         "dist": {
             "type": "zip",
-            "url": "https://github.com/guzzle/common/archive/23162d56daa85b1ee6f1d73d9b5a5ecda2d70849.zip",
-            "reference": "23162d56daa85b1ee6f1d73d9b5a5ecda2d70849",
+            "url": "https://github.com/guzzle/common/archive/v3.0.7.zip",
+            "reference": "v3.0.7",
             "shasum": ""
         },
         "require": {
             "php": ">=5.3.2",
             "symfony/event-dispatcher": ">=2.1"
         },
-        "time": "2012-12-06 02:26:39",
+        "time": "2012-12-19 23:06:35",
         "type": "library",
-        "installation-source": "source",
+        "extra": {
+            "branch-alias": {
+                "dev-master": "3.0-dev"
+            }
+        },
+        "installation-source": "dist",
         "autoload": {
             "psr-0": {
                 "Guzzle\\Common": ""
@@ -716,27 +721,32 @@
     },
     {
         "name": "guzzle/stream",
-        "version": "dev-master",
-        "version_normalized": "9999999-dev",
+        "version": "v3.0.7",
+        "version_normalized": "3.0.7.0",
         "target-dir": "Guzzle/Stream",
         "source": {
             "type": "git",
             "url": "https://github.com/guzzle/stream",
-            "reference": "v3.0.5"
+            "reference": "v3.0.7"
         },
         "dist": {
             "type": "zip",
-            "url": "https://github.com/guzzle/stream/archive/v3.0.5.zip",
-            "reference": "v3.0.5",
+            "url": "https://github.com/guzzle/stream/archive/v3.0.7.zip",
+            "reference": "v3.0.7",
             "shasum": ""
         },
         "require": {
             "php": ">=5.3.2",
             "guzzle/common": "self.version"
         },
-        "time": "2012-11-11 23:54:57",
+        "time": "2012-12-07 16:45:11",
         "type": "library",
-        "installation-source": "source",
+        "extra": {
+            "branch-alias": {
+                "dev-master": "3.0-dev"
+            }
+        },
+        "installation-source": "dist",
         "autoload": {
             "psr-0": {
                 "Guzzle\\Stream": ""
@@ -763,26 +773,31 @@
     },
     {
         "name": "guzzle/parser",
-        "version": "dev-master",
-        "version_normalized": "9999999-dev",
+        "version": "v3.0.7",
+        "version_normalized": "3.0.7.0",
         "target-dir": "Guzzle/Parser",
         "source": {
             "type": "git",
             "url": "git://github.com/guzzle/parser.git",
-            "reference": "v3.0.5"
+            "reference": "v3.0.7"
         },
         "dist": {
             "type": "zip",
-            "url": "https://github.com/guzzle/parser/archive/v3.0.5.zip",
-            "reference": "v3.0.5",
+            "url": "https://github.com/guzzle/parser/archive/v3.0.7.zip",
+            "reference": "v3.0.7",
             "shasum": ""
         },
         "require": {
             "php": ">=5.3.2"
         },
-        "time": "2012-11-19 00:07:13",
+        "time": "2012-12-07 16:45:11",
         "type": "library",
-        "installation-source": "source",
+        "extra": {
+            "branch-alias": {
+                "dev-master": "3.0-dev"
+            }
+        },
+        "installation-source": "dist",
         "autoload": {
             "psr-0": {
                 "Guzzle\\Parser": ""
@@ -804,29 +819,35 @@
     },
     {
         "name": "guzzle/http",
-        "version": "dev-master",
-        "version_normalized": "9999999-dev",
+        "version": "v3.0.7",
+        "version_normalized": "3.0.7.0",
         "target-dir": "Guzzle/Http",
         "source": {
             "type": "git",
             "url": "git://github.com/guzzle/http.git",
-            "reference": "v3.0.5"
+            "reference": "v3.0.7"
         },
         "dist": {
             "type": "zip",
-            "url": "https://github.com/guzzle/http/archive/v3.0.5.zip",
-            "reference": "v3.0.5",
+            "url": "https://github.com/guzzle/http/archive/v3.0.7.zip",
+            "reference": "v3.0.7",
             "shasum": ""
         },
         "require": {
             "php": ">=5.3.2",
+            "ext-curl": "*",
             "guzzle/common": "self.version",
             "guzzle/parser": "self.version",
             "guzzle/stream": "self.version"
         },
-        "time": "2012-11-18 05:28:55",
+        "time": "2012-12-14 00:49:17",
         "type": "library",
-        "installation-source": "source",
+        "extra": {
+            "branch-alias": {
+                "dev-master": "3.0-dev"
+            }
+        },
+        "installation-source": "dist",
         "autoload": {
             "psr-0": {
                 "Guzzle\\Http": ""
@@ -852,5 +873,111 @@
             "client",
             "Guzzle"
         ]
+    },
+    {
+        "name": "guzzle/log",
+        "version": "v3.0.7",
+        "version_normalized": "3.0.7.0",
+        "target-dir": "Guzzle/Log",
+        "source": {
+            "type": "git",
+            "url": "https://github.com/guzzle/log",
+            "reference": "v3.0.7"
+        },
+        "dist": {
+            "type": "zip",
+            "url": "https://github.com/guzzle/log/archive/v3.0.7.zip",
+            "reference": "v3.0.7",
+            "shasum": ""
+        },
+        "require": {
+            "php": ">=5.3.2"
+        },
+        "suggest": {
+            "guzzle/http": "v3.0.7"
+        },
+        "time": "2012-12-07 16:45:11",
+        "type": "library",
+        "extra": {
+            "branch-alias": {
+                "dev-master": "3.0-dev"
+            }
+        },
+        "installation-source": "dist",
+        "autoload": {
+            "psr-0": {
+                "Guzzle\\Log": ""
+            }
+        },
+        "notification-url": "https://packagist.org/downloads/",
+        "license": [
+            "MIT"
+        ],
+        "authors": [
+            {
+                "name": "Michael Dowling",
+                "email": "mtdowling@gmail.com",
+                "homepage": "https://github.com/mtdowling"
+            }
+        ],
+        "description": "Guzzle log adapter component",
+        "homepage": "http://guzzlephp.org/",
+        "keywords": [
+            "log",
+            "Guzzle",
+            "adapter"
+        ]
+    },
+    {
+        "name": "guzzle/plugin-backoff",
+        "version": "v3.0.7",
+        "version_normalized": "3.0.7.0",
+        "target-dir": "Guzzle/Plugin/Backoff",
+        "source": {
+            "type": "git",
+            "url": "https://github.com/guzzle/plugin-backoff",
+            "reference": "v3.0.7"
+        },
+        "dist": {
+            "type": "zip",
+            "url": "https://github.com/guzzle/plugin-backoff/archive/v3.0.7.zip",
+            "reference": "v3.0.7",
+            "shasum": ""
+        },
+        "require": {
+            "php": ">=5.3.2",
+            "guzzle/http": "self.version",
+            "guzzle/log": "self.version"
+        },
+        "time": "2012-12-07 16:45:11",
+        "type": "library",
+        "extra": {
+            "branch-alias": {
+                "dev-master": "3.0-dev"
+            }
+        },
+        "installation-source": "dist",
+        "autoload": {
+            "psr-0": {
+                "Guzzle\\Plugin\\Backoff": ""
+            }
+        },
+        "notification-url": "https://packagist.org/downloads/",
+        "license": [
+            "MIT"
+        ],
+        "authors": [
+            {
+                "name": "Michael Dowling",
+                "email": "mtdowling@gmail.com",
+                "homepage": "https://github.com/mtdowling"
+            }
+        ],
+        "description": "Guzzle backoff retry plugins",
+        "homepage": "http://guzzlephp.org/",
+        "keywords": [
+            "plugin",
+            "Guzzle"
+        ]
     }
 ]
diff --git a/core/vendor/guzzle/common/Guzzle/Common/Collection.php b/core/vendor/guzzle/common/Guzzle/Common/Collection.php
index b82df13..e7120cb 100644
--- a/core/vendor/guzzle/common/Guzzle/Common/Collection.php
+++ b/core/vendor/guzzle/common/Guzzle/Common/Collection.php
@@ -355,21 +355,11 @@ public function set($key, $value)
      */
     public function inject($input)
     {
-        // Only perform the preg callback if needed
-        return strpos($input, '{') === false
-            ? $input
-            : preg_replace_callback('/{\s*([A-Za-z_\-\.0-9]+)\s*}/', array($this, 'getPregMatchValue'), $input);
-    }
+        $replace = array();
+        foreach ($this->data as $key => $val) {
+            $replace['{' . $key . '}'] = $val;
+        }
 
-    /**
-     * Return a collection value for a match array of a preg_replace function
-     *
-     * @param array $matches preg_replace* matches
-     *
-     * @return mixed
-     */
-    public function getPregMatchValue(array $matches)
-    {
-        return $this->get($matches[1]);
+        return strtr($input, $replace);
     }
 }
diff --git a/core/vendor/guzzle/common/Guzzle/Common/Version.php b/core/vendor/guzzle/common/Guzzle/Common/Version.php
index 5383311..4ad85ae 100644
--- a/core/vendor/guzzle/common/Guzzle/Common/Version.php
+++ b/core/vendor/guzzle/common/Guzzle/Common/Version.php
@@ -7,6 +7,6 @@
  */
 class Version
 {
-    const VERSION = '3.0.5';
+    const VERSION = '3.0.7';
 }
 
diff --git a/core/vendor/guzzle/common/Guzzle/Common/composer.json b/core/vendor/guzzle/common/Guzzle/Common/composer.json
index 62431cc..5693c4d 100644
--- a/core/vendor/guzzle/common/Guzzle/Common/composer.json
+++ b/core/vendor/guzzle/common/Guzzle/Common/composer.json
@@ -11,5 +11,10 @@
     "autoload": {
         "psr-0": { "Guzzle\\Common": "" }
     },
-    "target-dir": "Guzzle/Common"
+    "target-dir": "Guzzle/Common",
+    "extra": {
+        "branch-alias": {
+            "dev-master": "3.0-dev"
+        }
+    }
 }
diff --git a/core/vendor/guzzle/http/Guzzle/Http/Client.php b/core/vendor/guzzle/http/Guzzle/Http/Client.php
index 2bb814f..1703b5e 100644
--- a/core/vendor/guzzle/http/Guzzle/Http/Client.php
+++ b/core/vendor/guzzle/http/Guzzle/Http/Client.php
@@ -75,7 +75,7 @@ public function __construct($baseUrl = '', $config = null)
         // Allow ssl.certificate_authority config setting to control the certificate authority used by curl
         $authority = $this->config->get(self::SSL_CERT_AUTHORITY);
         // Use the system's cacert if in a phar (curl can't read from a phar stream wrapper)
-        if (strpos(__FILE__, 'phar://') === false && $authority === true) {
+        if (strpos(__FILE__, 'phar://') !== false && (null === $authority || $authority === true)) {
             $authority = 'system';
         }
         // Set the config setting to system to use the certificate authority bundle on your system
diff --git a/core/vendor/guzzle/http/Guzzle/Http/Curl/CurlMulti.php b/core/vendor/guzzle/http/Guzzle/Http/Curl/CurlMulti.php
index 3744d7c..9c14db3 100644
--- a/core/vendor/guzzle/http/Guzzle/Http/Curl/CurlMulti.php
+++ b/core/vendor/guzzle/http/Guzzle/Http/Curl/CurlMulti.php
@@ -6,6 +6,7 @@
 use Guzzle\Common\Exception\ExceptionCollection;
 use Guzzle\Http\Exception\CurlException;
 use Guzzle\Http\Message\RequestInterface;
+use Guzzle\Plugin\Backoff\BackoffPlugin;
 
 /**
  * Send {@see RequestInterface} objects in parallel using curl_multi
@@ -126,7 +127,7 @@ public function __construct()
         class_exists('Guzzle\Http\Message\Response');
         class_exists('Guzzle\Http\Exception\CurlException');
 
-        $this->createMutliHandle();
+        $this->createMultiHandle();
     }
 
     /**
@@ -246,7 +247,7 @@ public function reset($hard = false)
         }
 
         if ($hard) {
-            $this->createMutliHandle();
+            $this->createMultiHandle();
         }
     }
 
@@ -379,43 +380,52 @@ protected function perform()
 
         // Create the polling event external to the loop
         $event = array('curl_multi' => $this);
+        $active = $this->executeHandles();
 
         while (1) {
 
-            $active = $this->executeHandles();
-
-            // Get messages from curl handles
-            while ($done = curl_multi_info_read($this->multiHandle)) {
-                $request = $this->resourceHash[(int) $done['handle']];
-                $handle = $this->handles[$request];
-                try {
-                    $this->processResponse($request, $handle, $done);
-                } catch (\Exception $e) {
-                    $this->removeErroredRequest($request, $e);
-                }
-            }
-
-            // Notify each request as polling and handled queued responses
-            $scopedPolling = $this->scope <= 0 ? $this->all() : $this->requests[$this->scope];
+            $this->processMessages();
 
             // Exit the function if there are no more requests to send
-            if (empty($scopedPolling)) {
+            if (!($scopedPolling = $this->scope <= 0 ? $this->all() : $this->requests[$this->scope])) {
                 break;
             }
 
-            // Notify all requests that requests are being polled
+            // Notify each request as polling
+            $waiting = $total = 0;
             foreach ($scopedPolling as $request) {
                 $event['request'] = $request;
                 $request->dispatch(self::POLLING_REQUEST, $event);
+                ++$total;
+                if ($request->getParams()->hasKey(BackoffPlugin::DELAY_PARAM)) {
+                    ++$waiting;
+                }
             }
 
-            if ($active) {
-                // Select the curl handles until there is any activity on any of the open file descriptors
-                // See https://github.com/php/php-src/blob/master/ext/curl/multi.c#L170
-                $active = $this->executeHandles(true, 0.1);
-            } else {
+            if ($waiting == $total) {
                 // Sleep to prevent eating CPU because no requests are actually pending a select call
                 usleep(500);
+            } else {
+                // Select the curl handles until there is any activity on any of the open file descriptors
+                // See https://github.com/php/php-src/blob/master/ext/curl/multi.c#L170
+                $active = $this->executeHandles(true, 0.02, $active);
+            }
+        }
+    }
+
+    /**
+     * Process any received curl multi messages
+     */
+    private function processMessages()
+    {
+        // Get messages from curl handles
+        while ($done = curl_multi_info_read($this->multiHandle)) {
+            try {
+                $request = $this->resourceHash[(int) $done['handle']];
+                $handle = $this->handles[$request];
+                $this->processResponse($request, $handle, $done);
+            } catch (\Exception $e) {
+                $this->removeErroredRequest($request, $e);
             }
         }
     }
@@ -425,29 +435,25 @@ protected function perform()
      *
      * @param bool $select  Set to TRUE to select the file descriptors
      * @param int  $timeout Select timeout in seconds
+     * @param int  $active  Previous active value
      *
      * @return int Returns the number of active handles
      */
-    private function executeHandles($select = false, $timeout = 1)
+    private function executeHandles($select = false, $timeout = 1, $active = 0)
     {
-        $active = $selectResult = 0;
-
         do {
-
-            if ($select) {
-                $selectResult = curl_multi_select($this->multiHandle, $timeout);
-            }
-
-            if ($selectResult === 0) {
-                do {
-                    $mrc = curl_multi_exec($this->multiHandle, $active);
-                } while ($mrc == CURLM_CALL_MULTI_PERFORM);
-                // Check the return value to ensure an error did not occur
-                $this->checkCurlResult($mrc);
+            if ($select && $active && curl_multi_select($this->multiHandle, $timeout) == -1) {
+                // Perform a usleep if a previously executed select returned -1
+                // @see https://bugs.php.net/bug.php?id=61141
+                usleep(125);
             }
-
+            do {
+                $mrc = curl_multi_exec($this->multiHandle, $active);
+            } while ($mrc == CURLM_CALL_MULTI_PERFORM);
+            // Check the return value to ensure an error did not occur
+            $this->checkCurlResult($mrc);
         // Poll once if not selecting, or poll until there are no handles with activity
-        } while ($select && $active && $selectResult == 0);
+        } while ($select && $active);
 
         return $active;
     }
@@ -572,19 +578,17 @@ private function isCurlException(RequestInterface $request, CurlHandle $handle,
     private function checkCurlResult($code)
     {
         if ($code != CURLM_OK && $code != CURLM_CALL_MULTI_PERFORM) {
-            if (isset($this->multiErrors[$code])) {
-                $message = "cURL error: {$code} ({$this->multiErrors[$code][0]}): cURL message: {$this->multiErrors[$code][1]}";
-            } else {
-                $message = 'Unexpected cURL error: ' . $code;
-            }
-            throw new CurlException($message);
+            throw new CurlException(isset($this->multiErrors[$code])
+                ? "cURL error: {$code} ({$this->multiErrors[$code][0]}): cURL message: {$this->multiErrors[$code][1]}"
+                : 'Unexpected cURL error: ' . $code
+            );
         }
     }
 
     /**
      * Create the new cURL multi handle with error checking
      */
-    private function createMutliHandle()
+    private function createMultiHandle()
     {
         if ($this->multiHandle && is_resource($this->multiHandle)) {
             curl_multi_close($this->multiHandle);
diff --git a/core/vendor/guzzle/http/Guzzle/Http/Message/Request.php b/core/vendor/guzzle/http/Guzzle/Http/Message/Request.php
index 59b7b0d..4575919 100644
--- a/core/vendor/guzzle/http/Guzzle/Http/Message/Request.php
+++ b/core/vendor/guzzle/http/Guzzle/Http/Message/Request.php
@@ -5,6 +5,7 @@
 use Guzzle\Common\Event;
 use Guzzle\Common\Collection;
 use Guzzle\Common\Exception\RuntimeException;
+use Guzzle\Common\Exception\InvalidArgumentException;
 use Guzzle\Http\Utils;
 use Guzzle\Http\Exception\RequestException;
 use Guzzle\Http\Exception\BadResponseException;
@@ -542,9 +543,16 @@ public function setResponse(Response $response, $queued = false)
     /**
      * {@inheritdoc}
      */
-    public function setResponseBody(EntityBodyInterface $body)
+    public function setResponseBody($body)
     {
-        $this->responseBody = $body;
+        // Attempt to open a file for writing if a string was passed
+        if (is_string($body)) {
+            if (!($body = fopen($body, 'w+'))) {
+                throw new InvalidArgumentException('Could not open ' . $body . ' for writing');
+            }
+        }
+
+        $this->responseBody = EntityBody::factory($body);
 
         return $this;
     }
diff --git a/core/vendor/guzzle/http/Guzzle/Http/Message/RequestInterface.php b/core/vendor/guzzle/http/Guzzle/Http/Message/RequestInterface.php
index 05bafc5..0fd6103 100644
--- a/core/vendor/guzzle/http/Guzzle/Http/Message/RequestInterface.php
+++ b/core/vendor/guzzle/http/Guzzle/Http/Message/RequestInterface.php
@@ -261,11 +261,11 @@ public function receiveResponseHeader($data);
      * This method should be invoked when you need to send the response's entity body somewhere other than the normal
      * php://temp buffer. For example, you can send the entity body to a socket, file, or some other custom stream.
      *
-     * @param EntityBodyInterface $body Response body object
-     *
+     * @param EntityBodyInterface|string|resource $body Response body object. Pass a string to attempt to store the
+     *                                                  response body in a local file.
      * @return Request
      */
-    public function setResponseBody(EntityBodyInterface $body);
+    public function setResponseBody($body);
 
     /**
      * Determine if the response body is repeatable (readable + seekable)
diff --git a/core/vendor/guzzle/http/Guzzle/Http/composer.json b/core/vendor/guzzle/http/Guzzle/Http/composer.json
index a55a855..b824003 100644
--- a/core/vendor/guzzle/http/Guzzle/Http/composer.json
+++ b/core/vendor/guzzle/http/Guzzle/Http/composer.json
@@ -13,6 +13,7 @@
     ],
     "require": {
         "php": ">=5.3.2",
+        "ext-curl": "*",
         "guzzle/common": "self.version",
         "guzzle/parser": "self.version",
         "guzzle/stream": "self.version"
@@ -20,5 +21,10 @@
     "autoload": {
         "psr-0": { "Guzzle\\Http": "" }
     },
-    "target-dir": "Guzzle/Http"
+    "target-dir": "Guzzle/Http",
+    "extra": {
+        "branch-alias": {
+            "dev-master": "3.0-dev"
+        }
+    }
 }
diff --git a/core/vendor/guzzle/log/Guzzle/Log/AbstractLogAdapter.php b/core/vendor/guzzle/log/Guzzle/Log/AbstractLogAdapter.php
new file mode 100644
index 0000000..9f5735c
--- /dev/null
+++ b/core/vendor/guzzle/log/Guzzle/Log/AbstractLogAdapter.php
@@ -0,0 +1,19 @@
+<?php
+
+namespace Guzzle\Log;
+
+/**
+ * Adapter class that allows Guzzle to log data using various logging implementations
+ */
+abstract class AbstractLogAdapter implements LogAdapterInterface
+{
+    protected $log;
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getLogObject()
+    {
+        return $this->log;
+    }
+}
diff --git a/core/vendor/guzzle/log/Guzzle/Log/ArrayLogAdapter.php b/core/vendor/guzzle/log/Guzzle/Log/ArrayLogAdapter.php
new file mode 100644
index 0000000..17088c1
--- /dev/null
+++ b/core/vendor/guzzle/log/Guzzle/Log/ArrayLogAdapter.php
@@ -0,0 +1,37 @@
+<?php
+
+namespace Guzzle\Log;
+
+/**
+ * Stores all log messages in an array
+ */
+class ArrayLogAdapter implements LogAdapterInterface
+{
+    protected $logs = array();
+
+    /**
+     * {@inheritdoc}
+     */
+    public function log($message, $priority = LOG_INFO, $extras = null)
+    {
+        $this->logs[] = array('message' => $message, 'priority' => $priority, 'extras' => $extras);
+    }
+
+    /**
+     * Get logged entries
+     *
+     * @return array
+     */
+    public function getLogs()
+    {
+        return $this->logs;
+    }
+
+    /**
+     * Clears logged entries
+     */
+    public function clearLogs()
+    {
+        $this->logs = array();
+    }
+}
diff --git a/core/vendor/guzzle/log/Guzzle/Log/ClosureLogAdapter.php b/core/vendor/guzzle/log/Guzzle/Log/ClosureLogAdapter.php
new file mode 100644
index 0000000..a793d5e
--- /dev/null
+++ b/core/vendor/guzzle/log/Guzzle/Log/ClosureLogAdapter.php
@@ -0,0 +1,29 @@
+<?php
+
+namespace Guzzle\Log;
+
+/**
+ * Logs messages using Closures. Closures combined with filtering can trigger application events based on log messages.
+ */
+class ClosureLogAdapter extends AbstractLogAdapter
+{
+    /**
+     * {@inheritdoc}
+     */
+    public function __construct($logObject)
+    {
+        if (!is_callable($logObject)) {
+            throw new \InvalidArgumentException('Object must be callable');
+        }
+
+        $this->log = $logObject;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function log($message, $priority = LOG_INFO, $extras = null)
+    {
+        call_user_func($this->log, $message, $priority, $extras);
+    }
+}
diff --git a/core/vendor/guzzle/log/Guzzle/Log/LogAdapterInterface.php b/core/vendor/guzzle/log/Guzzle/Log/LogAdapterInterface.php
new file mode 100644
index 0000000..3917d6d
--- /dev/null
+++ b/core/vendor/guzzle/log/Guzzle/Log/LogAdapterInterface.php
@@ -0,0 +1,18 @@
+<?php
+
+namespace Guzzle\Log;
+
+/**
+ * Adapter class that allows Guzzle to log data to various logging implementations.
+ */
+interface LogAdapterInterface
+{
+    /**
+     * Log a message at a priority
+     *
+     * @param string  $message  Message to log
+     * @param integer $priority Priority of message (use the \LOG_* constants of 0 - 7)
+     * @param mixed   $extras   Extra information to log in event
+     */
+    public function log($message, $priority = LOG_INFO, $extras = null);
+}
diff --git a/core/vendor/guzzle/log/Guzzle/Log/MessageFormatter.php b/core/vendor/guzzle/log/Guzzle/Log/MessageFormatter.php
new file mode 100644
index 0000000..2677b9a
--- /dev/null
+++ b/core/vendor/guzzle/log/Guzzle/Log/MessageFormatter.php
@@ -0,0 +1,183 @@
+<?php
+
+namespace Guzzle\Log;
+
+use Guzzle\Http\Curl\CurlHandle;
+use Guzzle\Http\Message\RequestInterface;
+use Guzzle\Http\Message\EntityEnclosingRequestInterface;
+use Guzzle\Http\Message\Response;
+
+/**
+ * Message formatter used in various places in the framework
+ *
+ * Format messages using a template that can contain the the following variables:
+ *
+ * - {request}:       Full HTTP request message
+ * - {response}:      Full HTTP response message
+ * - {ts}:            Timestamp
+ * - {host}:          Host of the request
+ * - {method}:        Method of the request
+ * - {url}:           URL of the request
+ * - {host}:          Host of the request
+ * - {protocol}:      Request protocol
+ * - {version}:       Protocol version
+ * - {resource}:      Resource of the request (path + query + fragment)
+ * - {port}:          Port of the request
+ * - {hostname}:      Hostname of the machine that sent the request
+ * - {code}:          Status code of the response (if available)
+ * - {phrase}:        Reason phrase of the response  (if available)
+ * - {curl_error}:    Curl error message (if available)
+ * - {curl_code}:     Curl error code (if available)
+ * - {curl_stderr}:   Curl standard error (if available)
+ * - {connect_time}:  Time in seconds it took to establish the connection (if available)
+ * - {total_time}:    Total transaction time in seconds for last transfer (if available)
+ * - {req_header_*}:  Replace `*` with the lowercased name of a request header to add to the message
+ * - {res_header_*}:  Replace `*` with the lowercased name of a response header to add to the message
+ * - {req_body}:      Request body
+ * - {res_body}:      Response body
+ */
+class MessageFormatter
+{
+    const DEFAULT_FORMAT = "{hostname} {req_header_User-Agent} - [{ts}] \"{method} {resource} {protocol}/{version}\" {code} {res_header_Content-Length}";
+    const DEBUG_FORMAT = ">>>>>>>>\n{request}\n<<<<<<<<\n{response}\n--------\n{curl_stderr}";
+    const SHORT_FORMAT = '[{ts}] "{method} {resource} {protocol}/{version}" {code}';
+
+    /**
+     * @var string Template used to format log messages
+     */
+    protected $template;
+
+    /**
+     * @param string $template Log message template
+     */
+    public function __construct($template = self::DEFAULT_FORMAT)
+    {
+        $this->template = $template ?: self::DEFAULT_FORMAT;
+    }
+
+    /**
+     * Set the template to use for logging
+     *
+     * @param string $template Log message template
+     *
+     * @return self
+     */
+    public function setTemplate($template)
+    {
+        $this->template = $template;
+
+        return $this;
+    }
+
+    /**
+     * Returns a formatted message
+     *
+     * @param RequestInterface $request    Request that was sent
+     * @param Response         $response   Response that was received
+     * @param CurlHandle       $handle     Curl handle associated with the message
+     * @param array            $customData Associative array of custom template data
+     *
+     * @return string
+     */
+    public function format(
+        RequestInterface $request,
+        Response $response = null,
+        CurlHandle $handle = null,
+        array $customData = array()
+    ) {
+        $cache = $customData;
+
+        return preg_replace_callback(
+            '/{\s*([A-Za-z_\-\.0-9]+)\s*}/',
+            function (array $matches) use ($request, $response, $handle, &$cache) {
+
+                if (array_key_exists($matches[1], $cache)) {
+                    return $cache[$matches[1]];
+                }
+
+                $result = '';
+                switch ($matches[1]) {
+                    case 'request':
+                        $result = (string) $request;
+                        break;
+                    case 'response':
+                        $result = (string) $response;
+                        break;
+                    case 'req_body':
+                        $result = $request instanceof EntityEnclosingRequestInterface
+                            ? (string) $request->getBody() : '';
+                        break;
+                    case 'res_body':
+                        $result = $response ? $response->getBody(true) : '';
+                        break;
+                    case 'ts':
+                        $result = gmdate('c');
+                        break;
+                    case 'method':
+                        $result = $request->getMethod();
+                        break;
+                    case 'url':
+                        $result = (string) $request->getUrl();
+                        break;
+                    case 'resource':
+                        $result = $request->getResource();
+                        break;
+                    case 'protocol':
+                        $result = 'HTTP';
+                        break;
+                    case 'version':
+                        $result = $request->getProtocolVersion();
+                        break;
+                    case 'host':
+                        $result = $request->getHost();
+                        break;
+                    case 'hostname':
+                        $result = gethostname();
+                        break;
+                    case 'port':
+                        $result = $request->getPort();
+                        break;
+                    case 'code':
+                        $result = $response ? $response->getStatusCode() : '';
+                        break;
+                    case 'phrase':
+                        $result = $response ? $response->getReasonPhrase() : '';
+                        break;
+                    case 'connect_time':
+                        if ($handle) {
+                            $result = $handle->getInfo(CURLINFO_CONNECT_TIME);
+                        } elseif ($response) {
+                            $result = $response->getInfo('connect_time');
+                        }
+                        break;
+                    case 'total_time':
+                        if ($handle) {
+                            $result = $handle->getInfo(CURLINFO_TOTAL_TIME);
+                        } elseif ($response) {
+                            $result = $response->getInfo('total_time');
+                        }
+                        break;
+                    case 'curl_error':
+                        $result = $handle ? $handle->getError() : '';
+                        break;
+                    case 'curl_code':
+                        $result = $handle ? $handle->getErrorNo() : '';
+                        break;
+                    case 'curl_stderr':
+                        $result =  $handle ? $handle->getStderr() : '';
+                        break;
+                    default:
+                        if (strpos($matches[1], 'req_header_') === 0) {
+                            $result = $request->getHeader(substr($matches[1], 11));
+                        } elseif (strpos($matches[1], 'res_header_') === 0) {
+                            $result = $response->getHeader(substr($matches[1], 11));
+                        }
+                }
+
+                $cache[$matches[1]] = $result;
+                return $result;
+            },
+            $this->template
+        );
+    }
+}
diff --git a/core/vendor/guzzle/log/Guzzle/Log/MonologLogAdapter.php b/core/vendor/guzzle/log/Guzzle/Log/MonologLogAdapter.php
new file mode 100644
index 0000000..55f60d1
--- /dev/null
+++ b/core/vendor/guzzle/log/Guzzle/Log/MonologLogAdapter.php
@@ -0,0 +1,41 @@
+<?php
+
+namespace Guzzle\Log;
+
+use Monolog\Logger;
+
+/**
+ * Monolog log adapter
+ *
+ * @link https://github.com/Seldaek/monolog
+ */
+class MonologLogAdapter extends AbstractLogAdapter
+{
+    /**
+     * syslog to Monolog mappings
+     */
+    private static $mapping = array(
+        LOG_DEBUG   => Logger::DEBUG,
+        LOG_INFO    => Logger::INFO,
+        LOG_WARNING => Logger::WARNING,
+        LOG_ERR     => Logger::ERROR,
+        LOG_CRIT    => Logger::CRITICAL,
+        LOG_ALERT   => Logger::ALERT
+    );
+
+    /**
+     * {@inheritdoc}
+     */
+    public function __construct(Logger $logObject)
+    {
+        $this->log = $logObject;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function log($message, $priority = LOG_INFO, $extras = null)
+    {
+        $this->log->addRecord(self::$mapping[$priority], $message);
+    }
+}
diff --git a/core/vendor/guzzle/log/Guzzle/Log/Zf1LogAdapter.php b/core/vendor/guzzle/log/Guzzle/Log/Zf1LogAdapter.php
new file mode 100644
index 0000000..b80dd37
--- /dev/null
+++ b/core/vendor/guzzle/log/Guzzle/Log/Zf1LogAdapter.php
@@ -0,0 +1,25 @@
+<?php
+
+namespace Guzzle\Log;
+
+/**
+ * Adapts a Zend Framework 1 logger object
+ */
+class Zf1LogAdapter extends AbstractLogAdapter
+{
+    /**
+     * {@inheritdoc}
+     */
+    public function __construct(\Zend_Log $logObject)
+    {
+        $this->log = $logObject;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function log($message, $priority = LOG_INFO, $extras = null)
+    {
+        $this->log->log($message, $priority, $extras);
+    }
+}
diff --git a/core/vendor/guzzle/log/Guzzle/Log/Zf2LogAdapter.php b/core/vendor/guzzle/log/Guzzle/Log/Zf2LogAdapter.php
new file mode 100644
index 0000000..3348c23
--- /dev/null
+++ b/core/vendor/guzzle/log/Guzzle/Log/Zf2LogAdapter.php
@@ -0,0 +1,27 @@
+<?php
+
+namespace Guzzle\Log;
+
+use Zend\Log\Logger;
+
+/**
+ * Adapts a Zend Framework 2 logger object
+ */
+class Zf2LogAdapter extends AbstractLogAdapter
+{
+    /**
+     * {@inheritdoc}
+     */
+    public function __construct(Logger $logObject)
+    {
+        $this->log = $logObject;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function log($message, $priority = LOG_INFO, $extras = null)
+    {
+        $this->log->log($priority, $message, $extras ?: array());
+    }
+}
diff --git a/core/vendor/guzzle/log/Guzzle/Log/composer.json b/core/vendor/guzzle/log/Guzzle/Log/composer.json
new file mode 100644
index 0000000..791e27e
--- /dev/null
+++ b/core/vendor/guzzle/log/Guzzle/Log/composer.json
@@ -0,0 +1,29 @@
+{
+    "name": "guzzle/log",
+    "description": "Guzzle log adapter component",
+    "homepage": "http://guzzlephp.org/",
+    "keywords": ["log", "adapter", "guzzle"],
+    "license": "MIT",
+    "authors": [
+        {
+            "name": "Michael Dowling",
+            "email": "mtdowling@gmail.com",
+            "homepage": "https://github.com/mtdowling"
+        }
+    ],
+    "require": {
+        "php": ">=5.3.2"
+    },
+    "autoload": {
+        "psr-0": { "Guzzle\\Log": "" }
+    },
+    "suggest": {
+        "guzzle/http": "self.version"
+    },
+    "target-dir": "Guzzle/Log",
+    "extra": {
+        "branch-alias": {
+            "dev-master": "3.0-dev"
+        }
+    }
+}
diff --git a/core/vendor/guzzle/parser/Guzzle/Parser/composer.json b/core/vendor/guzzle/parser/Guzzle/Parser/composer.json
index 898ff50..9c10342 100644
--- a/core/vendor/guzzle/parser/Guzzle/Parser/composer.json
+++ b/core/vendor/guzzle/parser/Guzzle/Parser/composer.json
@@ -10,5 +10,10 @@
     "autoload": {
         "psr-0": { "Guzzle\\Parser": "" }
     },
-    "target-dir": "Guzzle/Parser"
+    "target-dir": "Guzzle/Parser",
+    "extra": {
+        "branch-alias": {
+            "dev-master": "3.0-dev"
+        }
+    }
 }
diff --git a/core/vendor/guzzle/plugin-backoff/Guzzle/Plugin/Backoff/AbstractBackoffStrategy.php b/core/vendor/guzzle/plugin-backoff/Guzzle/Plugin/Backoff/AbstractBackoffStrategy.php
new file mode 100644
index 0000000..a452dcb
--- /dev/null
+++ b/core/vendor/guzzle/plugin-backoff/Guzzle/Plugin/Backoff/AbstractBackoffStrategy.php
@@ -0,0 +1,98 @@
+<?php
+
+namespace Guzzle\Plugin\Backoff;
+
+use Guzzle\Http\Message\RequestInterface;
+use Guzzle\Http\Message\Response;
+use Guzzle\Http\Exception\HttpException;
+
+/**
+ * Abstract backoff strategy that allows for a chain of responsibility
+ */
+abstract class AbstractBackoffStrategy implements BackoffStrategyInterface
+{
+    /**
+     * @var AbstractBackoffStrategy Next strategy in the chain
+     */
+    protected $next;
+
+    /**
+     * @param AbstractBackoffStrategy $next Next strategy in the chain
+     */
+    public function setNext(AbstractBackoffStrategy $next)
+    {
+        $this->next = $next;
+    }
+
+    /**
+     * Get the next backoff strategy in the chain
+     *
+     * @return AbstractBackoffStrategy|null
+     */
+    public function getNext()
+    {
+        return $this->next;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getBackoffPeriod(
+        $retries,
+        RequestInterface $request,
+        Response $response = null,
+        HttpException $e = null
+    ) {
+        $delay = $this->getDelay($retries, $request, $response, $e);
+        if ($delay === false) {
+            // The strategy knows that this must not be retried
+            return false;
+        } elseif ($delay === null) {
+            // If the strategy is deferring a decision and the next strategy will not make a decision then return false
+            return !$this->next || !$this->next->makesDecision()
+                ? false
+                : $this->next->getBackoffPeriod($retries, $request, $response, $e);
+        } elseif ($delay === true) {
+            // if the strategy knows that it must retry but is deferring to the next to determine the delay
+            if (!$this->next) {
+                return 0;
+            } else {
+                $next = $this->next;
+                while ($next->makesDecision() && $next->getNext()) {
+                    $next = $next->getNext();
+                }
+                return !$next->makesDecision() ? $next->getBackoffPeriod($retries, $request, $response, $e) : 0;
+            }
+        } else {
+            return $delay;
+        }
+    }
+
+    /**
+     * Check if the strategy does filtering and makes decisions on whether or not to retry.
+     *
+     * Strategies that return false will never retry if all of the previous strategies in a chain defer on a backoff
+     * decision.
+     *
+     * @return bool
+     */
+    abstract public function makesDecision();
+
+    /**
+     * Implement the concrete strategy
+     *
+     * @param int              $retries  Number of retries of the request
+     * @param RequestInterface $request  Request that was sent
+     * @param Response         $response Response that was received. Note that there may not be a response
+     * @param HttpException    $e        Exception that was encountered if any
+     *
+     * @return bool|int|null Returns false to not retry or the number of seconds to delay between retries. Return true
+     *                       or null to defer to the next strategy if available, and if not, return 0.
+     */
+    abstract protected function getDelay(
+        $retries,
+        RequestInterface $request,
+        Response $response = null,
+        HttpException $e = null
+    );
+}
diff --git a/core/vendor/guzzle/plugin-backoff/Guzzle/Plugin/Backoff/AbstractErrorCodeBackoffStrategy.php b/core/vendor/guzzle/plugin-backoff/Guzzle/Plugin/Backoff/AbstractErrorCodeBackoffStrategy.php
new file mode 100644
index 0000000..9b7c7ab
--- /dev/null
+++ b/core/vendor/guzzle/plugin-backoff/Guzzle/Plugin/Backoff/AbstractErrorCodeBackoffStrategy.php
@@ -0,0 +1,47 @@
+<?php
+
+namespace Guzzle\Plugin\Backoff;
+
+/**
+ * Strategy used to retry when certain error codes are encountered
+ */
+abstract class AbstractErrorCodeBackoffStrategy extends AbstractBackoffStrategy
+{
+    /**
+     * @var array Default cURL errors to retry
+     */
+    protected static $defaultErrorCodes = array();
+
+    /**
+     * @var array Error codes that can be retried
+     */
+    protected $errorCodes;
+
+    /**
+     * @param array                    $codes Array of codes that should be retried
+     * @param BackoffStrategyInterface $next  The optional next strategy
+     */
+    public function __construct(array $codes = null, BackoffStrategyInterface $next = null)
+    {
+        $this->errorCodes = array_fill_keys($codes ?: static::$defaultErrorCodes, 1);
+        $this->next = $next;
+    }
+
+    /**
+     * Get the default failure codes to retry
+     *
+     * @return array
+     */
+    public static function getDefaultFailureCodes()
+    {
+        return static::$defaultErrorCodes;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function makesDecision()
+    {
+        return true;
+    }
+}
diff --git a/core/vendor/guzzle/plugin-backoff/Guzzle/Plugin/Backoff/BackoffLogger.php b/core/vendor/guzzle/plugin-backoff/Guzzle/Plugin/Backoff/BackoffLogger.php
new file mode 100644
index 0000000..df91dd3
--- /dev/null
+++ b/core/vendor/guzzle/plugin-backoff/Guzzle/Plugin/Backoff/BackoffLogger.php
@@ -0,0 +1,87 @@
+<?php
+
+namespace Guzzle\Plugin\Backoff;
+
+use Guzzle\Common\Event;
+use Guzzle\Log\LogAdapterInterface;
+use Guzzle\Log\MessageFormatter;
+use Symfony\Component\EventDispatcher\EventSubscriberInterface;
+
+/**
+ * Logs backoff retries triggered from the BackoffPlugin
+ *
+ * Format your log messages using a template that can contain template substitutions found in {@see MessageFormatter}.
+ * In addition to the default template substitutions, there is also:
+ *
+ * - retries: The number of times the request has been retried
+ * - delay:   The amount of time the request is being delayed
+ */
+class BackoffLogger implements EventSubscriberInterface
+{
+    /**
+     * @var string Default log message template
+     */
+    const DEFAULT_FORMAT = '[{ts}] {method} {url} - {code} {phrase} - Retries: {retries}, Delay: {delay}, Time: {connect_time}, {total_time}, cURL: {curl_code} {curl_error}';
+
+    /**
+     * @var LogAdapterInterface Logger used to log retries
+     */
+    protected $logger;
+
+    /**
+     * @var MessageFormatter Formatter used to format log messages
+     */
+    protected $formatter;
+
+    /**
+     * Backoff retry logger
+     *
+     * @param LogAdapterInterface $logger    Logger used to log the retries
+     * @param MessageFormatter    $formatter Formatter used to format log messages
+     */
+    public function __construct(LogAdapterInterface $logger, MessageFormatter $formatter = null)
+    {
+        $this->logger = $logger;
+        $this->formatter = $formatter ?: new MessageFormatter(self::DEFAULT_FORMAT);
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public static function getSubscribedEvents()
+    {
+        return array(BackoffPlugin::RETRY_EVENT => 'onRequestRetry');
+    }
+
+    /**
+     * Set the template to use for logging
+     *
+     * @param string $template Log message template
+     *
+     * @return self
+     */
+    public function setTemplate($template)
+    {
+        $this->formatter->setTemplate($template);
+
+        return $this;
+    }
+
+    /**
+     * Called when a request is being retried
+     *
+     * @param Event $event Event emitted
+     */
+    public function onRequestRetry(Event $event)
+    {
+        $this->logger->log($this->formatter->format(
+            $event['request'],
+            $event['response'],
+            $event['handle'],
+            array(
+                'retries' => $event['retries'],
+                'delay'   => $event['delay']
+            )
+        ));
+    }
+}
diff --git a/core/vendor/guzzle/plugin-backoff/Guzzle/Plugin/Backoff/BackoffPlugin.php b/core/vendor/guzzle/plugin-backoff/Guzzle/Plugin/Backoff/BackoffPlugin.php
new file mode 100644
index 0000000..357c0bd
--- /dev/null
+++ b/core/vendor/guzzle/plugin-backoff/Guzzle/Plugin/Backoff/BackoffPlugin.php
@@ -0,0 +1,134 @@
+<?php
+
+namespace Guzzle\Plugin\Backoff;
+
+use Guzzle\Common\Event;
+use Guzzle\Common\AbstractHasDispatcher;
+use Guzzle\Http\Message\EntityEnclosingRequestInterface;
+use Guzzle\Http\Message\RequestInterface;
+use Guzzle\Http\Message\Response;
+use Guzzle\Http\Curl\CurlMultiInterface;
+use Symfony\Component\EventDispatcher\EventSubscriberInterface;
+
+/**
+ * Plugin to automatically retry failed HTTP requests using a backoff strategy
+ */
+class BackoffPlugin extends AbstractHasDispatcher implements EventSubscriberInterface
+{
+    const DELAY_PARAM = 'plugins.backoff.retry_time';
+    const RETRY_PARAM = 'plugins.backoff.retry_count';
+    const RETRY_EVENT = 'plugins.backoff.retry';
+
+    /**
+     * @var BackoffStrategyInterface Backoff strategy
+     */
+    protected $strategy;
+
+    /**
+     * @param BackoffStrategyInterface $strategy The backoff strategy used to determine whether or not to retry and
+     *                                           the amount of delay between retries.
+     */
+    public function __construct(BackoffStrategyInterface $strategy = null)
+    {
+        $this->strategy = $strategy;
+    }
+
+    /**
+     * Retrieve a basic truncated exponential backoff plugin that will retry HTTP errors and cURL errors
+     *
+     * @param int   $maxRetries Maximum number of retries
+     * @param array $httpCodes  HTTP response codes to retry
+     * @param array $curlCodes  cURL error codes to retry
+     *
+     * @return self
+     */
+    public static function getExponentialBackoff(
+        $maxRetries = 3,
+        array $httpCodes = null,
+        array $curlCodes = null
+    ) {
+        return new self(new HttpBackoffStrategy($httpCodes,
+            new TruncatedBackoffStrategy($maxRetries,
+                new CurlBackoffStrategy($curlCodes,
+                    new ExponentialBackoffStrategy()
+                )
+            )
+        ));
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public static function getAllEvents()
+    {
+        return array(self::RETRY_EVENT);
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public static function getSubscribedEvents()
+    {
+        return array(
+            'request.sent'      => 'onRequestSent',
+            'request.exception' => 'onRequestSent',
+            CurlMultiInterface::POLLING_REQUEST => 'onRequestPoll'
+        );
+    }
+
+    /**
+     * Called when a request has been sent  and isn't finished processing
+     *
+     * @param Event $event
+     */
+    public function onRequestSent(Event $event)
+    {
+        $request = $event['request'];
+        $response = $event['response'];
+        $exception = $event['exception'];
+
+        $params = $request->getParams();
+        $retries = (int) $params->get(self::RETRY_PARAM);
+        $delay = $this->strategy->getBackoffPeriod($retries, $request, $response, $exception);
+
+        if ($delay !== false) {
+            // Calculate how long to wait until the request should be retried
+            $params->set(self::RETRY_PARAM, ++$retries)
+                ->set(self::DELAY_PARAM, microtime(true) + $delay);
+            // Send the request again
+            $request->setState(RequestInterface::STATE_TRANSFER);
+            $this->dispatch(self::RETRY_EVENT, array(
+                'request'  => $request,
+                'response' => $response,
+                'handle'   => $exception ? $exception->getCurlHandle() : null,
+                'retries'  => $retries,
+                'delay'    => $delay
+            ));
+        }
+    }
+
+    /**
+     * Called when a request is polling in the curl multi object
+     *
+     * @param Event $event
+     */
+    public function onRequestPoll(Event $event)
+    {
+        $request = $event['request'];
+        $delay = $request->getParams()->get(self::DELAY_PARAM);
+
+        // If the duration of the delay has passed, retry the request using the pool
+        if (null !== $delay && microtime(true) >= $delay) {
+            // Remove the request from the pool and then add it back again. This is required for cURL to know that we
+            // want to retry sending the easy handle.
+            $request->getParams()->remove(self::DELAY_PARAM);
+            // Rewind the request body if possible
+            if ($request instanceof EntityEnclosingRequestInterface && $request->getBody()) {
+                $request->getBody()->seek(0);
+            }
+            $multi = $event['curl_multi'];
+            $multi->remove($request);
+            $multi->add($request, true);
+        }
+    }
+}
diff --git a/core/vendor/guzzle/plugin-backoff/Guzzle/Plugin/Backoff/BackoffStrategyInterface.php b/core/vendor/guzzle/plugin-backoff/Guzzle/Plugin/Backoff/BackoffStrategyInterface.php
new file mode 100644
index 0000000..4e590db
--- /dev/null
+++ b/core/vendor/guzzle/plugin-backoff/Guzzle/Plugin/Backoff/BackoffStrategyInterface.php
@@ -0,0 +1,30 @@
+<?php
+
+namespace Guzzle\Plugin\Backoff;
+
+use Guzzle\Http\Message\RequestInterface;
+use Guzzle\Http\Message\Response;
+use Guzzle\Http\Exception\HttpException;
+
+/**
+ * Strategy to determine if a request should be retried and how long to delay between retries
+ */
+interface BackoffStrategyInterface
+{
+    /**
+     * Get the amount of time to delay in seconds before retrying a request
+     *
+     * @param int              $retries  Number of retries of the request
+     * @param RequestInterface $request  Request that was sent
+     * @param Response         $response Response that was received. Note that there may not be a response
+     * @param HttpException    $e        Exception that was encountered if any
+     *
+     * @return bool|int Returns false to not retry or the number of seconds to delay between retries
+     */
+    public function getBackoffPeriod(
+        $retries,
+        RequestInterface $request,
+        Response $response = null,
+        HttpException $e = null
+    );
+}
diff --git a/core/vendor/guzzle/plugin-backoff/Guzzle/Plugin/Backoff/CallbackBackoffStrategy.php b/core/vendor/guzzle/plugin-backoff/Guzzle/Plugin/Backoff/CallbackBackoffStrategy.php
new file mode 100644
index 0000000..ea29003
--- /dev/null
+++ b/core/vendor/guzzle/plugin-backoff/Guzzle/Plugin/Backoff/CallbackBackoffStrategy.php
@@ -0,0 +1,57 @@
+<?php
+
+namespace Guzzle\Plugin\Backoff;
+
+use Guzzle\Common\Exception\InvalidArgumentException;
+use Guzzle\Http\Message\RequestInterface;
+use Guzzle\Http\Message\Response;
+use Guzzle\Http\Exception\HttpException;
+
+/**
+ * Strategy that will invoke a closure to determine whether or not to retry with a delay
+ */
+class CallbackBackoffStrategy extends AbstractBackoffStrategy
+{
+    /**
+     * @var \Closure|array|mixed Callable method to invoke
+     */
+    protected $callback;
+
+    /**
+     * @var bool Whether or not this strategy makes a retry decision
+     */
+    protected $decision;
+
+    /**
+     * @param \Closure|array|mixed     $callback Callable method to invoke
+     * @param bool                     $decision Set to true if this strategy makes a backoff decision
+     * @param BackoffStrategyInterface $next     The optional next strategy
+     *
+     * @throws InvalidArgumentException
+     */
+    public function __construct($callback, $decision, BackoffStrategyInterface $next = null)
+    {
+        if (!is_callable($callback)) {
+            throw new InvalidArgumentException('The callback must be callable');
+        }
+        $this->callback = $callback;
+        $this->decision = (bool) $decision;
+        $this->next = $next;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function makesDecision()
+    {
+        return $this->decision;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    protected function getDelay($retries, RequestInterface $request, Response $response = null, HttpException $e = null)
+    {
+        return call_user_func($this->callback, $retries, $request, $response, $e);
+    }
+}
diff --git a/core/vendor/guzzle/plugin-backoff/Guzzle/Plugin/Backoff/ConstantBackoffStrategy.php b/core/vendor/guzzle/plugin-backoff/Guzzle/Plugin/Backoff/ConstantBackoffStrategy.php
new file mode 100644
index 0000000..d74936f
--- /dev/null
+++ b/core/vendor/guzzle/plugin-backoff/Guzzle/Plugin/Backoff/ConstantBackoffStrategy.php
@@ -0,0 +1,44 @@
+<?php
+
+namespace Guzzle\Plugin\Backoff;
+
+use Guzzle\Http\Message\RequestInterface;
+use Guzzle\Http\Message\Response;
+use Guzzle\Http\Exception\HttpException;
+
+/**
+ * Will retry the request using the same amount of delay for each retry.
+ *
+ * Warning: If no decision making strategies precede this strategy in the the chain, then all requests will be retried
+ */
+class ConstantBackoffStrategy extends AbstractBackoffStrategy
+{
+    /**
+     * @var int Amount of time for each delay
+     */
+    protected $delay;
+
+    /**
+     * @param int $delay Amount of time to delay between each additional backoff
+     */
+    public function __construct($delay)
+    {
+        $this->delay = $delay;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function makesDecision()
+    {
+        return false;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    protected function getDelay($retries, RequestInterface $request, Response $response = null, HttpException $e = null)
+    {
+        return $this->delay;
+    }
+}
diff --git a/core/vendor/guzzle/plugin-backoff/Guzzle/Plugin/Backoff/CurlBackoffStrategy.php b/core/vendor/guzzle/plugin-backoff/Guzzle/Plugin/Backoff/CurlBackoffStrategy.php
new file mode 100644
index 0000000..af90b42
--- /dev/null
+++ b/core/vendor/guzzle/plugin-backoff/Guzzle/Plugin/Backoff/CurlBackoffStrategy.php
@@ -0,0 +1,33 @@
+<?php
+
+namespace Guzzle\Plugin\Backoff;
+
+use Guzzle\Http\Message\RequestInterface;
+use Guzzle\Http\Message\Response;
+use Guzzle\Http\Exception\HttpException;
+use Guzzle\Http\Exception\CurlException;
+
+/**
+ * Strategy used to retry when certain cURL error codes are encountered.
+ */
+class CurlBackoffStrategy extends AbstractErrorCodeBackoffStrategy
+{
+    /**
+     * @var array Default cURL errors to retry
+     */
+    protected static $defaultErrorCodes = array(
+        CURLE_COULDNT_RESOLVE_HOST, CURLE_COULDNT_CONNECT, CURLE_WRITE_ERROR, CURLE_READ_ERROR,
+        CURLE_OPERATION_TIMEOUTED, CURLE_SSL_CONNECT_ERROR, CURLE_HTTP_PORT_FAILED, CURLE_GOT_NOTHING,
+        CURLE_SEND_ERROR, CURLE_RECV_ERROR
+    );
+
+    /**
+     * {@inheritdoc}
+     */
+    protected function getDelay($retries, RequestInterface $request, Response $response = null, HttpException $e = null)
+    {
+        if ($e && $e instanceof CurlException) {
+            return isset($this->errorCodes[$e->getErrorNo()]) ? true : null;
+        }
+    }
+}
diff --git a/core/vendor/guzzle/plugin-backoff/Guzzle/Plugin/Backoff/ExponentialBackoffStrategy.php b/core/vendor/guzzle/plugin-backoff/Guzzle/Plugin/Backoff/ExponentialBackoffStrategy.php
new file mode 100644
index 0000000..47962ce
--- /dev/null
+++ b/core/vendor/guzzle/plugin-backoff/Guzzle/Plugin/Backoff/ExponentialBackoffStrategy.php
@@ -0,0 +1,31 @@
+<?php
+
+namespace Guzzle\Plugin\Backoff;
+
+use Guzzle\Http\Message\RequestInterface;
+use Guzzle\Http\Message\Response;
+use Guzzle\Http\Exception\HttpException;
+
+/**
+ * Implements an exponential backoff retry strategy.
+ *
+ * Warning: If no decision making strategies precede this strategy in the the chain, then all requests will be retried
+ */
+class ExponentialBackoffStrategy extends AbstractBackoffStrategy
+{
+    /**
+     * {@inheritdoc}
+     */
+    public function makesDecision()
+    {
+        return false;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    protected function getDelay($retries, RequestInterface $request, Response $response = null, HttpException $e = null)
+    {
+        return (int) pow(2, $retries);
+    }
+}
diff --git a/core/vendor/guzzle/plugin-backoff/Guzzle/Plugin/Backoff/HttpBackoffStrategy.php b/core/vendor/guzzle/plugin-backoff/Guzzle/Plugin/Backoff/HttpBackoffStrategy.php
new file mode 100644
index 0000000..c5eed3f
--- /dev/null
+++ b/core/vendor/guzzle/plugin-backoff/Guzzle/Plugin/Backoff/HttpBackoffStrategy.php
@@ -0,0 +1,35 @@
+<?php
+
+namespace Guzzle\Plugin\Backoff;
+
+use Guzzle\Http\Message\RequestInterface;
+use Guzzle\Http\Message\Response;
+use Guzzle\Http\Exception\HttpException;
+
+/**
+ * Strategy used to retry HTTP requests based on the response code.
+ *
+ * Retries 500 and 503 error by default.
+ */
+class HttpBackoffStrategy extends AbstractErrorCodeBackoffStrategy
+{
+    /**
+     * @var array Default cURL errors to retry
+     */
+    protected static $defaultErrorCodes = array(500, 503);
+
+    /**
+     * {@inheritdoc}
+     */
+    protected function getDelay($retries, RequestInterface $request, Response $response = null, HttpException $e = null)
+    {
+        if ($response) {
+            //Short circuit the rest of the checks if it was successful
+            if ($response->isSuccessful()) {
+                return false;
+            } else {
+                return isset($this->errorCodes[$response->getStatusCode()]) ? true : null;
+            }
+        }
+    }
+}
diff --git a/core/vendor/guzzle/plugin-backoff/Guzzle/Plugin/Backoff/LinearBackoffStrategy.php b/core/vendor/guzzle/plugin-backoff/Guzzle/Plugin/Backoff/LinearBackoffStrategy.php
new file mode 100644
index 0000000..e082461
--- /dev/null
+++ b/core/vendor/guzzle/plugin-backoff/Guzzle/Plugin/Backoff/LinearBackoffStrategy.php
@@ -0,0 +1,44 @@
+<?php
+
+namespace Guzzle\Plugin\Backoff;
+
+use Guzzle\Http\Message\RequestInterface;
+use Guzzle\Http\Message\Response;
+use Guzzle\Http\Exception\HttpException;
+
+/**
+ * Implements a linear backoff retry strategy.
+ *
+ * Warning: If no decision making strategies precede this strategy in the the chain, then all requests will be retried
+ */
+class LinearBackoffStrategy extends AbstractBackoffStrategy
+{
+    /**
+     * @var int Amount of time to progress each delay
+     */
+    protected $step;
+
+    /**
+     * @param int $step Amount of time to increase the delay each additional backoff
+     */
+    public function __construct($step = 1)
+    {
+        $this->step = $step;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function makesDecision()
+    {
+        return false;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    protected function getDelay($retries, RequestInterface $request, Response $response = null, HttpException $e = null)
+    {
+        return $retries * $this->step;
+    }
+}
diff --git a/core/vendor/guzzle/plugin-backoff/Guzzle/Plugin/Backoff/ReasonPhraseBackoffStrategy.php b/core/vendor/guzzle/plugin-backoff/Guzzle/Plugin/Backoff/ReasonPhraseBackoffStrategy.php
new file mode 100644
index 0000000..942c5c5
--- /dev/null
+++ b/core/vendor/guzzle/plugin-backoff/Guzzle/Plugin/Backoff/ReasonPhraseBackoffStrategy.php
@@ -0,0 +1,31 @@
+<?php
+
+namespace Guzzle\Plugin\Backoff;
+
+use Guzzle\Http\Message\RequestInterface;
+use Guzzle\Http\Message\Response;
+use Guzzle\Http\Exception\HttpException;
+
+/**
+ * Strategy used to retry HTTP requests when the response's reason phrase matches one of the registered phrases.
+ */
+class ReasonPhraseBackoffStrategy extends AbstractErrorCodeBackoffStrategy
+{
+    /**
+     * {@inheritdoc}
+     */
+    public function makesDecision()
+    {
+        return true;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    protected function getDelay($retries, RequestInterface $request, Response $response = null, HttpException $e = null)
+    {
+        if ($response) {
+            return isset($this->errorCodes[$response->getReasonPhrase()]) ? true : null;
+        }
+    }
+}
diff --git a/core/vendor/guzzle/plugin-backoff/Guzzle/Plugin/Backoff/TruncatedBackoffStrategy.php b/core/vendor/guzzle/plugin-backoff/Guzzle/Plugin/Backoff/TruncatedBackoffStrategy.php
new file mode 100644
index 0000000..766fe2d
--- /dev/null
+++ b/core/vendor/guzzle/plugin-backoff/Guzzle/Plugin/Backoff/TruncatedBackoffStrategy.php
@@ -0,0 +1,44 @@
+<?php
+
+namespace Guzzle\Plugin\Backoff;
+
+use Guzzle\Http\Message\RequestInterface;
+use Guzzle\Http\Message\Response;
+use Guzzle\Http\Exception\HttpException;
+
+/**
+ * Strategy that will not retry more than a certain number of times.
+ */
+class TruncatedBackoffStrategy extends AbstractBackoffStrategy
+{
+    /**
+     * @var int Maximum number of retries per request
+     */
+    protected $max;
+
+    /**
+     * @param int                      $maxRetries Maximum number of retries per request
+     * @param BackoffStrategyInterface $next The optional next strategy
+     */
+    public function __construct($maxRetries, BackoffStrategyInterface $next = null)
+    {
+        $this->max = $maxRetries;
+        $this->next = $next;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function makesDecision()
+    {
+        return true;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    protected function getDelay($retries, RequestInterface $request, Response $response = null, HttpException $e = null)
+    {
+        return $retries < $this->max ? null : false;
+    }
+}
diff --git a/core/vendor/guzzle/plugin-backoff/Guzzle/Plugin/Backoff/composer.json b/core/vendor/guzzle/plugin-backoff/Guzzle/Plugin/Backoff/composer.json
new file mode 100644
index 0000000..abbf917
--- /dev/null
+++ b/core/vendor/guzzle/plugin-backoff/Guzzle/Plugin/Backoff/composer.json
@@ -0,0 +1,28 @@
+{
+    "name": "guzzle/plugin-backoff",
+    "description": "Guzzle backoff retry plugins",
+    "homepage": "http://guzzlephp.org/",
+    "keywords": ["plugin", "guzzle"],
+    "license": "MIT",
+    "authors": [
+        {
+            "name": "Michael Dowling",
+            "email": "mtdowling@gmail.com",
+            "homepage": "https://github.com/mtdowling"
+        }
+    ],
+    "require": {
+        "php": ">=5.3.2",
+        "guzzle/http": "self.version",
+        "guzzle/log": "self.version"
+    },
+    "autoload": {
+        "psr-0": { "Guzzle\\Plugin\\Backoff": "" }
+    },
+    "target-dir": "Guzzle/Plugin/Backoff",
+    "extra": {
+        "branch-alias": {
+            "dev-master": "3.0-dev"
+        }
+    }
+}
diff --git a/core/vendor/guzzle/stream/Guzzle/Stream/composer.json b/core/vendor/guzzle/stream/Guzzle/Stream/composer.json
index 6c2cc38..99edfe8 100644
--- a/core/vendor/guzzle/stream/Guzzle/Stream/composer.json
+++ b/core/vendor/guzzle/stream/Guzzle/Stream/composer.json
@@ -18,5 +18,10 @@
     "autoload": {
         "psr-0": { "Guzzle\\Stream": "" }
     },
-    "target-dir": "Guzzle/Stream"
+    "target-dir": "Guzzle/Stream",
+    "extra": {
+        "branch-alias": {
+            "dev-master": "3.0-dev"
+        }
+    }
 }
