about summary refs log tree commit diff
path: root/.venv/lib/python3.12/site-packages/requests-stubs
diff options
context:
space:
mode:
Diffstat (limited to '.venv/lib/python3.12/site-packages/requests-stubs')
-rw-r--r--.venv/lib/python3.12/site-packages/requests-stubs/METADATA.toml13
-rw-r--r--.venv/lib/python3.12/site-packages/requests-stubs/__init__.pyi39
-rw-r--r--.venv/lib/python3.12/site-packages/requests-stubs/__version__.pyi12
-rw-r--r--.venv/lib/python3.12/site-packages/requests-stubs/adapters.pyi109
-rw-r--r--.venv/lib/python3.12/site-packages/requests-stubs/api.pyi155
-rw-r--r--.venv/lib/python3.12/site-packages/requests-stubs/auth.pyi39
-rw-r--r--.venv/lib/python3.12/site-packages/requests-stubs/certs.pyi1
-rw-r--r--.venv/lib/python3.12/site-packages/requests-stubs/compat.pyi26
-rw-r--r--.venv/lib/python3.12/site-packages/requests-stubs/cookies.pyi62
-rw-r--r--.venv/lib/python3.12/site-packages/requests-stubs/exceptions.pyi42
-rw-r--r--.venv/lib/python3.12/site-packages/requests-stubs/help.pyi34
-rw-r--r--.venv/lib/python3.12/site-packages/requests-stubs/hooks.pyi6
-rw-r--r--.venv/lib/python3.12/site-packages/requests-stubs/models.pyi167
-rw-r--r--.venv/lib/python3.12/site-packages/requests-stubs/packages.pyi3
-rw-r--r--.venv/lib/python3.12/site-packages/requests-stubs/py.typed0
-rw-r--r--.venv/lib/python3.12/site-packages/requests-stubs/sessions.pyi316
-rw-r--r--.venv/lib/python3.12/site-packages/requests-stubs/status_codes.pyi3
-rw-r--r--.venv/lib/python3.12/site-packages/requests-stubs/structures.pyi25
-rw-r--r--.venv/lib/python3.12/site-packages/requests-stubs/utils.pyi70
19 files changed, 1122 insertions, 0 deletions
diff --git a/.venv/lib/python3.12/site-packages/requests-stubs/METADATA.toml b/.venv/lib/python3.12/site-packages/requests-stubs/METADATA.toml
new file mode 100644
index 00000000..a36e323e
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/requests-stubs/METADATA.toml
@@ -0,0 +1,13 @@
+version = "2.32.*"
+upstream_repository = "https://github.com/psf/requests"
+# requires a version of urllib3 with a py.typed file
+requires = ["urllib3>=2"]
+extra_description = """\
+    Note: `types-requests` has required `urllib3>=2` since v2.31.0.7. \
+    If you need to install `types-requests` into an environment \
+    that must also have `urllib3<2` installed into it, \
+    you will have to use `types-requests<2.31.0.7`.\
+    """
+
+[tool.stubtest]
+extras = ["socks"]
diff --git a/.venv/lib/python3.12/site-packages/requests-stubs/__init__.pyi b/.venv/lib/python3.12/site-packages/requests-stubs/__init__.pyi
new file mode 100644
index 00000000..199c59e9
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/requests-stubs/__init__.pyi
@@ -0,0 +1,39 @@
+from . import __version__ as version_mod, packages as packages, utils as utils
+from .api import (
+    delete as delete,
+    get as get,
+    head as head,
+    options as options,
+    patch as patch,
+    post as post,
+    put as put,
+    request as request,
+)
+from .exceptions import (
+    ConnectionError as ConnectionError,
+    ConnectTimeout as ConnectTimeout,
+    FileModeWarning as FileModeWarning,
+    HTTPError as HTTPError,
+    JSONDecodeError as JSONDecodeError,
+    ReadTimeout as ReadTimeout,
+    RequestException as RequestException,
+    Timeout as Timeout,
+    TooManyRedirects as TooManyRedirects,
+    URLRequired as URLRequired,
+)
+from .models import PreparedRequest as PreparedRequest, Request as Request, Response as Response
+from .sessions import Session as Session, session as session
+from .status_codes import codes as codes
+
+__author__ = version_mod.__author__
+__author_email__ = version_mod.__author_email__
+__build__ = version_mod.__build__
+__cake__ = version_mod.__cake__
+__copyright__ = version_mod.__copyright__
+__description__ = version_mod.__description__
+__license__ = version_mod.__license__
+__title__ = version_mod.__title__
+__url__ = version_mod.__url__
+__version__ = version_mod.__version__
+
+def check_compatibility(urllib3_version: str, chardet_version: str | None, charset_normalizer_version: str | None) -> None: ...
diff --git a/.venv/lib/python3.12/site-packages/requests-stubs/__version__.pyi b/.venv/lib/python3.12/site-packages/requests-stubs/__version__.pyi
new file mode 100644
index 00000000..05c93ebc
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/requests-stubs/__version__.pyi
@@ -0,0 +1,12 @@
+from typing import Final
+
+__title__: Final = "requests"
+__description__: Final[str]
+__url__: Final[str]
+__version__: Final[str]
+__build__: Final[int]
+__author__: Final[str]
+__author_email__: Final[str]
+__license__: Final[str]
+__copyright__: Final[str]
+__cake__: Final[str]
diff --git a/.venv/lib/python3.12/site-packages/requests-stubs/adapters.pyi b/.venv/lib/python3.12/site-packages/requests-stubs/adapters.pyi
new file mode 100644
index 00000000..2f8e4d75
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/requests-stubs/adapters.pyi
@@ -0,0 +1,109 @@
+from _typeshed import Incomplete
+from collections.abc import Mapping
+from ssl import SSLContext
+from typing import Literal, TypedDict
+from typing_extensions import NotRequired, deprecated
+
+import urllib3
+from urllib3.connectionpool import ConnectionPool
+from urllib3.contrib.socks import SOCKSProxyManager as SOCKSProxyManager
+from urllib3.exceptions import (
+    ConnectTimeoutError as ConnectTimeoutError,
+    MaxRetryError as MaxRetryError,
+    ProtocolError as ProtocolError,
+    ReadTimeoutError as ReadTimeoutError,
+    ResponseError as ResponseError,
+)
+from urllib3.poolmanager import PoolManager as PoolManager, proxy_from_url as proxy_from_url
+from urllib3.util.retry import Retry as Retry
+
+from .cookies import extract_cookies_to_jar as extract_cookies_to_jar
+from .exceptions import (
+    ConnectionError as ConnectionError,
+    ConnectTimeout as ConnectTimeout,
+    ProxyError as ProxyError,
+    ReadTimeout as ReadTimeout,
+    RetryError as RetryError,
+    SSLError as SSLError,
+)
+from .models import PreparedRequest, Response as Response
+from .structures import CaseInsensitiveDict as CaseInsensitiveDict
+from .utils import (
+    DEFAULT_CA_BUNDLE_PATH as DEFAULT_CA_BUNDLE_PATH,
+    _Uri,
+    get_auth_from_url as get_auth_from_url,
+    get_encoding_from_headers as get_encoding_from_headers,
+    prepend_scheme_if_needed as prepend_scheme_if_needed,
+    urldefragauth as urldefragauth,
+)
+
+# Arguments to urllib3 connection_from_host() functions (except pool_kwargs).
+class _HostParams(TypedDict):
+    host: str
+    scheme: str
+    port: int
+
+class _PoolKwargs(TypedDict):
+    ssl_context: NotRequired[SSLContext]
+    ca_certs: NotRequired[str]
+    ca_cert_dir: NotRequired[str]
+    cert_reqs: Literal["CERT_REQUIRED", "CERT_NONE"]
+    cert_file: NotRequired[str]
+    key_file: NotRequired[str]
+
+DEFAULT_POOLBLOCK: bool
+DEFAULT_POOLSIZE: int
+DEFAULT_RETRIES: int
+DEFAULT_POOL_TIMEOUT: float | None
+
+class BaseAdapter:
+    def __init__(self) -> None: ...
+    def send(
+        self,
+        request: PreparedRequest,
+        stream: bool = False,
+        timeout: None | float | tuple[float, float] | tuple[float, None] = None,
+        verify: bool | str = True,
+        cert: None | bytes | str | tuple[bytes | str, bytes | str] = None,
+        proxies: Mapping[str, str] | None = None,
+    ) -> Response: ...
+    def close(self) -> None: ...
+
+class HTTPAdapter(BaseAdapter):
+    __attrs__: Incomplete
+    max_retries: Retry
+    config: Incomplete
+    proxy_manager: Incomplete
+    def __init__(
+        self, pool_connections: int = 10, pool_maxsize: int = 10, max_retries: Retry | int | None = 0, pool_block: bool = False
+    ) -> None: ...
+    poolmanager: Incomplete
+    def init_poolmanager(self, connections, maxsize, block=False, **pool_kwargs): ...
+    def proxy_manager_for(self, proxy, **proxy_kwargs): ...
+    def cert_verify(self, conn, url, verify, cert): ...
+    def build_response(self, req: PreparedRequest, resp: urllib3.BaseHTTPResponse) -> Response: ...
+    def build_connection_pool_key_attributes(
+        self, request: PreparedRequest, verify: bool | str, cert: str | tuple[str, str] | None = None
+    ) -> tuple[_HostParams, _PoolKwargs]: ...
+    def get_connection_with_tls_context(
+        self,
+        request: PreparedRequest,
+        verify: bool | str | None,
+        proxies: Mapping[str, str] | None = None,
+        cert: tuple[str, str] | str | None = None,
+    ) -> ConnectionPool: ...
+    @deprecated("Use get_connection_with_tls_context() instead.")
+    def get_connection(self, url: _Uri, proxies: Mapping[str, str] | None = None) -> ConnectionPool: ...
+    def close(self): ...
+    def request_url(self, request, proxies): ...
+    def add_headers(self, request, **kwargs): ...
+    def proxy_headers(self, proxy): ...
+    def send(
+        self,
+        request: PreparedRequest,
+        stream: bool = False,
+        timeout: None | float | tuple[float, float] | tuple[float, None] = None,
+        verify: bool | str = True,
+        cert: None | bytes | str | tuple[bytes | str, bytes | str] = None,
+        proxies: Mapping[str, str] | None = None,
+    ) -> Response: ...
diff --git a/.venv/lib/python3.12/site-packages/requests-stubs/api.pyi b/.venv/lib/python3.12/site-packages/requests-stubs/api.pyi
new file mode 100644
index 00000000..02ecab01
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/requests-stubs/api.pyi
@@ -0,0 +1,155 @@
+from _typeshed import Incomplete
+from collections.abc import Mapping
+from http.cookiejar import CookieJar
+from typing_extensions import TypeAlias
+
+from .models import Response
+from .sessions import _Auth, _Cert, _Data, _Files, _HooksInput, _Params, _TextMapping, _Timeout, _Verify
+
+_HeadersMapping: TypeAlias = Mapping[str, str | bytes | None]
+
+def request(
+    method: str | bytes,
+    url: str | bytes,
+    *,
+    params: _Params | None = ...,
+    data: _Data | None = ...,
+    headers: _HeadersMapping | None = ...,
+    cookies: CookieJar | _TextMapping | None = ...,
+    files: _Files | None = ...,
+    auth: _Auth | None = ...,
+    timeout: _Timeout | None = ...,
+    allow_redirects: bool = ...,
+    proxies: _TextMapping | None = ...,
+    hooks: _HooksInput | None = ...,
+    stream: bool | None = ...,
+    verify: _Verify | None = ...,
+    cert: _Cert | None = ...,
+    json: Incomplete | None = ...,
+) -> Response: ...
+def get(
+    url: str | bytes,
+    params: _Params | None = None,
+    *,
+    data: _Data | None = ...,
+    headers: _HeadersMapping | None = ...,
+    cookies: CookieJar | _TextMapping | None = ...,
+    files: _Files | None = ...,
+    auth: _Auth | None = ...,
+    timeout: _Timeout | None = ...,
+    allow_redirects: bool = ...,
+    proxies: _TextMapping | None = ...,
+    hooks: _HooksInput | None = ...,
+    stream: bool | None = ...,
+    verify: _Verify | None = ...,
+    cert: _Cert | None = ...,
+    json: Incomplete | None = ...,
+) -> Response: ...
+def options(
+    url: str | bytes,
+    *,
+    params: _Params | None = ...,
+    data: _Data | None = ...,
+    headers: _HeadersMapping | None = ...,
+    cookies: CookieJar | _TextMapping | None = ...,
+    files: _Files | None = ...,
+    auth: _Auth | None = ...,
+    timeout: _Timeout | None = ...,
+    allow_redirects: bool = ...,
+    proxies: _TextMapping | None = ...,
+    hooks: _HooksInput | None = ...,
+    stream: bool | None = ...,
+    verify: _Verify | None = ...,
+    cert: _Cert | None = ...,
+    json: Incomplete | None = ...,
+) -> Response: ...
+def head(
+    url: str | bytes,
+    *,
+    params: _Params | None = ...,
+    data: _Data | None = ...,
+    headers: _HeadersMapping | None = ...,
+    cookies: CookieJar | _TextMapping | None = ...,
+    files: _Files | None = ...,
+    auth: _Auth | None = ...,
+    timeout: _Timeout | None = ...,
+    allow_redirects: bool = ...,
+    proxies: _TextMapping | None = ...,
+    hooks: _HooksInput | None = ...,
+    stream: bool | None = ...,
+    verify: _Verify | None = ...,
+    cert: _Cert | None = ...,
+    json: Incomplete | None = ...,
+) -> Response: ...
+def post(
+    url: str | bytes,
+    data: _Data | None = None,
+    json: Incomplete | None = None,
+    *,
+    params: _Params | None = ...,
+    headers: _HeadersMapping | None = ...,
+    cookies: CookieJar | _TextMapping | None = ...,
+    files: _Files | None = ...,
+    auth: _Auth | None = ...,
+    timeout: _Timeout | None = ...,
+    allow_redirects: bool = ...,
+    proxies: _TextMapping | None = ...,
+    hooks: _HooksInput | None = ...,
+    stream: bool | None = ...,
+    verify: _Verify | None = ...,
+    cert: _Cert | None = ...,
+) -> Response: ...
+def put(
+    url: str | bytes,
+    data: _Data | None = None,
+    *,
+    params: _Params | None = ...,
+    headers: _HeadersMapping | None = ...,
+    cookies: CookieJar | _TextMapping | None = ...,
+    files: _Files | None = ...,
+    auth: _Auth | None = ...,
+    timeout: _Timeout | None = ...,
+    allow_redirects: bool = ...,
+    proxies: _TextMapping | None = ...,
+    hooks: _HooksInput | None = ...,
+    stream: bool | None = ...,
+    verify: _Verify | None = ...,
+    cert: _Cert | None = ...,
+    json: Incomplete | None = ...,
+) -> Response: ...
+def patch(
+    url: str | bytes,
+    data: _Data | None = None,
+    *,
+    params: _Params | None = ...,
+    headers: _HeadersMapping | None = ...,
+    cookies: CookieJar | _TextMapping | None = ...,
+    files: _Files | None = ...,
+    auth: _Auth | None = ...,
+    timeout: _Timeout | None = ...,
+    allow_redirects: bool = ...,
+    proxies: _TextMapping | None = ...,
+    hooks: _HooksInput | None = ...,
+    stream: bool | None = ...,
+    verify: _Verify | None = ...,
+    cert: _Cert | None = ...,
+    json: Incomplete | None = ...,
+) -> Response: ...
+def delete(
+    url: str | bytes,
+    *,
+    params: _Params | None = ...,
+    data: _Data | None = ...,
+    headers: _HeadersMapping | None = ...,
+    cookies: CookieJar | _TextMapping | None = ...,
+    files: _Files | None = ...,
+    auth: _Auth | None = ...,
+    timeout: _Timeout | None = ...,
+    allow_redirects: bool = ...,
+    proxies: _TextMapping | None = ...,
+    hooks: _HooksInput | None = ...,
+    stream: bool | None = ...,
+    verify: _Verify | None = ...,
+    cert: _Cert | None = ...,
+    json: Incomplete | None = ...,
+) -> Response: ...
diff --git a/.venv/lib/python3.12/site-packages/requests-stubs/auth.pyi b/.venv/lib/python3.12/site-packages/requests-stubs/auth.pyi
new file mode 100644
index 00000000..21ef4abf
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/requests-stubs/auth.pyi
@@ -0,0 +1,39 @@
+from typing import Any
+
+from . import cookies, models, utils
+
+extract_cookies_to_jar = cookies.extract_cookies_to_jar
+parse_dict_header = utils.parse_dict_header
+to_native_string = utils.to_native_string
+
+CONTENT_TYPE_FORM_URLENCODED: Any
+CONTENT_TYPE_MULTI_PART: Any
+
+def _basic_auth_str(username: bytes | str, password: bytes | str) -> str: ...
+
+class AuthBase:
+    def __call__(self, r: models.PreparedRequest) -> models.PreparedRequest: ...
+
+class HTTPBasicAuth(AuthBase):
+    username: bytes | str
+    password: bytes | str
+    def __init__(self, username: bytes | str, password: bytes | str) -> None: ...
+    def __call__(self, r): ...
+
+class HTTPProxyAuth(HTTPBasicAuth):
+    def __call__(self, r): ...
+
+class HTTPDigestAuth(AuthBase):
+    username: bytes | str
+    password: bytes | str
+    last_nonce: Any
+    nonce_count: Any
+    chal: Any
+    pos: Any
+    num_401_calls: Any
+    def __init__(self, username: bytes | str, password: bytes | str) -> None: ...
+    def build_digest_header(self, method, url): ...
+    def handle_redirect(self, r, **kwargs): ...
+    def handle_401(self, r, **kwargs): ...
+    def __call__(self, r): ...
+    def init_per_thread_state(self) -> None: ...
diff --git a/.venv/lib/python3.12/site-packages/requests-stubs/certs.pyi b/.venv/lib/python3.12/site-packages/requests-stubs/certs.pyi
new file mode 100644
index 00000000..7c5857d6
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/requests-stubs/certs.pyi
@@ -0,0 +1 @@
+# no public data
diff --git a/.venv/lib/python3.12/site-packages/requests-stubs/compat.pyi b/.venv/lib/python3.12/site-packages/requests-stubs/compat.pyi
new file mode 100644
index 00000000..2494dde8
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/requests-stubs/compat.pyi
@@ -0,0 +1,26 @@
+from builtins import bytes as bytes, str as str
+from collections import OrderedDict as OrderedDict
+from typing import Literal
+from typing_extensions import TypeAlias
+from urllib.parse import (
+    quote as quote,
+    quote_plus as quote_plus,
+    unquote as unquote,
+    unquote_plus as unquote_plus,
+    urldefrag as urldefrag,
+    urlencode as urlencode,
+    urljoin as urljoin,
+    urlparse as urlparse,
+    urlsplit as urlsplit,
+    urlunparse as urlunparse,
+)
+from urllib.request import getproxies as getproxies, parse_http_list as parse_http_list, proxy_bypass as proxy_bypass
+
+is_py2: Literal[False]
+is_py3: Literal[True]
+has_simplejson: bool
+
+builtin_str: TypeAlias = str  # noqa: Y042
+basestring: tuple[type, ...]
+numeric_types: tuple[type, ...]
+integer_types: tuple[type, ...]
diff --git a/.venv/lib/python3.12/site-packages/requests-stubs/cookies.pyi b/.venv/lib/python3.12/site-packages/requests-stubs/cookies.pyi
new file mode 100644
index 00000000..dc0138d8
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/requests-stubs/cookies.pyi
@@ -0,0 +1,62 @@
+from _typeshed import SupportsKeysAndGetItem
+from collections.abc import Iterator, MutableMapping
+from http.cookiejar import Cookie, CookieJar, CookiePolicy
+from http.cookies import Morsel
+from typing import Any
+
+class MockRequest:
+    type: Any
+    def __init__(self, request) -> None: ...
+    def get_type(self): ...
+    def get_host(self): ...
+    def get_origin_req_host(self): ...
+    def get_full_url(self): ...
+    def is_unverifiable(self): ...
+    def has_header(self, name): ...
+    def get_header(self, name, default=None): ...
+    def add_header(self, key, val): ...
+    def add_unredirected_header(self, name, value): ...
+    def get_new_headers(self): ...
+    @property
+    def unverifiable(self): ...
+    @property
+    def origin_req_host(self): ...
+    @property
+    def host(self): ...
+
+class MockResponse:
+    def __init__(self, headers) -> None: ...
+    def info(self): ...
+    def getheaders(self, name): ...
+
+def extract_cookies_to_jar(jar, request, response): ...
+def get_cookie_header(jar, request): ...
+def remove_cookie_by_name(cookiejar, name, domain=None, path=None): ...
+
+class CookieConflictError(RuntimeError): ...
+
+class RequestsCookieJar(CookieJar, MutableMapping[str, str]):  # type: ignore[misc] # conflicting __iter__ in the base classes
+    def get(self, name: str, default: str | None = None, domain: str | None = None, path: str | None = None) -> str | None: ...  # type: ignore[override]
+    def set(self, name: str, value: str | Morsel[dict[str, str]], **kwargs) -> Cookie | None: ...
+    def iterkeys(self) -> Iterator[str]: ...
+    def keys(self) -> list[str]: ...  # type: ignore[override]
+    def itervalues(self) -> Iterator[str]: ...
+    def values(self) -> list[str]: ...  # type: ignore[override]
+    def iteritems(self) -> Iterator[tuple[str, str]]: ...
+    def items(self) -> list[tuple[str, str]]: ...  # type: ignore[override]
+    def list_domains(self) -> list[str]: ...
+    def list_paths(self) -> list[str]: ...
+    def multiple_domains(self) -> bool: ...
+    def get_dict(self, domain: str | None = None, path: str | None = None) -> dict[str, str]: ...
+    def __getitem__(self, name: str) -> str: ...
+    def __setitem__(self, name: str, value: str | Morsel[dict[str, str]]) -> None: ...
+    def __delitem__(self, name: str) -> None: ...
+    def set_cookie(self, cookie: Cookie, *args, **kwargs): ...
+    def update(self, other: CookieJar | SupportsKeysAndGetItem[str, str]): ...  # type: ignore[override]
+    def copy(self) -> RequestsCookieJar: ...
+    def get_policy(self) -> CookiePolicy: ...
+
+def create_cookie(name, value, **kwargs): ...
+def morsel_to_cookie(morsel): ...
+def cookiejar_from_dict(cookie_dict, cookiejar=None, overwrite=True): ...
+def merge_cookies(cookiejar, cookies): ...
diff --git a/.venv/lib/python3.12/site-packages/requests-stubs/exceptions.pyi b/.venv/lib/python3.12/site-packages/requests-stubs/exceptions.pyi
new file mode 100644
index 00000000..130bce72
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/requests-stubs/exceptions.pyi
@@ -0,0 +1,42 @@
+from typing import Any
+
+from urllib3.exceptions import HTTPError as BaseHTTPError
+
+from .models import Request, Response
+from .sessions import PreparedRequest
+
+class RequestException(OSError):
+    response: Response | None
+    request: Request | PreparedRequest | None
+    def __init__(
+        self, *args: object, request: Request | PreparedRequest | None = ..., response: Response | None = ...
+    ) -> None: ...
+
+class InvalidJSONError(RequestException): ...
+class JSONDecodeError(InvalidJSONError): ...
+
+class HTTPError(RequestException):
+    request: Request | PreparedRequest | Any
+    response: Response | Any
+
+class ConnectionError(RequestException): ...
+class ProxyError(ConnectionError): ...
+class SSLError(ConnectionError): ...
+class Timeout(RequestException): ...
+class ConnectTimeout(ConnectionError, Timeout): ...
+class ReadTimeout(Timeout): ...
+class URLRequired(RequestException): ...
+class TooManyRedirects(RequestException): ...
+class MissingSchema(RequestException, ValueError): ...
+class InvalidSchema(RequestException, ValueError): ...
+class InvalidURL(RequestException, ValueError): ...
+class InvalidHeader(RequestException, ValueError): ...
+class InvalidProxyURL(InvalidURL): ...
+class ChunkedEncodingError(RequestException): ...
+class ContentDecodingError(RequestException, BaseHTTPError): ...
+class StreamConsumedError(RequestException, TypeError): ...
+class RetryError(RequestException): ...
+class UnrewindableBodyError(RequestException): ...
+class RequestsWarning(Warning): ...
+class FileModeWarning(RequestsWarning, DeprecationWarning): ...
+class RequestsDependencyWarning(RequestsWarning): ...
diff --git a/.venv/lib/python3.12/site-packages/requests-stubs/help.pyi b/.venv/lib/python3.12/site-packages/requests-stubs/help.pyi
new file mode 100644
index 00000000..f36d62ff
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/requests-stubs/help.pyi
@@ -0,0 +1,34 @@
+from typing import TypedDict
+
+class _VersionDict(TypedDict):
+    version: str
+
+class _OptionalVersionDict(TypedDict):
+    version: str | None
+
+class _PlatformDict(TypedDict):
+    system: str
+    release: str
+
+class _ImplementationDict(_VersionDict):
+    name: str
+
+class _PyOpenSSLDict(_OptionalVersionDict):
+    openssl_version: str
+
+class _InfoDict(TypedDict):
+    platform: _PlatformDict
+    implementation: _ImplementationDict
+    system_ssl: _VersionDict
+    using_pyopenssl: bool
+    using_charset_normalizer: bool
+    pyOpenSSL: _PyOpenSSLDict
+    urllib3: _VersionDict
+    chardet: _OptionalVersionDict
+    charset_normalizer: _OptionalVersionDict
+    cryptography: _VersionDict
+    idna: _VersionDict
+    requests: _VersionDict
+
+def info() -> _InfoDict: ...
+def main() -> None: ...
diff --git a/.venv/lib/python3.12/site-packages/requests-stubs/hooks.pyi b/.venv/lib/python3.12/site-packages/requests-stubs/hooks.pyi
new file mode 100644
index 00000000..f706016c
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/requests-stubs/hooks.pyi
@@ -0,0 +1,6 @@
+from typing import Any
+
+HOOKS: Any
+
+def default_hooks(): ...
+def dispatch_hook(key, hooks, hook_data, **kwargs): ...
diff --git a/.venv/lib/python3.12/site-packages/requests-stubs/models.pyi b/.venv/lib/python3.12/site-packages/requests-stubs/models.pyi
new file mode 100644
index 00000000..d95a7382
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/requests-stubs/models.pyi
@@ -0,0 +1,167 @@
+import datetime
+from _typeshed import Incomplete, MaybeNone, Unused
+from collections.abc import Callable, Iterator
+from json import JSONDecoder
+from typing import Any
+from typing_extensions import Self
+
+from urllib3 import exceptions as urllib3_exceptions, fields, filepost, util
+from urllib3.response import HTTPResponse
+
+from . import auth, cookies, exceptions, hooks, status_codes, utils
+from .adapters import HTTPAdapter
+from .cookies import RequestsCookieJar
+from .structures import CaseInsensitiveDict as CaseInsensitiveDict
+
+default_hooks = hooks.default_hooks
+HTTPBasicAuth = auth.HTTPBasicAuth
+cookiejar_from_dict = cookies.cookiejar_from_dict
+get_cookie_header = cookies.get_cookie_header
+RequestField = fields.RequestField
+encode_multipart_formdata = filepost.encode_multipart_formdata
+parse_url = util.parse_url
+DecodeError = urllib3_exceptions.DecodeError
+ReadTimeoutError = urllib3_exceptions.ReadTimeoutError
+ProtocolError = urllib3_exceptions.ProtocolError
+LocationParseError = urllib3_exceptions.LocationParseError
+HTTPError = exceptions.HTTPError
+MissingSchema = exceptions.MissingSchema
+InvalidURL = exceptions.InvalidURL
+ChunkedEncodingError = exceptions.ChunkedEncodingError
+ContentDecodingError = exceptions.ContentDecodingError
+ConnectionError = exceptions.ConnectionError
+StreamConsumedError = exceptions.StreamConsumedError
+guess_filename = utils.guess_filename
+get_auth_from_url = utils.get_auth_from_url
+requote_uri = utils.requote_uri
+stream_decode_response_unicode = utils.stream_decode_response_unicode
+to_key_val_list = utils.to_key_val_list
+parse_header_links = utils.parse_header_links
+iter_slices = utils.iter_slices
+guess_json_utf = utils.guess_json_utf
+super_len = utils.super_len
+to_native_string = utils.to_native_string
+codes = status_codes.codes
+
+REDIRECT_STATI: Incomplete
+DEFAULT_REDIRECT_LIMIT: Incomplete
+CONTENT_CHUNK_SIZE: Incomplete
+ITER_CHUNK_SIZE: Incomplete
+
+class RequestEncodingMixin:
+    @property
+    def path_url(self) -> str: ...
+
+class RequestHooksMixin:
+    def register_hook(self, event, hook): ...
+    def deregister_hook(self, event, hook): ...
+
+class Request(RequestHooksMixin):
+    hooks: Incomplete
+    method: Incomplete
+    url: Incomplete
+    headers: Incomplete
+    files: Incomplete
+    data: Incomplete
+    json: Incomplete
+    params: Incomplete
+    auth: Incomplete
+    cookies: Incomplete
+    def __init__(
+        self,
+        method=None,
+        url=None,
+        headers=None,
+        files=None,
+        data=None,
+        params=None,
+        auth=None,
+        cookies=None,
+        hooks=None,
+        json=None,
+    ) -> None: ...
+    def prepare(self) -> PreparedRequest: ...
+
+class PreparedRequest(RequestEncodingMixin, RequestHooksMixin):
+    method: str | None
+    url: str | None
+    headers: CaseInsensitiveDict[str]
+    body: bytes | str | None
+    hooks: Incomplete
+    def __init__(self) -> None: ...
+    def prepare(
+        self,
+        method=None,
+        url=None,
+        headers=None,
+        files=None,
+        data=None,
+        params=None,
+        auth=None,
+        cookies=None,
+        hooks=None,
+        json=None,
+    ) -> None: ...
+    def copy(self) -> PreparedRequest: ...
+    def prepare_method(self, method) -> None: ...
+    def prepare_url(self, url, params) -> None: ...
+    def prepare_headers(self, headers) -> None: ...
+    def prepare_body(self, data, files, json=None) -> None: ...
+    def prepare_content_length(self, body: bytes | str | None) -> None: ...
+    def prepare_auth(self, auth, url="") -> None: ...
+    def prepare_cookies(self, cookies) -> None: ...
+    def prepare_hooks(self, hooks) -> None: ...
+
+class Response:
+    __attrs__: Incomplete
+    _content: bytes | None  # undocumented
+    status_code: int
+    headers: CaseInsensitiveDict[str]
+    raw: HTTPResponse | MaybeNone
+    url: str
+    encoding: str | None
+    history: list[Response]
+    reason: str
+    cookies: RequestsCookieJar
+    elapsed: datetime.timedelta
+    request: PreparedRequest
+    connection: HTTPAdapter
+    def __init__(self) -> None: ...
+    def __bool__(self) -> bool: ...
+    def __nonzero__(self) -> bool: ...
+    def __iter__(self) -> Iterator[bytes]: ...
+    def __enter__(self) -> Self: ...
+    def __exit__(self, *args: Unused) -> None: ...
+    @property
+    def next(self) -> PreparedRequest | None: ...
+    @property
+    def ok(self) -> bool: ...
+    @property
+    def is_redirect(self) -> bool: ...
+    @property
+    def is_permanent_redirect(self) -> bool: ...
+    @property
+    def apparent_encoding(self) -> str: ...
+    def iter_content(self, chunk_size: int | None = 1, decode_unicode: bool = False) -> Iterator[Incomplete]: ...
+    def iter_lines(
+        self, chunk_size: int | None = 512, decode_unicode: bool = False, delimiter: str | bytes | None = None
+    ) -> Iterator[Incomplete]: ...
+    @property
+    def content(self) -> bytes | MaybeNone: ...
+    @property
+    def text(self) -> str: ...
+    def json(
+        self,
+        *,
+        cls: type[JSONDecoder] | None = ...,
+        object_hook: Callable[[dict[Any, Any]], Any] | None = ...,
+        parse_float: Callable[[str], Any] | None = ...,
+        parse_int: Callable[[str], Any] | None = ...,
+        parse_constant: Callable[[str], Any] | None = ...,
+        object_pairs_hook: Callable[[list[tuple[Any, Any]]], Any] | None = ...,
+        **kwds: Any,
+    ) -> Any: ...
+    @property
+    def links(self) -> dict[Incomplete, Incomplete]: ...
+    def raise_for_status(self) -> None: ...
+    def close(self) -> None: ...
diff --git a/.venv/lib/python3.12/site-packages/requests-stubs/packages.pyi b/.venv/lib/python3.12/site-packages/requests-stubs/packages.pyi
new file mode 100644
index 00000000..22281ce4
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/requests-stubs/packages.pyi
@@ -0,0 +1,3 @@
+# requests also imports urllib3, idna, and chardet below
+# requests.packages. The stubs don't reflect that and it's recommended to
+# import these packages directly if needed.
diff --git a/.venv/lib/python3.12/site-packages/requests-stubs/py.typed b/.venv/lib/python3.12/site-packages/requests-stubs/py.typed
new file mode 100644
index 00000000..e69de29b
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/requests-stubs/py.typed
diff --git a/.venv/lib/python3.12/site-packages/requests-stubs/sessions.pyi b/.venv/lib/python3.12/site-packages/requests-stubs/sessions.pyi
new file mode 100644
index 00000000..5427c520
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/requests-stubs/sessions.pyi
@@ -0,0 +1,316 @@
+from _typeshed import Incomplete, SupportsItems, SupportsRead, Unused
+from collections.abc import Callable, Iterable, Mapping, MutableMapping
+from typing import Any, TypedDict
+from typing_extensions import Self, TypeAlias
+
+from urllib3._collections import RecentlyUsedContainer
+
+from . import adapters, auth as _auth, compat, cookies, exceptions, hooks, models, status_codes, utils
+from .models import Response
+from .structures import CaseInsensitiveDict as CaseInsensitiveDict
+
+_BaseAdapter: TypeAlias = adapters.BaseAdapter
+OrderedDict = compat.OrderedDict
+cookiejar_from_dict = cookies.cookiejar_from_dict
+extract_cookies_to_jar = cookies.extract_cookies_to_jar
+RequestsCookieJar = cookies.RequestsCookieJar
+merge_cookies = cookies.merge_cookies
+Request = models.Request
+PreparedRequest = models.PreparedRequest
+DEFAULT_REDIRECT_LIMIT = models.DEFAULT_REDIRECT_LIMIT
+default_hooks = hooks.default_hooks
+dispatch_hook = hooks.dispatch_hook
+to_key_val_list = utils.to_key_val_list
+default_headers = utils.default_headers
+to_native_string = utils.to_native_string
+TooManyRedirects = exceptions.TooManyRedirects
+InvalidSchema = exceptions.InvalidSchema
+ChunkedEncodingError = exceptions.ChunkedEncodingError
+ContentDecodingError = exceptions.ContentDecodingError
+HTTPAdapter = adapters.HTTPAdapter
+requote_uri = utils.requote_uri
+get_environ_proxies = utils.get_environ_proxies
+get_netrc_auth = utils.get_netrc_auth
+should_bypass_proxies = utils.should_bypass_proxies
+get_auth_from_url = utils.get_auth_from_url
+codes = status_codes.codes
+REDIRECT_STATI = models.REDIRECT_STATI
+
+def preferred_clock() -> float: ...
+def merge_setting(request_setting, session_setting, dict_class=...): ...
+def merge_hooks(request_hooks, session_hooks, dict_class=...): ...
+
+class SessionRedirectMixin:
+    def resolve_redirects(
+        self,
+        resp,
+        req,
+        stream: bool = False,
+        timeout: Incomplete | None = None,
+        verify: bool = True,
+        cert: Incomplete | None = None,
+        proxies: Incomplete | None = None,
+        yield_requests: bool = False,
+        **adapter_kwargs,
+    ): ...
+    def rebuild_auth(self, prepared_request, response): ...
+    def rebuild_proxies(self, prepared_request, proxies): ...
+    def should_strip_auth(self, old_url, new_url): ...
+    def rebuild_method(self, prepared_request: PreparedRequest, response: Response) -> None: ...
+    def get_redirect_target(self, resp: Response) -> str | None: ...
+
+_Data: TypeAlias = (
+    # used in requests.models.PreparedRequest.prepare_body
+    #
+    # case: is_stream
+    # see requests.adapters.HTTPAdapter.send
+    # will be sent directly to http.HTTPConnection.send(...) (through urllib3)
+    Iterable[bytes]
+    # case: not is_stream
+    # will be modified before being sent to urllib3.HTTPConnectionPool.urlopen(body=...)
+    # see requests.models.RequestEncodingMixin._encode_params
+    # see requests.models.RequestEncodingMixin._encode_files
+    # note that keys&values are converted from Any to str by urllib.parse.urlencode
+    | str
+    | bytes
+    | SupportsRead[str | bytes]
+    | list[tuple[Any, Any]]
+    | tuple[tuple[Any, Any], ...]
+    | Mapping[Any, Any]
+)
+_Auth: TypeAlias = tuple[str, str] | _auth.AuthBase | Callable[[PreparedRequest], PreparedRequest]
+_Cert: TypeAlias = str | tuple[str, str]
+# Files is passed to requests.utils.to_key_val_list()
+_FileName: TypeAlias = str | None
+_FileContent: TypeAlias = SupportsRead[str | bytes] | str | bytes
+_FileContentType: TypeAlias = str
+_FileCustomHeaders: TypeAlias = Mapping[str, str]
+_FileSpecTuple2: TypeAlias = tuple[_FileName, _FileContent]
+_FileSpecTuple3: TypeAlias = tuple[_FileName, _FileContent, _FileContentType]
+_FileSpecTuple4: TypeAlias = tuple[_FileName, _FileContent, _FileContentType, _FileCustomHeaders]
+_FileSpec: TypeAlias = _FileContent | _FileSpecTuple2 | _FileSpecTuple3 | _FileSpecTuple4
+_Files: TypeAlias = Mapping[str, _FileSpec] | Iterable[tuple[str, _FileSpec]]
+_Hook: TypeAlias = Callable[[Response], Any]
+_HooksInput: TypeAlias = Mapping[str, Iterable[_Hook] | _Hook]
+
+_ParamsMappingKeyType: TypeAlias = str | bytes | int | float
+_ParamsMappingValueType: TypeAlias = str | bytes | int | float | Iterable[str | bytes | int | float] | None
+_Params: TypeAlias = (
+    SupportsItems[_ParamsMappingKeyType, _ParamsMappingValueType]
+    | tuple[_ParamsMappingKeyType, _ParamsMappingValueType]
+    | Iterable[tuple[_ParamsMappingKeyType, _ParamsMappingValueType]]
+    | str
+    | bytes
+)
+_TextMapping: TypeAlias = MutableMapping[str, str]
+_HeadersUpdateMapping: TypeAlias = Mapping[str, str | bytes | None]
+_Timeout: TypeAlias = float | tuple[float, float] | tuple[float, None]
+_Verify: TypeAlias = bool | str
+
+class _Settings(TypedDict):
+    verify: _Verify | None
+    proxies: _TextMapping
+    stream: bool
+    cert: _Cert | None
+
+class Session(SessionRedirectMixin):
+    __attrs__: Any
+    # See https://github.com/psf/requests/issues/5020#issuecomment-989082461:
+    # requests sets this as a CaseInsensitiveDict, but users may set it to any MutableMapping
+    headers: MutableMapping[str, str | bytes]
+    auth: _Auth | None
+    proxies: _TextMapping
+    # Don't complain if:
+    #   - value is assumed to be a list (which it is by default)
+    #   - a _Hook is assigned directly, without wrapping it in a list (also works)
+    hooks: dict[str, list[_Hook] | Any]
+    params: _Params
+    stream: bool
+    verify: _Verify | None
+    cert: _Cert | None
+    max_redirects: int
+    trust_env: bool
+    cookies: RequestsCookieJar
+    adapters: MutableMapping[str, adapters.BaseAdapter]
+    redirect_cache: RecentlyUsedContainer[Any, Any]
+    def __init__(self) -> None: ...
+    def __enter__(self) -> Self: ...
+    def __exit__(self, *args: Unused) -> None: ...
+    def prepare_request(self, request: Request) -> PreparedRequest: ...
+    def request(
+        self,
+        method: str | bytes,
+        url: str | bytes,
+        params: _Params | None = None,
+        data: _Data | None = None,
+        headers: _HeadersUpdateMapping | None = None,
+        cookies: None | RequestsCookieJar | _TextMapping = None,
+        files: _Files | None = None,
+        auth: _Auth | None = None,
+        timeout: _Timeout | None = None,
+        allow_redirects: bool = True,
+        proxies: _TextMapping | None = None,
+        hooks: _HooksInput | None = None,
+        stream: bool | None = None,
+        verify: _Verify | None = None,
+        cert: _Cert | None = None,
+        json: Incomplete | None = None,
+    ) -> Response: ...
+    def get(
+        self,
+        url: str | bytes,
+        *,
+        params: _Params | None = ...,
+        data: _Data | None = ...,
+        headers: _HeadersUpdateMapping | None = ...,
+        cookies: RequestsCookieJar | _TextMapping | None = ...,
+        files: _Files | None = ...,
+        auth: _Auth | None = ...,
+        timeout: _Timeout | None = ...,
+        allow_redirects: bool = ...,
+        proxies: _TextMapping | None = ...,
+        hooks: _HooksInput | None = ...,
+        stream: bool | None = ...,
+        verify: _Verify | None = ...,
+        cert: _Cert | None = ...,
+        json: Incomplete | None = ...,
+    ) -> Response: ...
+    def options(
+        self,
+        url: str | bytes,
+        *,
+        params: _Params | None = ...,
+        data: _Data | None = ...,
+        headers: _HeadersUpdateMapping | None = ...,
+        cookies: RequestsCookieJar | _TextMapping | None = ...,
+        files: _Files | None = ...,
+        auth: _Auth | None = ...,
+        timeout: _Timeout | None = ...,
+        allow_redirects: bool = ...,
+        proxies: _TextMapping | None = ...,
+        hooks: _HooksInput | None = ...,
+        stream: bool | None = ...,
+        verify: _Verify | None = ...,
+        cert: _Cert | None = ...,
+        json: Incomplete | None = ...,
+    ) -> Response: ...
+    def head(
+        self,
+        url: str | bytes,
+        *,
+        params: _Params | None = ...,
+        data: _Data | None = ...,
+        headers: _HeadersUpdateMapping | None = ...,
+        cookies: RequestsCookieJar | _TextMapping | None = ...,
+        files: _Files | None = ...,
+        auth: _Auth | None = ...,
+        timeout: _Timeout | None = ...,
+        allow_redirects: bool = ...,
+        proxies: _TextMapping | None = ...,
+        hooks: _HooksInput | None = ...,
+        stream: bool | None = ...,
+        verify: _Verify | None = ...,
+        cert: _Cert | None = ...,
+        json: Incomplete | None = ...,
+    ) -> Response: ...
+    def post(
+        self,
+        url: str | bytes,
+        data: _Data | None = None,
+        json: Incomplete | None = None,
+        *,
+        params: _Params | None = ...,
+        headers: _HeadersUpdateMapping | None = ...,
+        cookies: RequestsCookieJar | _TextMapping | None = ...,
+        files: _Files | None = ...,
+        auth: _Auth | None = ...,
+        timeout: _Timeout | None = ...,
+        allow_redirects: bool = ...,
+        proxies: _TextMapping | None = ...,
+        hooks: _HooksInput | None = ...,
+        stream: bool | None = ...,
+        verify: _Verify | None = ...,
+        cert: _Cert | None = ...,
+    ) -> Response: ...
+    def put(
+        self,
+        url: str | bytes,
+        data: _Data | None = None,
+        *,
+        params: _Params | None = ...,
+        headers: _HeadersUpdateMapping | None = ...,
+        cookies: RequestsCookieJar | _TextMapping | None = ...,
+        files: _Files | None = ...,
+        auth: _Auth | None = ...,
+        timeout: _Timeout | None = ...,
+        allow_redirects: bool = ...,
+        proxies: _TextMapping | None = ...,
+        hooks: _HooksInput | None = ...,
+        stream: bool | None = ...,
+        verify: _Verify | None = ...,
+        cert: _Cert | None = ...,
+        json: Incomplete | None = ...,
+    ) -> Response: ...
+    def patch(
+        self,
+        url: str | bytes,
+        data: _Data | None = None,
+        *,
+        params: _Params | None = ...,
+        headers: _HeadersUpdateMapping | None = ...,
+        cookies: RequestsCookieJar | _TextMapping | None = ...,
+        files: _Files | None = ...,
+        auth: _Auth | None = ...,
+        timeout: _Timeout | None = ...,
+        allow_redirects: bool = ...,
+        proxies: _TextMapping | None = ...,
+        hooks: _HooksInput | None = ...,
+        stream: bool | None = ...,
+        verify: _Verify | None = ...,
+        cert: _Cert | None = ...,
+        json: Incomplete | None = ...,
+    ) -> Response: ...
+    def delete(
+        self,
+        url: str | bytes,
+        *,
+        params: _Params | None = ...,
+        data: _Data | None = ...,
+        headers: _HeadersUpdateMapping | None = ...,
+        cookies: RequestsCookieJar | _TextMapping | None = ...,
+        files: _Files | None = ...,
+        auth: _Auth | None = ...,
+        timeout: _Timeout | None = ...,
+        allow_redirects: bool = ...,
+        proxies: _TextMapping | None = ...,
+        hooks: _HooksInput | None = ...,
+        stream: bool | None = ...,
+        verify: _Verify | None = ...,
+        cert: _Cert | None = ...,
+        json: Incomplete | None = ...,
+    ) -> Response: ...
+    def send(
+        self,
+        request: PreparedRequest,
+        *,
+        stream: bool | None = ...,
+        verify: _Verify | None = ...,
+        proxies: _TextMapping | None = ...,
+        cert: _Cert | None = ...,
+        timeout: _Timeout | None = ...,
+        allow_redirects: bool = ...,
+        **kwargs: Any,
+    ) -> Response: ...
+    def merge_environment_settings(
+        self,
+        url: str | bytes | None,
+        proxies: _TextMapping | None,
+        stream: bool | None,
+        verify: _Verify | None,
+        cert: _Cert | None,
+    ) -> _Settings: ...
+    def get_adapter(self, url: str) -> _BaseAdapter: ...
+    def close(self) -> None: ...
+    def mount(self, prefix: str | bytes, adapter: _BaseAdapter) -> None: ...
+
+def session() -> Session: ...
diff --git a/.venv/lib/python3.12/site-packages/requests-stubs/status_codes.pyi b/.venv/lib/python3.12/site-packages/requests-stubs/status_codes.pyi
new file mode 100644
index 00000000..4660b476
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/requests-stubs/status_codes.pyi
@@ -0,0 +1,3 @@
+from typing import Any
+
+codes: Any
diff --git a/.venv/lib/python3.12/site-packages/requests-stubs/structures.pyi b/.venv/lib/python3.12/site-packages/requests-stubs/structures.pyi
new file mode 100644
index 00000000..53dd5f56
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/requests-stubs/structures.pyi
@@ -0,0 +1,25 @@
+from collections.abc import Iterable, Iterator, Mapping, MutableMapping
+from typing import Any, Generic, TypeVar, overload
+
+_D = TypeVar("_D")
+_VT = TypeVar("_VT")
+
+class CaseInsensitiveDict(MutableMapping[str, _VT], Generic[_VT]):
+    def __init__(self, data: Mapping[str, _VT] | Iterable[tuple[str, _VT]] | None = None, **kwargs: _VT) -> None: ...
+    def lower_items(self) -> Iterator[tuple[str, _VT]]: ...
+    def __setitem__(self, key: str, value: _VT) -> None: ...
+    def __getitem__(self, key: str) -> _VT: ...
+    def __delitem__(self, key: str) -> None: ...
+    def __iter__(self) -> Iterator[str]: ...
+    def __len__(self) -> int: ...
+    def copy(self) -> CaseInsensitiveDict[_VT]: ...
+
+class LookupDict(dict[str, _VT]):
+    name: Any
+    def __init__(self, name: Any = None) -> None: ...
+    def __getitem__(self, key: str) -> _VT | None: ...  # type: ignore[override]
+    def __setattr__(self, attr: str, value: _VT, /) -> None: ...
+    @overload
+    def get(self, key: str, default: None = None) -> _VT | None: ...
+    @overload
+    def get(self, key: str, default: _D | _VT) -> _D | _VT: ...
diff --git a/.venv/lib/python3.12/site-packages/requests-stubs/utils.pyi b/.venv/lib/python3.12/site-packages/requests-stubs/utils.pyi
new file mode 100644
index 00000000..3edd7c10
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/requests-stubs/utils.pyi
@@ -0,0 +1,70 @@
+import sys
+from _typeshed import Incomplete, StrOrBytesPath
+from collections.abc import Generator, Iterable, Mapping
+from contextlib import _GeneratorContextManager
+from io import BufferedWriter
+from typing import AnyStr
+from typing_extensions import TypeAlias
+
+from . import compat, cookies, exceptions, structures
+from .models import PreparedRequest, Request
+
+_Uri: TypeAlias = str | bytes
+OrderedDict = compat.OrderedDict
+cookiejar_from_dict = cookies.cookiejar_from_dict
+CaseInsensitiveDict = structures.CaseInsensitiveDict
+InvalidURL = exceptions.InvalidURL
+
+NETRC_FILES: tuple[str, str]
+DEFAULT_CA_BUNDLE_PATH: Incomplete
+DEFAULT_PORTS: dict[str, int]
+DEFAULT_ACCEPT_ENCODING: str
+
+def dict_to_sequence(d): ...
+def super_len(o): ...
+def get_netrc_auth(url: _Uri, raise_errors: bool = False) -> tuple[str, str] | None: ...
+def guess_filename(obj): ...
+def extract_zipped_paths(path): ...
+def atomic_open(filename: StrOrBytesPath) -> _GeneratorContextManager[BufferedWriter]: ...
+def from_key_val_list(value): ...
+def to_key_val_list(value): ...
+def parse_list_header(value): ...
+def parse_dict_header(value): ...
+def unquote_header_value(value, is_filename: bool = False): ...
+def dict_from_cookiejar(cj): ...
+def add_dict_to_cookiejar(cj, cookie_dict): ...
+def get_encodings_from_content(content): ...
+def get_encoding_from_headers(headers: Mapping[str, str]) -> str | None: ...
+def stream_decode_response_unicode(iterator, r): ...
+def iter_slices(string: str, slice_length: int | None) -> Generator[str, None, None]: ...
+def get_unicode_from_response(r): ...
+
+UNRESERVED_SET: frozenset[str]
+
+def unquote_unreserved(uri: str) -> str: ...
+def requote_uri(uri: str) -> str: ...
+def address_in_network(ip: str, net: str) -> bool: ...
+def dotted_netmask(mask: int) -> str: ...
+def is_ipv4_address(string_ip: str) -> bool: ...
+def is_valid_cidr(string_network: str) -> bool: ...
+def set_environ(env_name: str, value: None) -> _GeneratorContextManager[None]: ...
+def should_bypass_proxies(url: _Uri, no_proxy: Iterable[str] | None) -> bool: ...
+def get_environ_proxies(url: _Uri, no_proxy: Iterable[str] | None = None) -> dict[Incomplete, Incomplete]: ...
+def select_proxy(url: _Uri, proxies: Mapping[str, str] | None) -> str: ...
+def resolve_proxies(
+    request: Request | PreparedRequest, proxies: dict[str, str] | None, trust_env: bool = True
+) -> dict[str, str]: ...
+def default_user_agent(name: str = "python-requests") -> str: ...
+def default_headers() -> CaseInsensitiveDict[str]: ...
+def parse_header_links(value: str) -> list[dict[str, str]]: ...
+def guess_json_utf(data): ...
+def prepend_scheme_if_needed(url, new_scheme): ...
+def get_auth_from_url(url: _Uri) -> tuple[str, str]: ...
+def to_native_string(string, encoding="ascii"): ...
+def urldefragauth(url: _Uri): ...
+def rewind_body(prepared_request: PreparedRequest) -> None: ...
+def check_header_validity(header: tuple[AnyStr, AnyStr]) -> None: ...
+
+if sys.platform == "win32":
+    def proxy_bypass_registry(host: str) -> bool: ...
+    def proxy_bypass(host: str) -> bool: ...