diff --git a/additional_packages/README.md b/additional_packages/README.md
deleted file mode 100644
index 827c548..0000000
--- a/additional_packages/README.md
+++ /dev/null
@@ -1,4 +0,0 @@
-# Additional packages for Google Auth Library Python
-
-This folder contains seperately distributed auxilliary packages for use
-with google-auth.
diff --git a/additional_packages/google_auth_httplib2/.coveragerc b/additional_packages/google_auth_httplib2/.coveragerc
deleted file mode 100644
index c44dd8e..0000000
--- a/additional_packages/google_auth_httplib2/.coveragerc
+++ /dev/null
@@ -1,13 +0,0 @@
-[run]
-branch = True
-
-[report]
-omit =
-    */conftest.py
-exclude_lines =
-    # Re-enable the standard pragma
-    pragma: NO COVER
-    # Ignore debug-only repr
-    def __repr__
-    # Don't complain if tests don't hit defensive assertion code:
-    raise NotImplementedError
diff --git a/additional_packages/google_auth_httplib2/LICENSE b/additional_packages/google_auth_httplib2/LICENSE
deleted file mode 100644
index 261eeb9..0000000
--- a/additional_packages/google_auth_httplib2/LICENSE
+++ /dev/null
@@ -1,201 +0,0 @@
-                                 Apache License
-                           Version 2.0, January 2004
-                        http://www.apache.org/licenses/
-
-   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
-
-   1. Definitions.
-
-      "License" shall mean the terms and conditions for use, reproduction,
-      and distribution as defined by Sections 1 through 9 of this document.
-
-      "Licensor" shall mean the copyright owner or entity authorized by
-      the copyright owner that is granting the License.
-
-      "Legal Entity" shall mean the union of the acting entity and all
-      other entities that control, are controlled by, or are under common
-      control with that entity. For the purposes of this definition,
-      "control" means (i) the power, direct or indirect, to cause the
-      direction or management of such entity, whether by contract or
-      otherwise, or (ii) ownership of fifty percent (50%) or more of the
-      outstanding shares, or (iii) beneficial ownership of such entity.
-
-      "You" (or "Your") shall mean an individual or Legal Entity
-      exercising permissions granted by this License.
-
-      "Source" form shall mean the preferred form for making modifications,
-      including but not limited to software source code, documentation
-      source, and configuration files.
-
-      "Object" form shall mean any form resulting from mechanical
-      transformation or translation of a Source form, including but
-      not limited to compiled object code, generated documentation,
-      and conversions to other media types.
-
-      "Work" shall mean the work of authorship, whether in Source or
-      Object form, made available under the License, as indicated by a
-      copyright notice that is included in or attached to the work
-      (an example is provided in the Appendix below).
-
-      "Derivative Works" shall mean any work, whether in Source or Object
-      form, that is based on (or derived from) the Work and for which the
-      editorial revisions, annotations, elaborations, or other modifications
-      represent, as a whole, an original work of authorship. For the purposes
-      of this License, Derivative Works shall not include works that remain
-      separable from, or merely link (or bind by name) to the interfaces of,
-      the Work and Derivative Works thereof.
-
-      "Contribution" shall mean any work of authorship, including
-      the original version of the Work and any modifications or additions
-      to that Work or Derivative Works thereof, that is intentionally
-      submitted to Licensor for inclusion in the Work by the copyright owner
-      or by an individual or Legal Entity authorized to submit on behalf of
-      the copyright owner. For the purposes of this definition, "submitted"
-      means any form of electronic, verbal, or written communication sent
-      to the Licensor or its representatives, including but not limited to
-      communication on electronic mailing lists, source code control systems,
-      and issue tracking systems that are managed by, or on behalf of, the
-      Licensor for the purpose of discussing and improving the Work, but
-      excluding communication that is conspicuously marked or otherwise
-      designated in writing by the copyright owner as "Not a Contribution."
-
-      "Contributor" shall mean Licensor and any individual or Legal Entity
-      on behalf of whom a Contribution has been received by Licensor and
-      subsequently incorporated within the Work.
-
-   2. Grant of Copyright License. Subject to the terms and conditions of
-      this License, each Contributor hereby grants to You a perpetual,
-      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
-      copyright license to reproduce, prepare Derivative Works of,
-      publicly display, publicly perform, sublicense, and distribute the
-      Work and such Derivative Works in Source or Object form.
-
-   3. Grant of Patent License. Subject to the terms and conditions of
-      this License, each Contributor hereby grants to You a perpetual,
-      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
-      (except as stated in this section) patent license to make, have made,
-      use, offer to sell, sell, import, and otherwise transfer the Work,
-      where such license applies only to those patent claims licensable
-      by such Contributor that are necessarily infringed by their
-      Contribution(s) alone or by combination of their Contribution(s)
-      with the Work to which such Contribution(s) was submitted. If You
-      institute patent litigation against any entity (including a
-      cross-claim or counterclaim in a lawsuit) alleging that the Work
-      or a Contribution incorporated within the Work constitutes direct
-      or contributory patent infringement, then any patent licenses
-      granted to You under this License for that Work shall terminate
-      as of the date such litigation is filed.
-
-   4. Redistribution. You may reproduce and distribute copies of the
-      Work or Derivative Works thereof in any medium, with or without
-      modifications, and in Source or Object form, provided that You
-      meet the following conditions:
-
-      (a) You must give any other recipients of the Work or
-          Derivative Works a copy of this License; and
-
-      (b) You must cause any modified files to carry prominent notices
-          stating that You changed the files; and
-
-      (c) You must retain, in the Source form of any Derivative Works
-          that You distribute, all copyright, patent, trademark, and
-          attribution notices from the Source form of the Work,
-          excluding those notices that do not pertain to any part of
-          the Derivative Works; and
-
-      (d) If the Work includes a "NOTICE" text file as part of its
-          distribution, then any Derivative Works that You distribute must
-          include a readable copy of the attribution notices contained
-          within such NOTICE file, excluding those notices that do not
-          pertain to any part of the Derivative Works, in at least one
-          of the following places: within a NOTICE text file distributed
-          as part of the Derivative Works; within the Source form or
-          documentation, if provided along with the Derivative Works; or,
-          within a display generated by the Derivative Works, if and
-          wherever such third-party notices normally appear. The contents
-          of the NOTICE file are for informational purposes only and
-          do not modify the License. You may add Your own attribution
-          notices within Derivative Works that You distribute, alongside
-          or as an addendum to the NOTICE text from the Work, provided
-          that such additional attribution notices cannot be construed
-          as modifying the License.
-
-      You may add Your own copyright statement to Your modifications and
-      may provide additional or different license terms and conditions
-      for use, reproduction, or distribution of Your modifications, or
-      for any such Derivative Works as a whole, provided Your use,
-      reproduction, and distribution of the Work otherwise complies with
-      the conditions stated in this License.
-
-   5. Submission of Contributions. Unless You explicitly state otherwise,
-      any Contribution intentionally submitted for inclusion in the Work
-      by You to the Licensor shall be under the terms and conditions of
-      this License, without any additional terms or conditions.
-      Notwithstanding the above, nothing herein shall supersede or modify
-      the terms of any separate license agreement you may have executed
-      with Licensor regarding such Contributions.
-
-   6. Trademarks. This License does not grant permission to use the trade
-      names, trademarks, service marks, or product names of the Licensor,
-      except as required for reasonable and customary use in describing the
-      origin of the Work and reproducing the content of the NOTICE file.
-
-   7. Disclaimer of Warranty. Unless required by applicable law or
-      agreed to in writing, Licensor provides the Work (and each
-      Contributor provides its Contributions) on an "AS IS" BASIS,
-      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
-      implied, including, without limitation, any warranties or conditions
-      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
-      PARTICULAR PURPOSE. You are solely responsible for determining the
-      appropriateness of using or redistributing the Work and assume any
-      risks associated with Your exercise of permissions under this License.
-
-   8. Limitation of Liability. In no event and under no legal theory,
-      whether in tort (including negligence), contract, or otherwise,
-      unless required by applicable law (such as deliberate and grossly
-      negligent acts) or agreed to in writing, shall any Contributor be
-      liable to You for damages, including any direct, indirect, special,
-      incidental, or consequential damages of any character arising as a
-      result of this License or out of the use or inability to use the
-      Work (including but not limited to damages for loss of goodwill,
-      work stoppage, computer failure or malfunction, or any and all
-      other commercial damages or losses), even if such Contributor
-      has been advised of the possibility of such damages.
-
-   9. Accepting Warranty or Additional Liability. While redistributing
-      the Work or Derivative Works thereof, You may choose to offer,
-      and charge a fee for, acceptance of support, warranty, indemnity,
-      or other liability obligations and/or rights consistent with this
-      License. However, in accepting such obligations, You may act only
-      on Your own behalf and on Your sole responsibility, not on behalf
-      of any other Contributor, and only if You agree to indemnify,
-      defend, and hold each Contributor harmless for any liability
-      incurred by, or claims asserted against, such Contributor by reason
-      of your accepting any such warranty or additional liability.
-
-   END OF TERMS AND CONDITIONS
-
-   APPENDIX: How to apply the Apache License to your work.
-
-      To apply the Apache License to your work, attach the following
-      boilerplate notice, with the fields enclosed by brackets "[]"
-      replaced with your own identifying information. (Don't include
-      the brackets!)  The text should be enclosed in the appropriate
-      comment syntax for the file format. We also recommend that a
-      file or class name and description of purpose be included on the
-      same "printed page" as the copyright notice for easier
-      identification within third-party archives.
-
-   Copyright [yyyy] [name of copyright owner]
-
-   Licensed under the Apache License, Version 2.0 (the "License");
-   you may not use this file except in compliance with the License.
-   You may obtain a copy of the License at
-
-       http://www.apache.org/licenses/LICENSE-2.0
-
-   Unless required by applicable law or agreed to in writing, software
-   distributed under the License is distributed on an "AS IS" BASIS,
-   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-   See the License for the specific language governing permissions and
-   limitations under the License.
diff --git a/additional_packages/google_auth_httplib2/MANIFEST.in b/additional_packages/google_auth_httplib2/MANIFEST.in
deleted file mode 100644
index aac7fe1..0000000
--- a/additional_packages/google_auth_httplib2/MANIFEST.in
+++ /dev/null
@@ -1,2 +0,0 @@
-include README.rst LICENSE
-recursive-include tests *
diff --git a/additional_packages/google_auth_httplib2/README.rst b/additional_packages/google_auth_httplib2/README.rst
deleted file mode 100644
index 15477d0..0000000
--- a/additional_packages/google_auth_httplib2/README.rst
+++ /dev/null
@@ -1,33 +0,0 @@
-Httplib2 Transport for Google Auth
-==================================
-
-|pypi|
-
-This library provides an `httplib2`_ transport for `google-auth`_.
-
-.. note:: ``httplib`` has lots of problems such as lack of threadsafety and
-    and insecure usage of TLS. Using it is highly discouraged. This
-    library is intended to help existing users of ``oauth2client`` migrate to
-    ``google-auth``.
-
-.. |pypi| image:: https://img.shields.io/pypi/v/google-auth-httplib2.svg
-   :target: https://pypi.python.org/pypi/google-auth-httplib2
-
-.. _httplib2: https://github.com/httplib2/httplib2
-.. _google-auth: https://github.com/GoogleCloudPlatform/google-auth
-
-Installing
-----------
-
-You can install using `pip`_::
-
-    $ pip install google-auth-httplib2
-
-.. _pip: https://pip.pypa.io/en/stable/
-
-License
--------
-
-Apache 2.0 - See `the LICENSE`_ for more information.
-
-.. _the LICENSE: https://github.com/GoogleCloudPlatform/google-auth-library-python/blob/master/LICENSE
diff --git a/additional_packages/google_auth_httplib2/google_auth_httplib2.py b/additional_packages/google_auth_httplib2/google_auth_httplib2.py
deleted file mode 100644
index 866841b..0000000
--- a/additional_packages/google_auth_httplib2/google_auth_httplib2.py
+++ /dev/null
@@ -1,235 +0,0 @@
-# Copyright 2016 Google Inc.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#      http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-"""Transport adapter for httplib2."""
-
-from __future__ import absolute_import
-
-import logging
-
-from google.auth import exceptions
-from google.auth import transport
-import httplib2
-
-
-_LOGGER = logging.getLogger(__name__)
-# Properties present in file-like streams / buffers.
-_STREAM_PROPERTIES = ('read', 'seek', 'tell')
-
-
-class _Response(transport.Response):
-    """httplib2 transport response adapter.
-
-    Args:
-        response (httplib2.Response): The raw httplib2 response.
-        data (bytes): The response body.
-    """
-    def __init__(self, response, data):
-        self._response = response
-        self._data = data
-
-    @property
-    def status(self):
-        """int: The HTTP status code."""
-        return self._response.status
-
-    @property
-    def headers(self):
-        """Mapping[str, str]: The HTTP response headers."""
-        return dict(self._response)
-
-    @property
-    def data(self):
-        """bytes: The response body."""
-        return self._data
-
-
-class Request(transport.Request):
-    """httplib2 request adapter.
-
-    This class is used internally for making requests using various transports
-    in a consistent way. If you use :class:`AuthorizedHttp` you do not need
-    to construct or use this class directly.
-
-    This class can be useful if you want to manually refresh a
-    :class:`~google.auth.credentials.Credentials` instance::
-
-        import google.auth.transport.httplib2
-        import httplib2
-
-        http = httplib2.Http()
-        request = google.auth.transport.httplib2.Request(http)
-
-        credentials.refresh(request)
-
-    Args:
-        http (httplib2.Http): The underlying http object to use to make
-            requests.
-
-    .. automethod:: __call__
-    """
-    def __init__(self, http):
-        self.http = http
-
-    def __call__(self, url, method='GET', body=None, headers=None,
-                 timeout=None, **kwargs):
-        """Make an HTTP request using httplib2.
-
-        Args:
-            url (str): The URI to be requested.
-            method (str): The HTTP method to use for the request. Defaults
-                to 'GET'.
-            body (bytes): The payload / body in HTTP request.
-            headers (Mapping[str, str]): Request headers.
-            timeout (Optional[int]): The number of seconds to wait for a
-                response from the server. This is ignored by httplib2 and will
-                issue a warning.
-            kwargs: Additional arguments passed throught to the underlying
-                :meth:`httplib2.Http.request` method.
-
-        Returns:
-            google.auth.transport.Response: The HTTP response.
-
-        Raises:
-            google.auth.exceptions.TransportError: If any exception occurred.
-        """
-        if timeout is not None:
-            _LOGGER.warning(
-                'httplib2 transport does not support per-request timeout. '
-                'Set the timeout when constructing the httplib2.Http instance.'
-            )
-
-        try:
-            _LOGGER.debug('Making request: %s %s', method, url)
-            response, data = self.http.request(
-                url, method=method, body=body, headers=headers, **kwargs)
-            return _Response(response, data)
-        except httplib2.HttpLib2Error as exc:
-            raise exceptions.TransportError(exc)
-
-
-def _make_default_http():
-    """Returns a default httplib2.Http instance."""
-    return httplib2.Http()
-
-
-class AuthorizedHttp(object):
-    """A httplib2 HTTP class with credentials.
-
-    This class is used to perform requests to API endpoints that require
-    authorization::
-
-        from google.auth.transport._httplib2 import AuthorizedHttp
-
-        authed_http = AuthorizedHttp(credentials)
-
-        response = authed_http.request(
-            'https://www.googleapis.com/storage/v1/b')
-
-    This class implements :meth:`request` in the same way as
-    :class:`httplib2.Http` and can usually be used just like any other
-    instance of :class:``httplib2.Http`.
-
-    The underlying :meth:`request` implementation handles adding the
-    credentials' headers to the request and refreshing credentials as needed.
-    """
-    def __init__(self, credentials, http=None,
-                 refresh_status_codes=transport.DEFAULT_REFRESH_STATUS_CODES,
-                 max_refresh_attempts=transport.DEFAULT_MAX_REFRESH_ATTEMPTS):
-        """
-        Args:
-            credentials (google.auth.credentials.Credentials): The credentials
-                to add to the request.
-            http (httplib2.Http): The underlying HTTP object to
-                use to make requests. If not specified, a
-                :class:`httplib2.Http` instance will be constructed.
-            refresh_status_codes (Sequence[int]): Which HTTP status codes
-                indicate that credentials should be refreshed and the request
-                should be retried.
-            max_refresh_attempts (int): The maximum number of times to attempt
-                to refresh the credentials and retry the request.
-        """
-
-        if http is None:
-            http = _make_default_http()
-
-        self.http = http
-        self.credentials = credentials
-        self._refresh_status_codes = refresh_status_codes
-        self._max_refresh_attempts = max_refresh_attempts
-        # Request instance used by internal methods (for example,
-        # credentials.refresh).
-        self._request = Request(self.http)
-
-    def request(self, uri, method='GET', body=None, headers=None,
-                **kwargs):
-        """Implementation of httplib2's Http.request."""
-
-        _credential_refresh_attempt = kwargs.pop(
-            '_credential_refresh_attempt', 0)
-
-        # Make a copy of the headers. They will be modified by the credentials
-        # and we want to pass the original headers if we recurse.
-        request_headers = headers.copy() if headers is not None else {}
-
-        self.credentials.before_request(
-            self._request, method, uri, request_headers)
-
-        # Check if the body is a file-like stream, and if so, save the body
-        # stream position so that it can be restored in case of refresh.
-        body_stream_position = None
-        if all(getattr(body, stream_prop, None) for stream_prop in
-               _STREAM_PROPERTIES):
-            body_stream_position = body.tell()
-
-        # Make the request.
-        response, content = self.http.request(
-            uri, method, body=body, headers=request_headers, **kwargs)
-
-        # If the response indicated that the credentials needed to be
-        # refreshed, then refresh the credentials and re-attempt the
-        # request.
-        # A stored token may expire between the time it is retrieved and
-        # the time the request is made, so we may need to try twice.
-        if (response.status in self._refresh_status_codes
-                and _credential_refresh_attempt < self._max_refresh_attempts):
-
-            _LOGGER.info(
-                'Refreshing credentials due to a %s response. Attempt %s/%s.',
-                response.status, _credential_refresh_attempt + 1,
-                self._max_refresh_attempts)
-
-            self.credentials.refresh(self._request)
-
-            # Restore the body's stream position if needed.
-            if body_stream_position is not None:
-                body.seek(body_stream_position)
-
-            # Recurse. Pass in the original headers, not our modified set.
-            return self.request(
-                uri, method, body=body, headers=headers,
-                _credential_refresh_attempt=_credential_refresh_attempt + 1,
-                **kwargs)
-
-        return response, content
-
-    @property
-    def connections(self):
-        """Proxy to httplib2.Http.connections."""
-        return self.http.connections
-
-    @connections.setter
-    def connections(self, value):
-        """Proxy to httplib2.Http.connections."""
-        self.http.connections = value
diff --git a/additional_packages/google_auth_httplib2/setup.cfg b/additional_packages/google_auth_httplib2/setup.cfg
deleted file mode 100644
index 2a9acf1..0000000
--- a/additional_packages/google_auth_httplib2/setup.cfg
+++ /dev/null
@@ -1,2 +0,0 @@
-[bdist_wheel]
-universal = 1
diff --git a/additional_packages/google_auth_httplib2/setup.py b/additional_packages/google_auth_httplib2/setup.py
deleted file mode 100644
index ec04881..0000000
--- a/additional_packages/google_auth_httplib2/setup.py
+++ /dev/null
@@ -1,57 +0,0 @@
-# Copyright 2014 Google Inc.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#      http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-import io
-
-from setuptools import setup
-
-
-DEPENDENCIES = (
-    'google-auth'
-)
-
-
-with io.open('README.rst', 'r') as fh:
-    long_description = fh.read()
-
-
-setup(
-    name='google-auth-httplib2',
-    version='0.0.2',
-    author='Google Cloud Platform',
-    author_email='jonwayne+google-auth@google.com',
-    description='Google Authentication Library',
-    long_description=long_description,
-    url='https://github.com/GoogleCloudPlatform/google-auth-library-python',
-    py_modules=['google_auth_httplib2'],
-    install_requires=DEPENDENCIES,
-    license='Apache 2.0',
-    keywords='google auth oauth client',
-    classifiers=(
-        'Programming Language :: Python :: 2',
-        'Programming Language :: Python :: 2.7',
-        'Programming Language :: Python :: 3',
-        'Programming Language :: Python :: 3.4',
-        'Programming Language :: Python :: 3.5',
-        'Programming Language :: Python :: 3.6',
-        'Development Status :: 3 - Alpha',
-        'Intended Audience :: Developers',
-        'License :: OSI Approved :: Apache Software License',
-        'Operating System :: POSIX',
-        'Operating System :: Microsoft :: Windows',
-        'Operating System :: MacOS :: MacOS X',
-        'Operating System :: OS Independent',
-        'Topic :: Internet :: WWW/HTTP',
-    ),
-)
diff --git a/additional_packages/google_auth_httplib2/tests/__init__.py b/additional_packages/google_auth_httplib2/tests/__init__.py
deleted file mode 100644
index e69de29..0000000
--- a/additional_packages/google_auth_httplib2/tests/__init__.py
+++ /dev/null
diff --git a/additional_packages/google_auth_httplib2/tests/compliance.py b/additional_packages/google_auth_httplib2/tests/compliance.py
deleted file mode 100644
index a97a11b..0000000
--- a/additional_packages/google_auth_httplib2/tests/compliance.py
+++ /dev/null
@@ -1,92 +0,0 @@
-# Copyright 2016 Google Inc.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#      http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-import flask
-from google.auth import exceptions
-import pytest
-from pytest_localserver.http import WSGIServer
-from six.moves import http_client
-
-# .invalid will never resolve, see https://tools.ietf.org/html/rfc2606
-NXDOMAIN = 'test.invalid'
-
-
-class RequestResponseTests(object):
-
-    @pytest.fixture(scope='module')
-    def server(self):
-        """Provides a test HTTP server.
-
-        The test server is automatically created before
-        a test and destroyed at the end. The server is serving a test
-        application that can be used to verify requests.
-        """
-        app = flask.Flask(__name__)
-        app.debug = True
-
-        # pylint: disable=unused-variable
-        # (pylint thinks the flask routes are unusued.)
-        @app.route('/basic')
-        def index():
-            header_value = flask.request.headers.get('x-test-header', 'value')
-            headers = {'X-Test-Header': header_value}
-            return 'Basic Content', http_client.OK, headers
-
-        @app.route('/server_error')
-        def server_error():
-            return 'Error', http_client.INTERNAL_SERVER_ERROR
-        # pylint: enable=unused-variable
-
-        server = WSGIServer(application=app.wsgi_app)
-        server.start()
-        yield server
-        server.stop()
-
-    def test_request_basic(self, server):
-        request = self.make_request()
-        response = request(url=server.url + '/basic', method='GET')
-
-        assert response.status == http_client.OK
-        assert response.headers['x-test-header'] == 'value'
-        assert response.data == b'Basic Content'
-
-    def test_request_timeout(self, server):
-        request = self.make_request()
-        response = request(url=server.url + '/basic', method='GET', timeout=2)
-
-        assert response.status == http_client.OK
-        assert response.headers['x-test-header'] == 'value'
-        assert response.data == b'Basic Content'
-
-    def test_request_headers(self, server):
-        request = self.make_request()
-        response = request(
-            url=server.url + '/basic', method='GET', headers={
-                'x-test-header': 'hello world'})
-
-        assert response.status == http_client.OK
-        assert response.headers['x-test-header'] == 'hello world'
-        assert response.data == b'Basic Content'
-
-    def test_request_error(self, server):
-        request = self.make_request()
-        response = request(url=server.url + '/server_error', method='GET')
-
-        assert response.status == http_client.INTERNAL_SERVER_ERROR
-        assert response.data == b'Error'
-
-    def test_connection_error(self):
-        request = self.make_request()
-        with pytest.raises(exceptions.TransportError):
-            request(url='http://{}'.format(NXDOMAIN), method='GET')
diff --git a/additional_packages/google_auth_httplib2/tests/test_google_auth_httplib2.py b/additional_packages/google_auth_httplib2/tests/test_google_auth_httplib2.py
deleted file mode 100644
index 635965f..0000000
--- a/additional_packages/google_auth_httplib2/tests/test_google_auth_httplib2.py
+++ /dev/null
@@ -1,157 +0,0 @@
-# Copyright 2016 Google Inc.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#      http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-import httplib2
-import mock
-import six
-from six.moves import http_client
-
-import google_auth_httplib2
-from tests import compliance
-
-
-class MockHttp(object):
-    def __init__(self, responses, headers=None):
-        self.responses = responses
-        self.requests = []
-        self.headers = headers or {}
-
-    def request(self, url, method='GET', body=None, headers=None, **kwargs):
-        self.requests.append((method, url, body, headers, kwargs))
-        return self.responses.pop(0)
-
-
-class MockResponse(object):
-    def __init__(self, status=http_client.OK, data=b''):
-        self.status = status
-        self.data = data
-
-    def __iter__(self):
-        yield self
-        yield self.data
-
-
-class TestRequestResponse(compliance.RequestResponseTests):
-    def make_request(self):
-        http = httplib2.Http()
-        return google_auth_httplib2.Request(http)
-
-    def test_timeout(self):
-        url = 'http://example.com'
-        http = MockHttp(responses=[MockResponse()])
-        request = google_auth_httplib2.Request(http)
-        request(url=url, method='GET', timeout=5)
-
-        assert http.requests[0] == (
-            'GET', url, None, None, {})
-
-
-def test__make_default_http():
-    http = google_auth_httplib2._make_default_http()
-    assert isinstance(http, httplib2.Http)
-
-
-class MockCredentials(object):
-    def __init__(self, token='token'):
-        self.token = token
-
-    def apply(self, headers):
-        headers['authorization'] = self.token
-
-    def before_request(self, request, method, url, headers):
-        self.apply(headers)
-
-    def refresh(self, request):
-        self.token += '1'
-
-
-class TestAuthorizedHttp(object):
-    TEST_URL = 'http://example.com'
-
-    def test_authed_http_defaults(self):
-        authed_http = google_auth_httplib2.AuthorizedHttp(
-            mock.sentinel.credentials)
-
-        assert authed_http.credentials == mock.sentinel.credentials
-        assert isinstance(authed_http.http, httplib2.Http)
-
-    def test_connections(self):
-        authed_http = google_auth_httplib2.AuthorizedHttp(
-            mock.sentinel.credentials)
-
-        assert authed_http.connections == authed_http.http.connections
-
-        authed_http.connections = mock.sentinel.connections
-        assert authed_http.http.connections == mock.sentinel.connections
-
-    def test_request_no_refresh(self):
-        mock_credentials = mock.Mock(wraps=MockCredentials())
-        mock_response = MockResponse()
-        mock_http = MockHttp([mock_response])
-
-        authed_http = google_auth_httplib2.AuthorizedHttp(
-            mock_credentials, http=mock_http)
-
-        response, data = authed_http.request(self.TEST_URL)
-
-        assert response == mock_response
-        assert data == mock_response.data
-        assert mock_credentials.before_request.called
-        assert not mock_credentials.refresh.called
-        assert mock_http.requests == [
-            ('GET', self.TEST_URL, None, {'authorization': 'token'}, {})]
-
-    def test_request_refresh(self):
-        mock_credentials = mock.Mock(wraps=MockCredentials())
-        mock_final_response = MockResponse(status=http_client.OK)
-        # First request will 401, second request will succeed.
-        mock_http = MockHttp([
-            MockResponse(status=http_client.UNAUTHORIZED),
-            mock_final_response])
-
-        authed_http = google_auth_httplib2.AuthorizedHttp(
-            mock_credentials, http=mock_http)
-
-        response, data = authed_http.request(self.TEST_URL)
-
-        assert response == mock_final_response
-        assert data == mock_final_response.data
-        assert mock_credentials.before_request.call_count == 2
-        assert mock_credentials.refresh.called
-        assert mock_http.requests == [
-            ('GET', self.TEST_URL, None, {'authorization': 'token'}, {}),
-            ('GET', self.TEST_URL, None, {'authorization': 'token1'}, {})]
-
-    def test_request_stream_body(self):
-        mock_credentials = mock.Mock(wraps=MockCredentials())
-        mock_response = MockResponse()
-        # Refresh is needed to cover the resetting of the body position.
-        mock_http = MockHttp([
-            MockResponse(status=http_client.UNAUTHORIZED),
-            mock_response])
-
-        body = six.StringIO('body')
-        body.seek(1)
-
-        authed_http = google_auth_httplib2.AuthorizedHttp(
-            mock_credentials, http=mock_http)
-
-        response, data = authed_http.request(
-            self.TEST_URL, method='POST', body=body)
-
-        assert response == mock_response
-        assert data == mock_response.data
-        assert mock_http.requests == [
-            ('POST', self.TEST_URL, body, {'authorization': 'token'}, {}),
-            ('POST', self.TEST_URL, body, {'authorization': 'token1'}, {})]
diff --git a/additional_packages/google_auth_httplib2/tox.ini b/additional_packages/google_auth_httplib2/tox.ini
deleted file mode 100644
index 95f3454..0000000
--- a/additional_packages/google_auth_httplib2/tox.ini
+++ /dev/null
@@ -1,38 +0,0 @@
-[tox]
-envlist = lint,py27,py34,py35,py36,pypy,cover
-
-[testenv]
-deps =
-  flask
-  mock
-  pytest
-  pytest-cov
-  pytest-localserver
-  httplib2
-commands =
-  py.test --cov=google_auth_httplib2 --cov=tests {posargs:tests}
-
-[testenv:cover]
-basepython = python3.6
-commands =
-  py.test --cov=google_auth_httplib2 --cov=tests --cov-report= tests
-  coverage report --show-missing --fail-under=100
-deps =
-  {[testenv]deps}
-
-[testenv:lint]
-basepython = python3.5
-commands =
-  python setup.py check --metadata --restructuredtext --strict
-  flake8 \
-    --import-order-style=google \
-    --application-import-names="google_auth_httplib2,tests" \
-    google_auth_httplib2.py tests
-  python {toxinidir}/../../scripts/run_pylint.py \
-    --library-filesets google_auth_httplib2.py \
-    --test-filesets tests
-deps =
-  flake8
-  flake8-import-order
-  pylint
-  docutils
diff --git a/additional_packages/google_auth_oauthlib/.coveragerc b/additional_packages/google_auth_oauthlib/.coveragerc
deleted file mode 100644
index c44dd8e..0000000
--- a/additional_packages/google_auth_oauthlib/.coveragerc
+++ /dev/null
@@ -1,13 +0,0 @@
-[run]
-branch = True
-
-[report]
-omit =
-    */conftest.py
-exclude_lines =
-    # Re-enable the standard pragma
-    pragma: NO COVER
-    # Ignore debug-only repr
-    def __repr__
-    # Don't complain if tests don't hit defensive assertion code:
-    raise NotImplementedError
diff --git a/additional_packages/google_auth_oauthlib/CHANGELOG.rst b/additional_packages/google_auth_oauthlib/CHANGELOG.rst
deleted file mode 100644
index dbb95df..0000000
--- a/additional_packages/google_auth_oauthlib/CHANGELOG.rst
+++ /dev/null
@@ -1,4 +0,0 @@
-v0.0.1
-------
-
-Initial release. This package contains the functionality previously located in `google.oauth2.oauthlib` and `google.oauth2.flows`.
diff --git a/additional_packages/google_auth_oauthlib/LICENSE b/additional_packages/google_auth_oauthlib/LICENSE
deleted file mode 100644
index 261eeb9..0000000
--- a/additional_packages/google_auth_oauthlib/LICENSE
+++ /dev/null
@@ -1,201 +0,0 @@
-                                 Apache License
-                           Version 2.0, January 2004
-                        http://www.apache.org/licenses/
-
-   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
-
-   1. Definitions.
-
-      "License" shall mean the terms and conditions for use, reproduction,
-      and distribution as defined by Sections 1 through 9 of this document.
-
-      "Licensor" shall mean the copyright owner or entity authorized by
-      the copyright owner that is granting the License.
-
-      "Legal Entity" shall mean the union of the acting entity and all
-      other entities that control, are controlled by, or are under common
-      control with that entity. For the purposes of this definition,
-      "control" means (i) the power, direct or indirect, to cause the
-      direction or management of such entity, whether by contract or
-      otherwise, or (ii) ownership of fifty percent (50%) or more of the
-      outstanding shares, or (iii) beneficial ownership of such entity.
-
-      "You" (or "Your") shall mean an individual or Legal Entity
-      exercising permissions granted by this License.
-
-      "Source" form shall mean the preferred form for making modifications,
-      including but not limited to software source code, documentation
-      source, and configuration files.
-
-      "Object" form shall mean any form resulting from mechanical
-      transformation or translation of a Source form, including but
-      not limited to compiled object code, generated documentation,
-      and conversions to other media types.
-
-      "Work" shall mean the work of authorship, whether in Source or
-      Object form, made available under the License, as indicated by a
-      copyright notice that is included in or attached to the work
-      (an example is provided in the Appendix below).
-
-      "Derivative Works" shall mean any work, whether in Source or Object
-      form, that is based on (or derived from) the Work and for which the
-      editorial revisions, annotations, elaborations, or other modifications
-      represent, as a whole, an original work of authorship. For the purposes
-      of this License, Derivative Works shall not include works that remain
-      separable from, or merely link (or bind by name) to the interfaces of,
-      the Work and Derivative Works thereof.
-
-      "Contribution" shall mean any work of authorship, including
-      the original version of the Work and any modifications or additions
-      to that Work or Derivative Works thereof, that is intentionally
-      submitted to Licensor for inclusion in the Work by the copyright owner
-      or by an individual or Legal Entity authorized to submit on behalf of
-      the copyright owner. For the purposes of this definition, "submitted"
-      means any form of electronic, verbal, or written communication sent
-      to the Licensor or its representatives, including but not limited to
-      communication on electronic mailing lists, source code control systems,
-      and issue tracking systems that are managed by, or on behalf of, the
-      Licensor for the purpose of discussing and improving the Work, but
-      excluding communication that is conspicuously marked or otherwise
-      designated in writing by the copyright owner as "Not a Contribution."
-
-      "Contributor" shall mean Licensor and any individual or Legal Entity
-      on behalf of whom a Contribution has been received by Licensor and
-      subsequently incorporated within the Work.
-
-   2. Grant of Copyright License. Subject to the terms and conditions of
-      this License, each Contributor hereby grants to You a perpetual,
-      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
-      copyright license to reproduce, prepare Derivative Works of,
-      publicly display, publicly perform, sublicense, and distribute the
-      Work and such Derivative Works in Source or Object form.
-
-   3. Grant of Patent License. Subject to the terms and conditions of
-      this License, each Contributor hereby grants to You a perpetual,
-      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
-      (except as stated in this section) patent license to make, have made,
-      use, offer to sell, sell, import, and otherwise transfer the Work,
-      where such license applies only to those patent claims licensable
-      by such Contributor that are necessarily infringed by their
-      Contribution(s) alone or by combination of their Contribution(s)
-      with the Work to which such Contribution(s) was submitted. If You
-      institute patent litigation against any entity (including a
-      cross-claim or counterclaim in a lawsuit) alleging that the Work
-      or a Contribution incorporated within the Work constitutes direct
-      or contributory patent infringement, then any patent licenses
-      granted to You under this License for that Work shall terminate
-      as of the date such litigation is filed.
-
-   4. Redistribution. You may reproduce and distribute copies of the
-      Work or Derivative Works thereof in any medium, with or without
-      modifications, and in Source or Object form, provided that You
-      meet the following conditions:
-
-      (a) You must give any other recipients of the Work or
-          Derivative Works a copy of this License; and
-
-      (b) You must cause any modified files to carry prominent notices
-          stating that You changed the files; and
-
-      (c) You must retain, in the Source form of any Derivative Works
-          that You distribute, all copyright, patent, trademark, and
-          attribution notices from the Source form of the Work,
-          excluding those notices that do not pertain to any part of
-          the Derivative Works; and
-
-      (d) If the Work includes a "NOTICE" text file as part of its
-          distribution, then any Derivative Works that You distribute must
-          include a readable copy of the attribution notices contained
-          within such NOTICE file, excluding those notices that do not
-          pertain to any part of the Derivative Works, in at least one
-          of the following places: within a NOTICE text file distributed
-          as part of the Derivative Works; within the Source form or
-          documentation, if provided along with the Derivative Works; or,
-          within a display generated by the Derivative Works, if and
-          wherever such third-party notices normally appear. The contents
-          of the NOTICE file are for informational purposes only and
-          do not modify the License. You may add Your own attribution
-          notices within Derivative Works that You distribute, alongside
-          or as an addendum to the NOTICE text from the Work, provided
-          that such additional attribution notices cannot be construed
-          as modifying the License.
-
-      You may add Your own copyright statement to Your modifications and
-      may provide additional or different license terms and conditions
-      for use, reproduction, or distribution of Your modifications, or
-      for any such Derivative Works as a whole, provided Your use,
-      reproduction, and distribution of the Work otherwise complies with
-      the conditions stated in this License.
-
-   5. Submission of Contributions. Unless You explicitly state otherwise,
-      any Contribution intentionally submitted for inclusion in the Work
-      by You to the Licensor shall be under the terms and conditions of
-      this License, without any additional terms or conditions.
-      Notwithstanding the above, nothing herein shall supersede or modify
-      the terms of any separate license agreement you may have executed
-      with Licensor regarding such Contributions.
-
-   6. Trademarks. This License does not grant permission to use the trade
-      names, trademarks, service marks, or product names of the Licensor,
-      except as required for reasonable and customary use in describing the
-      origin of the Work and reproducing the content of the NOTICE file.
-
-   7. Disclaimer of Warranty. Unless required by applicable law or
-      agreed to in writing, Licensor provides the Work (and each
-      Contributor provides its Contributions) on an "AS IS" BASIS,
-      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
-      implied, including, without limitation, any warranties or conditions
-      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
-      PARTICULAR PURPOSE. You are solely responsible for determining the
-      appropriateness of using or redistributing the Work and assume any
-      risks associated with Your exercise of permissions under this License.
-
-   8. Limitation of Liability. In no event and under no legal theory,
-      whether in tort (including negligence), contract, or otherwise,
-      unless required by applicable law (such as deliberate and grossly
-      negligent acts) or agreed to in writing, shall any Contributor be
-      liable to You for damages, including any direct, indirect, special,
-      incidental, or consequential damages of any character arising as a
-      result of this License or out of the use or inability to use the
-      Work (including but not limited to damages for loss of goodwill,
-      work stoppage, computer failure or malfunction, or any and all
-      other commercial damages or losses), even if such Contributor
-      has been advised of the possibility of such damages.
-
-   9. Accepting Warranty or Additional Liability. While redistributing
-      the Work or Derivative Works thereof, You may choose to offer,
-      and charge a fee for, acceptance of support, warranty, indemnity,
-      or other liability obligations and/or rights consistent with this
-      License. However, in accepting such obligations, You may act only
-      on Your own behalf and on Your sole responsibility, not on behalf
-      of any other Contributor, and only if You agree to indemnify,
-      defend, and hold each Contributor harmless for any liability
-      incurred by, or claims asserted against, such Contributor by reason
-      of your accepting any such warranty or additional liability.
-
-   END OF TERMS AND CONDITIONS
-
-   APPENDIX: How to apply the Apache License to your work.
-
-      To apply the Apache License to your work, attach the following
-      boilerplate notice, with the fields enclosed by brackets "[]"
-      replaced with your own identifying information. (Don't include
-      the brackets!)  The text should be enclosed in the appropriate
-      comment syntax for the file format. We also recommend that a
-      file or class name and description of purpose be included on the
-      same "printed page" as the copyright notice for easier
-      identification within third-party archives.
-
-   Copyright [yyyy] [name of copyright owner]
-
-   Licensed under the Apache License, Version 2.0 (the "License");
-   you may not use this file except in compliance with the License.
-   You may obtain a copy of the License at
-
-       http://www.apache.org/licenses/LICENSE-2.0
-
-   Unless required by applicable law or agreed to in writing, software
-   distributed under the License is distributed on an "AS IS" BASIS,
-   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-   See the License for the specific language governing permissions and
-   limitations under the License.
diff --git a/additional_packages/google_auth_oauthlib/MANIFEST.in b/additional_packages/google_auth_oauthlib/MANIFEST.in
deleted file mode 100644
index aac7fe1..0000000
--- a/additional_packages/google_auth_oauthlib/MANIFEST.in
+++ /dev/null
@@ -1,2 +0,0 @@
-include README.rst LICENSE
-recursive-include tests *
diff --git a/additional_packages/google_auth_oauthlib/README.rst b/additional_packages/google_auth_oauthlib/README.rst
deleted file mode 100644
index 44c478b..0000000
--- a/additional_packages/google_auth_oauthlib/README.rst
+++ /dev/null
@@ -1,28 +0,0 @@
-oauthlib integration for Google Auth
-====================================
-
-|pypi|
-
-This library provides `oauthlib`_ integration with `google-auth`_.
-
-.. |pypi| image:: https://img.shields.io/pypi/v/google-auth-oauthlib.svg
-   :target: https://pypi.python.org/pypi/google-auth-oauthlib
-
-.. _oauthlib: https://github.com/idan/oauthlib
-.. _google-auth: https://github.com/GoogleCloudPlatform/google-auth
-
-Installing
-----------
-
-You can install using `pip`_::
-
-    $ pip install google-auth-oauthlib
-
-.. _pip: https://pip.pypa.io/en/stable/
-
-License
--------
-
-Apache 2.0 - See `the LICENSE`_ for more information.
-
-.. _the LICENSE: https://github.com/GoogleCloudPlatform/google-auth-library-python/blob/master/LICENSE
diff --git a/additional_packages/google_auth_oauthlib/google_auth_oauthlib/__init__.py b/additional_packages/google_auth_oauthlib/google_auth_oauthlib/__init__.py
deleted file mode 100644
index e69de29..0000000
--- a/additional_packages/google_auth_oauthlib/google_auth_oauthlib/__init__.py
+++ /dev/null
diff --git a/additional_packages/google_auth_oauthlib/google_auth_oauthlib/flow.py b/additional_packages/google_auth_oauthlib/google_auth_oauthlib/flow.py
deleted file mode 100644
index 0df96c0..0000000
--- a/additional_packages/google_auth_oauthlib/google_auth_oauthlib/flow.py
+++ /dev/null
@@ -1,458 +0,0 @@
-# Copyright 2016 Google Inc.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#      http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-"""OAuth 2.0 Authorization Flow
-
-This module provides integration with `requests-oauthlib`_ for running the
-`OAuth 2.0 Authorization Flow`_ and acquiring user credentials.
-
-Here's an example of using :class:`Flow` with the installed application
-authorization flow::
-
-    from google_auth_oauthlib.flow import Flow
-
-    # Create the flow using the client secrets file from the Google API
-    # Console.
-    flow = Flow.from_client_secrets_file(
-        'path/to/client_secrets.json',
-        scopes=['profile', 'email'],
-        redirect_uri='urn:ietf:wg:oauth:2.0:oob')
-
-    # Tell the user to go to the authorization URL.
-    auth_url, _ = flow.authorization_url(prompt='consent')
-
-    print('Please go to this URL: {}'.format(auth_url))
-
-    # The user will get an authorization code. This code is used to get the
-    # access token.
-    code = input('Enter the authorization code: ')
-    flow.fetch_token(code=code)
-
-    # You can use flow.credentials, or you can just get a requests session
-    # using flow.authorized_session.
-    session = flow.authorized_session()
-    print(session.get('https://www.googleapis.com/userinfo/v2/me').json())
-
-This particular flow can be handled entirely by using
-:class:`InstalledAppFlow`.
-
-.. _requests-oauthlib: http://requests-oauthlib.readthedocs.io/en/stable/
-.. _OAuth 2.0 Authorization Flow:
-    https://tools.ietf.org/html/rfc6749#section-1.2
-"""
-
-import json
-import logging
-import webbrowser
-import wsgiref.simple_server
-import wsgiref.util
-
-import google.auth.transport.requests
-import google.oauth2.credentials
-from six.moves import input
-
-import google_auth_oauthlib.helpers
-
-
-_LOGGER = logging.getLogger(__name__)
-
-
-class Flow(object):
-    """OAuth 2.0 Authorization Flow
-
-    This class uses a :class:`requests_oauthlib.OAuth2Session` instance at
-    :attr:`oauth2session` to perform all of the OAuth 2.0 logic. This class
-    just provides convenience methods and sane defaults for doing Google's
-    particular flavors of OAuth 2.0.
-
-    Typically you'll construct an instance of this flow using
-    :meth:`from_client_secrets_file` and a `client secrets file`_ obtained
-    from the `Google API Console`_.
-
-    .. _client secrets file:
-        https://developers.google.com/identity/protocols/OAuth2WebServer
-        #creatingcred
-    .. _Google API Console:
-        https://console.developers.google.com/apis/credentials
-    """
-
-    def __init__(self, oauth2session, client_type, client_config):
-        """
-        Args:
-            oauth2session (requests_oauthlib.OAuth2Session):
-                The OAuth 2.0 session from ``requests-oauthlib``.
-            client_type (str): The client type, either ``web`` or
-                ``installed``.
-            client_config (Mapping[str, Any]): The client
-                configuration in the Google `client secrets`_ format.
-
-        .. _client secrets:
-            https://developers.google.com/api-client-library/python/guide
-            /aaa_client_secrets
-        """
-        self.client_type = client_type
-        """str: The client type, either ``'web'`` or ``'installed'``"""
-        self.client_config = client_config[client_type]
-        """Mapping[str, Any]: The OAuth 2.0 client configuration."""
-        self.oauth2session = oauth2session
-        """requests_oauthlib.OAuth2Session: The OAuth 2.0 session."""
-
-    @classmethod
-    def from_client_config(cls, client_config, scopes, **kwargs):
-        """Creates a :class:`requests_oauthlib.OAuth2Session` from client
-        configuration loaded from a Google-format client secrets file.
-
-        Args:
-            client_config (Mapping[str, Any]): The client
-                configuration in the Google `client secrets`_ format.
-            scopes (Sequence[str]): The list of scopes to request during the
-                flow.
-            kwargs: Any additional parameters passed to
-                :class:`requests_oauthlib.OAuth2Session`
-
-        Returns:
-            Flow: The constructed Flow instance.
-
-        Raises:
-            ValueError: If the client configuration is not in the correct
-                format.
-
-        .. _client secrets:
-            https://developers.google.com/api-client-library/python/guide
-            /aaa_client_secrets
-        """
-        if 'web' in client_config:
-            client_type = 'web'
-        elif 'installed' in client_config:
-            client_type = 'installed'
-        else:
-            raise ValueError(
-                'Client secrets must be for a web or installed app.')
-
-        session, client_config = (
-            google_auth_oauthlib.helpers.session_from_client_config(
-                client_config, scopes, **kwargs))
-
-        return cls(session, client_type, client_config)
-
-    @classmethod
-    def from_client_secrets_file(cls, client_secrets_file, scopes, **kwargs):
-        """Creates a :class:`Flow` instance from a Google client secrets file.
-
-        Args:
-            client_secrets_file (str): The path to the client secrets .json
-                file.
-            scopes (Sequence[str]): The list of scopes to request during the
-                flow.
-            kwargs: Any additional parameters passed to
-                :class:`requests_oauthlib.OAuth2Session`
-
-        Returns:
-            Flow: The constructed Flow instance.
-        """
-        with open(client_secrets_file, 'r') as json_file:
-            client_config = json.load(json_file)
-
-        return cls.from_client_config(client_config, scopes=scopes, **kwargs)
-
-    @property
-    def redirect_uri(self):
-        """The OAuth 2.0 redirect URI. Pass-through to
-        ``self.oauth2session.redirect_uri``."""
-        return self.oauth2session.redirect_uri
-
-    @redirect_uri.setter
-    def redirect_uri(self, value):
-        self.oauth2session.redirect_uri = value
-
-    def authorization_url(self, **kwargs):
-        """Generates an authorization URL.
-
-        This is the first step in the OAuth 2.0 Authorization Flow. The user's
-        browser should be redirected to the returned URL.
-
-        This method calls
-        :meth:`requests_oauthlib.OAuth2Session.authorization_url`
-        and specifies the client configuration's authorization URI (usually
-        Google's authorization server) and specifies that "offline" access is
-        desired. This is required in order to obtain a refresh token.
-
-        Args:
-            kwargs: Additional arguments passed through to
-                :meth:`requests_oauthlib.OAuth2Session.authorization_url`
-
-        Returns:
-            Tuple[str, str]: The generated authorization URL and state. The
-                user must visit the URL to complete the flow. The state is used
-                when completing the flow to verify that the request originated
-                from your application. If your application is using a different
-                :class:`Flow` instance to obtain the token, you will need to
-                specify the ``state`` when constructing the :class:`Flow`.
-        """
-        url, state = self.oauth2session.authorization_url(
-            self.client_config['auth_uri'],
-            access_type='offline', **kwargs)
-
-        return url, state
-
-    def fetch_token(self, **kwargs):
-        """Completes the Authorization Flow and obtains an access token.
-
-        This is the final step in the OAuth 2.0 Authorization Flow. This is
-        called after the user consents.
-
-        This method calls
-        :meth:`requests_oauthlib.OAuth2Session.fetch_token`
-        and specifies the client configuration's token URI (usually Google's
-        token server).
-
-        Args:
-            kwargs: Arguments passed through to
-                :meth:`requests_oauthlib.OAuth2Session.fetch_token`. At least
-                one of ``code`` or ``authorization_response`` must be
-                specified.
-
-        Returns:
-            Mapping[str, str]: The obtained tokens. Typically, you will not use
-                return value of this function and instead and use
-                :meth:`credentials` to obtain a
-                :class:`~google.auth.credentials.Credentials` instance.
-        """
-        return self.oauth2session.fetch_token(
-            self.client_config['token_uri'],
-            client_secret=self.client_config['client_secret'],
-            **kwargs)
-
-    @property
-    def credentials(self):
-        """Returns credentials from the OAuth 2.0 session.
-
-        :meth:`fetch_token` must be called before accessing this. This method
-        constructs a :class:`google.oauth2.credentials.Credentials` class using
-        the session's token and the client config.
-
-        Returns:
-            google.oauth2.credentials.Credentials: The constructed credentials.
-
-        Raises:
-            ValueError: If there is no access token in the session.
-        """
-        return google_auth_oauthlib.helpers.credentials_from_session(
-            self.oauth2session, self.client_config)
-
-    def authorized_session(self):
-        """Returns a :class:`requests.Session` authorized with credentials.
-
-        :meth:`fetch_token` must be called before this method. This method
-        constructs a :class:`google.auth.transport.requests.AuthorizedSession`
-        class using this flow's :attr:`credentials`.
-
-        Returns:
-            google.auth.transport.requests.AuthorizedSession: The constructed
-                session.
-        """
-        return google.auth.transport.requests.AuthorizedSession(
-            self.credentials)
-
-
-class InstalledAppFlow(Flow):
-    """Authorization flow helper for installed applications.
-
-    This :class:`Flow` subclass makes it easier to perform the
-    `Installed Application Authorization Flow`_. This flow is useful for
-    local development or applications that are installed on a desktop operating
-    system.
-
-    This flow has two strategies: The console strategy provided by
-    :meth:`run_console` and the local server strategy provided by
-    :meth:`run_local_server`.
-
-    Example::
-
-        from google_auth_oauthlib.flow import InstalledAppFlow
-
-        flow = InstalledAppFlow.from_client_secrets_file(
-            'client_secrets.json',
-            scopes=['profile', 'email'])
-
-        flow.run_local_server()
-
-        session = flow.authorized_session()
-
-        profile_info = session.get(
-            'https://www.googleapis.com/userinfo/v2/me').json()
-
-        print(profile_info)
-        # {'name': '...',  'email': '...', ...}
-
-
-    Note that these aren't the only two ways to accomplish the installed
-    application flow, they are just the most common ways. You can use the
-    :class:`Flow` class to perform the same flow with different methods of
-    presenting the authorization URL to the user or obtaining the authorization
-    response, such as using an embedded web view.
-
-    .. _Installed Application Authorization Flow:
-        https://developers.google.com/api-client-library/python/auth
-        /installed-app
-    """
-    _OOB_REDIRECT_URI = 'urn:ietf:wg:oauth:2.0:oob'
-
-    _DEFAULT_AUTH_PROMPT_MESSAGE = (
-        'Please visit this URL to authorize this application: {url}')
-    """str: The message to display when prompting the user for
-    authorization."""
-    _DEFAULT_AUTH_CODE_MESSAGE = (
-        'Enter the authorization code: ')
-    """str: The message to display when prompting the user for the
-    authorization code. Used only by the console strategy."""
-
-    _DEFAULT_WEB_SUCCESS_MESSAGE = (
-        'The authentication flow has completed, you may close this window.')
-
-    def run_console(
-            self,
-            authorization_prompt_message=_DEFAULT_AUTH_PROMPT_MESSAGE,
-            authorization_code_message=_DEFAULT_AUTH_CODE_MESSAGE,
-            **kwargs):
-        """Run the flow using the console strategy.
-
-        The console strategy instructs the user to open the authorization URL
-        in their browser. Once the authorization is complete the authorization
-        server will give the user a code. The user then must copy & paste this
-        code into the application. The code is then exchanged for a token.
-
-        Args:
-            authorization_prompt_message (str): The message to display to tell
-                the user to navigate to the authorization URL.
-            authorization_code_message (str): The message to display when
-                prompting the user for the authorization code.
-            kwargs: Additional keyword arguments passed through to
-                :meth:`authorization_url`.
-
-        Returns:
-            google.oauth2.credentials.Credentials: The OAuth 2.0 credentials
-                for the user.
-        """
-        kwargs.setdefault('prompt', 'consent')
-
-        self.redirect_uri = self._OOB_REDIRECT_URI
-
-        auth_url, _ = self.authorization_url(**kwargs)
-
-        print(authorization_prompt_message.format(url=auth_url))
-
-        code = input(authorization_code_message)
-
-        self.fetch_token(code=code)
-
-        return self.credentials
-
-    def run_local_server(
-            self, host='localhost', port=8080,
-            authorization_prompt_message=_DEFAULT_AUTH_PROMPT_MESSAGE,
-            success_message=_DEFAULT_WEB_SUCCESS_MESSAGE,
-            open_browser=True,
-            **kwargs):
-        """Run the flow using the server strategy.
-
-        The server strategy instructs the user to open the authorization URL in
-        their browser and will attempt to automatically open the URL for them.
-        It will start a local web server to listen for the authorization
-        response. Once authorization is complete the authorization server will
-        redirect the user's browser to the local web server. The web server
-        will get the authorization code from the response and shutdown. The
-        code is then exchanged for a token.
-
-        Args:
-            host (str): The hostname for the local redirect server. This will
-                be served over http, not https.
-            port (int): The port for the local redirect server.
-            authorization_prompt_message (str): The message to display to tell
-                the user to navigate to the authorization URL.
-            success_message (str): The message to display in the web browser
-                the authorization flow is complete.
-            open_browser (bool): Whether or not to open the authorization URL
-                in the user's browser.
-            kwargs: Additional keyword arguments passed through to
-                :meth:`authorization_url`.
-
-        Returns:
-            google.oauth2.credentials.Credentials: The OAuth 2.0 credentials
-                for the user.
-        """
-        self.redirect_uri = 'http://{}:{}/'.format(host, port)
-
-        auth_url, _ = self.authorization_url(**kwargs)
-
-        wsgi_app = _RedirectWSGIApp(success_message)
-        local_server = wsgiref.simple_server.make_server(
-            host, port, wsgi_app, handler_class=_WSGIRequestHandler)
-
-        if open_browser:
-            webbrowser.open(auth_url, new=1, autoraise=True)
-
-        print(authorization_prompt_message.format(url=auth_url))
-
-        local_server.handle_request()
-
-        # Note: using https here because oauthlib is very picky that
-        # OAuth 2.0 should only occur over https.
-        authorization_response = wsgi_app.last_request_uri.replace(
-            'http', 'https')
-        self.fetch_token(authorization_response=authorization_response)
-
-        return self.credentials
-
-
-class _WSGIRequestHandler(wsgiref.simple_server.WSGIRequestHandler):
-    """Custom WSGIRequestHandler.
-
-    Uses a named logger instead of printing to stderr.
-    """
-    def log_message(self, format, *args, **kwargs):
-        # pylint: disable=redefined-builtin
-        # (format is the argument name defined in the superclass.)
-        _LOGGER.info(format, *args, **kwargs)
-
-
-class _RedirectWSGIApp(object):
-    """WSGI app to handle the authorization redirect.
-
-    Stores the request URI and displays the given success message.
-    """
-
-    def __init__(self, success_message):
-        """
-        Args:
-            success_message (str): The message to display in the web browser
-                the authorization flow is complete.
-        """
-        self.last_request_uri = None
-        self._success_message = success_message
-
-    def __call__(self, environ, start_response):
-        """WSGI Callable.
-
-        Args:
-            environ (Mapping[str, Any]): The WSGI environment.
-            start_response (Callable[str, list]): The WSGI start_response
-                callable.
-
-        Returns:
-            Iterable[bytes]: The response body.
-        """
-        start_response('200 OK', [('Content-type', 'text/plain')])
-        self.last_request_uri = wsgiref.util.request_uri(environ)
-        return [self._success_message.encode('utf-8')]
diff --git a/additional_packages/google_auth_oauthlib/google_auth_oauthlib/helpers.py b/additional_packages/google_auth_oauthlib/google_auth_oauthlib/helpers.py
deleted file mode 100644
index 41866d6..0000000
--- a/additional_packages/google_auth_oauthlib/google_auth_oauthlib/helpers.py
+++ /dev/null
@@ -1,137 +0,0 @@
-# Copyright 2017 Google Inc.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#      http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-"""Integration helpers.
-
-This module provides helpers for integrating with `requests-oauthlib`_.
-Typically, you'll want to use the higher-level helpers in
-:mod:`google_auth_oauthlib.flow`.
-
-.. _requests-oauthlib: http://requests-oauthlib.readthedocs.io/en/stable/
-"""
-
-import json
-
-import google.oauth2.credentials
-import requests_oauthlib
-
-_REQUIRED_CONFIG_KEYS = frozenset(('auth_uri', 'token_uri', 'client_id'))
-
-
-def session_from_client_config(client_config, scopes, **kwargs):
-    """Creates a :class:`requests_oauthlib.OAuth2Session` from client
-    configuration loaded from a Google-format client secrets file.
-
-    Args:
-        client_config (Mapping[str, Any]): The client
-            configuration in the Google `client secrets`_ format.
-        scopes (Sequence[str]): The list of scopes to request during the
-            flow.
-        kwargs: Any additional parameters passed to
-            :class:`requests_oauthlib.OAuth2Session`
-
-    Raises:
-        ValueError: If the client configuration is not in the correct
-            format.
-
-    Returns:
-        Tuple[requests_oauthlib.OAuth2Session, Mapping[str, Any]]: The new
-            oauthlib session and the validated client configuration.
-
-    .. _client secrets:
-        https://developers.google.com/api-client-library/python/guide
-        /aaa_client_secrets
-    """
-
-    if 'web' in client_config:
-        config = client_config['web']
-    elif 'installed' in client_config:
-        config = client_config['installed']
-    else:
-        raise ValueError(
-            'Client secrets must be for a web or installed app.')
-
-    if not _REQUIRED_CONFIG_KEYS.issubset(config.keys()):
-        raise ValueError('Client secrets is not in the correct format.')
-
-    session = requests_oauthlib.OAuth2Session(
-        client_id=config['client_id'],
-        scope=scopes,
-        **kwargs)
-
-    return session, client_config
-
-
-def session_from_client_secrets_file(client_secrets_file, scopes, **kwargs):
-    """Creates a :class:`requests_oauthlib.OAuth2Session` instance from a
-    Google-format client secrets file.
-
-    Args:
-        client_secrets_file (str): The path to the `client secrets`_ .json
-            file.
-        scopes (Sequence[str]): The list of scopes to request during the
-            flow.
-        kwargs: Any additional parameters passed to
-            :class:`requests_oauthlib.OAuth2Session`
-
-    Returns:
-        Tuple[requests_oauthlib.OAuth2Session, Mapping[str, Any]]: The new
-            oauthlib session and the validated client configuration.
-
-    .. _client secrets:
-        https://developers.google.com/api-client-library/python/guide
-        /aaa_client_secrets
-    """
-    with open(client_secrets_file, 'r') as json_file:
-        client_config = json.load(json_file)
-
-    return session_from_client_config(client_config, scopes, **kwargs)
-
-
-def credentials_from_session(session, client_config=None):
-    """Creates :class:`google.oauth2.credentials.Credentials` from a
-    :class:`requests_oauthlib.OAuth2Session`.
-
-    :meth:`fetch_token` must be called on the session before before calling
-    this. This uses the session's auth token and the provided client
-    configuration to create :class:`google.oauth2.credentials.Credentials`.
-    This allows you to use the credentials from the session with Google
-    API client libraries.
-
-    Args:
-        session (requests_oauthlib.OAuth2Session): The OAuth 2.0 session.
-        client_config (Mapping[str, Any]): The subset of the client
-            configuration to use. For example, if you have a web client
-            you would pass in `client_config['web']`.
-
-    Returns:
-        google.oauth2.credentials.Credentials: The constructed credentials.
-
-    Raises:
-        ValueError: If there is no access token in the session.
-    """
-    client_config = client_config if client_config is not None else {}
-
-    if not session.token:
-        raise ValueError(
-            'There is no access token for this session, did you call '
-            'fetch_token?')
-
-    return google.oauth2.credentials.Credentials(
-        session.token['access_token'],
-        refresh_token=session.token.get('refresh_token'),
-        token_uri=client_config.get('token_uri'),
-        client_id=client_config.get('client_id'),
-        client_secret=client_config.get('client_secret'),
-        scopes=session.scope)
diff --git a/additional_packages/google_auth_oauthlib/setup.cfg b/additional_packages/google_auth_oauthlib/setup.cfg
deleted file mode 100644
index 2a9acf1..0000000
--- a/additional_packages/google_auth_oauthlib/setup.cfg
+++ /dev/null
@@ -1,2 +0,0 @@
-[bdist_wheel]
-universal = 1
diff --git a/additional_packages/google_auth_oauthlib/setup.py b/additional_packages/google_auth_oauthlib/setup.py
deleted file mode 100644
index 3652470..0000000
--- a/additional_packages/google_auth_oauthlib/setup.py
+++ /dev/null
@@ -1,59 +0,0 @@
-# Copyright 2014 Google Inc.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#      http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-import io
-
-from setuptools import find_packages
-from setuptools import setup
-
-
-DEPENDENCIES = (
-    'google-auth',
-    'requests-oauthlib>=0.7.0',
-)
-
-
-with io.open('README.rst', 'r') as fh:
-    long_description = fh.read()
-
-
-setup(
-    name='google-auth-oauthlib',
-    version='0.0.1',
-    author='Google Cloud Platform',
-    author_email='jonwayne+google-auth@google.com',
-    description='Google Authentication Library',
-    long_description=long_description,
-    url='https://github.com/GoogleCloudPlatform/google-auth-library-python',
-    packages=find_packages(exclude=('tests*',)),
-    install_requires=DEPENDENCIES,
-    license='Apache 2.0',
-    keywords='google auth oauth client oauthlib',
-    classifiers=(
-        'Programming Language :: Python :: 2',
-        'Programming Language :: Python :: 2.7',
-        'Programming Language :: Python :: 3',
-        'Programming Language :: Python :: 3.4',
-        'Programming Language :: Python :: 3.5',
-        'Programming Language :: Python :: 3.6',
-        'Development Status :: 3 - Alpha',
-        'Intended Audience :: Developers',
-        'License :: OSI Approved :: Apache Software License',
-        'Operating System :: POSIX',
-        'Operating System :: Microsoft :: Windows',
-        'Operating System :: MacOS :: MacOS X',
-        'Operating System :: OS Independent',
-        'Topic :: Internet :: WWW/HTTP',
-    ),
-)
diff --git a/additional_packages/google_auth_oauthlib/tests/__init__.py b/additional_packages/google_auth_oauthlib/tests/__init__.py
deleted file mode 100644
index e69de29..0000000
--- a/additional_packages/google_auth_oauthlib/tests/__init__.py
+++ /dev/null
diff --git a/additional_packages/google_auth_oauthlib/tests/data/client_secrets.json b/additional_packages/google_auth_oauthlib/tests/data/client_secrets.json
deleted file mode 100644
index 1baa499..0000000
--- a/additional_packages/google_auth_oauthlib/tests/data/client_secrets.json
+++ /dev/null
@@ -1,14 +0,0 @@
-{
-  "web": {
-    "client_id": "example.apps.googleusercontent.com",
-    "project_id": "example",
-    "auth_uri": "https://accounts.google.com/o/oauth2/auth",
-    "token_uri": "https://accounts.google.com/o/oauth2/token",
-    "auth_provider_x509_cert_url": "https://www.googleapis.com/oauth2/v1/certs",
-    "client_secret": "itsasecrettoeveryone",
-    "redirect_uris": [
-      "urn:ietf:wg:oauth:2.0:oob",
-      "http://localhost"
-    ]
-  }
-}
diff --git a/additional_packages/google_auth_oauthlib/tests/test_flow.py b/additional_packages/google_auth_oauthlib/tests/test_flow.py
deleted file mode 100644
index 88d283d..0000000
--- a/additional_packages/google_auth_oauthlib/tests/test_flow.py
+++ /dev/null
@@ -1,205 +0,0 @@
-# Copyright 2017 Google Inc.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#      http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-import concurrent.futures
-import json
-import os
-
-import mock
-import pytest
-import requests
-from six.moves import urllib
-
-from google_auth_oauthlib import flow
-
-DATA_DIR = os.path.join(os.path.dirname(__file__), 'data')
-CLIENT_SECRETS_FILE = os.path.join(DATA_DIR, 'client_secrets.json')
-
-with open(CLIENT_SECRETS_FILE, 'r') as fh:
-    CLIENT_SECRETS_INFO = json.load(fh)
-
-
-class TestFlow(object):
-    def test_from_client_secrets_file(self):
-        instance = flow.Flow.from_client_secrets_file(
-            CLIENT_SECRETS_FILE, scopes=mock.sentinel.scopes)
-        assert instance.client_config == CLIENT_SECRETS_INFO['web']
-        assert (instance.oauth2session.client_id ==
-                CLIENT_SECRETS_INFO['web']['client_id'])
-        assert instance.oauth2session.scope == mock.sentinel.scopes
-
-    def test_from_client_config_installed(self):
-        client_config = {'installed': CLIENT_SECRETS_INFO['web']}
-        instance = flow.Flow.from_client_config(
-            client_config, scopes=mock.sentinel.scopes)
-        assert instance.client_config == client_config['installed']
-        assert (instance.oauth2session.client_id ==
-                client_config['installed']['client_id'])
-        assert instance.oauth2session.scope == mock.sentinel.scopes
-
-    def test_from_client_config_bad_format(self):
-        with pytest.raises(ValueError):
-            flow.Flow.from_client_config({}, scopes=mock.sentinel.scopes)
-
-    @pytest.fixture
-    def instance(self):
-        yield flow.Flow.from_client_config(
-            CLIENT_SECRETS_INFO, scopes=mock.sentinel.scopes)
-
-    def test_redirect_uri(self, instance):
-        instance.redirect_uri = mock.sentinel.redirect_uri
-        assert (instance.redirect_uri ==
-                instance.oauth2session.redirect_uri ==
-                mock.sentinel.redirect_uri)
-
-    def test_authorization_url(self, instance):
-        scope = 'scope_one'
-        instance.oauth2session.scope = [scope]
-        authorization_url_patch = mock.patch.object(
-            instance.oauth2session, 'authorization_url',
-            wraps=instance.oauth2session.authorization_url)
-
-        with authorization_url_patch as authorization_url_spy:
-            url, _ = instance.authorization_url(prompt='consent')
-
-            assert CLIENT_SECRETS_INFO['web']['auth_uri'] in url
-            assert scope in url
-            authorization_url_spy.assert_called_with(
-                CLIENT_SECRETS_INFO['web']['auth_uri'],
-                access_type='offline',
-                prompt='consent')
-
-    def test_fetch_token(self, instance):
-        fetch_token_patch = mock.patch.object(
-            instance.oauth2session, 'fetch_token', autospec=True,
-            return_value=mock.sentinel.token)
-
-        with fetch_token_patch as fetch_token_mock:
-            token = instance.fetch_token(code=mock.sentinel.code)
-
-            assert token == mock.sentinel.token
-            fetch_token_mock.assert_called_with(
-                CLIENT_SECRETS_INFO['web']['token_uri'],
-                client_secret=CLIENT_SECRETS_INFO['web']['client_secret'],
-                code=mock.sentinel.code)
-
-    def test_credentials(self, instance):
-        instance.oauth2session.token = {
-            'access_token': mock.sentinel.access_token,
-            'refresh_token': mock.sentinel.refresh_token
-        }
-
-        credentials = instance.credentials
-
-        assert credentials.token == mock.sentinel.access_token
-        assert credentials._refresh_token == mock.sentinel.refresh_token
-        assert (credentials._client_id ==
-                CLIENT_SECRETS_INFO['web']['client_id'])
-        assert (credentials._client_secret ==
-                CLIENT_SECRETS_INFO['web']['client_secret'])
-        assert (credentials._token_uri ==
-                CLIENT_SECRETS_INFO['web']['token_uri'])
-
-    def test_authorized_session(self, instance):
-        instance.oauth2session.token = {
-            'access_token': mock.sentinel.access_token,
-            'refresh_token': mock.sentinel.refresh_token
-        }
-
-        session = instance.authorized_session()
-
-        assert session.credentials.token == mock.sentinel.access_token
-
-
-class TestInstalledAppFlow(object):
-    SCOPES = ['email', 'profile']
-    REDIRECT_REQUEST_PATH = '/?code=code&state=state'
-
-    @pytest.fixture
-    def instance(self):
-        yield flow.InstalledAppFlow.from_client_config(
-            CLIENT_SECRETS_INFO, scopes=self.SCOPES)
-
-    @pytest.fixture
-    def mock_fetch_token(self, instance):
-        def set_token(*args, **kwargs):
-            instance.oauth2session.token = {
-                'access_token': mock.sentinel.access_token,
-                'refresh_token': mock.sentinel.refresh_token
-            }
-
-        fetch_token_patch = mock.patch.object(
-            instance.oauth2session, 'fetch_token', autospec=True,
-            side_effect=set_token)
-
-        with fetch_token_patch as fetch_token_mock:
-            yield fetch_token_mock
-
-    @mock.patch('google_auth_oauthlib.flow.input', autospec=True)
-    def test_run_console(self, input_mock, instance, mock_fetch_token):
-        input_mock.return_value = mock.sentinel.code
-
-        credentials = instance.run_console()
-
-        assert credentials.token == mock.sentinel.access_token
-        assert credentials._refresh_token == mock.sentinel.refresh_token
-
-        mock_fetch_token.assert_called_with(
-            CLIENT_SECRETS_INFO['web']['token_uri'],
-            client_secret=CLIENT_SECRETS_INFO['web']['client_secret'],
-            code=mock.sentinel.code)
-
-    @mock.patch('google_auth_oauthlib.flow.webbrowser', autospec=True)
-    def test_run_local_server(
-            self, webbrowser_mock, instance, mock_fetch_token):
-        auth_redirect_url = urllib.parse.urljoin(
-            'http://localhost:8080',
-            self.REDIRECT_REQUEST_PATH)
-
-        with concurrent.futures.ThreadPoolExecutor(max_workers=1) as pool:
-            future = pool.submit(instance.run_local_server)
-
-            while not future.done():
-                try:
-                    requests.get(auth_redirect_url)
-                except requests.ConnectionError:  # pragma: NO COVER
-                    pass
-
-            credentials = future.result()
-
-        assert credentials.token == mock.sentinel.access_token
-        assert credentials._refresh_token == mock.sentinel.refresh_token
-        assert webbrowser_mock.open.called
-
-        expected_auth_response = auth_redirect_url.replace('http', 'https')
-        mock_fetch_token.assert_called_with(
-            CLIENT_SECRETS_INFO['web']['token_uri'],
-            client_secret=CLIENT_SECRETS_INFO['web']['client_secret'],
-            authorization_response=expected_auth_response)
-
-    @mock.patch('google_auth_oauthlib.flow.webbrowser', autospec=True)
-    @mock.patch('wsgiref.simple_server.make_server', autospec=True)
-    def test_run_local_server_no_browser(
-            self, make_server_mock, webbrowser_mock, instance,
-            mock_fetch_token):
-
-        def assign_last_request_uri(host, port, wsgi_app, **kwargs):
-            wsgi_app.last_request_uri = self.REDIRECT_REQUEST_PATH
-            return mock.Mock()
-
-        make_server_mock.side_effect = assign_last_request_uri
-
-        instance.run_local_server(open_browser=False)
-
-        assert not webbrowser_mock.open.called
diff --git a/additional_packages/google_auth_oauthlib/tests/test_helpers.py b/additional_packages/google_auth_oauthlib/tests/test_helpers.py
deleted file mode 100644
index faae76b..0000000
--- a/additional_packages/google_auth_oauthlib/tests/test_helpers.py
+++ /dev/null
@@ -1,92 +0,0 @@
-# Copyright 2017 Google Inc.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#      http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-import json
-import os
-
-import mock
-import pytest
-
-from google_auth_oauthlib import helpers
-
-DATA_DIR = os.path.join(os.path.dirname(__file__), 'data')
-CLIENT_SECRETS_FILE = os.path.join(DATA_DIR, 'client_secrets.json')
-
-with open(CLIENT_SECRETS_FILE, 'r') as fh:
-    CLIENT_SECRETS_INFO = json.load(fh)
-
-
-def test_session_from_client_config_web():
-    session, config = helpers.session_from_client_config(
-        CLIENT_SECRETS_INFO, scopes=mock.sentinel.scopes)
-
-    assert config == CLIENT_SECRETS_INFO
-    assert session.client_id == CLIENT_SECRETS_INFO['web']['client_id']
-    assert session.scope == mock.sentinel.scopes
-
-
-def test_session_from_client_config_installed():
-    info = {'installed': CLIENT_SECRETS_INFO['web']}
-    session, config = helpers.session_from_client_config(
-        info, scopes=mock.sentinel.scopes)
-    assert config == info
-    assert session.client_id == info['installed']['client_id']
-    assert session.scope == mock.sentinel.scopes
-
-
-def test_session_from_client_config_bad_format():
-    with pytest.raises(ValueError):
-        helpers.session_from_client_config({}, scopes=[])
-
-
-def test_session_from_client_config_missing_keys():
-    with pytest.raises(ValueError):
-        helpers.session_from_client_config({'web': {}}, scopes=[])
-
-
-def test_session_from_client_secrets_file():
-    session, config = helpers.session_from_client_secrets_file(
-        CLIENT_SECRETS_FILE, scopes=mock.sentinel.scopes)
-    assert config == CLIENT_SECRETS_INFO
-    assert session.client_id == CLIENT_SECRETS_INFO['web']['client_id']
-    assert session.scope == mock.sentinel.scopes
-
-
-@pytest.fixture
-def session():
-    session, _ = helpers.session_from_client_config(
-        CLIENT_SECRETS_INFO, scopes=mock.sentinel.scopes)
-    yield session
-
-
-def test_credentials_from_session(session):
-    session.token = {
-        'access_token': mock.sentinel.access_token,
-        'refresh_token': mock.sentinel.refresh_token
-    }
-
-    credentials = helpers.credentials_from_session(
-        session, CLIENT_SECRETS_INFO['web'])
-
-    assert credentials.token == mock.sentinel.access_token
-    assert credentials._refresh_token == mock.sentinel.refresh_token
-    assert credentials._client_id == CLIENT_SECRETS_INFO['web']['client_id']
-    assert (credentials._client_secret ==
-            CLIENT_SECRETS_INFO['web']['client_secret'])
-    assert credentials._token_uri == CLIENT_SECRETS_INFO['web']['token_uri']
-
-
-def test_bad_credentials(session):
-    with pytest.raises(ValueError):
-        helpers.credentials_from_session(session)
diff --git a/additional_packages/google_auth_oauthlib/tox.ini b/additional_packages/google_auth_oauthlib/tox.ini
deleted file mode 100644
index c0983f6..0000000
--- a/additional_packages/google_auth_oauthlib/tox.ini
+++ /dev/null
@@ -1,36 +0,0 @@
-[tox]
-envlist = lint,py27,py34,py35,py36,pypy,cover
-
-[testenv]
-deps =
-  mock
-  pytest
-  pytest-cov
-  futures
-commands =
-  py.test --cov=google_auth_oauthlib --cov=tests {posargs:tests}
-
-[testenv:cover]
-basepython = python3.6
-commands =
-  py.test --cov=google_auth_oauthlib --cov=tests --cov-report= tests
-  coverage report --show-missing --fail-under=100
-deps =
-  {[testenv]deps}
-
-[testenv:lint]
-basepython = python3.5
-commands =
-  python setup.py check --metadata --restructuredtext --strict
-  flake8 \
-    --import-order-style=google \
-    --application-import-names="google_auth_oauthlib,tests" \
-    google_auth_oauthlib tests
-  python {toxinidir}/../../scripts/run_pylint.py \
-    --library-filesets google_auth_oauthlib \
-    --test-filesets tests
-deps =
-  flake8
-  flake8-import-order
-  pylint
-  docutils
