We are currently solving the following issue within our repository. Here is the issue text:
--- BEGIN ISSUE ---
TooManyRedirects is not properly exposed publicly
## Description

https://github.com/aio-libs/aiohttp/commit/544716cf93b3856e485c8e993de60d9911c002cb (#2943) added `TooManyRedirects` and added it as `aiohttp.TooManyRedirects` [in the documentation](https://docs.aiohttp.org/en/latest/client_reference.html#aiohttp.TooManyRedirects).
However, it's not properly exposed publicly in `__init__.py` and can only be referenced as `aiohttp.client_exceptions.TooManyRedirects`.

## Expected Behaviour

`aiohttp.TooManyRedirects` works, by reference to `aiohttp.client_exceptions.TooManyRedirects`

## Actual Behaviour

`AttributeError: module 'aiohttp' has no attribute 'TooManyRedirects`

## Reproduction Steps

`import aiohttp` and attempt to use `aiohttp.TooManyRedirects`

## Environment

aiohttp 3.5.4
Also reproducible on latest master (https://github.com/aio-libs/aiohttp/commit/81cc715227f6b0f3b36ee6d8bcc95a63a37fbdab)

--- END ISSUE ---

Below are some code segments, each from a relevant file. One or more of these files may contain bugs.
--- BEGIN FILES ---
Path: `aiohttp/__init__.py`
Content:
```
1 __version__ = '4.0.0a0'
2 
3 from typing import Tuple  # noqa
4 
5 from . import hdrs
6 from .client import (
7     BaseConnector,
8     ClientConnectionError,
9     ClientConnectorCertificateError,
10     ClientConnectorError,
11     ClientConnectorSSLError,
12     ClientError,
13     ClientHttpProxyError,
14     ClientOSError,
15     ClientPayloadError,
16     ClientProxyConnectionError,
17     ClientRequest,
18     ClientResponse,
19     ClientResponseError,
20     ClientSession,
21     ClientSSLError,
22     ClientTimeout,
23     ClientWebSocketResponse,
24     ContentTypeError,
25     Fingerprint,
26     InvalidURL,
27     RequestInfo,
28     ServerConnectionError,
29     ServerDisconnectedError,
30     ServerFingerprintMismatch,
31     ServerTimeoutError,
32     TCPConnector,
33     UnixConnector,
34     WSServerHandshakeError,
35     request,
36 )
37 from .cookiejar import CookieJar, DummyCookieJar
38 from .formdata import FormData
39 from .helpers import BasicAuth, ChainMapProxy
40 from .http import (
41     HttpVersion,
42     HttpVersion10,
43     HttpVersion11,
44     WebSocketError,
45     WSCloseCode,
46     WSMessage,
47     WSMsgType,
48 )
49 from .multipart import (
50     BadContentDispositionHeader,
51     BadContentDispositionParam,
52     BodyPartReader,
53     MultipartReader,
54     MultipartWriter,
55     content_disposition_filename,
56     parse_content_disposition,
57 )
58 from .payload import (
59     PAYLOAD_REGISTRY,
60     AsyncIterablePayload,
61     BufferedReaderPayload,
62     BytesIOPayload,
63     BytesPayload,
64     IOBasePayload,
65     JsonPayload,
66     Payload,
67     StringIOPayload,
68     StringPayload,
69     TextIOPayload,
70     get_payload,
71     payload_type,
72 )
73 from .resolver import AsyncResolver, DefaultResolver, ThreadedResolver
74 from .signals import Signal
75 from .streams import (
76     EMPTY_PAYLOAD,
77     DataQueue,
78     EofStream,
79     FlowControlDataQueue,
80     StreamReader,
81 )
82 from .tracing import (
83     TraceConfig,
84     TraceConnectionCreateEndParams,
85     TraceConnectionCreateStartParams,
86     TraceConnectionQueuedEndParams,
87     TraceConnectionQueuedStartParams,
88     TraceConnectionReuseconnParams,
89     TraceDnsCacheHitParams,
90     TraceDnsCacheMissParams,
91     TraceDnsResolveHostEndParams,
92     TraceDnsResolveHostStartParams,
93     TraceRequestChunkSentParams,
94     TraceRequestEndParams,
95     TraceRequestExceptionParams,
96     TraceRequestRedirectParams,
97     TraceRequestStartParams,
98     TraceResponseChunkReceivedParams,
99 )
100 
101 __all__ = (
102     'hdrs',
103     # client
104     'BaseConnector',
105     'ClientConnectionError',
106     'ClientConnectorCertificateError',
107     'ClientConnectorError',
108     'ClientConnectorSSLError',
109     'ClientError',
110     'ClientHttpProxyError',
111     'ClientOSError',
112     'ClientPayloadError',
113     'ClientProxyConnectionError',
114     'ClientResponse',
115     'ClientRequest',
116     'ClientResponseError',
117     'ClientSSLError',
118     'ClientSession',
119     'ClientTimeout',
120     'ClientWebSocketResponse',
121     'ContentTypeError',
122     'Fingerprint',
123     'InvalidURL',
124     'RequestInfo',
125     'ServerConnectionError',
126     'ServerDisconnectedError',
127     'ServerFingerprintMismatch',
128     'ServerTimeoutError',
129     'TCPConnector',
130     'UnixConnector',
131     'WSServerHandshakeError',
132     'request',
133     # cookiejar
134     'CookieJar',
135     'DummyCookieJar',
136     # formdata
137     'FormData',
138     # helpers
139     'BasicAuth',
140     'ChainMapProxy',
141     # http
142     'HttpVersion',
143     'HttpVersion10',
144     'HttpVersion11',
145     'WSMsgType',
146     'WSCloseCode',
147     'WSMessage',
148     'WebSocketError',
149     # multipart
150     'BadContentDispositionHeader',
151     'BadContentDispositionParam',
152     'BodyPartReader',
153     'MultipartReader',
154     'MultipartWriter',
155     'content_disposition_filename',
156     'parse_content_disposition',
157     # payload
158     'AsyncIterablePayload',
159     'BufferedReaderPayload',
160     'BytesIOPayload',
161     'BytesPayload',
162     'IOBasePayload',
163     'JsonPayload',
164     'PAYLOAD_REGISTRY',
165     'Payload',
166     'StringIOPayload',
167     'StringPayload',
168     'TextIOPayload',
169     'get_payload',
170     'payload_type',
171     # resolver
172     'AsyncResolver',
173     'DefaultResolver',
174     'ThreadedResolver',
175     # signals
176     'Signal',
177     'DataQueue',
178     'EMPTY_PAYLOAD',
179     'EofStream',
180     'FlowControlDataQueue',
181     'StreamReader',
182     # tracing
183     'TraceConfig',
184     'TraceConnectionCreateEndParams',
185     'TraceConnectionCreateStartParams',
186     'TraceConnectionQueuedEndParams',
187     'TraceConnectionQueuedStartParams',
188     'TraceConnectionReuseconnParams',
189     'TraceDnsCacheHitParams',
190     'TraceDnsCacheMissParams',
191     'TraceDnsResolveHostEndParams',
192     'TraceDnsResolveHostStartParams',
193     'TraceRequestChunkSentParams',
194     'TraceRequestEndParams',
195     'TraceRequestExceptionParams',
196     'TraceRequestRedirectParams',
197     'TraceRequestStartParams',
198     'TraceResponseChunkReceivedParams',
199 )  # type: Tuple[str, ...]
200 
201 try:
202     from .worker import GunicornWebWorker, GunicornUVLoopWebWorker  # noqa
203     __all__ += ('GunicornWebWorker', 'GunicornUVLoopWebWorker')
204 except ImportError:  # pragma: no cover
205     pass
206
```
--- END FILES ---

Please first localize the bug based on the issue statement, and then generate a patch according to the `git diff` format fenced by three backticks.

Here is an example:

```diff
diff --git a/examples/server_async.py b/examples/server_async.py
--- a/examples/server_async.py
+++ b/examples/server_async.py
@@ -313,4 +313,4 @@
 
 
 if __name__ == "__main__":
-    asyncio.run(run_async_server("."), debug=True)
+    asyncio.run(run_async_server(), debug=True)
diff --git a/examples/server_sync.py b/examples/server_sync.py
--- a/examples/server_sync.py
+++ b/examples/server_sync.py
@@ -313,5 +313,5 @@
 
 
 if __name__ == "__main__":
-    server = run_sync_server(".")
+    server = run_sync_server()
     server.shutdown()

```

diff --git a/aiohttp/__init__.py b/aiohttp/__init__.py
--- a/aiohttp/__init__.py
+++ b/aiohttp/__init__.py
@@ -30,6 +30,7 @@
     ServerFingerprintMismatch,
     ServerTimeoutError,
     TCPConnector,
+    TooManyRedirects,
     UnixConnector,
     WSServerHandshakeError,
     request,
@@ -127,6 +128,7 @@
     'ServerFingerprintMismatch',
     'ServerTimeoutError',
     'TCPConnector',
+    'TooManyRedirects',
     'UnixConnector',
     'WSServerHandshakeError',
     'request',

{"golden_diff": "diff --git a/aiohttp/__init__.py b/aiohttp/__init__.py\n--- a/aiohttp/__init__.py\n+++ b/aiohttp/__init__.py\n@@ -30,6 +30,7 @@\n     ServerFingerprintMismatch,\n     ServerTimeoutError,\n     TCPConnector,\n+    TooManyRedirects,\n     UnixConnector,\n     WSServerHandshakeError,\n     request,\n@@ -127,6 +128,7 @@\n     'ServerFingerprintMismatch',\n     'ServerTimeoutError',\n     'TCPConnector',\n+    'TooManyRedirects',\n     'UnixConnector',\n     'WSServerHandshakeError',\n     'request',\n", "issue": "TooManyRedirects is not properly exposed publicly\n## Description\r\n\r\nhttps://github.com/aio-libs/aiohttp/commit/544716cf93b3856e485c8e993de60d9911c002cb (#2943) added `TooManyRedirects` and added it as `aiohttp.TooManyRedirects` [in the documentation](https://docs.aiohttp.org/en/latest/client_reference.html#aiohttp.TooManyRedirects).\r\nHowever, it's not properly exposed publicly in `__init__.py` and can only be referenced as `aiohttp.client_exceptions.TooManyRedirects`.\r\n\r\n## Expected Behaviour\r\n\r\n`aiohttp.TooManyRedirects` works, by reference to `aiohttp.client_exceptions.TooManyRedirects`\r\n\r\n## Actual Behaviour\r\n\r\n`AttributeError: module 'aiohttp' has no attribute 'TooManyRedirects`\r\n\r\n## Reproduction Steps\r\n\r\n`import aiohttp` and attempt to use `aiohttp.TooManyRedirects`\r\n\r\n## Environment\r\n\r\naiohttp 3.5.4\r\nAlso reproducible on latest master (https://github.com/aio-libs/aiohttp/commit/81cc715227f6b0f3b36ee6d8bcc95a63a37fbdab)\n", "before_files": [{"content": "__version__ = '4.0.0a0'\n\nfrom typing import Tuple  # noqa\n\nfrom . import hdrs\nfrom .client import (\n    BaseConnector,\n    ClientConnectionError,\n    ClientConnectorCertificateError,\n    ClientConnectorError,\n    ClientConnectorSSLError,\n    ClientError,\n    ClientHttpProxyError,\n    ClientOSError,\n    ClientPayloadError,\n    ClientProxyConnectionError,\n    ClientRequest,\n    ClientResponse,\n    ClientResponseError,\n    ClientSession,\n    ClientSSLError,\n    ClientTimeout,\n    ClientWebSocketResponse,\n    ContentTypeError,\n    Fingerprint,\n    InvalidURL,\n    RequestInfo,\n    ServerConnectionError,\n    ServerDisconnectedError,\n    ServerFingerprintMismatch,\n    ServerTimeoutError,\n    TCPConnector,\n    UnixConnector,\n    WSServerHandshakeError,\n    request,\n)\nfrom .cookiejar import CookieJar, DummyCookieJar\nfrom .formdata import FormData\nfrom .helpers import BasicAuth, ChainMapProxy\nfrom .http import (\n    HttpVersion,\n    HttpVersion10,\n    HttpVersion11,\n    WebSocketError,\n    WSCloseCode,\n    WSMessage,\n    WSMsgType,\n)\nfrom .multipart import (\n    BadContentDispositionHeader,\n    BadContentDispositionParam,\n    BodyPartReader,\n    MultipartReader,\n    MultipartWriter,\n    content_disposition_filename,\n    parse_content_disposition,\n)\nfrom .payload import (\n    PAYLOAD_REGISTRY,\n    AsyncIterablePayload,\n    BufferedReaderPayload,\n    BytesIOPayload,\n    BytesPayload,\n    IOBasePayload,\n    JsonPayload,\n    Payload,\n    StringIOPayload,\n    StringPayload,\n    TextIOPayload,\n    get_payload,\n    payload_type,\n)\nfrom .resolver import AsyncResolver, DefaultResolver, ThreadedResolver\nfrom .signals import Signal\nfrom .streams import (\n    EMPTY_PAYLOAD,\n    DataQueue,\n    EofStream,\n    FlowControlDataQueue,\n    StreamReader,\n)\nfrom .tracing import (\n    TraceConfig,\n    TraceConnectionCreateEndParams,\n    TraceConnectionCreateStartParams,\n    TraceConnectionQueuedEndParams,\n    TraceConnectionQueuedStartParams,\n    TraceConnectionReuseconnParams,\n    TraceDnsCacheHitParams,\n    TraceDnsCacheMissParams,\n    TraceDnsResolveHostEndParams,\n    TraceDnsResolveHostStartParams,\n    TraceRequestChunkSentParams,\n    TraceRequestEndParams,\n    TraceRequestExceptionParams,\n    TraceRequestRedirectParams,\n    TraceRequestStartParams,\n    TraceResponseChunkReceivedParams,\n)\n\n__all__ = (\n    'hdrs',\n    # client\n    'BaseConnector',\n    'ClientConnectionError',\n    'ClientConnectorCertificateError',\n    'ClientConnectorError',\n    'ClientConnectorSSLError',\n    'ClientError',\n    'ClientHttpProxyError',\n    'ClientOSError',\n    'ClientPayloadError',\n    'ClientProxyConnectionError',\n    'ClientResponse',\n    'ClientRequest',\n    'ClientResponseError',\n    'ClientSSLError',\n    'ClientSession',\n    'ClientTimeout',\n    'ClientWebSocketResponse',\n    'ContentTypeError',\n    'Fingerprint',\n    'InvalidURL',\n    'RequestInfo',\n    'ServerConnectionError',\n    'ServerDisconnectedError',\n    'ServerFingerprintMismatch',\n    'ServerTimeoutError',\n    'TCPConnector',\n    'UnixConnector',\n    'WSServerHandshakeError',\n    'request',\n    # cookiejar\n    'CookieJar',\n    'DummyCookieJar',\n    # formdata\n    'FormData',\n    # helpers\n    'BasicAuth',\n    'ChainMapProxy',\n    # http\n    'HttpVersion',\n    'HttpVersion10',\n    'HttpVersion11',\n    'WSMsgType',\n    'WSCloseCode',\n    'WSMessage',\n    'WebSocketError',\n    # multipart\n    'BadContentDispositionHeader',\n    'BadContentDispositionParam',\n    'BodyPartReader',\n    'MultipartReader',\n    'MultipartWriter',\n    'content_disposition_filename',\n    'parse_content_disposition',\n    # payload\n    'AsyncIterablePayload',\n    'BufferedReaderPayload',\n    'BytesIOPayload',\n    'BytesPayload',\n    'IOBasePayload',\n    'JsonPayload',\n    'PAYLOAD_REGISTRY',\n    'Payload',\n    'StringIOPayload',\n    'StringPayload',\n    'TextIOPayload',\n    'get_payload',\n    'payload_type',\n    # resolver\n    'AsyncResolver',\n    'DefaultResolver',\n    'ThreadedResolver',\n    # signals\n    'Signal',\n    'DataQueue',\n    'EMPTY_PAYLOAD',\n    'EofStream',\n    'FlowControlDataQueue',\n    'StreamReader',\n    # tracing\n    'TraceConfig',\n    'TraceConnectionCreateEndParams',\n    'TraceConnectionCreateStartParams',\n    'TraceConnectionQueuedEndParams',\n    'TraceConnectionQueuedStartParams',\n    'TraceConnectionReuseconnParams',\n    'TraceDnsCacheHitParams',\n    'TraceDnsCacheMissParams',\n    'TraceDnsResolveHostEndParams',\n    'TraceDnsResolveHostStartParams',\n    'TraceRequestChunkSentParams',\n    'TraceRequestEndParams',\n    'TraceRequestExceptionParams',\n    'TraceRequestRedirectParams',\n    'TraceRequestStartParams',\n    'TraceResponseChunkReceivedParams',\n)  # type: Tuple[str, ...]\n\ntry:\n    from .worker import GunicornWebWorker, GunicornUVLoopWebWorker  # noqa\n    __all__ += ('GunicornWebWorker', 'GunicornUVLoopWebWorker')\nexcept ImportError:  # pragma: no cover\n    pass\n", "path": "aiohttp/__init__.py"}], "after_files": [{"content": "__version__ = '4.0.0a0'\n\nfrom typing import Tuple  # noqa\n\nfrom . import hdrs\nfrom .client import (\n    BaseConnector,\n    ClientConnectionError,\n    ClientConnectorCertificateError,\n    ClientConnectorError,\n    ClientConnectorSSLError,\n    ClientError,\n    ClientHttpProxyError,\n    ClientOSError,\n    ClientPayloadError,\n    ClientProxyConnectionError,\n    ClientRequest,\n    ClientResponse,\n    ClientResponseError,\n    ClientSession,\n    ClientSSLError,\n    ClientTimeout,\n    ClientWebSocketResponse,\n    ContentTypeError,\n    Fingerprint,\n    InvalidURL,\n    RequestInfo,\n    ServerConnectionError,\n    ServerDisconnectedError,\n    ServerFingerprintMismatch,\n    ServerTimeoutError,\n    TCPConnector,\n    TooManyRedirects,\n    UnixConnector,\n    WSServerHandshakeError,\n    request,\n)\nfrom .cookiejar import CookieJar, DummyCookieJar\nfrom .formdata import FormData\nfrom .helpers import BasicAuth, ChainMapProxy\nfrom .http import (\n    HttpVersion,\n    HttpVersion10,\n    HttpVersion11,\n    WebSocketError,\n    WSCloseCode,\n    WSMessage,\n    WSMsgType,\n)\nfrom .multipart import (\n    BadContentDispositionHeader,\n    BadContentDispositionParam,\n    BodyPartReader,\n    MultipartReader,\n    MultipartWriter,\n    content_disposition_filename,\n    parse_content_disposition,\n)\nfrom .payload import (\n    PAYLOAD_REGISTRY,\n    AsyncIterablePayload,\n    BufferedReaderPayload,\n    BytesIOPayload,\n    BytesPayload,\n    IOBasePayload,\n    JsonPayload,\n    Payload,\n    StringIOPayload,\n    StringPayload,\n    TextIOPayload,\n    get_payload,\n    payload_type,\n)\nfrom .resolver import AsyncResolver, DefaultResolver, ThreadedResolver\nfrom .signals import Signal\nfrom .streams import (\n    EMPTY_PAYLOAD,\n    DataQueue,\n    EofStream,\n    FlowControlDataQueue,\n    StreamReader,\n)\nfrom .tracing import (\n    TraceConfig,\n    TraceConnectionCreateEndParams,\n    TraceConnectionCreateStartParams,\n    TraceConnectionQueuedEndParams,\n    TraceConnectionQueuedStartParams,\n    TraceConnectionReuseconnParams,\n    TraceDnsCacheHitParams,\n    TraceDnsCacheMissParams,\n    TraceDnsResolveHostEndParams,\n    TraceDnsResolveHostStartParams,\n    TraceRequestChunkSentParams,\n    TraceRequestEndParams,\n    TraceRequestExceptionParams,\n    TraceRequestRedirectParams,\n    TraceRequestStartParams,\n    TraceResponseChunkReceivedParams,\n)\n\n__all__ = (\n    'hdrs',\n    # client\n    'BaseConnector',\n    'ClientConnectionError',\n    'ClientConnectorCertificateError',\n    'ClientConnectorError',\n    'ClientConnectorSSLError',\n    'ClientError',\n    'ClientHttpProxyError',\n    'ClientOSError',\n    'ClientPayloadError',\n    'ClientProxyConnectionError',\n    'ClientResponse',\n    'ClientRequest',\n    'ClientResponseError',\n    'ClientSSLError',\n    'ClientSession',\n    'ClientTimeout',\n    'ClientWebSocketResponse',\n    'ContentTypeError',\n    'Fingerprint',\n    'InvalidURL',\n    'RequestInfo',\n    'ServerConnectionError',\n    'ServerDisconnectedError',\n    'ServerFingerprintMismatch',\n    'ServerTimeoutError',\n    'TCPConnector',\n    'TooManyRedirects',\n    'UnixConnector',\n    'WSServerHandshakeError',\n    'request',\n    # cookiejar\n    'CookieJar',\n    'DummyCookieJar',\n    # formdata\n    'FormData',\n    # helpers\n    'BasicAuth',\n    'ChainMapProxy',\n    # http\n    'HttpVersion',\n    'HttpVersion10',\n    'HttpVersion11',\n    'WSMsgType',\n    'WSCloseCode',\n    'WSMessage',\n    'WebSocketError',\n    # multipart\n    'BadContentDispositionHeader',\n    'BadContentDispositionParam',\n    'BodyPartReader',\n    'MultipartReader',\n    'MultipartWriter',\n    'content_disposition_filename',\n    'parse_content_disposition',\n    # payload\n    'AsyncIterablePayload',\n    'BufferedReaderPayload',\n    'BytesIOPayload',\n    'BytesPayload',\n    'IOBasePayload',\n    'JsonPayload',\n    'PAYLOAD_REGISTRY',\n    'Payload',\n    'StringIOPayload',\n    'StringPayload',\n    'TextIOPayload',\n    'get_payload',\n    'payload_type',\n    # resolver\n    'AsyncResolver',\n    'DefaultResolver',\n    'ThreadedResolver',\n    # signals\n    'Signal',\n    'DataQueue',\n    'EMPTY_PAYLOAD',\n    'EofStream',\n    'FlowControlDataQueue',\n    'StreamReader',\n    # tracing\n    'TraceConfig',\n    'TraceConnectionCreateEndParams',\n    'TraceConnectionCreateStartParams',\n    'TraceConnectionQueuedEndParams',\n    'TraceConnectionQueuedStartParams',\n    'TraceConnectionReuseconnParams',\n    'TraceDnsCacheHitParams',\n    'TraceDnsCacheMissParams',\n    'TraceDnsResolveHostEndParams',\n    'TraceDnsResolveHostStartParams',\n    'TraceRequestChunkSentParams',\n    'TraceRequestEndParams',\n    'TraceRequestExceptionParams',\n    'TraceRequestRedirectParams',\n    'TraceRequestStartParams',\n    'TraceResponseChunkReceivedParams',\n)  # type: Tuple[str, ...]\n\ntry:\n    from .worker import GunicornWebWorker, GunicornUVLoopWebWorker  # noqa\n    __all__ += ('GunicornWebWorker', 'GunicornUVLoopWebWorker')\nexcept ImportError:  # pragma: no cover\n    pass\n", "path": "aiohttp/__init__.py"}]}