pypi / support

Issue tracker for support requests related to using https://pypi.org
90 stars 47 forks source link

Cannot upload package to test.pypi.org #3396

Open bmvandoren opened 7 months ago

bmvandoren commented 7 months ago

My Platform

Terminal (zsh) on MacOS 13.6. Spectrum service provider, no firewalls or proxies.

Fastly Debug

(nighthawk-dev2) benjamin@BenjamiVanDoren exported_nfc_model % python -m twine upload --repository-url https://test.pypi.org/legacy/ dist/*
Uploading distributions to https://test.pypi.org/legacy/
Enter your username: bmvandoren
Enter your password: 
Uploading nighthawk-0.3.0-py3-none-any.whl
WARNING  Retrying (Retry(total=9, connect=5, read=None, redirect=None, status=None)) after connection broken by 'SSLEOFError(8, 'EOF occurred in violation of protocol (_ssl.c:2426)')': /legacy/ 
100% ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 81.3/81.3 MB • 00:59 • 1.3 MB/s
Traceback (most recent call last):
  File "/Users/benjamin/opt/anaconda3/envs/nighthawk-dev2/lib/python3.10/site-packages/urllib3/connectionpool.py", line 790, in urlopen
    response = self._make_request(
  File "/Users/benjamin/opt/anaconda3/envs/nighthawk-dev2/lib/python3.10/site-packages/urllib3/connectionpool.py", line 536, in _make_request
    response = conn.getresponse()
  File "/Users/benjamin/opt/anaconda3/envs/nighthawk-dev2/lib/python3.10/site-packages/urllib3/connection.py", line 461, in getresponse
    httplib_response = super().getresponse()
  File "/Users/benjamin/opt/anaconda3/envs/nighthawk-dev2/lib/python3.10/http/client.py", line 1375, in getresponse
    response.begin()
  File "/Users/benjamin/opt/anaconda3/envs/nighthawk-dev2/lib/python3.10/http/client.py", line 318, in begin
    version, status, reason = self._read_status()
  File "/Users/benjamin/opt/anaconda3/envs/nighthawk-dev2/lib/python3.10/http/client.py", line 287, in _read_status
    raise RemoteDisconnected("Remote end closed connection without"
http.client.RemoteDisconnected: Remote end closed connection without response

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/Users/benjamin/opt/anaconda3/envs/nighthawk-dev2/lib/python3.10/site-packages/requests/adapters.py", line 486, in send
    resp = conn.urlopen(
  File "/Users/benjamin/opt/anaconda3/envs/nighthawk-dev2/lib/python3.10/site-packages/urllib3/connectionpool.py", line 874, in urlopen
    return self.urlopen(
  File "/Users/benjamin/opt/anaconda3/envs/nighthawk-dev2/lib/python3.10/site-packages/urllib3/connectionpool.py", line 844, in urlopen
    retries = retries.increment(
  File "/Users/benjamin/opt/anaconda3/envs/nighthawk-dev2/lib/python3.10/site-packages/urllib3/util/retry.py", line 470, in increment
    raise reraise(type(error), error, _stacktrace)
  File "/Users/benjamin/opt/anaconda3/envs/nighthawk-dev2/lib/python3.10/site-packages/urllib3/util/util.py", line 38, in reraise
    raise value.with_traceback(tb)
  File "/Users/benjamin/opt/anaconda3/envs/nighthawk-dev2/lib/python3.10/site-packages/urllib3/connectionpool.py", line 790, in urlopen
    response = self._make_request(
  File "/Users/benjamin/opt/anaconda3/envs/nighthawk-dev2/lib/python3.10/site-packages/urllib3/connectionpool.py", line 536, in _make_request
    response = conn.getresponse()
  File "/Users/benjamin/opt/anaconda3/envs/nighthawk-dev2/lib/python3.10/site-packages/urllib3/connection.py", line 461, in getresponse
    httplib_response = super().getresponse()
  File "/Users/benjamin/opt/anaconda3/envs/nighthawk-dev2/lib/python3.10/http/client.py", line 1375, in getresponse
    response.begin()
  File "/Users/benjamin/opt/anaconda3/envs/nighthawk-dev2/lib/python3.10/http/client.py", line 318, in begin
    version, status, reason = self._read_status()
  File "/Users/benjamin/opt/anaconda3/envs/nighthawk-dev2/lib/python3.10/http/client.py", line 287, in _read_status
    raise RemoteDisconnected("Remote end closed connection without"
urllib3.exceptions.ProtocolError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/Users/benjamin/opt/anaconda3/envs/nighthawk-dev2/lib/python3.10/runpy.py", line 196, in _run_module_as_main
    return _run_code(code, main_globals, None,
  File "/Users/benjamin/opt/anaconda3/envs/nighthawk-dev2/lib/python3.10/runpy.py", line 86, in _run_code
    exec(code, run_globals)
  File "/Users/benjamin/opt/anaconda3/envs/nighthawk-dev2/lib/python3.10/site-packages/twine/__main__.py", line 51, in <module>
    sys.exit(main())
  File "/Users/benjamin/opt/anaconda3/envs/nighthawk-dev2/lib/python3.10/site-packages/twine/__main__.py", line 33, in main
    error = cli.dispatch(sys.argv[1:])
  File "/Users/benjamin/opt/anaconda3/envs/nighthawk-dev2/lib/python3.10/site-packages/twine/cli.py", line 123, in dispatch
    return main(args.args)
  File "/Users/benjamin/opt/anaconda3/envs/nighthawk-dev2/lib/python3.10/site-packages/twine/commands/upload.py", line 198, in main
    return upload(upload_settings, parsed_args.dists)
  File "/Users/benjamin/opt/anaconda3/envs/nighthawk-dev2/lib/python3.10/site-packages/twine/commands/upload.py", line 142, in upload
    resp = repository.upload(package)
  File "/Users/benjamin/opt/anaconda3/envs/nighthawk-dev2/lib/python3.10/site-packages/twine/repository.py", line 186, in upload
    resp = self._upload(package)
  File "/Users/benjamin/opt/anaconda3/envs/nighthawk-dev2/lib/python3.10/site-packages/twine/repository.py", line 172, in _upload
    resp = self.session.post(
  File "/Users/benjamin/opt/anaconda3/envs/nighthawk-dev2/lib/python3.10/site-packages/requests/sessions.py", line 637, in post
    return self.request("POST", url, data=data, json=json, **kwargs)
  File "/Users/benjamin/opt/anaconda3/envs/nighthawk-dev2/lib/python3.10/site-packages/requests/sessions.py", line 589, in request
    resp = self.send(prep, **send_kwargs)
  File "/Users/benjamin/opt/anaconda3/envs/nighthawk-dev2/lib/python3.10/site-packages/requests/sessions.py", line 703, in send
    r = adapter.send(request, **kwargs)
  File "/Users/benjamin/opt/anaconda3/envs/nighthawk-dev2/lib/python3.10/site-packages/requests/adapters.py", line 501, in send
    raise ConnectionError(err, request=request)
requests.exceptions.ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))

DNS Resolution

$ dig test.pypi.org A

; <<>> DiG 9.10.6 <<>> test.pypi.org A
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 34816
;; flags: qr rd ra; QUERY: 1, ANSWER: 2, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 1232
;; QUESTION SECTION:
;test.pypi.org.         IN  A

;; ANSWER SECTION:
test.pypi.org.      86400   IN  CNAME   dualstack.python.map.fastly.net.
dualstack.python.map.fastly.net. 30 IN  A   199.232.36.223

;; Query time: 37 msec
;; SERVER: 192.168.57.1#53(192.168.57.1)
;; WHEN: Mon Nov 27 12:21:40 EST 2023
;; MSG SIZE  rcvd: 103
$ dig test.pypi.org AAAA

; <<>> DiG 9.10.6 <<>> test.pypi.org AAAA
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 45659
;; flags: qr rd ra; QUERY: 1, ANSWER: 2, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 1232
;; QUESTION SECTION:
;test.pypi.org.         IN  AAAA

;; ANSWER SECTION:
test.pypi.org.      86400   IN  CNAME   dualstack.python.map.fastly.net.
dualstack.python.map.fastly.net. 30 IN  AAAA    2a04:4e42:46::223

;; Query time: 36 msec
;; SERVER: 192.168.57.1#53(192.168.57.1)
;; WHEN: Mon Nov 27 12:22:04 EST 2023
;; MSG SIZE  rcvd: 115
$ dig files.pythonhosted.org A

; <<>> DiG 9.10.6 <<>> files.pythonhosted.org A
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 55191
;; flags: qr rd ra; QUERY: 1, ANSWER: 5, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 1232
;; QUESTION SECTION:
;files.pythonhosted.org.        IN  A

;; ANSWER SECTION:
files.pythonhosted.org. 86366   IN  CNAME   dualstack.m.sni.global.fastly.net.
dualstack.m.sni.global.fastly.net. 30 IN A  151.101.1.55
dualstack.m.sni.global.fastly.net. 30 IN A  151.101.65.55
dualstack.m.sni.global.fastly.net. 30 IN A  151.101.129.55
dualstack.m.sni.global.fastly.net. 30 IN A  151.101.193.55

;; Query time: 35 msec
;; SERVER: 192.168.57.1#53(192.168.57.1)
;; WHEN: Mon Nov 27 12:22:33 EST 2023
;; MSG SIZE  rcvd: 162
$ dig files.pythonhosted.org AAAA

; <<>> DiG 9.10.6 <<>> files.pythonhosted.org AAAA
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 64867
;; flags: qr rd ra; QUERY: 1, ANSWER: 5, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 1232
;; QUESTION SECTION:
;files.pythonhosted.org.        IN  AAAA

;; ANSWER SECTION:
files.pythonhosted.org. 84534   IN  CNAME   dualstack.m.sni.global.fastly.net.
dualstack.m.sni.global.fastly.net. 30 IN AAAA   2a04:4e42::311
dualstack.m.sni.global.fastly.net. 30 IN AAAA   2a04:4e42:200::311
dualstack.m.sni.global.fastly.net. 30 IN AAAA   2a04:4e42:400::311
dualstack.m.sni.global.fastly.net. 30 IN AAAA   2a04:4e42:600::311

;; Query time: 34 msec
;; SERVER: 192.168.57.1#53(192.168.57.1)
;; WHEN: Mon Nov 27 12:22:44 EST 2023
;; MSG SIZE  rcvd: 210

Traceroutes / IPv4

$ traceroute test.pypi.org

traceroute to dualstack.python.map.fastly.net (151.101.208.223), 64 hops max, 52 byte packets
 1  firewall-5thfl (192.168.57.1)  2.859 ms  1.453 ms  1.615 ms
 2  067-254-128-001.res.spectrum.com (67.254.128.1)  11.536 ms  11.680 ms  13.626 ms
 3  lag-50.nyclnyrg02h.netops.charter.com (68.173.200.142)  15.763 ms  11.154 ms  15.224 ms
 4  lag-101.nyquny9101r.netops.charter.com (68.173.198.34)  15.379 ms  24.409 ms  18.956 ms
 5  lag-15.nycmny837aw-bcr00.netops.charter.com (66.109.6.76)  12.736 ms  14.979 ms  14.981 ms
 6  lag-20.nwrknjmd67w-bcr00.netops.charter.com (66.109.5.139)  25.511 ms  21.476 ms  66.389 ms
 7  lag-401.bpr03nwrknjmd.netops.charter.com (66.109.10.179)  17.600 ms  16.748 ms
    lag-400.bpr03nwrknjmd.netops.charter.com (66.109.9.171)  14.949 ms
 8  * * *
 9  * * *
10  * * *
11  * * *
12  * * *
13  * * *
14  * * *
15  * * *
16  * * *
17  * *^C
$ traceroute pypi.org

traceroute: Warning: pypi.org has multiple addresses; using 151.101.0.223
traceroute to pypi.org (151.101.0.223), 64 hops max, 52 byte packets
 1  firewall-5thfl (192.168.57.1)  3.021 ms  1.512 ms  1.259 ms
 2  067-254-128-001.res.spectrum.com (67.254.128.1)  15.870 ms  13.818 ms  20.469 ms
 3  lag-50.nyclnyrg02h.netops.charter.com (68.173.200.142)  15.550 ms  13.410 ms  14.797 ms
 4  lag-101.nyquny9101r.netops.charter.com (68.173.198.34)  24.223 ms  22.189 ms  16.733 ms
 5  lag-25.nycmny837aw-bcr00.netops.charter.com (107.14.19.22)  14.635 ms  18.206 ms
    lag-15.nycmny837aw-bcr00.netops.charter.com (66.109.6.76)  16.214 ms
 6  lag-1.pr2.nyc20.netops.charter.com (66.109.9.5)  21.206 ms
    lag-0.pr2.nyc20.netops.charter.com (66.109.5.119)  14.538 ms
    lag-1.pr2.nyc20.netops.charter.com (66.109.9.5)  20.188 ms
 7  * * *
 8  * * *
^C
$ traceroute files.pythonhosted.org

traceroute: Warning: files.pythonhosted.org has multiple addresses; using 151.101.129.55
traceroute to dualstack.m.sni.global.fastly.net (151.101.129.55), 64 hops max, 52 byte packets
 1  firewall-5thfl (192.168.57.1)  4.232 ms  2.565 ms  1.335 ms
 2  067-254-128-001.res.spectrum.com (67.254.128.1)  15.230 ms  14.206 ms  19.954 ms
 3  lag-50.nyclnyrg01h.netops.charter.com (68.173.200.140)  15.657 ms  11.931 ms  13.986 ms
 4  lag-101.nyclnyrg01r.netops.charter.com (68.173.198.32)  24.955 ms  20.123 ms  18.706 ms
 5  lag-29.nwrknjmd67w-bcr00.netops.charter.com (107.14.19.24)  14.080 ms  18.011 ms
    lag-19.nwrknjmd67w-bcr00.netops.charter.com (66.109.6.78)  16.711 ms
 6  lag-400.bpr03nwrknjmd.netops.charter.com (66.109.9.171)  42.452 ms
    lag-401.bpr03nwrknjmd.netops.charter.com (66.109.10.179)  28.599 ms
    lag-400.bpr03nwrknjmd.netops.charter.com (66.109.9.171)  49.235 ms
 7  * * *
^C

Traceroutes / IPv6 (If available)

$ traceroute6 pypi.org

traceroute6: Warning: pypi.org has multiple addresses; using 2a04:4e42:600::223
connect: No route to host
$ traceroute6 files.pythonhosted.org

traceroute6: Warning: dualstack.m.sni.global.fastly.net has multiple addresses; using 2a04:4e42::311
connect: No route to host

HTTPS Requests / IPv4

$ curl -vvv -I --ipv4 https://pypi.org/pypi/pip/json

*   Trying 151.101.64.223:443...
* Connected to pypi.org (151.101.64.223) port 443
* ALPN: curl offers h2,http/1.1
* TLSv1.3 (OUT), TLS handshake, Client hello (1):
*  CAfile: /Users/benjamin/opt/anaconda3/ssl/cacert.pem
*  CApath: none
* TLSv1.3 (IN), TLS handshake, Server hello (2):
* TLSv1.3 (IN), TLS handshake, Encrypted Extensions (8):
* TLSv1.3 (IN), TLS handshake, Certificate (11):
* TLSv1.3 (IN), TLS handshake, CERT verify (15):
* TLSv1.3 (IN), TLS handshake, Finished (20):
* TLSv1.3 (OUT), TLS change cipher, Change cipher spec (1):
* TLSv1.3 (OUT), TLS handshake, Finished (20):
* SSL connection using TLSv1.3 / TLS_AES_128_GCM_SHA256
* ALPN: server accepted h2
* Server certificate:
*  subject: CN=pypi.org
*  start date: Apr 29 19:53:38 2023 GMT
*  expire date: May 30 19:53:37 2024 GMT
*  subjectAltName: host "pypi.org" matched cert's "pypi.org"
*  issuer: C=BE; O=GlobalSign nv-sa; CN=GlobalSign Atlas R3 DV TLS CA 2023 Q2
*  SSL certificate verify ok.
* TLSv1.3 (IN), TLS handshake, Newsession Ticket (4):
* using HTTP/2
* [HTTP/2] [1] OPENED stream for https://pypi.org/pypi/pip/json
* [HTTP/2] [1] [:method: HEAD]
* [HTTP/2] [1] [:scheme: https]
* [HTTP/2] [1] [:authority: pypi.org]
* [HTTP/2] [1] [:path: /pypi/pip/json]
* [HTTP/2] [1] [user-agent: curl/8.4.0]
* [HTTP/2] [1] [accept: */*]
> HEAD /pypi/pip/json HTTP/2
> Host: pypi.org
> User-Agent: curl/8.4.0
> Accept: */*
> 
< HTTP/2 200 
HTTP/2 200 
< content-type: application/json
content-type: application/json
< access-control-allow-origin: *
access-control-allow-origin: *
< access-control-allow-headers: Content-Type, If-Match, If-Modified-Since, If-None-Match, If-Unmodified-Since
access-control-allow-headers: Content-Type, If-Match, If-Modified-Since, If-None-Match, If-Unmodified-Since
< access-control-allow-methods: GET
access-control-allow-methods: GET
< access-control-max-age: 86400
access-control-max-age: 86400
< access-control-expose-headers: X-PyPI-Last-Serial
access-control-expose-headers: X-PyPI-Last-Serial
< x-pypi-last-serial: 20272292
x-pypi-last-serial: 20272292
< cache-control: max-age=900, public
cache-control: max-age=900, public
< etag: "krCdlEMa8FzPJbwWUQlskw"
etag: "krCdlEMa8FzPJbwWUQlskw"
< content-security-policy: base-uri 'self'; block-all-mixed-content; connect-src 'self' https://api.github.com/repos/ https://api.github.com/search/issues https://*.google-analytics.com https://*.analytics.google.com https://*.googletagmanager.com fastly-insights.com *.fastly-insights.com *.ethicalads.io https://api.pwnedpasswords.com https://cdn.jsdelivr.net/npm/mathjax@3.2.2/es5/sre/mathmaps/ https://2p66nmmycsj3.statuspage.io; default-src 'none'; font-src 'self' fonts.gstatic.com; form-action 'self' https://checkout.stripe.com; frame-ancestors 'none'; frame-src 'none'; img-src 'self' https://pypi-camo.global.ssl.fastly.net/ https://*.google-analytics.com https://*.googletagmanager.com *.fastly-insights.com *.ethicalads.io; script-src 'self' https://*.googletagmanager.com https://www.google-analytics.com https://ssl.google-analytics.com *.fastly-insights.com *.ethicalads.io 'sha256-U3hKDidudIaxBDEzwGJApJgPEf2mWk6cfMWghrAa6i0=' https://cdn.jsdelivr.net/npm/mathjax@3.2.2/ 'sha256-1CldwzdEg2k1wTmf7s5RWVd7NMXI/7nxxjJM2C4DqII=' 'sha256-0POaN8stWYQxhzjKS+/eOfbbJ/u4YHO5ZagJvLpMypo='; style-src 'self' fonts.googleapis.com *.ethicalads.io 'sha256-2YHqZokjiizkHi1Zt+6ar0XJ0OeEy/egBnlm+MDMtrM=' 'sha256-47DEQpj8HBSa+/TImW+5JCeuQeRkm5NMpJWZG3hSuFU=' 'sha256-JLEjeN9e5dGsz5475WyRaoA4eQOdNPxDIeUhclnJDCE=' 'sha256-mQyxHEuwZJqpxCw3SLmc4YOySNKXunyu2Oiz1r3/wAE=' 'sha256-OCf+kv5Asiwp++8PIevKBYSgnNLNUZvxAp4a7wMLuKA=' 'sha256-h5LOiLhk6wiJrGsG5ItM0KimwzWQH/yAcmoJDJL//bY='; worker-src *.fastly-insights.com
content-security-policy: base-uri 'self'; block-all-mixed-content; connect-src 'self' https://api.github.com/repos/ https://api.github.com/search/issues https://*.google-analytics.com https://*.analytics.google.com https://*.googletagmanager.com fastly-insights.com *.fastly-insights.com *.ethicalads.io https://api.pwnedpasswords.com https://cdn.jsdelivr.net/npm/mathjax@3.2.2/es5/sre/mathmaps/ https://2p66nmmycsj3.statuspage.io; default-src 'none'; font-src 'self' fonts.gstatic.com; form-action 'self' https://checkout.stripe.com; frame-ancestors 'none'; frame-src 'none'; img-src 'self' https://pypi-camo.global.ssl.fastly.net/ https://*.google-analytics.com https://*.googletagmanager.com *.fastly-insights.com *.ethicalads.io; script-src 'self' https://*.googletagmanager.com https://www.google-analytics.com https://ssl.google-analytics.com *.fastly-insights.com *.ethicalads.io 'sha256-U3hKDidudIaxBDEzwGJApJgPEf2mWk6cfMWghrAa6i0=' https://cdn.jsdelivr.net/npm/mathjax@3.2.2/ 'sha256-1CldwzdEg2k1wTmf7s5RWVd7NMXI/7nxxjJM2C4DqII=' 'sha256-0POaN8stWYQxhzjKS+/eOfbbJ/u4YHO5ZagJvLpMypo='; style-src 'self' fonts.googleapis.com *.ethicalads.io 'sha256-2YHqZokjiizkHi1Zt+6ar0XJ0OeEy/egBnlm+MDMtrM=' 'sha256-47DEQpj8HBSa+/TImW+5JCeuQeRkm5NMpJWZG3hSuFU=' 'sha256-JLEjeN9e5dGsz5475WyRaoA4eQOdNPxDIeUhclnJDCE=' 'sha256-mQyxHEuwZJqpxCw3SLmc4YOySNKXunyu2Oiz1r3/wAE=' 'sha256-OCf+kv5Asiwp++8PIevKBYSgnNLNUZvxAp4a7wMLuKA=' 'sha256-h5LOiLhk6wiJrGsG5ItM0KimwzWQH/yAcmoJDJL//bY='; worker-src *.fastly-insights.com
< referrer-policy: origin-when-cross-origin
referrer-policy: origin-when-cross-origin
< accept-ranges: bytes
accept-ranges: bytes
< date: Mon, 27 Nov 2023 17:27:58 GMT
date: Mon, 27 Nov 2023 17:27:58 GMT
< x-served-by: cache-iad-kcgs7200098-IAD, cache-lga21920-LGA
x-served-by: cache-iad-kcgs7200098-IAD, cache-lga21920-LGA
< x-cache: HIT, HIT
x-cache: HIT, HIT
< x-cache-hits: 919002, 1
x-cache-hits: 919002, 1
< x-timer: S1701106078.058428,VS0,VE1
x-timer: S1701106078.058428,VS0,VE1
< vary: Accept-Encoding
vary: Accept-Encoding
< strict-transport-security: max-age=31536000; includeSubDomains; preload
strict-transport-security: max-age=31536000; includeSubDomains; preload
< x-frame-options: deny
x-frame-options: deny
< x-xss-protection: 1; mode=block
x-xss-protection: 1; mode=block
< x-content-type-options: nosniff
x-content-type-options: nosniff
< x-permitted-cross-domain-policies: none
x-permitted-cross-domain-policies: none
< permissions-policy: publickey-credentials-create=(self),publickey-credentials-get=(self),accelerometer=(),ambient-light-sensor=(),autoplay=(),battery=(),camera=(),display-capture=(),document-domain=(),encrypted-media=(),execution-while-not-rendered=(),execution-while-out-of-viewport=(),fullscreen=(),gamepad=(),geolocation=(),gyroscope=(),hid=(),identity-credentials-get=(),idle-detection=(),local-fonts=(),magnetometer=(),microphone=(),midi=(),otp-credentials=(),payment=(),picture-in-picture=(),screen-wake-lock=(),serial=(),speaker-selection=(),storage-access=(),usb=(),web-share=(),xr-spatial-tracking=()
permissions-policy: publickey-credentials-create=(self),publickey-credentials-get=(self),accelerometer=(),ambient-light-sensor=(),autoplay=(),battery=(),camera=(),display-capture=(),document-domain=(),encrypted-media=(),execution-while-not-rendered=(),execution-while-out-of-viewport=(),fullscreen=(),gamepad=(),geolocation=(),gyroscope=(),hid=(),identity-credentials-get=(),idle-detection=(),local-fonts=(),magnetometer=(),microphone=(),midi=(),otp-credentials=(),payment=(),picture-in-picture=(),screen-wake-lock=(),serial=(),speaker-selection=(),storage-access=(),usb=(),web-share=(),xr-spatial-tracking=()
< content-length: 179082
content-length: 179082

< 
* Connection #0 to host pypi.org left intact
* 
$ curl -vvv -I --ipv4 https://files.pythonhosted.org/packages/ae/e8/2340d46ecadb1692a1e455f13f75e596d4eab3d11a57446f08259dee8f02/pip-10.0.1.tar.gz

*   Trying 151.101.129.55:443...
* Connected to files.pythonhosted.org (151.101.129.55) port 443
* ALPN: curl offers h2,http/1.1
* TLSv1.3 (OUT), TLS handshake, Client hello (1):
*  CAfile: /Users/benjamin/opt/anaconda3/ssl/cacert.pem
*  CApath: none
* TLSv1.3 (IN), TLS handshake, Server hello (2):
* TLSv1.3 (IN), TLS handshake, Encrypted Extensions (8):
* TLSv1.3 (IN), TLS handshake, Certificate (11):
* TLSv1.3 (IN), TLS handshake, CERT verify (15):
* TLSv1.3 (IN), TLS handshake, Finished (20):
* TLSv1.3 (OUT), TLS change cipher, Change cipher spec (1):
* TLSv1.3 (OUT), TLS handshake, Finished (20):
* SSL connection using TLSv1.3 / TLS_AES_128_GCM_SHA256
* ALPN: server accepted h2
* Server certificate:
*  subject: CN=*.pythonhosted.org
*  start date: Jul  1 20:50:25 2023 GMT
*  expire date: Aug  1 20:50:24 2024 GMT
*  subjectAltName: host "files.pythonhosted.org" matched cert's "*.pythonhosted.org"
*  issuer: C=BE; O=GlobalSign nv-sa; CN=GlobalSign Atlas R3 DV TLS CA 2023 Q2
*  SSL certificate verify ok.
* TLSv1.3 (IN), TLS handshake, Newsession Ticket (4):
* using HTTP/2
* [HTTP/2] [1] OPENED stream for https://files.pythonhosted.org/packages/ae/e8/2340d46ecadb1692a1e455f13f75e596d4eab3d11a57446f08259dee8f02/pip-10.0.1.tar.gz
* [HTTP/2] [1] [:method: HEAD]
* [HTTP/2] [1] [:scheme: https]
* [HTTP/2] [1] [:authority: files.pythonhosted.org]
* [HTTP/2] [1] [:path: /packages/ae/e8/2340d46ecadb1692a1e455f13f75e596d4eab3d11a57446f08259dee8f02/pip-10.0.1.tar.gz]
* [HTTP/2] [1] [user-agent: curl/8.4.0]
* [HTTP/2] [1] [accept: */*]
> HEAD /packages/ae/e8/2340d46ecadb1692a1e455f13f75e596d4eab3d11a57446f08259dee8f02/pip-10.0.1.tar.gz HTTP/2
> Host: files.pythonhosted.org
> User-Agent: curl/8.4.0
> Accept: */*
> 
< HTTP/2 200 
HTTP/2 200 
< last-modified: Tue, 11 Apr 2023 02:19:03 GMT
last-modified: Tue, 11 Apr 2023 02:19:03 GMT
< etag: "83a177756e2c801d0b3a6f7b0d4f3f7e"
etag: "83a177756e2c801d0b3a6f7b0d4f3f7e"
< x-amz-meta-btime: 2020-02-26T17:47:37.438Z
x-amz-meta-btime: 2020-02-26T17:47:37.438Z
< x-amz-meta-mtime: 1582739257.438
x-amz-meta-mtime: 1582739257.438
< x-amz-request-id: 93f1a9c2c0ed3be6
x-amz-request-id: 93f1a9c2c0ed3be6
< x-amz-id-2: aN/VjczEyNo5m0zG+MGZkomaxY2QwLjgq
x-amz-id-2: aN/VjczEyNo5m0zG+MGZkomaxY2QwLjgq
< x-amz-version-id: 4_z179c51e67f11a0ad8f6c0018_f1191cd4ff993bd3d_d20230411_m021903_c005_v0501003_t0041_u01681179543316
x-amz-version-id: 4_z179c51e67f11a0ad8f6c0018_f1191cd4ff993bd3d_d20230411_m021903_c005_v0501003_t0041_u01681179543316
< content-type: binary/octet-stream
content-type: binary/octet-stream
< cache-control: max-age=365000000, immutable, public
cache-control: max-age=365000000, immutable, public
< accept-ranges: bytes
accept-ranges: bytes
< date: Mon, 27 Nov 2023 17:28:12 GMT
date: Mon, 27 Nov 2023 17:28:12 GMT
< age: 304703
age: 304703
< x-served-by: cache-iad-kcgs7200149-IAD, cache-ewr18172-EWR
x-served-by: cache-iad-kcgs7200149-IAD, cache-ewr18172-EWR
< x-cache: HIT, HIT
x-cache: HIT, HIT
< x-cache-hits: 20, 1
x-cache-hits: 20, 1
< x-timer: S1701106093.821188,VS0,VE4
x-timer: S1701106093.821188,VS0,VE4
< strict-transport-security: max-age=31536000; includeSubDomains; preload
strict-transport-security: max-age=31536000; includeSubDomains; preload
< x-frame-options: deny
x-frame-options: deny
< x-xss-protection: 1; mode=block
x-xss-protection: 1; mode=block
< x-content-type-options: nosniff
x-content-type-options: nosniff
< x-permitted-cross-domain-policies: none
x-permitted-cross-domain-policies: none
< x-robots-header: noindex
x-robots-header: noindex
< x-pypi-file-python-version: source
x-pypi-file-python-version: source
< x-pypi-file-version: 10.0.1
x-pypi-file-version: 10.0.1
< x-pypi-file-package-type: sdist
x-pypi-file-package-type: sdist
< x-pypi-file-project: pip
x-pypi-file-project: pip
< content-length: 1246072
content-length: 1246072

< 
* Connection #0 to host files.pythonhosted.org left intact

HTTPS Requests / IPv6 (If available)

$ curl -vvv -I --ipv6 https://pypi.org/pypi/pip/json

*   Trying [::ffff:151.101.0.223]:443...
* Connected to pypi.org (::ffff:151.101.0.223) port 443
* ALPN: curl offers h2,http/1.1
* TLSv1.3 (OUT), TLS handshake, Client hello (1):
*  CAfile: /Users/benjamin/opt/anaconda3/ssl/cacert.pem
*  CApath: none
* TLSv1.3 (IN), TLS handshake, Server hello (2):
* TLSv1.3 (IN), TLS handshake, Encrypted Extensions (8):
* TLSv1.3 (IN), TLS handshake, Certificate (11):
* TLSv1.3 (IN), TLS handshake, CERT verify (15):
* TLSv1.3 (IN), TLS handshake, Finished (20):
* TLSv1.3 (OUT), TLS change cipher, Change cipher spec (1):
* TLSv1.3 (OUT), TLS handshake, Finished (20):
* SSL connection using TLSv1.3 / TLS_AES_128_GCM_SHA256
* ALPN: server accepted h2
* Server certificate:
*  subject: CN=pypi.org
*  start date: Apr 29 19:53:38 2023 GMT
*  expire date: May 30 19:53:37 2024 GMT
*  subjectAltName: host "pypi.org" matched cert's "pypi.org"
*  issuer: C=BE; O=GlobalSign nv-sa; CN=GlobalSign Atlas R3 DV TLS CA 2023 Q2
*  SSL certificate verify ok.
* TLSv1.3 (IN), TLS handshake, Newsession Ticket (4):
* using HTTP/2
* [HTTP/2] [1] OPENED stream for https://pypi.org/pypi/pip/json
* [HTTP/2] [1] [:method: HEAD]
* [HTTP/2] [1] [:scheme: https]
* [HTTP/2] [1] [:authority: pypi.org]
* [HTTP/2] [1] [:path: /pypi/pip/json]
* [HTTP/2] [1] [user-agent: curl/8.4.0]
* [HTTP/2] [1] [accept: */*]
> HEAD /pypi/pip/json HTTP/2
> Host: pypi.org
> User-Agent: curl/8.4.0
> Accept: */*
> 
< HTTP/2 200 
HTTP/2 200 
< content-type: application/json
content-type: application/json
< access-control-allow-origin: *
access-control-allow-origin: *
< access-control-allow-headers: Content-Type, If-Match, If-Modified-Since, If-None-Match, If-Unmodified-Since
access-control-allow-headers: Content-Type, If-Match, If-Modified-Since, If-None-Match, If-Unmodified-Since
< access-control-allow-methods: GET
access-control-allow-methods: GET
< access-control-max-age: 86400
access-control-max-age: 86400
< access-control-expose-headers: X-PyPI-Last-Serial
access-control-expose-headers: X-PyPI-Last-Serial
< x-pypi-last-serial: 20272292
x-pypi-last-serial: 20272292
< cache-control: max-age=900, public
cache-control: max-age=900, public
< etag: "krCdlEMa8FzPJbwWUQlskw"
etag: "krCdlEMa8FzPJbwWUQlskw"
< content-security-policy: base-uri 'self'; block-all-mixed-content; connect-src 'self' https://api.github.com/repos/ https://api.github.com/search/issues https://*.google-analytics.com https://*.analytics.google.com https://*.googletagmanager.com fastly-insights.com *.fastly-insights.com *.ethicalads.io https://api.pwnedpasswords.com https://cdn.jsdelivr.net/npm/mathjax@3.2.2/es5/sre/mathmaps/ https://2p66nmmycsj3.statuspage.io; default-src 'none'; font-src 'self' fonts.gstatic.com; form-action 'self' https://checkout.stripe.com; frame-ancestors 'none'; frame-src 'none'; img-src 'self' https://pypi-camo.global.ssl.fastly.net/ https://*.google-analytics.com https://*.googletagmanager.com *.fastly-insights.com *.ethicalads.io; script-src 'self' https://*.googletagmanager.com https://www.google-analytics.com https://ssl.google-analytics.com *.fastly-insights.com *.ethicalads.io 'sha256-U3hKDidudIaxBDEzwGJApJgPEf2mWk6cfMWghrAa6i0=' https://cdn.jsdelivr.net/npm/mathjax@3.2.2/ 'sha256-1CldwzdEg2k1wTmf7s5RWVd7NMXI/7nxxjJM2C4DqII=' 'sha256-0POaN8stWYQxhzjKS+/eOfbbJ/u4YHO5ZagJvLpMypo='; style-src 'self' fonts.googleapis.com *.ethicalads.io 'sha256-2YHqZokjiizkHi1Zt+6ar0XJ0OeEy/egBnlm+MDMtrM=' 'sha256-47DEQpj8HBSa+/TImW+5JCeuQeRkm5NMpJWZG3hSuFU=' 'sha256-JLEjeN9e5dGsz5475WyRaoA4eQOdNPxDIeUhclnJDCE=' 'sha256-mQyxHEuwZJqpxCw3SLmc4YOySNKXunyu2Oiz1r3/wAE=' 'sha256-OCf+kv5Asiwp++8PIevKBYSgnNLNUZvxAp4a7wMLuKA=' 'sha256-h5LOiLhk6wiJrGsG5ItM0KimwzWQH/yAcmoJDJL//bY='; worker-src *.fastly-insights.com
content-security-policy: base-uri 'self'; block-all-mixed-content; connect-src 'self' https://api.github.com/repos/ https://api.github.com/search/issues https://*.google-analytics.com https://*.analytics.google.com https://*.googletagmanager.com fastly-insights.com *.fastly-insights.com *.ethicalads.io https://api.pwnedpasswords.com https://cdn.jsdelivr.net/npm/mathjax@3.2.2/es5/sre/mathmaps/ https://2p66nmmycsj3.statuspage.io; default-src 'none'; font-src 'self' fonts.gstatic.com; form-action 'self' https://checkout.stripe.com; frame-ancestors 'none'; frame-src 'none'; img-src 'self' https://pypi-camo.global.ssl.fastly.net/ https://*.google-analytics.com https://*.googletagmanager.com *.fastly-insights.com *.ethicalads.io; script-src 'self' https://*.googletagmanager.com https://www.google-analytics.com https://ssl.google-analytics.com *.fastly-insights.com *.ethicalads.io 'sha256-U3hKDidudIaxBDEzwGJApJgPEf2mWk6cfMWghrAa6i0=' https://cdn.jsdelivr.net/npm/mathjax@3.2.2/ 'sha256-1CldwzdEg2k1wTmf7s5RWVd7NMXI/7nxxjJM2C4DqII=' 'sha256-0POaN8stWYQxhzjKS+/eOfbbJ/u4YHO5ZagJvLpMypo='; style-src 'self' fonts.googleapis.com *.ethicalads.io 'sha256-2YHqZokjiizkHi1Zt+6ar0XJ0OeEy/egBnlm+MDMtrM=' 'sha256-47DEQpj8HBSa+/TImW+5JCeuQeRkm5NMpJWZG3hSuFU=' 'sha256-JLEjeN9e5dGsz5475WyRaoA4eQOdNPxDIeUhclnJDCE=' 'sha256-mQyxHEuwZJqpxCw3SLmc4YOySNKXunyu2Oiz1r3/wAE=' 'sha256-OCf+kv5Asiwp++8PIevKBYSgnNLNUZvxAp4a7wMLuKA=' 'sha256-h5LOiLhk6wiJrGsG5ItM0KimwzWQH/yAcmoJDJL//bY='; worker-src *.fastly-insights.com
< referrer-policy: origin-when-cross-origin
referrer-policy: origin-when-cross-origin
< accept-ranges: bytes
accept-ranges: bytes
< date: Mon, 27 Nov 2023 17:26:55 GMT
date: Mon, 27 Nov 2023 17:26:55 GMT
< x-served-by: cache-iad-kcgs7200098-IAD, cache-lga21930-LGA
x-served-by: cache-iad-kcgs7200098-IAD, cache-lga21930-LGA
< x-cache: HIT, HIT
x-cache: HIT, HIT
< x-cache-hits: 919002, 1
x-cache-hits: 919002, 1
< x-timer: S1701106016.854396,VS0,VE2
x-timer: S1701106016.854396,VS0,VE2
< vary: Accept-Encoding
vary: Accept-Encoding
< strict-transport-security: max-age=31536000; includeSubDomains; preload
strict-transport-security: max-age=31536000; includeSubDomains; preload
< x-frame-options: deny
x-frame-options: deny
< x-xss-protection: 1; mode=block
x-xss-protection: 1; mode=block
< x-content-type-options: nosniff
x-content-type-options: nosniff
< x-permitted-cross-domain-policies: none
x-permitted-cross-domain-policies: none
< permissions-policy: publickey-credentials-create=(self),publickey-credentials-get=(self),accelerometer=(),ambient-light-sensor=(),autoplay=(),battery=(),camera=(),display-capture=(),document-domain=(),encrypted-media=(),execution-while-not-rendered=(),execution-while-out-of-viewport=(),fullscreen=(),gamepad=(),geolocation=(),gyroscope=(),hid=(),identity-credentials-get=(),idle-detection=(),local-fonts=(),magnetometer=(),microphone=(),midi=(),otp-credentials=(),payment=(),picture-in-picture=(),screen-wake-lock=(),serial=(),speaker-selection=(),storage-access=(),usb=(),web-share=(),xr-spatial-tracking=()
permissions-policy: publickey-credentials-create=(self),publickey-credentials-get=(self),accelerometer=(),ambient-light-sensor=(),autoplay=(),battery=(),camera=(),display-capture=(),document-domain=(),encrypted-media=(),execution-while-not-rendered=(),execution-while-out-of-viewport=(),fullscreen=(),gamepad=(),geolocation=(),gyroscope=(),hid=(),identity-credentials-get=(),idle-detection=(),local-fonts=(),magnetometer=(),microphone=(),midi=(),otp-credentials=(),payment=(),picture-in-picture=(),screen-wake-lock=(),serial=(),speaker-selection=(),storage-access=(),usb=(),web-share=(),xr-spatial-tracking=()
< content-length: 179082
content-length: 179082

< 
* Connection #0 to host pypi.org left intact
* 
$ curl -vvv -I --ipv6 https://files.pythonhosted.org/packages/ae/e8/2340d46ecadb1692a1e455f13f75e596d4eab3d11a57446f08259dee8f02/pip-10.0.1.tar.gz

*   Trying [::ffff:151.101.1.55]:443...
* Connected to files.pythonhosted.org (::ffff:151.101.1.55) port 443
* ALPN: curl offers h2,http/1.1
* TLSv1.3 (OUT), TLS handshake, Client hello (1):
*  CAfile: /Users/benjamin/opt/anaconda3/ssl/cacert.pem
*  CApath: none
* TLSv1.3 (IN), TLS handshake, Server hello (2):
* TLSv1.3 (IN), TLS handshake, Encrypted Extensions (8):
* TLSv1.3 (IN), TLS handshake, Certificate (11):
* TLSv1.3 (IN), TLS handshake, CERT verify (15):
* TLSv1.3 (IN), TLS handshake, Finished (20):
* TLSv1.3 (OUT), TLS change cipher, Change cipher spec (1):
* TLSv1.3 (OUT), TLS handshake, Finished (20):
* SSL connection using TLSv1.3 / TLS_AES_128_GCM_SHA256
* ALPN: server accepted h2
* Server certificate:
*  subject: CN=*.pythonhosted.org
*  start date: Jul  1 20:50:25 2023 GMT
*  expire date: Aug  1 20:50:24 2024 GMT
*  subjectAltName: host "files.pythonhosted.org" matched cert's "*.pythonhosted.org"
*  issuer: C=BE; O=GlobalSign nv-sa; CN=GlobalSign Atlas R3 DV TLS CA 2023 Q2
*  SSL certificate verify ok.
* TLSv1.3 (IN), TLS handshake, Newsession Ticket (4):
* using HTTP/2
* [HTTP/2] [1] OPENED stream for https://files.pythonhosted.org/packages/ae/e8/2340d46ecadb1692a1e455f13f75e596d4eab3d11a57446f08259dee8f02/pip-10.0.1.tar.gz
* [HTTP/2] [1] [:method: HEAD]
* [HTTP/2] [1] [:scheme: https]
* [HTTP/2] [1] [:authority: files.pythonhosted.org]
* [HTTP/2] [1] [:path: /packages/ae/e8/2340d46ecadb1692a1e455f13f75e596d4eab3d11a57446f08259dee8f02/pip-10.0.1.tar.gz]
* [HTTP/2] [1] [user-agent: curl/8.4.0]
* [HTTP/2] [1] [accept: */*]
> HEAD /packages/ae/e8/2340d46ecadb1692a1e455f13f75e596d4eab3d11a57446f08259dee8f02/pip-10.0.1.tar.gz HTTP/2
> Host: files.pythonhosted.org
> User-Agent: curl/8.4.0
> Accept: */*
> 
< HTTP/2 200 
HTTP/2 200 
< last-modified: Tue, 11 Apr 2023 02:19:03 GMT
last-modified: Tue, 11 Apr 2023 02:19:03 GMT
< etag: "83a177756e2c801d0b3a6f7b0d4f3f7e"
etag: "83a177756e2c801d0b3a6f7b0d4f3f7e"
< x-amz-meta-btime: 2020-02-26T17:47:37.438Z
x-amz-meta-btime: 2020-02-26T17:47:37.438Z
< x-amz-meta-mtime: 1582739257.438
x-amz-meta-mtime: 1582739257.438
< x-amz-request-id: 93f1a9c2c0ed3be6
x-amz-request-id: 93f1a9c2c0ed3be6
< x-amz-id-2: aN/VjczEyNo5m0zG+MGZkomaxY2QwLjgq
x-amz-id-2: aN/VjczEyNo5m0zG+MGZkomaxY2QwLjgq
< x-amz-version-id: 4_z179c51e67f11a0ad8f6c0018_f1191cd4ff993bd3d_d20230411_m021903_c005_v0501003_t0041_u01681179543316
x-amz-version-id: 4_z179c51e67f11a0ad8f6c0018_f1191cd4ff993bd3d_d20230411_m021903_c005_v0501003_t0041_u01681179543316
< content-type: binary/octet-stream
content-type: binary/octet-stream
< cache-control: max-age=365000000, immutable, public
cache-control: max-age=365000000, immutable, public
< accept-ranges: bytes
accept-ranges: bytes
< date: Mon, 27 Nov 2023 17:27:19 GMT
date: Mon, 27 Nov 2023 17:27:19 GMT
< age: 304649
age: 304649
< x-served-by: cache-iad-kcgs7200149-IAD, cache-ewr18150-EWR
x-served-by: cache-iad-kcgs7200149-IAD, cache-ewr18150-EWR
< x-cache: HIT, HIT
x-cache: HIT, HIT
< x-cache-hits: 20, 1
x-cache-hits: 20, 1
< x-timer: S1701106039.396728,VS0,VE4
x-timer: S1701106039.396728,VS0,VE4
< strict-transport-security: max-age=31536000; includeSubDomains; preload
strict-transport-security: max-age=31536000; includeSubDomains; preload
< x-frame-options: deny
x-frame-options: deny
< x-xss-protection: 1; mode=block
x-xss-protection: 1; mode=block
< x-content-type-options: nosniff
x-content-type-options: nosniff
< x-permitted-cross-domain-policies: none
x-permitted-cross-domain-policies: none
< x-robots-header: noindex
x-robots-header: noindex
< x-pypi-file-python-version: source
x-pypi-file-python-version: source
< x-pypi-file-version: 10.0.1
x-pypi-file-version: 10.0.1
< x-pypi-file-package-type: sdist
x-pypi-file-package-type: sdist
< x-pypi-file-project: pip
x-pypi-file-project: pip
< content-length: 1246072
content-length: 1246072

< 
* Connection #0 to host files.pythonhosted.org left intact
* 

TLS Debug / IPv4

$ echo -n | openssl s_client -4 -connect pypi.org:443

CONNECTED(00000005)
depth=2 OU = GlobalSign Root CA - R3, O = GlobalSign, CN = GlobalSign
verify return:1
depth=1 C = BE, O = GlobalSign nv-sa, CN = GlobalSign Atlas R3 DV TLS CA 2023 Q2
verify return:1
depth=0 CN = pypi.org
verify return:1
---
Certificate chain
 0 s:CN = pypi.org
   i:C = BE, O = GlobalSign nv-sa, CN = GlobalSign Atlas R3 DV TLS CA 2023 Q2
   a:PKEY: rsaEncryption, 2048 (bit); sigalg: RSA-SHA256
   v:NotBefore: Apr 29 19:53:38 2023 GMT; NotAfter: May 30 19:53:37 2024 GMT
 1 s:C = BE, O = GlobalSign nv-sa, CN = GlobalSign Atlas R3 DV TLS CA 2023 Q2
   i:OU = GlobalSign Root CA - R3, O = GlobalSign, CN = GlobalSign
   a:PKEY: rsaEncryption, 2048 (bit); sigalg: RSA-SHA256
   v:NotBefore: Jan 18 03:36:52 2023 GMT; NotAfter: Jan 18 00:00:00 2025 GMT
---
Server certificate
-----BEGIN CERTIFICATE-----
MIIGfzCCBWegAwIBAgIQATphpUBWfreAY2OTrbDywTANBgkqhkiG9w0BAQsFADBY
MQswCQYDVQQGEwJCRTEZMBcGA1UEChMQR2xvYmFsU2lnbiBudi1zYTEuMCwGA1UE
AxMlR2xvYmFsU2lnbiBBdGxhcyBSMyBEViBUTFMgQ0EgMjAyMyBRMjAeFw0yMzA0
MjkxOTUzMzhaFw0yNDA1MzAxOTUzMzdaMBMxETAPBgNVBAMMCHB5cGkub3JnMIIB
IjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsVzK0dZ2ALTL74lfSb8xvcqO
eEP1opP9RNEQXhsEAs5sI8hYBP/j8IJO4cBZN/585CTJ8SAMxXon7IC0FvXnhefc
bE0kyHQf1cchLuqi2cArNUCZd7kIwYCpIpDvYLTlcJP1ClwwlUdDfobcMMLlot14
NBY11KT1iuNdujm83xF4LvHZu1dNTNMkU0Qnzl26tVKzewC29nEELWwz0Navusc/
5RVUI8bWrY2ZEJyeJvbs6aHcNbPdhfb8JP8pzheLNDL0VjWnxJnIDWttprck5FJM
lueKFjrx4vGB8kWfFpLkOSoq4/VW75FvR78Zx2Bj8BroMnbUiQ/NLhlBFHCscQID
AQABo4IDiDCCA4QwPgYDVR0RBDcwNYIIcHlwaS5vcmeCCioucHlwaS5vcmeCDHd3
dy5weXBpLm9yZ4IPZG9uYXRlLnB5cGkub3JnMA4GA1UdDwEB/wQEAwIFoDAdBgNV
HSUEFjAUBggrBgEFBQcDAQYIKwYBBQUHAwIwHQYDVR0OBBYEFH5KpEjjaz1tMuya
qyjnyKenhRycMFcGA1UdIARQME4wCAYGZ4EMAQIBMEIGCisGAQQBoDIKAQMwNDAy
BggrBgEFBQcCARYmaHR0cHM6Ly93d3cuZ2xvYmFsc2lnbi5jb20vcmVwb3NpdG9y
eS8wDAYDVR0TAQH/BAIwADCBngYIKwYBBQUHAQEEgZEwgY4wQAYIKwYBBQUHMAGG
NGh0dHA6Ly9vY3NwLmdsb2JhbHNpZ24uY29tL2NhL2dzYXRsYXNyM2R2dGxzY2Ey
MDIzcTIwSgYIKwYBBQUHMAKGPmh0dHA6Ly9zZWN1cmUuZ2xvYmFsc2lnbi5jb20v
Y2FjZXJ0L2dzYXRsYXNyM2R2dGxzY2EyMDIzcTIuY3J0MB8GA1UdIwQYMBaAFMai
YRNFFcyQj7rBrLzMOw0O0N4GMEgGA1UdHwRBMD8wPaA7oDmGN2h0dHA6Ly9jcmwu
Z2xvYmFsc2lnbi5jb20vY2EvZ3NhdGxhc3IzZHZ0bHNjYTIwMjNxMi5jcmwwggF/
BgorBgEEAdZ5AgQCBIIBbwSCAWsBaQB2AHb/iD8KtvuVUcJhzPWHujS0pM27Kdxo
Qgqf5mdMWjp0AAABh86UAM4AAAQDAEcwRQIhAMEeNv9F3vkrUFb8UDUnBgcJ2ed2
u0Y2h4qXuv4SyBcCAiAdoR3AfpZboQtcbZ4F5kfLAIaEZ48avbJTJGrTg0Z0dwB2
ADtTd3U+LbmAToswWwb+QDtn2E/D9Me9AA0tcm/h+tQXAAABh86UAXkAAAQDAEcw
RQIhAL+PCGdwFgr/6mjPltxIkO2pSZ6eDY2sv8n+cW5hXCmzAiAL3XKCZqwJGJXE
kvt1ZJkMoqLzAy5CM2ANzSIXQni6wgB3AHPZnokbTJZ4oCB9R53mssYc0FFecRkq
jGuAEHrBd3K1AAABh86UAcgAAAQDAEgwRgIhALbbX2nIHt3iNRL+nMyqN0CUwxDz
BaSjdQhfBDPciwKbAiEAov0IJaslITt1Mxtyh4Ped9ZOkST5A0K0/Fdbk64zI+sw
DQYJKoZIhvcNAQELBQADggEBAGodVH7XXcayedVPuAMF5agiOBVJp7evMWz2R8xK
ON0jovv1oItNrXvt3tVWvPUl4Dm/AIbCrAHw/d1cz1loot8Nv2tRI8vRpBZ6bnnQ
wWKVlJmz3BRr42wV5HMiLjk0cUFgL+BDcoqpcEKUXsuNgTaevvLkx38Oo8b4Y9PT
CBkcuiqBfqViBAHB9mUcJCtpXW5waX+DwvbkkTULNTdYq5CZLENSPa2H22r/V0SI
gu08iGpOOdMJaaFBQp35ECW+UTdYSa+9tMx+B3GzpgxXVcW/P/ZCKcThequGVDbr
7hy8HRcXVP/+ejef0co8/E9MR5/EYrICq5M7JWJunSDgFP8=
-----END CERTIFICATE-----
subject=CN = pypi.org
issuer=C = BE, O = GlobalSign nv-sa, CN = GlobalSign Atlas R3 DV TLS CA 2023 Q2
---
No client certificate CA names sent
Peer signing digest: SHA256
Peer signature type: RSA-PSS
Server Temp Key: X25519, 253 bits
---
SSL handshake has read 3387 bytes and written 374 bytes
Verification: OK
---
New, TLSv1.3, Cipher is TLS_AES_128_GCM_SHA256
Server public key is 2048 bit
Secure Renegotiation IS NOT supported
Compression: NONE
Expansion: NONE
No ALPN negotiated
Early data was not sent
Verify return code: 0 (ok)
---
---
Post-Handshake New Session Ticket arrived:
SSL-Session:
    Protocol  : TLSv1.3
    Cipher    : TLS_AES_128_GCM_SHA256
    Session-ID: 68E36B88B6BF20C8A72D63568E64F7120D66F9CD282309B0392158064AD05983
    Session-ID-ctx: 
    Resumption PSK: 8C5B30F3EB25B4FFE26CDE29F8D083AC2D6F24EE1F55912E3A007D5F19C73E22
    PSK identity: None
    PSK identity hint: None
    SRP username: None
    TLS session ticket lifetime hint: 3600 (seconds)
    TLS session ticket:
    0000 - 01 80 81 b4 02 f6 94 7f-38 55 c4 a9 06 33 69 a0   ........8U...3i.
    0010 - 51 f3 e3 89 c1 37 c1 d4-a6 1e 6a e8 5b 9a 34 3c   Q....7....j.[.4<
    0020 - 1b 9b cf b7 a3 7e 4d fc-3b 8b 89 a8 7d db 6f 7a   .....~M.;...}.oz
    0030 - bd 78 28 6d 9b 6c 9b 56-cd 31 30 f7 b6 24 81 04   .x(m.l.V.10..$..
    0040 - c1 d2 8c 5f d6 da e0 e5-e0 53 5b 4d bc 24 3e 6a   ..._.....S[M.$>j
    0050 - a1 0e da 87 22 9b d5 6b-7c 7f b1 b9 1c f8 72 9a   ...."..k|.....r.
    0060 - 09 eb 03 4d 7e 7c ed e6-87 c5 f5 17 5a a9 c3 d3   ...M~|......Z...
    0070 - c2 fe 67 47 4b 01 89 86-6f 2d e4 89 0e 1b 52 15   ..gGK...o-....R.
    0080 - cf a9 34 7e fb 1b 4c b4-49 00 93 5e 66 d4 4a c6   ..4~..L.I..^f.J.
    0090 - 17 dd 61 a2 78 c8 a2 13-ef 88 50 30 c7 30 e5 2f   ..a.x.....P0.0./

    Start Time: 1701106125
    Timeout   : 7200 (sec)
    Verify return code: 0 (ok)
    Extended master secret: no
    Max Early Data: 0
---
read R BLOCK
DONE
$ echo -n | openssl s_client -4 -connect files.pythonhosted.org:443

CONNECTED(00000003)
depth=2 OU = GlobalSign Root CA - R3, O = GlobalSign, CN = GlobalSign
verify return:1
depth=1 C = BE, O = GlobalSign nv-sa, CN = GlobalSign Atlas R3 DV TLS CA 2023 Q2
verify return:1
depth=0 CN = *.pythonhosted.org
verify return:1
---
Certificate chain
 0 s:CN = *.pythonhosted.org
   i:C = BE, O = GlobalSign nv-sa, CN = GlobalSign Atlas R3 DV TLS CA 2023 Q2
   a:PKEY: rsaEncryption, 2048 (bit); sigalg: RSA-SHA256
   v:NotBefore: Jul  1 20:50:25 2023 GMT; NotAfter: Aug  1 20:50:24 2024 GMT
 1 s:C = BE, O = GlobalSign nv-sa, CN = GlobalSign Atlas R3 DV TLS CA 2023 Q2
   i:OU = GlobalSign Root CA - R3, O = GlobalSign, CN = GlobalSign
   a:PKEY: rsaEncryption, 2048 (bit); sigalg: RSA-SHA256
   v:NotBefore: Jan 18 03:36:52 2023 GMT; NotAfter: Jan 18 00:00:00 2025 GMT
---
Server certificate
-----BEGIN CERTIFICATE-----
MIIGZjCCBU6gAwIBAgIQAQXnUK6h/QwFsLAnYL7NBDANBgkqhkiG9w0BAQsFADBY
MQswCQYDVQQGEwJCRTEZMBcGA1UEChMQR2xvYmFsU2lnbiBudi1zYTEuMCwGA1UE
AxMlR2xvYmFsU2lnbiBBdGxhcyBSMyBEViBUTFMgQ0EgMjAyMyBRMjAeFw0yMzA3
MDEyMDUwMjVaFw0yNDA4MDEyMDUwMjRaMB0xGzAZBgNVBAMMEioucHl0aG9uaG9z
dGVkLm9yZzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMMeAyhtK20j
ump8M2NOR/Wb5tTwfuySip+TkYnHzllwNqKPua+oTpPsMqDZ9JpqfFe+PMw02ajH
eaeJJTgoD8YEb4syAPMDoqz/0Ue7xRX1it9hTtHHB9UP9m0loa5t3Juaz+nxC4he
noQ2iAvZFFvT4dX47cg+qeNqiMgY1rMOJHcq1i0UXvpzdS6AFHgW6MGnyYvavAbV
Uv09ocno/X7KBED7eoL2HbfwIPgnq/L6bbbt/japig2tEmqyjbhW+vBvADyx55Y6
FirzZHkZ0HF3k2g65BvmTb22p0x+0XqLFjyXgYT0KwcEbKKYq8jJh0grpQH+GWZQ
0LyVmVegPK8CAwEAAaOCA2UwggNhMB0GA1UdEQQWMBSCEioucHl0aG9uaG9zdGVk
Lm9yZzAOBgNVHQ8BAf8EBAMCBaAwHQYDVR0lBBYwFAYIKwYBBQUHAwEGCCsGAQUF
BwMCMB0GA1UdDgQWBBRUjFwvnzsiKLolC2rxupen1gbfCzBXBgNVHSAEUDBOMAgG
BmeBDAECATBCBgorBgEEAaAyCgEDMDQwMgYIKwYBBQUHAgEWJmh0dHBzOi8vd3d3
Lmdsb2JhbHNpZ24uY29tL3JlcG9zaXRvcnkvMAwGA1UdEwEB/wQCMAAwgZ4GCCsG
AQUFBwEBBIGRMIGOMEAGCCsGAQUFBzABhjRodHRwOi8vb2NzcC5nbG9iYWxzaWdu
LmNvbS9jYS9nc2F0bGFzcjNkdnRsc2NhMjAyM3EyMEoGCCsGAQUFBzAChj5odHRw
Oi8vc2VjdXJlLmdsb2JhbHNpZ24uY29tL2NhY2VydC9nc2F0bGFzcjNkdnRsc2Nh
MjAyM3EyLmNydDAfBgNVHSMEGDAWgBTGomETRRXMkI+6way8zDsNDtDeBjBIBgNV
HR8EQTA/MD2gO6A5hjdodHRwOi8vY3JsLmdsb2JhbHNpZ24uY29tL2NhL2dzYXRs
YXNyM2R2dGxzY2EyMDIzcTIuY3JsMIIBfQYKKwYBBAHWeQIEAgSCAW0EggFpAWcA
dgB2/4g/Crb7lVHCYcz1h7o0tKTNuyncaEIKn+ZnTFo6dAAAAYkTOJ7lAAAEAwBH
MEUCIEpQN30bEORtGcI9cAkltlMBASSqJg9XBV2Mw0hno9Q/AiEAhrz1aIZxsAaq
x9LG5bvuUl9ZgfYMKH30+xjVevYM1nkAdgDuzdBk1dsazsVct520zROiModGfLzs
3sNRSFlGcR+1mwAAAYkTOJ8ZAAAEAwBHMEUCIQC9FUgUvNwRg49MrpBIX/RuGTry
5jpX5GmEzhxJJlioNwIgUga+LUjRh3BZNQirUf1p9KlEwlL0LdM/bie8hZZgSVwA
dQDatr9rP7W2Ip+bwrtca+hwkXFsu1GEhTS9pD0wSNf7qwAAAYkTOJ9XAAAEAwBG
MEQCIFWZBBBn2EOIY817GLCzzPbUgQzlxK6o0pUUvOSPdOMXAiBZaHEpJD05NCR7
oXsou1bqeES14vqUy53w4UNPopnNPzANBgkqhkiG9w0BAQsFAAOCAQEAlKhJpTZs
kkG/bBEoMrKclENg+jE3iCTEASTOWZ8ISodLG2TudAPK0XjL12Qt08kHz36aXjRo
uzjt1GEoLKmqfyThMKhDH657M+H2uokLxvvjHkru2BK8iibtqGHfHF1EgglcLrDG
UV6LxGTpQwxmSQRYNZ6tT+aSaMsWHinU/9lOQaHUz0nINMh7kcZJuZvjiw1I33tS
jEFayLbNtbDKiSzVsZ85VT7s9yfO4s4HOfUA2F1AFyWtaTRPYm+W2eU6foOR32yu
ZZxbMIp/VDJRw7k+wTGxPv8JUzDs6Rgh//qc7+NdCxsdlK+8tGUxWISJS7Ypgxtg
cRfB92MnObNElw==
-----END CERTIFICATE-----
subject=CN = *.pythonhosted.org
issuer=C = BE, O = GlobalSign nv-sa, CN = GlobalSign Atlas R3 DV TLS CA 2023 Q2
---
No client certificate CA names sent
Peer signing digest: SHA256
Peer signature type: RSA-PSS
Server Temp Key: X25519, 253 bits
---
SSL handshake has read 3362 bytes and written 388 bytes
Verification: OK
---
New, TLSv1.3, Cipher is TLS_AES_128_GCM_SHA256
Server public key is 2048 bit
Secure Renegotiation IS NOT supported
Compression: NONE
Expansion: NONE
No ALPN negotiated
Early data was not sent
Verify return code: 0 (ok)
---
---
Post-Handshake New Session Ticket arrived:
SSL-Session:
    Protocol  : TLSv1.3
    Cipher    : TLS_AES_128_GCM_SHA256
    Session-ID: 9E936943463D47C4160649B2463F6AA2C9A2DE26280736FB4925E0F620A95A51
    Session-ID-ctx: 
    Resumption PSK: 26D70F4D861383F45F61D2DC77F77088DA21C6AD3D7F1404D0BA7BA04F9D3E80
    PSK identity: None
    PSK identity hint: None
    SRP username: None
    TLS session ticket lifetime hint: 3600 (seconds)
    TLS session ticket:
    0000 - 01 80 81 b4 02 f6 94 7f-38 55 c4 a9 06 33 69 a0   ........8U...3i.
    0010 - 60 63 31 3e f2 36 f9 9f-ca 7c b6 c1 fc de 1a fb   `c1>.6...|......
    0020 - 97 26 55 f2 e5 42 76 ec-f5 32 60 24 03 a9 0e 31   .&U..Bv..2`$...1
    0030 - 0e 92 c4 24 44 1f 99 ee-e9 ac 9d 1d f1 58 85 cb   ...$D........X..
    0040 - 7b e3 12 46 7c c0 f3 7c-f9 ca 43 ec 3d 75 18 51   {..F|..|..C.=u.Q
    0050 - ef 4c cd cd 9d 13 9b bf-bc 74 8f e0 f1 cf e7 51   .L.......t.....Q
    0060 - 49 88 36 b1 7b 21 34 4d-28 ca 7c ef df be a3 4b   I.6.{!4M(.|....K
    0070 - 12 ce 41 06 c6 5c be 12-5b 7b 44 55 dd ff 4e 76   ..A..\..[{DU..Nv
    0080 - f8 a1 5c 9e 5b 1e 07 31-b1 60 bb 42 d3 32 fd 1e   ..\.[..1.`.B.2..
    0090 - 14 4a 05 d3 98 de d5 4d-f1 c8 1e 0e 86 a1 0d 5e   .J.....M.......^

    Start Time: 1701106138
    Timeout   : 7200 (sec)
    Verify return code: 0 (ok)
    Extended master secret: no
    Max Early Data: 0
---
read R BLOCK
DONE

TLS Debug / IPv6 (If available)

$ echo -n | openssl s_client -6 -connect pypi.org:443
CONNECTED(00000006)
depth=2 OU = GlobalSign Root CA - R3, O = GlobalSign, CN = GlobalSign
verify return:1
depth=1 C = BE, O = GlobalSign nv-sa, CN = GlobalSign Atlas R3 DV TLS CA 2023 Q2
verify return:1
depth=0 CN = pypi.org
verify return:1
---
Certificate chain
 0 s:CN = pypi.org
   i:C = BE, O = GlobalSign nv-sa, CN = GlobalSign Atlas R3 DV TLS CA 2023 Q2
   a:PKEY: rsaEncryption, 2048 (bit); sigalg: RSA-SHA256
   v:NotBefore: Apr 29 19:53:38 2023 GMT; NotAfter: May 30 19:53:37 2024 GMT
 1 s:C = BE, O = GlobalSign nv-sa, CN = GlobalSign Atlas R3 DV TLS CA 2023 Q2
   i:OU = GlobalSign Root CA - R3, O = GlobalSign, CN = GlobalSign
   a:PKEY: rsaEncryption, 2048 (bit); sigalg: RSA-SHA256
   v:NotBefore: Jan 18 03:36:52 2023 GMT; NotAfter: Jan 18 00:00:00 2025 GMT
---
Server certificate
-----BEGIN CERTIFICATE-----
MIIGfzCCBWegAwIBAgIQATphpUBWfreAY2OTrbDywTANBgkqhkiG9w0BAQsFADBY
MQswCQYDVQQGEwJCRTEZMBcGA1UEChMQR2xvYmFsU2lnbiBudi1zYTEuMCwGA1UE
AxMlR2xvYmFsU2lnbiBBdGxhcyBSMyBEViBUTFMgQ0EgMjAyMyBRMjAeFw0yMzA0
MjkxOTUzMzhaFw0yNDA1MzAxOTUzMzdaMBMxETAPBgNVBAMMCHB5cGkub3JnMIIB
IjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsVzK0dZ2ALTL74lfSb8xvcqO
eEP1opP9RNEQXhsEAs5sI8hYBP/j8IJO4cBZN/585CTJ8SAMxXon7IC0FvXnhefc
bE0kyHQf1cchLuqi2cArNUCZd7kIwYCpIpDvYLTlcJP1ClwwlUdDfobcMMLlot14
NBY11KT1iuNdujm83xF4LvHZu1dNTNMkU0Qnzl26tVKzewC29nEELWwz0Navusc/
5RVUI8bWrY2ZEJyeJvbs6aHcNbPdhfb8JP8pzheLNDL0VjWnxJnIDWttprck5FJM
lueKFjrx4vGB8kWfFpLkOSoq4/VW75FvR78Zx2Bj8BroMnbUiQ/NLhlBFHCscQID
AQABo4IDiDCCA4QwPgYDVR0RBDcwNYIIcHlwaS5vcmeCCioucHlwaS5vcmeCDHd3
dy5weXBpLm9yZ4IPZG9uYXRlLnB5cGkub3JnMA4GA1UdDwEB/wQEAwIFoDAdBgNV
HSUEFjAUBggrBgEFBQcDAQYIKwYBBQUHAwIwHQYDVR0OBBYEFH5KpEjjaz1tMuya
qyjnyKenhRycMFcGA1UdIARQME4wCAYGZ4EMAQIBMEIGCisGAQQBoDIKAQMwNDAy
BggrBgEFBQcCARYmaHR0cHM6Ly93d3cuZ2xvYmFsc2lnbi5jb20vcmVwb3NpdG9y
eS8wDAYDVR0TAQH/BAIwADCBngYIKwYBBQUHAQEEgZEwgY4wQAYIKwYBBQUHMAGG
NGh0dHA6Ly9vY3NwLmdsb2JhbHNpZ24uY29tL2NhL2dzYXRsYXNyM2R2dGxzY2Ey
MDIzcTIwSgYIKwYBBQUHMAKGPmh0dHA6Ly9zZWN1cmUuZ2xvYmFsc2lnbi5jb20v
Y2FjZXJ0L2dzYXRsYXNyM2R2dGxzY2EyMDIzcTIuY3J0MB8GA1UdIwQYMBaAFMai
YRNFFcyQj7rBrLzMOw0O0N4GMEgGA1UdHwRBMD8wPaA7oDmGN2h0dHA6Ly9jcmwu
Z2xvYmFsc2lnbi5jb20vY2EvZ3NhdGxhc3IzZHZ0bHNjYTIwMjNxMi5jcmwwggF/
BgorBgEEAdZ5AgQCBIIBbwSCAWsBaQB2AHb/iD8KtvuVUcJhzPWHujS0pM27Kdxo
Qgqf5mdMWjp0AAABh86UAM4AAAQDAEcwRQIhAMEeNv9F3vkrUFb8UDUnBgcJ2ed2
u0Y2h4qXuv4SyBcCAiAdoR3AfpZboQtcbZ4F5kfLAIaEZ48avbJTJGrTg0Z0dwB2
ADtTd3U+LbmAToswWwb+QDtn2E/D9Me9AA0tcm/h+tQXAAABh86UAXkAAAQDAEcw
RQIhAL+PCGdwFgr/6mjPltxIkO2pSZ6eDY2sv8n+cW5hXCmzAiAL3XKCZqwJGJXE
kvt1ZJkMoqLzAy5CM2ANzSIXQni6wgB3AHPZnokbTJZ4oCB9R53mssYc0FFecRkq
jGuAEHrBd3K1AAABh86UAcgAAAQDAEgwRgIhALbbX2nIHt3iNRL+nMyqN0CUwxDz
BaSjdQhfBDPciwKbAiEAov0IJaslITt1Mxtyh4Ped9ZOkST5A0K0/Fdbk64zI+sw
DQYJKoZIhvcNAQELBQADggEBAGodVH7XXcayedVPuAMF5agiOBVJp7evMWz2R8xK
ON0jovv1oItNrXvt3tVWvPUl4Dm/AIbCrAHw/d1cz1loot8Nv2tRI8vRpBZ6bnnQ
wWKVlJmz3BRr42wV5HMiLjk0cUFgL+BDcoqpcEKUXsuNgTaevvLkx38Oo8b4Y9PT
CBkcuiqBfqViBAHB9mUcJCtpXW5waX+DwvbkkTULNTdYq5CZLENSPa2H22r/V0SI
gu08iGpOOdMJaaFBQp35ECW+UTdYSa+9tMx+B3GzpgxXVcW/P/ZCKcThequGVDbr
7hy8HRcXVP/+ejef0co8/E9MR5/EYrICq5M7JWJunSDgFP8=
-----END CERTIFICATE-----
subject=CN = pypi.org
issuer=C = BE, O = GlobalSign nv-sa, CN = GlobalSign Atlas R3 DV TLS CA 2023 Q2
---
No client certificate CA names sent
Peer signing digest: SHA256
Peer signature type: RSA-PSS
Server Temp Key: X25519, 253 bits
---
SSL handshake has read 3387 bytes and written 374 bytes
Verification: OK
---
New, TLSv1.3, Cipher is TLS_AES_128_GCM_SHA256
Server public key is 2048 bit
Secure Renegotiation IS NOT supported
Compression: NONE
Expansion: NONE
No ALPN negotiated
Early data was not sent
Verify return code: 0 (ok)
---
---
Post-Handshake New Session Ticket arrived:
SSL-Session:
    Protocol  : TLSv1.3
    Cipher    : TLS_AES_128_GCM_SHA256
    Session-ID: E38C2A230AF8ADA4D9B5F991CE79AC834F4EED093C1A924E0D6EBF875468B1FD
    Session-ID-ctx: 
    Resumption PSK: EA2BBF38590B1A5360867E9EF34347F5DDE92322A871229479ECB1003283C1A7
    PSK identity: None
    PSK identity hint: None
    SRP username: None
    TLS session ticket lifetime hint: 3600 (seconds)
    TLS session ticket:
    0000 - 01 80 81 b4 02 f6 94 7f-38 55 c4 a9 06 33 69 a0   ........8U...3i.
    0010 - a6 e4 aa 46 a4 68 e2 3c-f8 7f 69 24 58 18 58 e9   ...F.h.<..i$X.X.
    0020 - e9 fb 86 b6 1c 8c 15 fe-c1 7a 5f bc 00 a3 29 0a   .........z_...).
    0030 - 91 99 51 a6 75 62 6f 1c-cf 71 79 8f 60 79 ec 6d   ..Q.ubo..qy.`y.m
    0040 - 5d 92 c9 45 3f 9e 36 bf-e9 cd 2b 68 f2 b6 8a 69   ]..E?.6...+h...i
    0050 - f0 ef 48 22 cc 39 58 64-1a 50 c3 9b 42 4e 67 d7   ..H".9Xd.P..BNg.
    0060 - 4e 33 57 9c 5b 66 43 ee-31 b5 8f 65 80 4d 92 33   N3W.[fC.1..e.M.3
    0070 - b1 12 f7 be a8 8d e8 ea-e6 19 29 80 b3 fb 37 66   ..........)...7f
    0080 - 24 07 13 03 67 c8 e3 0d-80 8b dc 8e 28 c1 77 80   $...g.......(.w.
    0090 - 86 21 74 82 28 e3 0e 16-04 f5 03 52 53 2a 5e 92   .!t.(......RS*^.

    Start Time: 1701106149
    Timeout   : 7200 (sec)
    Verify return code: 0 (ok)
    Extended master secret: no
    Max Early Data: 0
---
read R BLOCK
DONE
$ echo -n | openssl s_client -6 -connect files.pythonhosted.org:443

CONNECTED(00000005)
depth=2 OU = GlobalSign Root CA - R3, O = GlobalSign, CN = GlobalSign
verify return:1
depth=1 C = BE, O = GlobalSign nv-sa, CN = GlobalSign Atlas R3 DV TLS CA 2023 Q2
verify return:1
depth=0 CN = *.pythonhosted.org
verify return:1
---
Certificate chain
 0 s:CN = *.pythonhosted.org
   i:C = BE, O = GlobalSign nv-sa, CN = GlobalSign Atlas R3 DV TLS CA 2023 Q2
   a:PKEY: rsaEncryption, 2048 (bit); sigalg: RSA-SHA256
   v:NotBefore: Jul  1 20:50:25 2023 GMT; NotAfter: Aug  1 20:50:24 2024 GMT
 1 s:C = BE, O = GlobalSign nv-sa, CN = GlobalSign Atlas R3 DV TLS CA 2023 Q2
   i:OU = GlobalSign Root CA - R3, O = GlobalSign, CN = GlobalSign
   a:PKEY: rsaEncryption, 2048 (bit); sigalg: RSA-SHA256
   v:NotBefore: Jan 18 03:36:52 2023 GMT; NotAfter: Jan 18 00:00:00 2025 GMT
---
Server certificate
-----BEGIN CERTIFICATE-----
MIIGZjCCBU6gAwIBAgIQAQXnUK6h/QwFsLAnYL7NBDANBgkqhkiG9w0BAQsFADBY
MQswCQYDVQQGEwJCRTEZMBcGA1UEChMQR2xvYmFsU2lnbiBudi1zYTEuMCwGA1UE
AxMlR2xvYmFsU2lnbiBBdGxhcyBSMyBEViBUTFMgQ0EgMjAyMyBRMjAeFw0yMzA3
MDEyMDUwMjVaFw0yNDA4MDEyMDUwMjRaMB0xGzAZBgNVBAMMEioucHl0aG9uaG9z
dGVkLm9yZzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMMeAyhtK20j
ump8M2NOR/Wb5tTwfuySip+TkYnHzllwNqKPua+oTpPsMqDZ9JpqfFe+PMw02ajH
eaeJJTgoD8YEb4syAPMDoqz/0Ue7xRX1it9hTtHHB9UP9m0loa5t3Juaz+nxC4he
noQ2iAvZFFvT4dX47cg+qeNqiMgY1rMOJHcq1i0UXvpzdS6AFHgW6MGnyYvavAbV
Uv09ocno/X7KBED7eoL2HbfwIPgnq/L6bbbt/japig2tEmqyjbhW+vBvADyx55Y6
FirzZHkZ0HF3k2g65BvmTb22p0x+0XqLFjyXgYT0KwcEbKKYq8jJh0grpQH+GWZQ
0LyVmVegPK8CAwEAAaOCA2UwggNhMB0GA1UdEQQWMBSCEioucHl0aG9uaG9zdGVk
Lm9yZzAOBgNVHQ8BAf8EBAMCBaAwHQYDVR0lBBYwFAYIKwYBBQUHAwEGCCsGAQUF
BwMCMB0GA1UdDgQWBBRUjFwvnzsiKLolC2rxupen1gbfCzBXBgNVHSAEUDBOMAgG
BmeBDAECATBCBgorBgEEAaAyCgEDMDQwMgYIKwYBBQUHAgEWJmh0dHBzOi8vd3d3
Lmdsb2JhbHNpZ24uY29tL3JlcG9zaXRvcnkvMAwGA1UdEwEB/wQCMAAwgZ4GCCsG
AQUFBwEBBIGRMIGOMEAGCCsGAQUFBzABhjRodHRwOi8vb2NzcC5nbG9iYWxzaWdu
LmNvbS9jYS9nc2F0bGFzcjNkdnRsc2NhMjAyM3EyMEoGCCsGAQUFBzAChj5odHRw
Oi8vc2VjdXJlLmdsb2JhbHNpZ24uY29tL2NhY2VydC9nc2F0bGFzcjNkdnRsc2Nh
MjAyM3EyLmNydDAfBgNVHSMEGDAWgBTGomETRRXMkI+6way8zDsNDtDeBjBIBgNV
HR8EQTA/MD2gO6A5hjdodHRwOi8vY3JsLmdsb2JhbHNpZ24uY29tL2NhL2dzYXRs
YXNyM2R2dGxzY2EyMDIzcTIuY3JsMIIBfQYKKwYBBAHWeQIEAgSCAW0EggFpAWcA
dgB2/4g/Crb7lVHCYcz1h7o0tKTNuyncaEIKn+ZnTFo6dAAAAYkTOJ7lAAAEAwBH
MEUCIEpQN30bEORtGcI9cAkltlMBASSqJg9XBV2Mw0hno9Q/AiEAhrz1aIZxsAaq
x9LG5bvuUl9ZgfYMKH30+xjVevYM1nkAdgDuzdBk1dsazsVct520zROiModGfLzs
3sNRSFlGcR+1mwAAAYkTOJ8ZAAAEAwBHMEUCIQC9FUgUvNwRg49MrpBIX/RuGTry
5jpX5GmEzhxJJlioNwIgUga+LUjRh3BZNQirUf1p9KlEwlL0LdM/bie8hZZgSVwA
dQDatr9rP7W2Ip+bwrtca+hwkXFsu1GEhTS9pD0wSNf7qwAAAYkTOJ9XAAAEAwBG
MEQCIFWZBBBn2EOIY817GLCzzPbUgQzlxK6o0pUUvOSPdOMXAiBZaHEpJD05NCR7
oXsou1bqeES14vqUy53w4UNPopnNPzANBgkqhkiG9w0BAQsFAAOCAQEAlKhJpTZs
kkG/bBEoMrKclENg+jE3iCTEASTOWZ8ISodLG2TudAPK0XjL12Qt08kHz36aXjRo
uzjt1GEoLKmqfyThMKhDH657M+H2uokLxvvjHkru2BK8iibtqGHfHF1EgglcLrDG
UV6LxGTpQwxmSQRYNZ6tT+aSaMsWHinU/9lOQaHUz0nINMh7kcZJuZvjiw1I33tS
jEFayLbNtbDKiSzVsZ85VT7s9yfO4s4HOfUA2F1AFyWtaTRPYm+W2eU6foOR32yu
ZZxbMIp/VDJRw7k+wTGxPv8JUzDs6Rgh//qc7+NdCxsdlK+8tGUxWISJS7Ypgxtg
cRfB92MnObNElw==
-----END CERTIFICATE-----
subject=CN = *.pythonhosted.org
issuer=C = BE, O = GlobalSign nv-sa, CN = GlobalSign Atlas R3 DV TLS CA 2023 Q2
---
No client certificate CA names sent
Peer signing digest: SHA256
Peer signature type: RSA-PSS
Server Temp Key: X25519, 253 bits
---
SSL handshake has read 3362 bytes and written 388 bytes
Verification: OK
---
New, TLSv1.3, Cipher is TLS_AES_128_GCM_SHA256
Server public key is 2048 bit
Secure Renegotiation IS NOT supported
Compression: NONE
Expansion: NONE
No ALPN negotiated
Early data was not sent
Verify return code: 0 (ok)
---
---
Post-Handshake New Session Ticket arrived:
SSL-Session:
    Protocol  : TLSv1.3
    Cipher    : TLS_AES_128_GCM_SHA256
    Session-ID: E2141003B748408910D46188AC36F7FE96E8FBBF394BE6A1B14BE8A808AD7379
    Session-ID-ctx: 
    Resumption PSK: F8479E50FA3716F660F1F4EA13DDBE46B17E2571A0D6E7319A2026D902EA56DB
    PSK identity: None
    PSK identity hint: None
    SRP username: None
    TLS session ticket lifetime hint: 3600 (seconds)
    TLS session ticket:
    0000 - 01 80 81 b4 02 f6 94 7f-38 55 c4 a9 06 33 69 a0   ........8U...3i.
    0010 - fe b3 6e 16 24 fa a4 33-20 5b 8e 2f b6 c3 56 55   ..n.$..3 [./..VU
    0020 - c8 80 e0 a8 07 26 a5 96-e7 b1 4d 9a 15 7e c1 e8   .....&....M..~..
    0030 - 12 0b be b3 cc fe e1 d0-0a 62 0b 96 87 c5 e4 e2   .........b......
    0040 - 2d 89 9e 95 7c b5 93 80-26 80 3e d3 c5 48 8b 47   -...|...&.>..H.G
    0050 - fd 8b 03 a9 f3 82 fd 87-73 d6 23 bb c9 cd f9 29   ........s.#....)
    0060 - e9 a3 15 43 7a 64 d4 c9-75 45 a8 ad a9 f5 79 a7   ...Czd..uE....y.
    0070 - fb 94 a0 54 55 73 17 38-1b 40 7a 02 24 8c b2 b2   ...TUs.8.@z.$...
    0080 - 57 98 8e fd ac 6e 31 c9-16 53 fd 52 cf c8 fe 2d   W....n1..S.R...-
    0090 - 5a 3f f7 5e 8a 9b 5f 7c-7a 0e 43 7a 50 17 d4 d1   Z?.^.._|z.CzP...

    Start Time: 1701106161
    Timeout   : 7200 (sec)
    Verify return code: 0 (ok)
    Extended master secret: no
    Max Early Data: 0
---
read R BLOCK
DONE

Code of Conduct

bmvandoren commented 6 months ago

I'm still having this issue and would very much appreciate guidance, as I still cannot upload updates to my package.

miketheman commented 6 months ago

@bmvandoren I think we're missing some key details about your set up here - specifically some versions of anaconda, twine, requests, urllib3, certifi, ca-certificates.

We can see that you're able to connect via the openssl tool, so there might be something else amiss in the Python environment.

bmvandoren commented 6 months ago

Thanks for getting back to me, @miketheman. Happy to provide whatever details would be helpful.

conda version : 23.10.0 conda-build version : 3.22.0 python version : 3.8.18.final.0

ca-certificates 2023.08.22 hecd8cb5_0

twine==4.0.2 requests==2.31.0 requests-oauthlib==1.3.1 requests-toolbelt==1.0.0 urllib3==2.1.0 certifi==2023.11.17

Many thanks.

bmvandoren commented 6 months ago

Also worth highlighting that the package is large (81.3 mb), but below the 100 mb limit (and I was able to upload earlier versions of virtually the same size).

miketheman commented 6 months ago

Thanks. I've also noticed that some of the openssl debug commands are referring to pypi.org, not test.pypi.org where you're seeing the issue - can you please update/run those as well and provide the output?

bmvandoren commented 6 months ago

Happily! I think I found the relevant commands, but let me know if there are any others to run. Thanks @miketheman.

echo -n | openssl s_client -4 -connect test.pypi.org:443
CONNECTED(00000003)
depth=2 OU = GlobalSign Root CA - R3, O = GlobalSign, CN = GlobalSign
verify return:1
depth=1 C = BE, O = GlobalSign nv-sa, CN = GlobalSign Atlas R3 DV TLS CA 2023 Q2
verify return:1
depth=0 CN = pypi.org
verify return:1
---
Certificate chain
 0 s:CN = pypi.org
   i:C = BE, O = GlobalSign nv-sa, CN = GlobalSign Atlas R3 DV TLS CA 2023 Q2
   a:PKEY: rsaEncryption, 2048 (bit); sigalg: RSA-SHA256
   v:NotBefore: Apr 29 19:53:38 2023 GMT; NotAfter: May 30 19:53:37 2024 GMT
 1 s:C = BE, O = GlobalSign nv-sa, CN = GlobalSign Atlas R3 DV TLS CA 2023 Q2
   i:OU = GlobalSign Root CA - R3, O = GlobalSign, CN = GlobalSign
   a:PKEY: rsaEncryption, 2048 (bit); sigalg: RSA-SHA256
   v:NotBefore: Jan 18 03:36:52 2023 GMT; NotAfter: Jan 18 00:00:00 2025 GMT
---
Server certificate
-----BEGIN CERTIFICATE-----
MIIGfzCCBWegAwIBAgIQATphpUBWfreAY2OTrbDywTANBgkqhkiG9w0BAQsFADBY
MQswCQYDVQQGEwJCRTEZMBcGA1UEChMQR2xvYmFsU2lnbiBudi1zYTEuMCwGA1UE
AxMlR2xvYmFsU2lnbiBBdGxhcyBSMyBEViBUTFMgQ0EgMjAyMyBRMjAeFw0yMzA0
MjkxOTUzMzhaFw0yNDA1MzAxOTUzMzdaMBMxETAPBgNVBAMMCHB5cGkub3JnMIIB
IjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsVzK0dZ2ALTL74lfSb8xvcqO
eEP1opP9RNEQXhsEAs5sI8hYBP/j8IJO4cBZN/585CTJ8SAMxXon7IC0FvXnhefc
bE0kyHQf1cchLuqi2cArNUCZd7kIwYCpIpDvYLTlcJP1ClwwlUdDfobcMMLlot14
NBY11KT1iuNdujm83xF4LvHZu1dNTNMkU0Qnzl26tVKzewC29nEELWwz0Navusc/
5RVUI8bWrY2ZEJyeJvbs6aHcNbPdhfb8JP8pzheLNDL0VjWnxJnIDWttprck5FJM
lueKFjrx4vGB8kWfFpLkOSoq4/VW75FvR78Zx2Bj8BroMnbUiQ/NLhlBFHCscQID
AQABo4IDiDCCA4QwPgYDVR0RBDcwNYIIcHlwaS5vcmeCCioucHlwaS5vcmeCDHd3
dy5weXBpLm9yZ4IPZG9uYXRlLnB5cGkub3JnMA4GA1UdDwEB/wQEAwIFoDAdBgNV
HSUEFjAUBggrBgEFBQcDAQYIKwYBBQUHAwIwHQYDVR0OBBYEFH5KpEjjaz1tMuya
qyjnyKenhRycMFcGA1UdIARQME4wCAYGZ4EMAQIBMEIGCisGAQQBoDIKAQMwNDAy
BggrBgEFBQcCARYmaHR0cHM6Ly93d3cuZ2xvYmFsc2lnbi5jb20vcmVwb3NpdG9y
eS8wDAYDVR0TAQH/BAIwADCBngYIKwYBBQUHAQEEgZEwgY4wQAYIKwYBBQUHMAGG
NGh0dHA6Ly9vY3NwLmdsb2JhbHNpZ24uY29tL2NhL2dzYXRsYXNyM2R2dGxzY2Ey
MDIzcTIwSgYIKwYBBQUHMAKGPmh0dHA6Ly9zZWN1cmUuZ2xvYmFsc2lnbi5jb20v
Y2FjZXJ0L2dzYXRsYXNyM2R2dGxzY2EyMDIzcTIuY3J0MB8GA1UdIwQYMBaAFMai
YRNFFcyQj7rBrLzMOw0O0N4GMEgGA1UdHwRBMD8wPaA7oDmGN2h0dHA6Ly9jcmwu
Z2xvYmFsc2lnbi5jb20vY2EvZ3NhdGxhc3IzZHZ0bHNjYTIwMjNxMi5jcmwwggF/
BgorBgEEAdZ5AgQCBIIBbwSCAWsBaQB2AHb/iD8KtvuVUcJhzPWHujS0pM27Kdxo
Qgqf5mdMWjp0AAABh86UAM4AAAQDAEcwRQIhAMEeNv9F3vkrUFb8UDUnBgcJ2ed2
u0Y2h4qXuv4SyBcCAiAdoR3AfpZboQtcbZ4F5kfLAIaEZ48avbJTJGrTg0Z0dwB2
ADtTd3U+LbmAToswWwb+QDtn2E/D9Me9AA0tcm/h+tQXAAABh86UAXkAAAQDAEcw
RQIhAL+PCGdwFgr/6mjPltxIkO2pSZ6eDY2sv8n+cW5hXCmzAiAL3XKCZqwJGJXE
kvt1ZJkMoqLzAy5CM2ANzSIXQni6wgB3AHPZnokbTJZ4oCB9R53mssYc0FFecRkq
jGuAEHrBd3K1AAABh86UAcgAAAQDAEgwRgIhALbbX2nIHt3iNRL+nMyqN0CUwxDz
BaSjdQhfBDPciwKbAiEAov0IJaslITt1Mxtyh4Ped9ZOkST5A0K0/Fdbk64zI+sw
DQYJKoZIhvcNAQELBQADggEBAGodVH7XXcayedVPuAMF5agiOBVJp7evMWz2R8xK
ON0jovv1oItNrXvt3tVWvPUl4Dm/AIbCrAHw/d1cz1loot8Nv2tRI8vRpBZ6bnnQ
wWKVlJmz3BRr42wV5HMiLjk0cUFgL+BDcoqpcEKUXsuNgTaevvLkx38Oo8b4Y9PT
CBkcuiqBfqViBAHB9mUcJCtpXW5waX+DwvbkkTULNTdYq5CZLENSPa2H22r/V0SI
gu08iGpOOdMJaaFBQp35ECW+UTdYSa+9tMx+B3GzpgxXVcW/P/ZCKcThequGVDbr
7hy8HRcXVP/+ejef0co8/E9MR5/EYrICq5M7JWJunSDgFP8=
-----END CERTIFICATE-----
subject=CN = pypi.org
issuer=C = BE, O = GlobalSign nv-sa, CN = GlobalSign Atlas R3 DV TLS CA 2023 Q2
---
No client certificate CA names sent
Peer signing digest: SHA256
Peer signature type: RSA-PSS
Server Temp Key: X25519, 253 bits
---
SSL handshake has read 3387 bytes and written 379 bytes
Verification: OK
---
New, TLSv1.3, Cipher is TLS_AES_128_GCM_SHA256
Server public key is 2048 bit
Secure Renegotiation IS NOT supported
Compression: NONE
Expansion: NONE
No ALPN negotiated
Early data was not sent
Verify return code: 0 (ok)
---
---
Post-Handshake New Session Ticket arrived:
SSL-Session:
    Protocol  : TLSv1.3
    Cipher    : TLS_AES_128_GCM_SHA256
    Session-ID: F5FFE6F6AD33D7B691B545CB1A8F1BECC175A10843A0BBC47D0B63A4F0B82273
    Session-ID-ctx: 
    Resumption PSK: F2325E2E190483CB0C6C2E85F87F0679552E47D0CECF83155C9BA23E73FAA38E
    PSK identity: None
    PSK identity hint: None
    SRP username: None
    TLS session ticket lifetime hint: 3600 (seconds)
    TLS session ticket:
    0000 - fe c4 d8 e8 7f fa 85 df-ce e0 cd 82 cf e0 2a be   ..............*.
    0010 - 06 5a 8c d3 0b 30 2c cb-cb 53 bb be d8 a4 f5 02   .Z...0,..S......
    0020 - 64 10 c1 f7 cc 78 bf fb-3d 8e 67 2a a3 1e 3a 5c   d....x..=.g*..:\
    0030 - 53 76 fa 3c 13 01 8f b4-b2 60 b5 fc 55 0c 72 91   Sv.<.....`..U.r.
    0040 - 95 c4 bf 82 36 51 52 df-d9 64 f1 df be fc 97 48   ....6QR..d.....H
    0050 - cf ee 93 93 d6 33 07 c4-1d 26 9c 22 57 d1 27 fb   .....3...&."W.'.
    0060 - f4 7e 00 85 ce 14 19 0f-8c 03 ec 07 db 8c 4c f4   .~............L.
    0070 - 03 b9 b1 86 86 31 d1 69-ce 13 82 64 df 6f 9f 30   .....1.i...d.o.0
    0080 - dd 48 ad 17 e5 2c 51 ed-b0 40 10 0d 1f a3 ed 58   .H...,Q..@.....X
    0090 - b7 77 33 1e 15 2f 34 13-7b fe 3f 5c d9 14 a3 8a   .w3../4.{.?\....

    Start Time: 1702930239
    Timeout   : 7200 (sec)
    Verify return code: 0 (ok)
    Extended master secret: no
    Max Early Data: 0
---
read R BLOCK
DONE
echo -n | openssl s_client -6 -connect test.pypi.org:443
CONNECTED(00000005)
depth=2 OU = GlobalSign Root CA - R3, O = GlobalSign, CN = GlobalSign
verify return:1
depth=1 C = BE, O = GlobalSign nv-sa, CN = GlobalSign Atlas R3 DV TLS CA 2023 Q2
verify return:1
depth=0 CN = pypi.org
verify return:1
---
Certificate chain
 0 s:CN = pypi.org
   i:C = BE, O = GlobalSign nv-sa, CN = GlobalSign Atlas R3 DV TLS CA 2023 Q2
   a:PKEY: rsaEncryption, 2048 (bit); sigalg: RSA-SHA256
   v:NotBefore: Apr 29 19:53:38 2023 GMT; NotAfter: May 30 19:53:37 2024 GMT
 1 s:C = BE, O = GlobalSign nv-sa, CN = GlobalSign Atlas R3 DV TLS CA 2023 Q2
   i:OU = GlobalSign Root CA - R3, O = GlobalSign, CN = GlobalSign
   a:PKEY: rsaEncryption, 2048 (bit); sigalg: RSA-SHA256
   v:NotBefore: Jan 18 03:36:52 2023 GMT; NotAfter: Jan 18 00:00:00 2025 GMT
---
Server certificate
-----BEGIN CERTIFICATE-----
MIIGfzCCBWegAwIBAgIQATphpUBWfreAY2OTrbDywTANBgkqhkiG9w0BAQsFADBY
MQswCQYDVQQGEwJCRTEZMBcGA1UEChMQR2xvYmFsU2lnbiBudi1zYTEuMCwGA1UE
AxMlR2xvYmFsU2lnbiBBdGxhcyBSMyBEViBUTFMgQ0EgMjAyMyBRMjAeFw0yMzA0
MjkxOTUzMzhaFw0yNDA1MzAxOTUzMzdaMBMxETAPBgNVBAMMCHB5cGkub3JnMIIB
IjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsVzK0dZ2ALTL74lfSb8xvcqO
eEP1opP9RNEQXhsEAs5sI8hYBP/j8IJO4cBZN/585CTJ8SAMxXon7IC0FvXnhefc
bE0kyHQf1cchLuqi2cArNUCZd7kIwYCpIpDvYLTlcJP1ClwwlUdDfobcMMLlot14
NBY11KT1iuNdujm83xF4LvHZu1dNTNMkU0Qnzl26tVKzewC29nEELWwz0Navusc/
5RVUI8bWrY2ZEJyeJvbs6aHcNbPdhfb8JP8pzheLNDL0VjWnxJnIDWttprck5FJM
lueKFjrx4vGB8kWfFpLkOSoq4/VW75FvR78Zx2Bj8BroMnbUiQ/NLhlBFHCscQID
AQABo4IDiDCCA4QwPgYDVR0RBDcwNYIIcHlwaS5vcmeCCioucHlwaS5vcmeCDHd3
dy5weXBpLm9yZ4IPZG9uYXRlLnB5cGkub3JnMA4GA1UdDwEB/wQEAwIFoDAdBgNV
HSUEFjAUBggrBgEFBQcDAQYIKwYBBQUHAwIwHQYDVR0OBBYEFH5KpEjjaz1tMuya
qyjnyKenhRycMFcGA1UdIARQME4wCAYGZ4EMAQIBMEIGCisGAQQBoDIKAQMwNDAy
BggrBgEFBQcCARYmaHR0cHM6Ly93d3cuZ2xvYmFsc2lnbi5jb20vcmVwb3NpdG9y
eS8wDAYDVR0TAQH/BAIwADCBngYIKwYBBQUHAQEEgZEwgY4wQAYIKwYBBQUHMAGG
NGh0dHA6Ly9vY3NwLmdsb2JhbHNpZ24uY29tL2NhL2dzYXRsYXNyM2R2dGxzY2Ey
MDIzcTIwSgYIKwYBBQUHMAKGPmh0dHA6Ly9zZWN1cmUuZ2xvYmFsc2lnbi5jb20v
Y2FjZXJ0L2dzYXRsYXNyM2R2dGxzY2EyMDIzcTIuY3J0MB8GA1UdIwQYMBaAFMai
YRNFFcyQj7rBrLzMOw0O0N4GMEgGA1UdHwRBMD8wPaA7oDmGN2h0dHA6Ly9jcmwu
Z2xvYmFsc2lnbi5jb20vY2EvZ3NhdGxhc3IzZHZ0bHNjYTIwMjNxMi5jcmwwggF/
BgorBgEEAdZ5AgQCBIIBbwSCAWsBaQB2AHb/iD8KtvuVUcJhzPWHujS0pM27Kdxo
Qgqf5mdMWjp0AAABh86UAM4AAAQDAEcwRQIhAMEeNv9F3vkrUFb8UDUnBgcJ2ed2
u0Y2h4qXuv4SyBcCAiAdoR3AfpZboQtcbZ4F5kfLAIaEZ48avbJTJGrTg0Z0dwB2
ADtTd3U+LbmAToswWwb+QDtn2E/D9Me9AA0tcm/h+tQXAAABh86UAXkAAAQDAEcw
RQIhAL+PCGdwFgr/6mjPltxIkO2pSZ6eDY2sv8n+cW5hXCmzAiAL3XKCZqwJGJXE
kvt1ZJkMoqLzAy5CM2ANzSIXQni6wgB3AHPZnokbTJZ4oCB9R53mssYc0FFecRkq
jGuAEHrBd3K1AAABh86UAcgAAAQDAEgwRgIhALbbX2nIHt3iNRL+nMyqN0CUwxDz
BaSjdQhfBDPciwKbAiEAov0IJaslITt1Mxtyh4Ped9ZOkST5A0K0/Fdbk64zI+sw
DQYJKoZIhvcNAQELBQADggEBAGodVH7XXcayedVPuAMF5agiOBVJp7evMWz2R8xK
ON0jovv1oItNrXvt3tVWvPUl4Dm/AIbCrAHw/d1cz1loot8Nv2tRI8vRpBZ6bnnQ
wWKVlJmz3BRr42wV5HMiLjk0cUFgL+BDcoqpcEKUXsuNgTaevvLkx38Oo8b4Y9PT
CBkcuiqBfqViBAHB9mUcJCtpXW5waX+DwvbkkTULNTdYq5CZLENSPa2H22r/V0SI
gu08iGpOOdMJaaFBQp35ECW+UTdYSa+9tMx+B3GzpgxXVcW/P/ZCKcThequGVDbr
7hy8HRcXVP/+ejef0co8/E9MR5/EYrICq5M7JWJunSDgFP8=
-----END CERTIFICATE-----
subject=CN = pypi.org
issuer=C = BE, O = GlobalSign nv-sa, CN = GlobalSign Atlas R3 DV TLS CA 2023 Q2
---
No client certificate CA names sent
Peer signing digest: SHA256
Peer signature type: RSA-PSS
Server Temp Key: X25519, 253 bits
---
SSL handshake has read 3337 bytes and written 395 bytes
Verification: OK
---
New, TLSv1.3, Cipher is TLS_AES_256_GCM_SHA384
Server public key is 2048 bit
Secure Renegotiation IS NOT supported
Compression: NONE
Expansion: NONE
No ALPN negotiated
Early data was not sent
Verify return code: 0 (ok)
---
DONE
miketheman commented 6 months ago

I will point out that something doesn't look right - since you've said you're using Python 3.8, but the first traceback is showing an anaconda Python 3.10 in the logged paths - are you certain you're using the same python env?

bmvandoren commented 6 months ago

Hmm. It looks like I have 3.8 installed in the (base) conda environment, but the development environment for this package has Python 3.10, as intended. I created the development environment using this command:

conda create -n nighthawk-dev2 python=3.10

If I run python in this environment, it shows me that I am indeed using 3.10:

python
Python 3.10.13 (main, Sep 11 2023, 08:39:02) [Clang 14.0.6 ] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> 

The output above was from the conda info command:

conda info

     active environment : nighthawk-dev2
    active env location : /Users/benjamin/opt/anaconda3/envs/nighthawk-dev2
            shell level : 2
       user config file : /Users/benjamin/.condarc
 populated config files : /Users/benjamin/.condarc
          conda version : 23.10.0
    conda-build version : 3.22.0
         python version : 3.8.18.final.0
...

This clearly indicates a python version of 3.8, but I am not sure if this would be expected to show 3.10 in this case.

I hope this helps.

bmvandoren commented 6 months ago

I believe this means that anaconda is installed in a base python version of 3.8, but this is different from the python version of the development environment, which is 3.10. However, I could definitely be wrong.

bmvandoren commented 6 months ago

And to answer your question, yes, all of the commands I have run here have been run in the nighthawk-dev2 development environment.

miketheman commented 6 months ago

@bmvandoren The only other things I can currently think of is that your TestPyPI account isn't currently set up for 2FA (which is already required on TestPyPI, and coming to PyPI), which would then also need an API Token instead of username/password for twine.

I'd have expected a different error message than the one we saw though.

Does the exact same error persist as when you originally reported the issue, or has the traceback changed?

miketheman commented 6 months ago

You could also add --verbose to the twine upload step to get a bit more context in the output.

bmvandoren commented 6 months ago

I do not have 2FA set up - I will try that now and let you know.

bmvandoren commented 6 months ago

Unfortunately that doesn't appear to have fixed the issue. I set up 2FA on my test.pypi account, and twine appears to be able to authenticate using this method. But I still get the same warning and eventual error.

I should also note that a colleague of mine who is also on this project gets the same error when he tries to upload the package using his test PyPI account on his computer.

Here's the twine output after enabling 2FA:

$ python -m twine upload --repository nighthawk dist/* --verbose
INFO     Using configuration from /Users/benjamin/.pypirc                                                                          
Uploading distributions to https://test.pypi.org/legacy/
INFO     dist/nighthawk-0.3.0-py3-none-any.whl (77.5 MB)                                                                           
INFO     dist/nighthawk-0.3.0.tar.gz (77.5 MB)                                                                                     
INFO     username set from config file                                                                                             
INFO     password set from config file                                                                                             
INFO     username: __token__                                                                                                       
INFO     password: <hidden>                                                                                                        
Uploading nighthawk-0.3.0-py3-none-any.whl
WARNING  Retrying (Retry(total=9, connect=5, read=None, redirect=None, status=None)) after connection broken by 'SSLEOFError(8,    
         'EOF occurred in violation of protocol (_ssl.c:2426)')': /legacy/                                                         
100% ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 81.3/81.3 MB • 01:04 • 1.4 MB/s

Traceback (most recent call last):
  File "/Users/benjamin/opt/anaconda3/envs/nighthawk-dev2/lib/python3.10/site-packages/urllib3/connectionpool.py", line 790, in urlopen
    response = self._make_request(
  File "/Users/benjamin/opt/anaconda3/envs/nighthawk-dev2/lib/python3.10/site-packages/urllib3/connectionpool.py", line 536, in _make_request
    response = conn.getresponse()
  File "/Users/benjamin/opt/anaconda3/envs/nighthawk-dev2/lib/python3.10/site-packages/urllib3/connection.py", line 461, in getresponse
    httplib_response = super().getresponse()
  File "/Users/benjamin/opt/anaconda3/envs/nighthawk-dev2/lib/python3.10/http/client.py", line 1375, in getresponse
    response.begin()
  File "/Users/benjamin/opt/anaconda3/envs/nighthawk-dev2/lib/python3.10/http/client.py", line 318, in begin
    version, status, reason = self._read_status()
  File "/Users/benjamin/opt/anaconda3/envs/nighthawk-dev2/lib/python3.10/http/client.py", line 287, in _read_status
    raise RemoteDisconnected("Remote end closed connection without"
http.client.RemoteDisconnected: Remote end closed connection without response

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/Users/benjamin/opt/anaconda3/envs/nighthawk-dev2/lib/python3.10/site-packages/requests/adapters.py", line 486, in send
    resp = conn.urlopen(
  File "/Users/benjamin/opt/anaconda3/envs/nighthawk-dev2/lib/python3.10/site-packages/urllib3/connectionpool.py", line 874, in urlopen
    return self.urlopen(
  File "/Users/benjamin/opt/anaconda3/envs/nighthawk-dev2/lib/python3.10/site-packages/urllib3/connectionpool.py", line 844, in urlopen
    retries = retries.increment(
  File "/Users/benjamin/opt/anaconda3/envs/nighthawk-dev2/lib/python3.10/site-packages/urllib3/util/retry.py", line 470, in increment
    raise reraise(type(error), error, _stacktrace)
  File "/Users/benjamin/opt/anaconda3/envs/nighthawk-dev2/lib/python3.10/site-packages/urllib3/util/util.py", line 38, in reraise
    raise value.with_traceback(tb)
  File "/Users/benjamin/opt/anaconda3/envs/nighthawk-dev2/lib/python3.10/site-packages/urllib3/connectionpool.py", line 790, in urlopen
    response = self._make_request(
  File "/Users/benjamin/opt/anaconda3/envs/nighthawk-dev2/lib/python3.10/site-packages/urllib3/connectionpool.py", line 536, in _make_request
    response = conn.getresponse()
  File "/Users/benjamin/opt/anaconda3/envs/nighthawk-dev2/lib/python3.10/site-packages/urllib3/connection.py", line 461, in getresponse
    httplib_response = super().getresponse()
  File "/Users/benjamin/opt/anaconda3/envs/nighthawk-dev2/lib/python3.10/http/client.py", line 1375, in getresponse
    response.begin()
  File "/Users/benjamin/opt/anaconda3/envs/nighthawk-dev2/lib/python3.10/http/client.py", line 318, in begin
    version, status, reason = self._read_status()
  File "/Users/benjamin/opt/anaconda3/envs/nighthawk-dev2/lib/python3.10/http/client.py", line 287, in _read_status
    raise RemoteDisconnected("Remote end closed connection without"
urllib3.exceptions.ProtocolError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/Users/benjamin/opt/anaconda3/envs/nighthawk-dev2/lib/python3.10/runpy.py", line 196, in _run_module_as_main
    return _run_code(code, main_globals, None,
  File "/Users/benjamin/opt/anaconda3/envs/nighthawk-dev2/lib/python3.10/runpy.py", line 86, in _run_code
    exec(code, run_globals)
  File "/Users/benjamin/opt/anaconda3/envs/nighthawk-dev2/lib/python3.10/site-packages/twine/__main__.py", line 51, in <module>
    sys.exit(main())
  File "/Users/benjamin/opt/anaconda3/envs/nighthawk-dev2/lib/python3.10/site-packages/twine/__main__.py", line 33, in main
    error = cli.dispatch(sys.argv[1:])
  File "/Users/benjamin/opt/anaconda3/envs/nighthawk-dev2/lib/python3.10/site-packages/twine/cli.py", line 123, in dispatch
    return main(args.args)
  File "/Users/benjamin/opt/anaconda3/envs/nighthawk-dev2/lib/python3.10/site-packages/twine/commands/upload.py", line 198, in main
    return upload(upload_settings, parsed_args.dists)
  File "/Users/benjamin/opt/anaconda3/envs/nighthawk-dev2/lib/python3.10/site-packages/twine/commands/upload.py", line 142, in upload
    resp = repository.upload(package)
  File "/Users/benjamin/opt/anaconda3/envs/nighthawk-dev2/lib/python3.10/site-packages/twine/repository.py", line 186, in upload
    resp = self._upload(package)
  File "/Users/benjamin/opt/anaconda3/envs/nighthawk-dev2/lib/python3.10/site-packages/twine/repository.py", line 172, in _upload
    resp = self.session.post(
  File "/Users/benjamin/opt/anaconda3/envs/nighthawk-dev2/lib/python3.10/site-packages/requests/sessions.py", line 637, in post
    return self.request("POST", url, data=data, json=json, **kwargs)
  File "/Users/benjamin/opt/anaconda3/envs/nighthawk-dev2/lib/python3.10/site-packages/requests/sessions.py", line 589, in request
    resp = self.send(prep, **send_kwargs)
  File "/Users/benjamin/opt/anaconda3/envs/nighthawk-dev2/lib/python3.10/site-packages/requests/sessions.py", line 703, in send
    r = adapter.send(request, **kwargs)
  File "/Users/benjamin/opt/anaconda3/envs/nighthawk-dev2/lib/python3.10/site-packages/requests/adapters.py", line 501, in send
    raise ConnectionError(err, request=request)
requests.exceptions.ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))
miketheman commented 6 months ago

@bmvandoren Thanks for stepping through that, it's super helpful to see the timings. And you'll need to do the 2FA setup anyhow 👼

I think what we're seeing is that the client (twine) taking too long to upload and complete all the steps, possibly due to network congestion, or some other bottleneck. We can see from the output that attempts appear to cut off around the 1 minute mark (Production PyPI has different limits in place).

A couple of ideas you might want to try:

bmvandoren commented 6 months ago

Thanks @miketheman. According to speedtest.net my download speed is 200 Mbps and upload is 10 Mbps. I'm in a city right now and my cell phone is getting faster upload speeds, so I tried tethering. It cut the upload time in half. However, it's still failing, but in a different way. It's bizarre because the upload finishes and then it gives the error.

$  python -m twine upload --repository nighthawk-test dist/* --verbose
INFO     Using configuration from /Users/benjamin/.pypirc                                                                          
Uploading distributions to https://test.pypi.org/legacy/
INFO     dist/nighthawk-0.3.0-py3-none-any.whl (77.5 MB)                                                                           
INFO     dist/nighthawk-0.3.0.tar.gz (77.5 MB)                                                                                     
INFO     username set from config file                                                                                             
INFO     password set from config file                                                                                             
INFO     username: __token__                                                                                                       
INFO     password: <hidden>                                                                                                        
Uploading nighthawk-0.3.0-py3-none-any.whl
100% ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 81.3/81.3 MB • 00:22 • 3.3 MB/s
WARNING  Received "503: Service Unavailable"                                                                                       
         Package upload appears to have failed. Retry 1 of 5.                                                                      
Uploading nighthawk-0.3.0-py3-none-any.whl
100% ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 81.3/81.3 MB • 00:21 • 3.7 MB/s
WARNING  Received "503: Service Unavailable"                                                                                       
         Package upload appears to have failed. Retry 2 of 5.                                                                      
Uploading nighthawk-0.3.0-py3-none-any.whl
100% ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 81.3/81.3 MB • 00:25 • 4.3 MB/s
WARNING  Received "503: Service Unavailable"                                                                                       
         Package upload appears to have failed. Retry 3 of 5.                                                                      
Uploading nighthawk-0.3.0-py3-none-any.whl
100% ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 81.3/81.3 MB • 00:26 • 4.0 MB/s
WARNING  Received "503: Service Unavailable"                                                                                       
         Package upload appears to have failed. Retry 4 of 5.                                                                      
Uploading nighthawk-0.3.0-py3-none-any.whl
100% ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 81.3/81.3 MB • 00:24 • 3.9 MB/s
WARNING  Received "503: Service Unavailable"                                                                                       
         Package upload appears to have failed. Retry 5 of 5.                                                                      
INFO     Response from https://test.pypi.org/legacy/:                                                                              
         503 Service Unavailable                                                                                                   
INFO     <!DOCTYPE html>                                                                                                           
         <html lang="en">                                                                                                          
           <head>                                                                                                                  
             <meta charset="utf-8">                                                                                                
             <meta http-equiv="X-UA-Compatible" content="IE=edge">                                                                 
             <meta name="viewport" content="width=device-width, initial-scale=1">                                                  

             <meta name="defaultLanguage" content="en">                                                                            
             <meta name="availableLanguages" content="en">                                                                         

             <title>Service Unavailable (503)</title>                                                                              

             <meta name="description" content="The Python Package Index (PyPI) is a repository of software for the Python          
         programming language.">                                                                                                   

             <!-- Fonts -->                                                                                                        
             <link rel="stylesheet"                                                                                                
         href="https://fonts.googleapis.com/css?family=Source+Sans+Pro:400,400italic,600,600italic,700,700italic|Source+Code+Pro:50
         0">                                                                                                                       

             <style>                                                                                                               
               html,                                                                                                               
               body {                                                                                                              
                 box-sizing: border-box;                                                                                           
                 font-family: 'Source Sans Pro', 'Helvetica', Arial, sans-serif;                                                   
                 font-size: 17px;                                                                                                  
                 line-height: 1.4;                                                                                                 
                 font-weight: 300;                                                                                                 
                 color: #fff;                                                                                                      
                 -webkit-text-size-adjust: 100%;                                                                                   
                 font-size: 100%;                                                                                                  
                 padding: 0;                                                                                                       
                 margin: 0;                                                                                                        
               }                                                                                                                   

               h1, strong {                                                                                                        
                 font-weight: 600;                                                                                                 
               }                                                                                                                   

               ul {                                                                                                                
                 list-style-type: none;                                                                                            
                 padding-left: 0;                                                                                                  
               }                                                                                                                   

               hr {                                                                                                                
                 margin: 50px auto;                                                                                                
                 width: 300px;                                                                                                     
                 max-width: 100%;                                                                                                  
                 border: 0;                                                                                                        
                 height: 2px;                                                                                                      
                 background: rgba(255, 255, 255, 0.5);                                                                             
               }                                                                                                                   

               .viewport-section {                                                                                                 
                 height: 100vh;                                                                                                    
                 display: flex;                                                                                                    
                 align-items: center;                                                                                              
                 justify-content: center;                                                                                          
                 background-color: #006dad;                                                                                        
                 color: #fff;                                                                                                      
               }                                                                                                                   

               .viewport-section a {                                                                                               
                 color: #fff;                                                                                                      
               }                                                                                                                   

               .viewport-section__content {                                                                                        
                 text-align: center;                                                                                               
                 padding: 30px;                                                                                                    
                 min-width: 0;                                                                                                     
               }                                                                                                                   

               .viewport-section__heading {                                                                                        
                 font-size: 2.4em;                                                                                                 
                 padding: 20px 15px 0;                                                                                             
                 margin: 0;                                                                                                        
               }                                                                                                                   

               @media screen and (max-width: 600px) {                                                                              
                 .viewport-section__content {                                                                                      
                   padding: 15px;                                                                                                  
                 }                                                                                                                 

                 .viewport-section__heading {                                                                                      
                   font-size: 1.5em;                                                                                               
                 }                                                                                                                 
               }                                                                                                                   
             </style>                                                                                                              

           </head>                                                                                                                 

           <body>                                                                                                                  
             <div class="viewport-section">                                                                                        
               <div class="viewport-section__content">                                                                             
                 <img alt="PyPI logo"                                                                                              
         src="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSI2NS44MTIiIGhlaWdodD0iNTgiIHZ
         pZXdCb3g9IjAgMCA2NS44MTIwMzUgNTguMDAwMDAxIj48ZyBmaWxsPSIjYTI5ZDg2IiBzdHJva2U9IiNjY2MiIHN0cm9rZS13aWR0aD0iLjIxNCIgc3Ryb2tlL
         WxpbmVqb2luPSJiZXZlbCI+PHBhdGggZD0iTTE4LjkzIDE4LjgyNmw5LjMyMyAzLjM5NHYxMC45NTdsLTkuMzIzLTMuMzk0eiIgc3R5bGU9Imlzb2xhdGlvbjp
         hdXRvO21peC1ibGVuZC1tb2RlOm5vcm1hbCIgY29sb3I9IiMwMDAiIG92ZXJmbG93PSJ2aXNpYmxlIiBmaWxsPSIjZTllOWZmIi8+PHBhdGggZD0iTTkuNDcgM
         jIuMjd2MTAuOTU3bDkuNDYtMy40NDRWMTguODI2eiIgc3R5bGU9Imlzb2xhdGlvbjphdXRvO21peC1ibGVuZC1tb2RlOm5vcm1hbCIgY29sb3I9IiMwMDAiIG9
         2ZXJmbG93PSJ2aXNpYmxlIiBmaWxsPSIjMzUzNTY0Ii8+PHBhdGggZD0iTTkuNDcgMzMuMjI3bDkuMzIyIDMuMzkzIDkuNDYtMy40NDMtOS4zMjItMy4zOTR6I
         iBzdHlsZT0iaXNvbGF0aW9uOmF1dG87bWl4LWJsZW5kLW1vZGU6bm9ybWFsIiBjb2xvcj0iIzAwMCIgb3ZlcmZsb3c9InZpc2libGUiIGZpbGw9IiNhZmFmZGU
         iLz48cGF0aCBkPSJNOS40NyAyMi4yN2w5LjMyMiAzLjM5MyA5LjQ2LTMuNDQzLTkuMzIyLTMuMzk0eiIgZmlsbD0iI2Y3ZjdmNCIvPjxwYXRoIGQ9Ik0xOC43O
         TIgMjUuNjYzVjM2LjYybDkuNDYtMy40NDNWMjIuMjJ6IiBmaWxsPSIjZmZmIi8+PHBhdGggZD0iTTkuNDcgMjIuMjdsOS4zMjIgMy4zOTNWMzYuNjJMOS40NyA
         zMy4yMjd6IiBmaWxsPSIjZWZlZWVhIi8+PHBhdGggc3R5bGU9Imlzb2xhdGlvbjphdXRvO21peC1ibGVuZC1tb2RlOm5vcm1hbCIgZD0iTTI4LjI5MyAxMS4xN
         jZsOS4zMjMgMy4zOTN2MTAuOTU3bC05LjMyMy0zLjM5M3oiIGNvbG9yPSIjMDAwIiBvdmVyZmxvdz0idmlzaWJsZSIgZmlsbD0iI2U5ZTlmZiIvPjxwYXRoIHN
         0eWxlPSJpc29sYXRpb246YXV0bzttaXgtYmxlbmQtbW9kZTpub3JtYWwiIGQ9Ik0xOC44MzMgMTQuNjA5djEwLjk1N2w5LjQ2LTMuNDQzVjExLjE2NnoiIGNvb
         G9yPSIjMDAwIiBvdmVyZmxvdz0idmlzaWJsZSIgZmlsbD0iIzM1MzU2NCIvPjxwYXRoIHN0eWxlPSJpc29sYXRpb246YXV0bzttaXgtYmxlbmQtbW9kZTpub3J
         tYWwiIGQ9Ik0xOC44MzMgMjUuNTY2bDkuMzIyIDMuMzkzIDkuNDYxLTMuNDQzLTkuMzIzLTMuMzkzeiIgY29sb3I9IiMwMDAiIG92ZXJmbG93PSJ2aXNpYmxlI
         iBmaWxsPSIjYWZhZmRlIi8+PHBhdGggZD0iTTE4LjgzMyAxNC42MDlsOS4zMjIgMy4zOTMgOS40NjEtMy40NDMtOS4zMjMtMy4zOTN6IiBmaWxsPSIjZjdmN2Y
         0Ii8+PHBhdGggZD0iTTI4LjE1NSAxOC4wMDJWMjguOTZsOS40NjEtMy40NDNWMTQuNTU5eiIgZmlsbD0iI2ZmZiIvPjxwYXRoIGQ9Ik0xOC44MzMgMTQuNjA5b
         DkuMzIyIDMuMzkzVjI4Ljk2bC05LjMyMi0zLjM5M3oiIGZpbGw9IiNlZmVlZWEiLz48cGF0aCBkPSJNOS41NjcgMzMuMjk3bDkuMzIyIDMuMzkzdjEwLjk1N2w
         tOS4zMjItMy4zOTN6IiBzdHlsZT0iaXNvbGF0aW9uOmF1dG87bWl4LWJsZW5kLW1vZGU6bm9ybWFsIiBjb2xvcj0iIzAwMCIgb3ZlcmZsb3c9InZpc2libGUiI
         GZpbGw9IiNlOWU5ZmYiLz48cGF0aCBkPSJNLjEwNiAzNi43NHYxMC45NTdsOS40Ni0zLjQ0M1YzMy4yOTd6IiBzdHlsZT0iaXNvbGF0aW9uOmF1dG87bWl4LWJ
         sZW5kLW1vZGU6bm9ybWFsIiBjb2xvcj0iIzAwMCIgb3ZlcmZsb3c9InZpc2libGUiIGZpbGw9IiMzNTM1NjQiLz48cGF0aCBkPSJNLjEwNiA0Ny42OTdMOS40M
         yA1MS4wOWw5LjQ2LTMuNDQzLTkuMzIyLTMuMzkzeiIgc3R5bGU9Imlzb2xhdGlvbjphdXRvO21peC1ibGVuZC1tb2RlOm5vcm1hbCIgY29sb3I9IiMwMDAiIG9
         2ZXJmbG93PSJ2aXNpYmxlIiBmaWxsPSIjYWZhZmRlIi8+PHBhdGggZD0iTS4xMDYgMzYuNzRsOS4zMjMgMy4zOTMgOS40Ni0zLjQ0My05LjMyMi0zLjM5M3oiI
         GZpbGw9IiNmN2Y3ZjQiLz48cGF0aCBkPSJNOS40MjkgNDAuMTMzVjUxLjA5bDkuNDYtMy40NDNWMzYuNjl6IiBmaWxsPSIjZmZmIi8+PHBhdGggZD0iTS4xMDY
         gMzYuNzRsOS4zMjMgMy4zOTNWNTEuMDlMLjEwNiA0Ny42OTd6IiBmaWxsPSIjZWZlZWVhIi8+PC9nPjxnIGZpbGw9IiNhMjlkODYiIHN0cm9rZT0iI2NjYyIgc
         3Ryb2tlLXdpZHRoPSIuMjE0IiBzdHJva2UtbGluZWpvaW49ImJldmVsIj48cGF0aCBzdHlsZT0iaXNvbGF0aW9uOmF1dG87bWl4LWJsZW5kLW1vZGU6bm9ybWF
         sIiBkPSJNMTguOTMgMzYuNzAybDkuMzIzIDMuMzkzdjEwLjk1N2wtOS4zMjMtMy4zOTN6IiBjb2xvcj0iIzAwMCIgb3ZlcmZsb3c9InZpc2libGUiIGZpbGw9I
         iNlOWU5ZmYiLz48cGF0aCBzdHlsZT0iaXNvbGF0aW9uOmF1dG87bWl4LWJsZW5kLW1vZGU6bm9ybWFsIiBkPSJNOS40NyA0MC4xNDV2MTAuOTU3bDkuNDYtMy4
         0NDNWMzYuNzAyeiIgY29sb3I9IiMwMDAiIG92ZXJmbG93PSJ2aXNpYmxlIiBmaWxsPSIjMzUzNTY0Ii8+PHBhdGggc3R5bGU9Imlzb2xhdGlvbjphdXRvO21pe
         C1ibGVuZC1tb2RlOm5vcm1hbCIgZD0iTTkuNDcgNTEuMTAybDkuMzIyIDMuMzkzIDkuNDYtMy40NDMtOS4zMjItMy4zOTN6IiBjb2xvcj0iIzAwMCIgb3ZlcmZ
         sb3c9InZpc2libGUiIGZpbGw9IiNhZmFmZGUiLz48cGF0aCBkPSJNOS40NyA0MC4xNDVsOS4zMjIgMy4zOTMgOS40Ni0zLjQ0My05LjMyMi0zLjM5M3oiIGZpb
         Gw9IiNmN2Y3ZjQiLz48cGF0aCBkPSJNMTguNzkyIDQzLjUzOHYxMC45NTdsOS40Ni0zLjQ0M1Y0MC4wOTV6IiBmaWxsPSIjZmZmIi8+PHBhdGggZD0iTTkuNDc
         gNDAuMTQ1bDkuMzIyIDMuMzkzdjEwLjk1N0w5LjQ3IDUxLjEwMnoiIGZpbGw9IiNlZmVlZWEiLz48L2c+PGcgZmlsbD0iI2EyOWQ4NiIgc3Ryb2tlPSIjY2NjI
         iBzdHJva2Utd2lkdGg9Ii4yMTQiIHN0cm9rZS1saW5lam9pbj0iYmV2ZWwiPjxwYXRoIGQ9Ik0xOC45MyAyNS42MzZsOS4zMjMgMy4zOTN2MTAuOTU3bC05LjM
         yMy0zLjM5M3oiIHN0eWxlPSJpc29sYXRpb246YXV0bzttaXgtYmxlbmQtbW9kZTpub3JtYWwiIGNvbG9yPSIjMDAwIiBvdmVyZmxvdz0idmlzaWJsZSIgZmlsb
         D0iI2U5ZTlmZiIvPjxwYXRoIGQ9Ik05LjQ3IDI5LjA4djEwLjk1Nmw5LjQ2LTMuNDQzVjI1LjYzNnoiIHN0eWxlPSJpc29sYXRpb246YXV0bzttaXgtYmxlbmQ
         tbW9kZTpub3JtYWwiIGNvbG9yPSIjMDAwIiBvdmVyZmxvdz0idmlzaWJsZSIgZmlsbD0iIzM1MzU2NCIvPjxwYXRoIGQ9Ik05LjQ3IDQwLjAzNmw5LjMyMiAzL
         jM5NCA5LjQ2LTMuNDQ0LTkuMzIyLTMuMzkzeiIgc3R5bGU9Imlzb2xhdGlvbjphdXRvO21peC1ibGVuZC1tb2RlOm5vcm1hbCIgY29sb3I9IiMwMDAiIG92ZXJ
         mbG93PSJ2aXNpYmxlIiBmaWxsPSIjYWZhZmRlIi8+PHBhdGggZD0iTTkuNDcgMjkuMDhsOS4zMjIgMy4zOTMgOS40Ni0zLjQ0NC05LjMyMi0zLjM5M3oiIGZpb
         Gw9IiNmN2Y3ZjQiLz48cGF0aCBkPSJNMTguNzkyIDMyLjQ3M1Y0My40M2w5LjQ2LTMuNDQ0VjI5LjAzeiIgZmlsbD0iI2ZmZiIvPjxwYXRoIGQ9Ik05LjQ3IDI
         5LjA4bDkuMzIyIDMuMzkzVjQzLjQzTDkuNDcgNDAuMDM2eiIgZmlsbD0iI2VmZWVlYSIvPjwvZz48ZyBmaWxsPSIjYTI5ZDg2IiBzdHJva2U9IiNjY2MiIHN0c
         m9rZS13aWR0aD0iLjIxNCIgc3Ryb2tlLWxpbmVqb2luPSJiZXZlbCI+PHBhdGggc3R5bGU9Imlzb2xhdGlvbjphdXRvO21peC1ibGVuZC1tb2RlOm5vcm1hbCI
         gZD0iTTU2LjM4MyAyOS44OTJsOS4zMjMgMy4zOTN2MTAuOTU3bC05LjMyMy0zLjM5M3oiIGNvbG9yPSIjMDAwIiBvdmVyZmxvdz0idmlzaWJsZSIgZmlsbD0iI
         2U5ZTlmZiIvPjxwYXRoIHN0eWxlPSJpc29sYXRpb246YXV0bzttaXgtYmxlbmQtbW9kZTpub3JtYWwiIGQ9Ik00Ni45MjMgMzMuMzM1djEwLjk1N2w5LjQ2LTM
         uNDQzVjI5Ljg5MnoiIGNvbG9yPSIjMDAwIiBvdmVyZmxvdz0idmlzaWJsZSIgZmlsbD0iIzM1MzU2NCIvPjxwYXRoIHN0eWxlPSJpc29sYXRpb246YXV0bztta
         XgtYmxlbmQtbW9kZTpub3JtYWwiIGQ9Ik00Ni45MjMgNDQuMjkybDkuMzIyIDMuMzk0IDkuNDYtMy40NDQtOS4zMjItMy4zOTN6IiBjb2xvcj0iIzAwMCIgb3Z
         lcmZsb3c9InZpc2libGUiIGZpbGw9IiNhZmFmZGUiLz48cGF0aCBkPSJNNDYuOTIzIDMzLjMzNWw5LjMyMiAzLjM5NCA5LjQ2LTMuNDQ0LTkuMzIyLTMuMzkze
         iIgZmlsbD0iI2Y3ZjdmNCIvPjxwYXRoIGQ9Ik01Ni4yNDUgMzYuNzI5djEwLjk1N2w5LjQ2LTMuNDQ0VjMzLjI4NXoiIGZpbGw9IiNmZmYiLz48cGF0aCBkPSJ
         NNDYuOTIzIDMzLjMzNWw5LjMyMiAzLjM5NHYxMC45NTdsLTkuMzIyLTMuMzk0eiIgZmlsbD0iI2VmZWVlYSIvPjwvZz48ZyB0cmFuc2Zvcm09InRyYW5zbGF0Z
         SgtMTY4My42NiAtNTEzLjI3NSkgc2NhbGUoLjY1MTc3KSI+PGcgZmlsbD0iI2EyOWQ4NiIgc3Ryb2tlPSIjY2NjIiBzdHJva2Utd2lkdGg9Ii4zMjgiIHN0cm9
         rZS1saW5lam9pbj0iYmV2ZWwiPjxwYXRoIHN0eWxlPSJpc29sYXRpb246YXV0bzttaXgtYmxlbmQtbW9kZTpub3JtYWwiIGQ9Ik0yNjU1LjM0OSA4MzguNTk0b
         DE0LjMwMyA1LjIwNnYxNi44MTFsLTE0LjMwMy01LjIwNnoiIGNvbG9yPSIjMDAwIiBvdmVyZmxvdz0idmlzaWJsZSIgZmlsbD0iI2U5ZTlmZiIvPjxwYXRoIHN
         0eWxlPSJpc29sYXRpb246YXV0bzttaXgtYmxlbmQtbW9kZTpub3JtYWwiIGQ9Ik0yNjQwLjgzNCA4NDMuODc3djE2LjgxMWwxNC41MTUtNS4yODN2LTE2Ljgxe
         iIgY29sb3I9IiMwMDAiIG92ZXJmbG93PSJ2aXNpYmxlIiBmaWxsPSIjMzUzNTY0Ii8+PHBhdGggc3R5bGU9Imlzb2xhdGlvbjphdXRvO21peC1ibGVuZC1tb2R
         lOm5vcm1hbCIgZD0iTTI2NDAuODM0IDg2MC42ODhsMTQuMzAzIDUuMjA2IDE0LjUxNS01LjI4My0xNC4zMDMtNS4yMDZ6IiBjb2xvcj0iIzAwMCIgb3ZlcmZsb
         3c9InZpc2libGUiIGZpbGw9IiNhZmFmZGUiLz48cGF0aCBkPSJNMjY0MC44MzQgODQzLjg3N2wxNC4zMDMgNS4yMDYgMTQuNTE1LTUuMjgzLTE0LjMwMy01LjI
         wNnoiIGZpbGw9IiNmN2Y3ZjQiLz48cGF0aCBkPSJNMjY1NS4xMzcgODQ5LjA4M3YxNi44MTFsMTQuNTE1LTUuMjgzdi0xNi44MXoiIGZpbGw9IiNmZmQyNDIiL
         z48cGF0aCBkPSJNMjY0MC44MzQgODQzLjg3N2wxNC4zMDMgNS4yMDZ2MTYuODExbC0xNC4zMDMtNS4yMDZ6IiBmaWxsPSIjZWZlZWVhIi8+PC9nPjxjaXJjbGU
         gdHJhbnNmb3JtPSJza2V3WSgtMjApIHNjYWxlKC45Mzk3IDEpIiBjeT0iMTgyMy44OTkiIGN4PSIyODM1LjIxOCIgcj0iMi45NjciIGZpbGw9IiNmZmYiLz48L
         2c+PGcgZmlsbD0iI2EyOWQ4NiIgc3Ryb2tlPSIjY2NjIiBzdHJva2Utd2lkdGg9Ii4yMTQiIHN0cm9rZS1saW5lam9pbj0iYmV2ZWwiPjxwYXRoIGQ9Ik0zNy4
         2NTcgMzYuNzAybDkuMzIyIDMuMzkzdjEwLjk1N2wtOS4zMjItMy4zOTN6IiBzdHlsZT0iaXNvbGF0aW9uOmF1dG87bWl4LWJsZW5kLW1vZGU6bm9ybWFsIiBjb
         2xvcj0iIzAwMCIgb3ZlcmZsb3c9InZpc2libGUiIGZpbGw9IiNlOWU5ZmYiLz48cGF0aCBkPSJNMjguMTk2IDQwLjE0NXYxMC45NTdsOS40Ni0zLjQ0M1YzNi4
         3MDJ6IiBzdHlsZT0iaXNvbGF0aW9uOmF1dG87bWl4LWJsZW5kLW1vZGU6bm9ybWFsIiBjb2xvcj0iIzAwMCIgb3ZlcmZsb3c9InZpc2libGUiIGZpbGw9IiMzN
         TM1NjQiLz48cGF0aCBkPSJNMjguMTk2IDUxLjEwMmw5LjMyMyAzLjM5MyA5LjQ2LTMuNDQzLTkuMzIyLTMuMzkzeiIgc3R5bGU9Imlzb2xhdGlvbjphdXRvO21
         peC1ibGVuZC1tb2RlOm5vcm1hbCIgY29sb3I9IiMwMDAiIG92ZXJmbG93PSJ2aXNpYmxlIiBmaWxsPSIjYWZhZmRlIi8+PHBhdGggZD0iTTI4LjE5NiA0MC4xN
         DVsOS4zMjMgMy4zOTMgOS40Ni0zLjQ0My05LjMyMi0zLjM5M3oiIGZpbGw9IiNmN2Y3ZjQiLz48cGF0aCBkPSJNMzcuNTE5IDQzLjUzOHYxMC45NTdsOS40Ni0
         zLjQ0M1Y0MC4wOTV6IiBmaWxsPSIjZmZkMjQyIi8+PHBhdGggZD0iTTI4LjE5NiA0MC4xNDVsOS4zMjMgMy4zOTN2MTAuOTU3bC05LjMyMy0zLjM5M3oiIGZpb
         Gw9IiNlZmVlZWEiLz48L2c+PGcgZmlsbD0iI2EyOWQ4NiIgc3Ryb2tlPSIjY2NjIiBzdHJva2Utd2lkdGg9Ii4yMTQiIHN0cm9rZS1saW5lam9pbj0iYmV2ZWw
         iPjxwYXRoIHN0eWxlPSJpc29sYXRpb246YXV0bzttaXgtYmxlbmQtbW9kZTpub3JtYWwiIGQ9Ik0yOC4yOTMgNDAuMTA3bDkuMzIzIDMuMzkzdjEwLjk1N2wtO
         S4zMjMtMy4zOTN6IiBjb2xvcj0iIzAwMCIgb3ZlcmZsb3c9InZpc2libGUiIGZpbGw9IiNlOWU5ZmYiLz48cGF0aCBzdHlsZT0iaXNvbGF0aW9uOmF1dG87bWl
         4LWJsZW5kLW1vZGU6bm9ybWFsIiBkPSJNMTguODMzIDQzLjU1djEwLjk1N2w5LjQ2LTMuNDQzVjQwLjEwN3oiIGNvbG9yPSIjMDAwIiBvdmVyZmxvdz0idmlza
         WJsZSIgZmlsbD0iIzM1MzU2NCIvPjxwYXRoIHN0eWxlPSJpc29sYXRpb246YXV0bzttaXgtYmxlbmQtbW9kZTpub3JtYWwiIGQ9Ik0xOC44MzMgNTQuNTA3bDk
         uMzIyIDMuMzkzIDkuNDYtMy40NDMtOS4zMjItMy4zOTN6IiBjb2xvcj0iIzAwMCIgb3ZlcmZsb3c9InZpc2libGUiIGZpbGw9IiNhZmFmZGUiLz48cGF0aCBkP
         SJNMTguODMzIDQzLjU1bDkuMzIyIDMuMzkzIDkuNDYtMy40NDMtOS4zMjItMy4zOTN6IiBmaWxsPSIjZjdmN2Y0Ii8+PHBhdGggZD0iTTI4LjE1NSA0Ni45NDN
         WNTcuOWw5LjQ2LTMuNDQzVjQzLjV6IiBmaWxsPSIjZmZmIi8+PHBhdGggZD0iTTE4LjgzMyA0My41NWw5LjMyMiAzLjM5M1Y1Ny45bC05LjMyMi0zLjM5M3oiI
         GZpbGw9IiNlZmVlZWEiLz48L2c+PGcgZmlsbD0iI2EyOWQ4NiIgc3Ryb2tlPSIjY2NjIiBzdHJva2Utd2lkdGg9Ii4yMTQiIHN0cm9rZS1saW5lam9pbj0iYmV
         2ZWwiPjxwYXRoIGQ9Ik01Ni4zODMgMTguODI2bDkuMzIzIDMuMzk0djEwLjk1N2wtOS4zMjMtMy4zOTR6IiBzdHlsZT0iaXNvbGF0aW9uOmF1dG87bWl4LWJsZ
         W5kLW1vZGU6bm9ybWFsIiBjb2xvcj0iIzAwMCIgb3ZlcmZsb3c9InZpc2libGUiIGZpbGw9IiNlOWU5ZmYiLz48cGF0aCBkPSJNNDYuOTIzIDIyLjI3djEwLjk
         1N2w5LjQ2LTMuNDQ0VjE4LjgyNnoiIHN0eWxlPSJpc29sYXRpb246YXV0bzttaXgtYmxlbmQtbW9kZTpub3JtYWwiIGNvbG9yPSIjMDAwIiBvdmVyZmxvdz0id
         mlzaWJsZSIgZmlsbD0iIzM1MzU2NCIvPjxwYXRoIGQ9Ik00Ni45MjMgMzMuMjI3bDkuMzIyIDMuMzkzIDkuNDYtMy40NDMtOS4zMjItMy4zOTR6IiBzdHlsZT0
         iaXNvbGF0aW9uOmF1dG87bWl4LWJsZW5kLW1vZGU6bm9ybWFsIiBjb2xvcj0iIzAwMCIgb3ZlcmZsb3c9InZpc2libGUiIGZpbGw9IiNhZmFmZGUiLz48cGF0a
         CBkPSJNNDYuOTIzIDIyLjI3bDkuMzIyIDMuMzkzIDkuNDYtMy40NDMtOS4zMjItMy4zOTR6IiBmaWxsPSIjZjdmN2Y0Ii8+PHBhdGggZD0iTTU2LjI0NSAyNS4
         2NjNWMzYuNjJsOS40Ni0zLjQ0M1YyMi4yMnoiIGZpbGw9IiNmZmQyNDIiLz48cGF0aCBkPSJNNDYuOTIzIDIyLjI3bDkuMzIyIDMuMzkzVjM2LjYybC05LjMyM
         i0zLjM5M3oiIGZpbGw9IiNlZmVlZWEiLz48L2c+PGcgZmlsbD0iI2EyOWQ4NiIgc3Ryb2tlPSIjY2NjIiBzdHJva2Utd2lkdGg9Ii4yMTQiIHN0cm9rZS1saW5
         lam9pbj0iYmV2ZWwiPjxwYXRoIHN0eWxlPSJpc29sYXRpb246YXV0bzttaXgtYmxlbmQtbW9kZTpub3JtYWwiIGQ9Ik01Ni4zODMgNy43Nmw5LjMyMyAzLjM5N
         FYyMi4xMWwtOS4zMjMtMy4zOTN6IiBjb2xvcj0iIzAwMCIgb3ZlcmZsb3c9InZpc2libGUiIGZpbGw9IiNlOWU5ZmYiLz48cGF0aCBzdHlsZT0iaXNvbGF0aW9
         uOmF1dG87bWl4LWJsZW5kLW1vZGU6bm9ybWFsIiBkPSJNNDYuOTIzIDExLjIwNHYxMC45NTdsOS40Ni0zLjQ0M1Y3Ljc2eiIgY29sb3I9IiMwMDAiIG92ZXJmb
         G93PSJ2aXNpYmxlIiBmaWxsPSIjMzUzNTY0Ii8+PHBhdGggc3R5bGU9Imlzb2xhdGlvbjphdXRvO21peC1ibGVuZC1tb2RlOm5vcm1hbCIgZD0iTTQ2LjkyMyA
         yMi4xNjFsOS4zMjIgMy4zOTMgOS40Ni0zLjQ0My05LjMyMi0zLjM5M3oiIGNvbG9yPSIjMDAwIiBvdmVyZmxvdz0idmlzaWJsZSIgZmlsbD0iI2FmYWZkZSIvP
         jxwYXRoIGQ9Ik00Ni45MjMgMTEuMjA0bDkuMzIyIDMuMzkzIDkuNDYtMy40NDMtOS4zMjItMy4zOTN6IiBmaWxsPSIjZmZjOTFkIi8+PHBhdGggZD0iTTU2LjI
         0NSAxNC41OTd2MTAuOTU3bDkuNDYtMy40NDNWMTEuMTU0eiIgZmlsbD0iI2ZmZDI0MiIvPjxwYXRoIGQ9Ik00Ni45MjMgMTEuMjA0bDkuMzIyIDMuMzkzdjEwL
         jk1N2wtOS4zMjItMy4zOTN6IiBmaWxsPSIjZWZlZWVhIi8+PC9nPjxnIGZpbGw9IiNhMjlkODYiIHN0cm9rZT0iI2NjYyIgc3Ryb2tlLXdpZHRoPSIuMjE0IiB
         zdHJva2UtbGluZWpvaW49ImJldmVsIj48cGF0aCBzdHlsZT0iaXNvbGF0aW9uOmF1dG87bWl4LWJsZW5kLW1vZGU6bm9ybWFsIiBkPSJNNDcuMDIgMjIuMjMxb
         DkuMzIyIDMuMzkzdjEwLjk1N2wtOS4zMjItMy4zOTN6IiBjb2xvcj0iIzAwMCIgb3ZlcmZsb3c9InZpc2libGUiIGZpbGw9IiNlOWU5ZmYiLz48cGF0aCBzdHl
         sZT0iaXNvbGF0aW9uOmF1dG87bWl4LWJsZW5kLW1vZGU6bm9ybWFsIiBkPSJNMzcuNTYgMjUuNjc1djEwLjk1N2w5LjQ2LTMuNDQ0VjIyLjIzMXoiIGNvbG9yP
         SIjMDAwIiBvdmVyZmxvdz0idmlzaWJsZSIgZmlsbD0iIzM1MzU2NCIvPjxwYXRoIHN0eWxlPSJpc29sYXRpb246YXV0bzttaXgtYmxlbmQtbW9kZTpub3JtYWw
         iIGQ9Ik0zNy41NiAzNi42MzJsOS4zMjIgMy4zOTMgOS40Ni0zLjQ0NC05LjMyMi0zLjM5M3oiIGNvbG9yPSIjMDAwIiBvdmVyZmxvdz0idmlzaWJsZSIgZmlsb
         D0iI2FmYWZkZSIvPjxwYXRoIGQ9Ik0zNy41NiAyNS42NzVsOS4zMjIgMy4zOTMgOS40Ni0zLjQ0NC05LjMyMi0zLjM5M3oiIGZpbGw9IiNmN2Y3ZjQiLz48cGF
         0aCBkPSJNNDYuODgyIDI5LjA2OHYxMC45NTdsOS40Ni0zLjQ0NFYyNS42MjR6IiBmaWxsPSIjZmZkMjQyIi8+PHBhdGggZD0iTTM3LjU2IDI1LjY3NWw5LjMyM
         iAzLjM5M3YxMC45NTdsLTkuMzIzLTMuMzkzeiIgZmlsbD0iI2VmZWVlYSIvPjwvZz48ZyBmaWxsPSIjYTI5ZDg2IiBzdHJva2U9IiNjY2MiIHN0cm9rZS13aWR
         0aD0iLjIxNCIgc3Ryb2tlLWxpbmVqb2luPSJiZXZlbCI+PHBhdGggZD0iTTQ3LjAyIDExLjE2Nmw5LjMyMiAzLjM5M3YxMC45NTdsLTkuMzIyLTMuMzkzeiIgc
         3R5bGU9Imlzb2xhdGlvbjphdXRvO21peC1ibGVuZC1tb2RlOm5vcm1hbCIgY29sb3I9IiMwMDAiIG92ZXJmbG93PSJ2aXNpYmxlIiBmaWxsPSIjZTllOWZmIi8
         +PHBhdGggZD0iTTM3LjU2IDE0LjYwOXYxMC45NTdsOS40Ni0zLjQ0M1YxMS4xNjZ6IiBzdHlsZT0iaXNvbGF0aW9uOmF1dG87bWl4LWJsZW5kLW1vZGU6bm9yb
         WFsIiBjb2xvcj0iIzAwMCIgb3ZlcmZsb3c9InZpc2libGUiIGZpbGw9IiMzNTM1NjQiLz48cGF0aCBkPSJNMzcuNTYgMjUuNTY2bDkuMzIyIDMuMzkzIDkuNDY
         tMy40NDMtOS4zMjItMy4zOTN6IiBzdHlsZT0iaXNvbGF0aW9uOmF1dG87bWl4LWJsZW5kLW1vZGU6bm9ybWFsIiBjb2xvcj0iIzAwMCIgb3ZlcmZsb3c9InZpc
         2libGUiIGZpbGw9IiNhZmFmZGUiLz48cGF0aCBkPSJNMzcuNTYgMTQuNjA5bDkuMzIyIDMuMzkzIDkuNDYtMy40NDMtOS4zMjItMy4zOTN6IiBmaWxsPSIjZjd
         mN2Y0Ii8+PHBhdGggZD0iTTQ2Ljg4MiAxOC4wMDJWMjguOTZsOS40Ni0zLjQ0M1YxNC41NTl6IiBmaWxsPSIjMzc3NWE5Ii8+PHBhdGggZD0iTTM3LjU2IDE0L
         jYwOWw5LjMyMiAzLjM5M1YyOC45NmwtOS4zMjMtMy4zOTN6IiBmaWxsPSIjZWZlZWVhIi8+PC9nPjxnIGZpbGw9IiNhMjlkODYiIHN0cm9rZT0iI2NjYyIgc3R
         yb2tlLXdpZHRoPSIuMjE0IiBzdHJva2UtbGluZWpvaW49ImJldmVsIj48cGF0aCBzdHlsZT0iaXNvbGF0aW9uOmF1dG87bWl4LWJsZW5kLW1vZGU6bm9ybWFsI
         iBkPSJNNDcuMDIuMWw5LjMyMiAzLjM5M1YxNC40NWwtOS4zMjItMy4zOTN6IiBjb2xvcj0iIzAwMCIgb3ZlcmZsb3c9InZpc2libGUiIGZpbGw9IiNlOWU5ZmY
         iLz48cGF0aCBzdHlsZT0iaXNvbGF0aW9uOmF1dG87bWl4LWJsZW5kLW1vZGU6bm9ybWFsIiBkPSJNMzcuNTYgMy41NDNWMTQuNWw5LjQ2LTMuNDQzVi4xeiIgY
         29sb3I9IiMwMDAiIG92ZXJmbG93PSJ2aXNpYmxlIiBmaWxsPSIjMzUzNTY0Ii8+PHBhdGggc3R5bGU9Imlzb2xhdGlvbjphdXRvO21peC1ibGVuZC1tb2RlOm5
         vcm1hbCIgZD0iTTM3LjU2IDE0LjVsOS4zMjIgMy4zOTMgOS40Ni0zLjQ0My05LjMyMi0zLjM5M3oiIGNvbG9yPSIjMDAwIiBvdmVyZmxvdz0idmlzaWJsZSIgZ
         mlsbD0iI2FmYWZkZSIvPjxwYXRoIGQ9Ik0zNy41NiAzLjU0M2w5LjMyMiAzLjM5MyA5LjQ2LTMuNDQzTDQ3LjAyLjF6IiBmaWxsPSIjMmY2NDkxIi8+PHBhdGg
         gZD0iTTQ2Ljg4MiA2LjkzNnYxMC45NTdsOS40Ni0zLjQ0M1YzLjQ5M3oiIGZpbGw9IiMzNzc1YTkiLz48cGF0aCBkPSJNMzcuNTYgMy41NDNsOS4zMjIgMy4zO
         TN2MTAuOTU3TDM3LjU1OSAxNC41eiIgZmlsbD0iI2VmZWVlYSIvPjwvZz48ZyBmaWxsPSIjYTI5ZDg2IiBzdHJva2U9IiNjY2MiIHN0cm9rZS13aWR0aD0iLjI
         xNCIgc3Ryb2tlLWxpbmVqb2luPSJiZXZlbCI+PHBhdGggZD0iTTM3LjY1NyAyNS42MzZsOS4zMjIgMy4zOTN2MTAuOTU3bC05LjMyMi0zLjM5M3oiIHN0eWxlP
         SJpc29sYXRpb246YXV0bzttaXgtYmxlbmQtbW9kZTpub3JtYWwiIGNvbG9yPSIjMDAwIiBvdmVyZmxvdz0idmlzaWJsZSIgZmlsbD0iI2U5ZTlmZiIvPjxwYXR
         oIGQ9Ik0yOC4xOTYgMjkuMDh2MTAuOTU2bDkuNDYtMy40NDNWMjUuNjM2eiIgc3R5bGU9Imlzb2xhdGlvbjphdXRvO21peC1ibGVuZC1tb2RlOm5vcm1hbCIgY
         29sb3I9IiMwMDAiIG92ZXJmbG93PSJ2aXNpYmxlIiBmaWxsPSIjMzUzNTY0Ii8+PHBhdGggZD0iTTI4LjE5NiA0MC4wMzZsOS4zMjMgMy4zOTQgOS40Ni0zLjQ
         0NC05LjMyMi0zLjM5M3oiIHN0eWxlPSJpc29sYXRpb246YXV0bzttaXgtYmxlbmQtbW9kZTpub3JtYWwiIGNvbG9yPSIjMDAwIiBvdmVyZmxvdz0idmlzaWJsZ
         SIgZmlsbD0iI2FmYWZkZSIvPjxwYXRoIGQ9Ik0yOC4xOTYgMjkuMDhsOS4zMjMgMy4zOTMgOS40Ni0zLjQ0NC05LjMyMi0zLjM5M3oiIGZpbGw9IiNmN2Y3ZjQ
         iLz48cGF0aCBkPSJNMzcuNTE5IDMyLjQ3M1Y0My40M2w5LjQ2LTMuNDQ0VjI5LjAzeiIgZmlsbD0iI2ZmZDI0MiIvPjxwYXRoIGQ9Ik0yOC4xOTYgMjkuMDhsO
         S4zMjMgMy4zOTNWNDMuNDNsLTkuMzIzLTMuMzk0eiIgZmlsbD0iI2VmZWVlYSIvPjwvZz48ZyBmaWxsPSIjYTI5ZDg2IiBzdHJva2U9IiNjY2MiIHN0cm9rZS1
         3aWR0aD0iLjIxNCIgc3Ryb2tlLWxpbmVqb2luPSJiZXZlbCI+PHBhdGggc3R5bGU9Imlzb2xhdGlvbjphdXRvO21peC1ibGVuZC1tb2RlOm5vcm1hbCIgZD0iT
         TM3LjY1NyAxNC41N2w5LjMyMiAzLjM5NFYyOC45MmwtOS4zMjItMy4zOTR6IiBjb2xvcj0iIzAwMCIgb3ZlcmZsb3c9InZpc2libGUiIGZpbGw9IiNlOWU5ZmY
         iLz48cGF0aCBzdHlsZT0iaXNvbGF0aW9uOmF1dG87bWl4LWJsZW5kLW1vZGU6bm9ybWFsIiBkPSJNMjguMTk2IDE4LjAxNFYyOC45N2w5LjQ2LTMuNDQ0VjE0L
         jU3eiIgY29sb3I9IiMwMDAiIG92ZXJmbG93PSJ2aXNpYmxlIiBmaWxsPSIjMzUzNTY0Ii8+PHBhdGggc3R5bGU9Imlzb2xhdGlvbjphdXRvO21peC1ibGVuZC1
         tb2RlOm5vcm1hbCIgZD0iTTI4LjE5NiAyOC45N2w5LjMyMyAzLjM5NCA5LjQ2LTMuNDQzLTkuMzIyLTMuMzk0eiIgY29sb3I9IiMwMDAiIG92ZXJmbG93PSJ2a
         XNpYmxlIiBmaWxsPSIjYWZhZmRlIi8+PHBhdGggZD0iTTI4LjE5NiAxOC4wMTRsOS4zMjMgMy4zOTMgOS40Ni0zLjQ0My05LjMyMi0zLjM5NHoiIGZpbGw9IiN
         mN2Y3ZjQiLz48cGF0aCBkPSJNMzcuNTE5IDIxLjQwN3YxMC45NTdsOS40Ni0zLjQ0M1YxNy45NjR6IiBmaWxsPSIjMzc3NWE5Ii8+PHBhdGggZD0iTTI4LjE5N
         iAxOC4wMTRsOS4zMjMgMy4zOTN2MTAuOTU3bC05LjMyMy0zLjM5M3oiIGZpbGw9IiNlZmVlZWEiLz48L2c+PGcgZmlsbD0iI2EyOWQ4NiIgc3Ryb2tlPSIjY2N
         jIiBzdHJva2Utd2lkdGg9Ii4yMTQiIHN0cm9rZS1saW5lam9pbj0iYmV2ZWwiPjxwYXRoIHN0eWxlPSJpc29sYXRpb246YXV0bzttaXgtYmxlbmQtbW9kZTpub
         3JtYWwiIGQ9Ik0yOC4yOTMgMjkuMDRsOS4zMjMgMy4zOTR2MTAuOTU3bC05LjMyMy0zLjM5M3oiIGNvbG9yPSIjMDAwIiBvdmVyZmxvdz0idmlzaWJsZSIgZml
         sbD0iI2U5ZTlmZiIvPjxwYXRoIHN0eWxlPSJpc29sYXRpb246YXV0bzttaXgtYmxlbmQtbW9kZTpub3JtYWwiIGQ9Ik0xOC44MzMgMzIuNDg0djEwLjk1N2w5L
         jQ2LTMuNDQzVjI5LjA0eiIgY29sb3I9IiMwMDAiIG92ZXJmbG93PSJ2aXNpYmxlIiBmaWxsPSIjMzUzNTY0Ii8+PHBhdGggc3R5bGU9Imlzb2xhdGlvbjphdXR
         vO21peC1ibGVuZC1tb2RlOm5vcm1hbCIgZD0iTTE4LjgzMyA0My40NDFsOS4zMjIgMy4zOTMgOS40Ni0zLjQ0My05LjMyMi0zLjM5M3oiIGNvbG9yPSIjMDAwI
         iBvdmVyZmxvdz0idmlzaWJsZSIgZmlsbD0iI2FmYWZkZSIvPjxwYXRoIGQ9Ik0xOC44MzMgMzIuNDg0bDkuMzIyIDMuMzkzIDkuNDYtMy40NDMtOS4zMjItMy4
         zOTN6IiBmaWxsPSIjZjdmN2Y0Ii8+PHBhdGggZD0iTTI4LjE1NSAzNS44Nzd2MTAuOTU3bDkuNDYtMy40NDNWMzIuNDM0eiIgZmlsbD0iIzM3NzVhOSIvPjxwY
         XRoIGQ9Ik0xOC44MzMgMzIuNDg0bDkuMzIyIDMuMzkzdjEwLjk1N2wtOS4zMjItMy4zOTN6IiBmaWxsPSIjMmY2NDkxIi8+PC9nPjxnIGZpbGw9IiNhMjlkODY
         iIHN0cm9rZT0iI2NjYyIgc3Ryb2tlLXdpZHRoPSIuMjE0IiBzdHJva2UtbGluZWpvaW49ImJldmVsIj48cGF0aCBkPSJNMjguMjkzIDE3Ljk3NWw5LjMyMyAzL
         jM5M3YxMC45NTdsLTkuMzIzLTMuMzkzeiIgc3R5bGU9Imlzb2xhdGlvbjphdXRvO21peC1ibGVuZC1tb2RlOm5vcm1hbCIgY29sb3I9IiMwMDAiIG92ZXJmbG9
         3PSJ2aXNpYmxlIiBmaWxsPSIjZTllOWZmIi8+PHBhdGggZD0iTTE4LjgzMyAyMS40MTl2MTAuOTU3bDkuNDYtMy40NDRWMTcuOTc1eiIgc3R5bGU9Imlzb2xhd
         GlvbjphdXRvO21peC1ibGVuZC1tb2RlOm5vcm1hbCIgY29sb3I9IiMwMDAiIG92ZXJmbG93PSJ2aXNpYmxlIiBmaWxsPSIjMzUzNTY0Ii8+PHBhdGggZD0iTTE
         4LjgzMyAzMi4zNzZsOS4zMjIgMy4zOTMgOS40Ni0zLjQ0NC05LjMyMi0zLjM5M3oiIHN0eWxlPSJpc29sYXRpb246YXV0bzttaXgtYmxlbmQtbW9kZTpub3JtY
         WwiIGNvbG9yPSIjMDAwIiBvdmVyZmxvdz0idmlzaWJsZSIgZmlsbD0iI2FmYWZkZSIvPjxwYXRoIGQ9Ik0xOC44MzMgMjEuNDE5bDkuMzIyIDMuMzkzIDkuNDY
         tMy40NDQtOS4zMjItMy4zOTN6IiBmaWxsPSIjMmY2NDkxIi8+PHBhdGggZD0iTTI4LjE1NSAyNC44MTJ2MTAuOTU3bDkuNDYtMy40NDRWMjEuMzY4eiIgZmlsb
         D0iIzM3NzVhOSIvPjxwYXRoIGQ9Ik0xOC44MzMgMjEuNDE5bDkuMzIyIDMuMzkzdjEwLjk1N2wtOS4zMjItMy4zOTN6IiBmaWxsPSIjMmY2NDkxIi8+PC9nPjx
         nIHRyYW5zZm9ybT0idHJhbnNsYXRlKC0xNjgzLjY2IC01MTMuMjc1KSBzY2FsZSguNjUxNzcpIj48ZyBmaWxsPSIjYTI5ZDg2IiBzdHJva2U9IiNjY2MiIHN0c
         m9rZS13aWR0aD0iLjMyOCIgc3Ryb2tlLWxpbmVqb2luPSJiZXZlbCI+PHBhdGggc3R5bGU9Imlzb2xhdGlvbjphdXRvO21peC1ibGVuZC1tb2RlOm5vcm1hbCI
         gZD0iTTI2NDAuOTgzIDc5Mi44ODVsMTQuMzA0IDUuMjA2djE2LjgxMWwtMTQuMzA0LTUuMjA2eiIgY29sb3I9IiMwMDAiIG92ZXJmbG93PSJ2aXNpYmxlIiBma
         WxsPSIjZTllOWZmIi8+PHBhdGggc3R5bGU9Imlzb2xhdGlvbjphdXRvO21peC1ibGVuZC1tb2RlOm5vcm1hbCIgZD0iTTI2MjYuNDY4IDc5OC4xNjh2MTYuODE
         xbDE0LjUxNS01LjI4M3YtMTYuODExeiIgY29sb3I9IiMwMDAiIG92ZXJmbG93PSJ2aXNpYmxlIiBmaWxsPSIjMzUzNTY0Ii8+PHBhdGggc3R5bGU9Imlzb2xhd
         GlvbjphdXRvO21peC1ibGVuZC1tb2RlOm5vcm1hbCIgZD0iTTI2MjYuNDY4IDgxNC45NzlsMTQuMzA0IDUuMjA2IDE0LjUxNS01LjI4My0xNC4zMDQtNS4yMDZ
         6IiBjb2xvcj0iIzAwMCIgb3ZlcmZsb3c9InZpc2libGUiIGZpbGw9IiNhZmFmZGUiLz48cGF0aCBkPSJNMjYyNi40NjggNzk4LjE2OGwxNC4zMDQgNS4yMDYgM
         TQuNTE1LTUuMjgzLTE0LjMwNC01LjIwNnoiIGZpbGw9IiMyZjY0OTEiLz48cGF0aCBkPSJNMjY0MC43NzIgODAzLjM3NHYxNi44MTFsMTQuNTE1LTUuMjgzdi0
         xNi44MTF6IiBmaWxsPSIjMzc3NWE5Ii8+PHBhdGggZD0iTTI2MjYuNDY4IDc5OC4xNjhsMTQuMzA0IDUuMjA2djE2LjgxMWwtMTQuMzA0LTUuMjA2eiIgZmlsb
         D0iIzJmNjQ5MSIvPjwvZz48Y2lyY2xlIHRyYW5zZm9ybT0ic2tld1koLTIwKSBzY2FsZSguOTM5NyAxKSIgY3k9IjE3NzIuOTIyIiBjeD0iMjgxNi4wMTciIHI
         9IjIuOTY3IiBmaWxsPSIjZmZmIi8+PC9nPjwvc3ZnPg==">                                                                           
                 <h1 class="viewport-section__heading">Sorry, something went wrong</h1>                                            

                 <div class="viewport-section__text">                                                                              
                   <p>PyPI is down for maintenance or is having an outage.</p>                                                     
                   <p>                                                                                                             
                     This is affecting several of our services, including our web interface.</br>                                  
                     If you are trying to install a package, you should be able to <strong>pip install</strong> packages without   
         problem.                                                                                                                  
                   </p>                                                                                                            

                   <ul class="unstyled">                                                                                           
                     <li><a href="https://status.python.org/">Check our status page</a>, or</li>                                   
                     <li><a href="https://twitter.com/PythonStatus">View Python Status on Twitter</a></li>                         
                   </ul>                                                                                                           

                   <hr>                                                                                                            

                   <p>                                                                                                             
                     <strong>                                                                                                      
                       Rely on PyPI to get your job done?</br>                                                                     
                       Consider <a href="https://github.com/pypa/warehouse">contributing</a> or <a                                 
         href="https://psfmember.org/civicrm/contribute/transact?reset=1&id=13">donating</a> to help us build a more stable and    
         secure platform.                                                                                                          
                     </strong>                                                                                                     
                   </p>                                                                                                            
                 </div>                                                                                                            
               </div>                                                                                                              
             </div>                                                                                                                
           </body>                                                                                                                 
         </html>                                                                                                                   

ERROR    HTTPError: 503 Service Unavailable from https://test.pypi.org/legacy/                                                     
         Service Unavailable                               
bmvandoren commented 6 months ago

Hi @miketheman - writing with an update. Most of the bulk of the package is from a few model files. When I exclude the model files and try uploading the package, it works. Is it possible to try increasing the file size limit on this package?

Here is the output from the upload when I remove the (necessary) model files. The package is then only 430 kB:

$ python -m twine upload --repository nighthawk-test dist/* --verbose
INFO     Using configuration from /Users/benjamin/.pypirc                                                                          
Uploading distributions to https://test.pypi.org/legacy/
INFO     dist/nighthawk-0.3.0.post1-py3-none-any.whl (430.3 KB)                                                                    
INFO     dist/nighthawk-0.3.0.post1.tar.gz (428.0 KB)                                                                              
INFO     username set from config file                                                                                             
INFO     password set from config file                                                                                             
INFO     username: __token__                                                                                                       
INFO     password: <hidden>                                                                                                        
Uploading nighthawk-0.3.0.post1-py3-none-any.whl
100% ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 471.7/471.7 kB • 00:00 • 1.9 MB/s
INFO     Response from https://test.pypi.org/legacy/:                                                                              
         200 OK                                                                                                                    
Uploading nighthawk-0.3.0.post1.tar.gz
100% ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 469.4/469.4 kB • 00:00 • 150.6 MB/s
INFO     Response from https://test.pypi.org/legacy/:                                                                              
         200 OK                                                                                                                    

View at:
https://test.pypi.org/project/nighthawk/0.3.0.post1/
miketheman commented 6 months ago

@bmvandoren Glad to hear there was some successful uploads - that confirms all the authentication and upload stack. The current (and default) limit is 100MB per file, and you're under that limit already.

The "503: Service Unavailable" is coming from our caching tier, in response to a 5xx response from the backend, but I haven't been able to find any specific logged exceptions that would show this issue.

If you can run the test again with the faster network and provide UTC timestamps so we can narrow down when this is happening.

bmvandoren commented 6 months ago

@miketheman - I ran these uploads again and printed UTC timestamps. The timestamps are in HH:MM:SS format and correspond to the UTC date of 2023-12-21. I first tried uploading the ~80 mb package, which again failed as before. Then I removed the model files and uploaded the rest of the package, which again worked. Many thanks for your continued help.

Uploading full package (fails)

$ (python -m twine upload --repository nighthawk-test dist/* --verbose) | TZ=UTC ts '<%H:%M:%S %z>'
<02:25:46 +0000> INFO     Using configuration from /Users/benjamin/.pypirc                                                                              
<02:25:46 +0000> Uploading distributions to https://test.pypi.org/legacy/
<02:25:46 +0000> INFO     dist/nighthawk-0.3.0.post2-py3-none-any.whl (77.5 MB)                                                                         
<02:25:47 +0000> INFO     dist/nighthawk-0.3.0.post2.tar.gz (77.5 MB)                                                                                   
<02:25:47 +0000> INFO     username set from config file                                                                                                 
<02:25:47 +0000> INFO     password set from config file                                                                                                 
<02:25:47 +0000> INFO     username: __token__                                                                                                           
<02:25:47 +0000> INFO     password: <hidden>                                                                                                            
<02:25:47 +0000> Uploading nighthawk-0.3.0.post2-py3-none-any.whl
100% ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 81.3/81.3 MB • 00:15 • 5.3 MB/s
<02:26:06 +0000> WARNING  Received "503: Service Unavailable"                                                                                                                                                               
<02:26:06 +0000>          Package upload appears to have failed. Retry 1 of 5.                                                                                                                                              
<02:26:06 +0000> Uploading nighthawk-0.3.0.post2-py3-none-any.whl
100% ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 81.3/81.3 MB • 00:21 • 3.9 MB/s
<02:26:28 +0000> WARNING  Received "503: Service Unavailable"                                                                                                                                                                                 
<02:26:28 +0000>          Package upload appears to have failed. Retry 2 of 5.                                                                                                                                                                
<02:26:28 +0000> Uploading nighthawk-0.3.0.post2-py3-none-any.whl
100% ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 81.3/81.3 MB • 00:21 • 3.7 MB/s
<02:26:51 +0000> WARNING  Received "503: Service Unavailable"                                                                                                                                                                                 
<02:26:51 +0000>          Package upload appears to have failed. Retry 3 of 5.                                                                                                                                                                
<02:26:51 +0000> Uploading nighthawk-0.3.0.post2-py3-none-any.whl
100% ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 81.3/81.3 MB • 00:21 • 3.9 MB/s
<02:27:13 +0000> WARNING  Received "503: Service Unavailable"                                                                                                                                                                                 
<02:27:13 +0000>          Package upload appears to have failed. Retry 4 of 5.                                                                                                                                                                
<02:27:13 +0000> Uploading nighthawk-0.3.0.post2-py3-none-any.whl
100% ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 81.3/81.3 MB • 00:20 • 5.0 MB/s
<02:27:34 +0000> WARNING  Received "503: Service Unavailable"                                                                                                                                                                                 
<02:27:34 +0000>          Package upload appears to have failed. Retry 5 of 5.                                                                                                                                                                
<02:27:34 +0000> INFO     Response from https://test.pypi.org/legacy/:                                                                                                                                                                        
<02:27:34 +0000>          503 Service Unavailable                                                                                                                                                                                             
<02:27:34 +0000> INFO     <!DOCTYPE html>                                                                                                                                                                                                     
<02:27:34 +0000>          <html lang="en">                                                                                                                                                                                                    
<02:27:34 +0000>            <head>                                                                                                                                                                                                            
<02:27:34 +0000>              <meta charset="utf-8">                                                                                                                                                                                          
<02:27:34 +0000>              <meta http-equiv="X-UA-Compatible" content="IE=edge">                                                                                                                                                           
<02:27:34 +0000>              <meta name="viewport" content="width=device-width, initial-scale=1">                                                                                                                                            
<02:27:34 +0000>                                                                                                                                                                                                                              
<02:27:34 +0000>              <meta name="defaultLanguage" content="en">                                                                                                                                                                      
<02:27:34 +0000>              <meta name="availableLanguages" content="en">                                                                                                                                                                   
<02:27:34 +0000>                                                                                                                                                                                                                              
<02:27:34 +0000>              <title>Service Unavailable (503)</title>                                                                                                                                                                        
<02:27:34 +0000>                                                                                                                                                                                                                              
<02:27:34 +0000>              <meta name="description" content="The Python Package Index (PyPI) is a repository of software for the Python programming language.">                                                                            
<02:27:34 +0000>                                                                                                                                                                                                                              
<02:27:34 +0000>              <!-- Fonts -->                                                                                                                                                                                                  
<02:27:34 +0000>              <link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Source+Sans+Pro:400,400italic,600,600italic,700,700italic|Source+Code+Pro:500">                                                            
<02:27:34 +0000>                                                                                                                                                                                                                              
<02:27:34 +0000>              <style>                                                                                                                                                                                                         
<02:27:34 +0000>                html,                                                                                                                                                                                                         
<02:27:34 +0000>                body {                                                                                                                                                                                                        
<02:27:34 +0000>                  box-sizing: border-box;                                                                                                                                                                                     
<02:27:34 +0000>                  font-family: 'Source Sans Pro', 'Helvetica', Arial, sans-serif;                                                                                                                                             
<02:27:34 +0000>                  font-size: 17px;                                                                                                                                                                                            
<02:27:34 +0000>                  line-height: 1.4;                                                                                                                                                                                           
<02:27:34 +0000>                  font-weight: 300;                                                                                                                                                                                           
<02:27:34 +0000>                  color: #fff;                                                                                                                                                                                                
<02:27:34 +0000>                  -webkit-text-size-adjust: 100%;                                                                                                                                                                             
<02:27:34 +0000>                  font-size: 100%;                                                                                                                                                                                            
<02:27:34 +0000>                  padding: 0;                                                                                                                                                                                                 
<02:27:34 +0000>                  margin: 0;                                                                                                                                                                                                  
<02:27:34 +0000>                }                                                                                                                                                                                                             
<02:27:34 +0000>                                                                                                                                                                                                                              
<02:27:34 +0000>                h1, strong {                                                                                                                                                                                                  
<02:27:34 +0000>                  font-weight: 600;                                                                                                                                                                                           
<02:27:34 +0000>                }                                                                                                                                                                                                             
<02:27:34 +0000>                                                                                                                                                                                                                              
<02:27:34 +0000>                ul {                                                                                                                                                                                                          
<02:27:34 +0000>                  list-style-type: none;                                                                                                                                                                                      
<02:27:34 +0000>                  padding-left: 0;                                                                                                                                                                                            
<02:27:34 +0000>                }                                                                                                                                                                                                             
<02:27:34 +0000>                                                                                                                                                                                                                              
<02:27:34 +0000>                hr {                                                                                                                                                                                                          
<02:27:34 +0000>                  margin: 50px auto;                                                                                                                                                                                          
<02:27:34 +0000>                  width: 300px;                                                                                                                                                                                               
<02:27:34 +0000>                  max-width: 100%;                                                                                                                                                                                            
<02:27:34 +0000>                  border: 0;                                                                                                                                                                                                  
<02:27:34 +0000>                  height: 2px;                                                                                                                                                                                                
<02:27:34 +0000>                  background: rgba(255, 255, 255, 0.5);                                                                                                                                                                       
<02:27:34 +0000>                }                                                                                                                                                                                                             
<02:27:34 +0000>                                                                                                                                                                                                                              
<02:27:34 +0000>                .viewport-section {                                                                                                                                                                                           
<02:27:34 +0000>                  height: 100vh;                                                                                                                                                                                              
<02:27:34 +0000>                  display: flex;                                                                                                                                                                                              
<02:27:34 +0000>                  align-items: center;                                                                                                                                                                                        
<02:27:34 +0000>                  justify-content: center;                                                                                                                                                                                    
<02:27:34 +0000>                  background-color: #006dad;                                                                                                                                                                                  
<02:27:34 +0000>                  color: #fff;                                                                                                                                                                                                
<02:27:34 +0000>                }                                                                                                                                                                                                             
<02:27:34 +0000>                                                                                                                                                                                                                              
<02:27:34 +0000>                .viewport-section a {                                                                                                                                                                                         
<02:27:34 +0000>                  color: #fff;                                                                                                                                                                                                
<02:27:34 +0000>                }                                                                                                                                                                                                             
<02:27:34 +0000>                                                                                                                                                                                                                              
<02:27:34 +0000>                .viewport-section__content {                                                                                                                                                                                  
<02:27:34 +0000>                  text-align: center;                                                                                                                                                                                         
<02:27:34 +0000>                  padding: 30px;                                                                                                                                                                                              
<02:27:34 +0000>                  min-width: 0;                                                                                                                                                                                               
<02:27:34 +0000>                }                                                                                                                                                                                                             
<02:27:34 +0000>                                                                                                                                                                                                                              
<02:27:34 +0000>                .viewport-section__heading {                                                                                                                                                                                  
<02:27:34 +0000>                  font-size: 2.4em;                                                                                                                                                                                           
<02:27:34 +0000>                  padding: 20px 15px 0;                                                                                                                                                                                       
<02:27:34 +0000>                  margin: 0;                                                                                                                                                                                                  
<02:27:34 +0000>                }                                                                                                                                                                                                             
<02:27:34 +0000>                                                                                                                                                                                                                              
<02:27:34 +0000>                @media screen and (max-width: 600px) {                                                                                                                                                                        
<02:27:34 +0000>                  .viewport-section__content {                                                                                                                                                                                
<02:27:34 +0000>                    padding: 15px;                                                                                                                                                                                            
<02:27:34 +0000>                  }                                                                                                                                                                                                           
<02:27:34 +0000>                                                                                                                                                                                                                              
<02:27:34 +0000>                  .viewport-section__heading {                                                                                                                                                                                
<02:27:34 +0000>                    font-size: 1.5em;                                                                                                                                                                                         
<02:27:34 +0000>                  }                                                                                                                                                                                                           
<02:27:34 +0000>                }                                                                                                                                                                                                             
<02:27:34 +0000>              </style>                                                                                                                                                                                                        
<02:27:34 +0000>                                                                                                                                                                                                                              
<02:27:34 +0000>            </head>                                                                                                                                                                                                           
<02:27:34 +0000>                                                                                                                                                                                                                              
<02:27:34 +0000>            <body>                                                                                                                                                                                                            
<02:27:34 +0000>              <div class="viewport-section">                                                                                                                                                                                  
<02:27:34 +0000>                <div class="viewport-section__content">                                                                                                                                                                       
<02:27:34 +0000>                  <img alt="PyPI logo"                                                                                                                                                                                        
<02:27:34 +0000>          src="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSI2NS44MTIiIGhlaWdodD0iNTgiIHZpZXdCb3g9IjAgMCA2NS44MTIwMzUgNTguMDAwMDAxIj48ZyBmaWxsPSIjYTI5ZDg2IiBzdHJva2U9IiNjY2MiIHN0c
<02:27:34 +0000>          m9rZS13aWR0aD0iLjIxNCIgc3Ryb2tlLWxpbmVqb2luPSJiZXZlbCI+PHBhdGggZD0iTTE4LjkzIDE4LjgyNmw5LjMyMyAzLjM5NHYxMC45NTdsLTkuMzIzLTMuMzk0eiIgc3R5bGU9Imlzb2xhdGlvbjphdXRvO21peC1ibGVuZC1tb2RlOm5vcm1hbCIgY29sb3I9IiMwMDAiIG92Z
<02:27:34 +0000>          XJmbG93PSJ2aXNpYmxlIiBmaWxsPSIjZTllOWZmIi8+PHBhdGggZD0iTTkuNDcgMjIuMjd2MTAuOTU3bDkuNDYtMy40NDRWMTguODI2eiIgc3R5bGU9Imlzb2xhdGlvbjphdXRvO21peC1ibGVuZC1tb2RlOm5vcm1hbCIgY29sb3I9IiMwMDAiIG92ZXJmbG93PSJ2aXNpYmxlIiBma
<02:27:34 +0000>          WxsPSIjMzUzNTY0Ii8+PHBhdGggZD0iTTkuNDcgMzMuMjI3bDkuMzIyIDMuMzkzIDkuNDYtMy40NDMtOS4zMjItMy4zOTR6IiBzdHlsZT0iaXNvbGF0aW9uOmF1dG87bWl4LWJsZW5kLW1vZGU6bm9ybWFsIiBjb2xvcj0iIzAwMCIgb3ZlcmZsb3c9InZpc2libGUiIGZpbGw9IiNhZ
<02:27:34 +0000>          mFmZGUiLz48cGF0aCBkPSJNOS40NyAyMi4yN2w5LjMyMiAzLjM5MyA5LjQ2LTMuNDQzLTkuMzIyLTMuMzk0eiIgZmlsbD0iI2Y3ZjdmNCIvPjxwYXRoIGQ9Ik0xOC43OTIgMjUuNjYzVjM2LjYybDkuNDYtMy40NDNWMjIuMjJ6IiBmaWxsPSIjZmZmIi8+PHBhdGggZD0iTTkuNDcgM
<02:27:34 +0000>          jIuMjdsOS4zMjIgMy4zOTNWMzYuNjJMOS40NyAzMy4yMjd6IiBmaWxsPSIjZWZlZWVhIi8+PHBhdGggc3R5bGU9Imlzb2xhdGlvbjphdXRvO21peC1ibGVuZC1tb2RlOm5vcm1hbCIgZD0iTTI4LjI5MyAxMS4xNjZsOS4zMjMgMy4zOTN2MTAuOTU3bC05LjMyMy0zLjM5M3oiIGNvb
<02:27:34 +0000>          G9yPSIjMDAwIiBvdmVyZmxvdz0idmlzaWJsZSIgZmlsbD0iI2U5ZTlmZiIvPjxwYXRoIHN0eWxlPSJpc29sYXRpb246YXV0bzttaXgtYmxlbmQtbW9kZTpub3JtYWwiIGQ9Ik0xOC44MzMgMTQuNjA5djEwLjk1N2w5LjQ2LTMuNDQzVjExLjE2NnoiIGNvbG9yPSIjMDAwIiBvdmVyZ
<02:27:34 +0000>          mxvdz0idmlzaWJsZSIgZmlsbD0iIzM1MzU2NCIvPjxwYXRoIHN0eWxlPSJpc29sYXRpb246YXV0bzttaXgtYmxlbmQtbW9kZTpub3JtYWwiIGQ9Ik0xOC44MzMgMjUuNTY2bDkuMzIyIDMuMzkzIDkuNDYxLTMuNDQzLTkuMzIzLTMuMzkzeiIgY29sb3I9IiMwMDAiIG92ZXJmbG93P
<02:27:34 +0000>          SJ2aXNpYmxlIiBmaWxsPSIjYWZhZmRlIi8+PHBhdGggZD0iTTE4LjgzMyAxNC42MDlsOS4zMjIgMy4zOTMgOS40NjEtMy40NDMtOS4zMjMtMy4zOTN6IiBmaWxsPSIjZjdmN2Y0Ii8+PHBhdGggZD0iTTI4LjE1NSAxOC4wMDJWMjguOTZsOS40NjEtMy40NDNWMTQuNTU5eiIgZmlsb
<02:27:34 +0000>          D0iI2ZmZiIvPjxwYXRoIGQ9Ik0xOC44MzMgMTQuNjA5bDkuMzIyIDMuMzkzVjI4Ljk2bC05LjMyMi0zLjM5M3oiIGZpbGw9IiNlZmVlZWEiLz48cGF0aCBkPSJNOS41NjcgMzMuMjk3bDkuMzIyIDMuMzkzdjEwLjk1N2wtOS4zMjItMy4zOTN6IiBzdHlsZT0iaXNvbGF0aW9uOmF1d
<02:27:34 +0000>          G87bWl4LWJsZW5kLW1vZGU6bm9ybWFsIiBjb2xvcj0iIzAwMCIgb3ZlcmZsb3c9InZpc2libGUiIGZpbGw9IiNlOWU5ZmYiLz48cGF0aCBkPSJNLjEwNiAzNi43NHYxMC45NTdsOS40Ni0zLjQ0M1YzMy4yOTd6IiBzdHlsZT0iaXNvbGF0aW9uOmF1dG87bWl4LWJsZW5kLW1vZGU6b
<02:27:34 +0000>          m9ybWFsIiBjb2xvcj0iIzAwMCIgb3ZlcmZsb3c9InZpc2libGUiIGZpbGw9IiMzNTM1NjQiLz48cGF0aCBkPSJNLjEwNiA0Ny42OTdMOS40MyA1MS4wOWw5LjQ2LTMuNDQzLTkuMzIyLTMuMzkzeiIgc3R5bGU9Imlzb2xhdGlvbjphdXRvO21peC1ibGVuZC1tb2RlOm5vcm1hbCIgY
<02:27:34 +0000>          29sb3I9IiMwMDAiIG92ZXJmbG93PSJ2aXNpYmxlIiBmaWxsPSIjYWZhZmRlIi8+PHBhdGggZD0iTS4xMDYgMzYuNzRsOS4zMjMgMy4zOTMgOS40Ni0zLjQ0My05LjMyMi0zLjM5M3oiIGZpbGw9IiNmN2Y3ZjQiLz48cGF0aCBkPSJNOS40MjkgNDAuMTMzVjUxLjA5bDkuNDYtMy40N
<02:27:34 +0000>          DNWMzYuNjl6IiBmaWxsPSIjZmZmIi8+PHBhdGggZD0iTS4xMDYgMzYuNzRsOS4zMjMgMy4zOTNWNTEuMDlMLjEwNiA0Ny42OTd6IiBmaWxsPSIjZWZlZWVhIi8+PC9nPjxnIGZpbGw9IiNhMjlkODYiIHN0cm9rZT0iI2NjYyIgc3Ryb2tlLXdpZHRoPSIuMjE0IiBzdHJva2UtbGluZ
<02:27:34 +0000>          WpvaW49ImJldmVsIj48cGF0aCBzdHlsZT0iaXNvbGF0aW9uOmF1dG87bWl4LWJsZW5kLW1vZGU6bm9ybWFsIiBkPSJNMTguOTMgMzYuNzAybDkuMzIzIDMuMzkzdjEwLjk1N2wtOS4zMjMtMy4zOTN6IiBjb2xvcj0iIzAwMCIgb3ZlcmZsb3c9InZpc2libGUiIGZpbGw9IiNlOWU5Z
<02:27:34 +0000>          mYiLz48cGF0aCBzdHlsZT0iaXNvbGF0aW9uOmF1dG87bWl4LWJsZW5kLW1vZGU6bm9ybWFsIiBkPSJNOS40NyA0MC4xNDV2MTAuOTU3bDkuNDYtMy40NDNWMzYuNzAyeiIgY29sb3I9IiMwMDAiIG92ZXJmbG93PSJ2aXNpYmxlIiBmaWxsPSIjMzUzNTY0Ii8+PHBhdGggc3R5bGU9I
<02:27:34 +0000>          mlzb2xhdGlvbjphdXRvO21peC1ibGVuZC1tb2RlOm5vcm1hbCIgZD0iTTkuNDcgNTEuMTAybDkuMzIyIDMuMzkzIDkuNDYtMy40NDMtOS4zMjItMy4zOTN6IiBjb2xvcj0iIzAwMCIgb3ZlcmZsb3c9InZpc2libGUiIGZpbGw9IiNhZmFmZGUiLz48cGF0aCBkPSJNOS40NyA0MC4xN
<02:27:34 +0000>          DVsOS4zMjIgMy4zOTMgOS40Ni0zLjQ0My05LjMyMi0zLjM5M3oiIGZpbGw9IiNmN2Y3ZjQiLz48cGF0aCBkPSJNMTguNzkyIDQzLjUzOHYxMC45NTdsOS40Ni0zLjQ0M1Y0MC4wOTV6IiBmaWxsPSIjZmZmIi8+PHBhdGggZD0iTTkuNDcgNDAuMTQ1bDkuMzIyIDMuMzkzdjEwLjk1N
<02:27:34 +0000>          0w5LjQ3IDUxLjEwMnoiIGZpbGw9IiNlZmVlZWEiLz48L2c+PGcgZmlsbD0iI2EyOWQ4NiIgc3Ryb2tlPSIjY2NjIiBzdHJva2Utd2lkdGg9Ii4yMTQiIHN0cm9rZS1saW5lam9pbj0iYmV2ZWwiPjxwYXRoIGQ9Ik0xOC45MyAyNS42MzZsOS4zMjMgMy4zOTN2MTAuOTU3bC05LjMyM
<02:27:34 +0000>          y0zLjM5M3oiIHN0eWxlPSJpc29sYXRpb246YXV0bzttaXgtYmxlbmQtbW9kZTpub3JtYWwiIGNvbG9yPSIjMDAwIiBvdmVyZmxvdz0idmlzaWJsZSIgZmlsbD0iI2U5ZTlmZiIvPjxwYXRoIGQ9Ik05LjQ3IDI5LjA4djEwLjk1Nmw5LjQ2LTMuNDQzVjI1LjYzNnoiIHN0eWxlPSJpc
<02:27:34 +0000>          29sYXRpb246YXV0bzttaXgtYmxlbmQtbW9kZTpub3JtYWwiIGNvbG9yPSIjMDAwIiBvdmVyZmxvdz0idmlzaWJsZSIgZmlsbD0iIzM1MzU2NCIvPjxwYXRoIGQ9Ik05LjQ3IDQwLjAzNmw5LjMyMiAzLjM5NCA5LjQ2LTMuNDQ0LTkuMzIyLTMuMzkzeiIgc3R5bGU9Imlzb2xhdGlvb
<02:27:34 +0000>          jphdXRvO21peC1ibGVuZC1tb2RlOm5vcm1hbCIgY29sb3I9IiMwMDAiIG92ZXJmbG93PSJ2aXNpYmxlIiBmaWxsPSIjYWZhZmRlIi8+PHBhdGggZD0iTTkuNDcgMjkuMDhsOS4zMjIgMy4zOTMgOS40Ni0zLjQ0NC05LjMyMi0zLjM5M3oiIGZpbGw9IiNmN2Y3ZjQiLz48cGF0aCBkP
<02:27:34 +0000>          SJNMTguNzkyIDMyLjQ3M1Y0My40M2w5LjQ2LTMuNDQ0VjI5LjAzeiIgZmlsbD0iI2ZmZiIvPjxwYXRoIGQ9Ik05LjQ3IDI5LjA4bDkuMzIyIDMuMzkzVjQzLjQzTDkuNDcgNDAuMDM2eiIgZmlsbD0iI2VmZWVlYSIvPjwvZz48ZyBmaWxsPSIjYTI5ZDg2IiBzdHJva2U9IiNjY2MiI
<02:27:34 +0000>          HN0cm9rZS13aWR0aD0iLjIxNCIgc3Ryb2tlLWxpbmVqb2luPSJiZXZlbCI+PHBhdGggc3R5bGU9Imlzb2xhdGlvbjphdXRvO21peC1ibGVuZC1tb2RlOm5vcm1hbCIgZD0iTTU2LjM4MyAyOS44OTJsOS4zMjMgMy4zOTN2MTAuOTU3bC05LjMyMy0zLjM5M3oiIGNvbG9yPSIjMDAwI
<02:27:34 +0000>          iBvdmVyZmxvdz0idmlzaWJsZSIgZmlsbD0iI2U5ZTlmZiIvPjxwYXRoIHN0eWxlPSJpc29sYXRpb246YXV0bzttaXgtYmxlbmQtbW9kZTpub3JtYWwiIGQ9Ik00Ni45MjMgMzMuMzM1djEwLjk1N2w5LjQ2LTMuNDQzVjI5Ljg5MnoiIGNvbG9yPSIjMDAwIiBvdmVyZmxvdz0idmlza
<02:27:34 +0000>          WJsZSIgZmlsbD0iIzM1MzU2NCIvPjxwYXRoIHN0eWxlPSJpc29sYXRpb246YXV0bzttaXgtYmxlbmQtbW9kZTpub3JtYWwiIGQ9Ik00Ni45MjMgNDQuMjkybDkuMzIyIDMuMzk0IDkuNDYtMy40NDQtOS4zMjItMy4zOTN6IiBjb2xvcj0iIzAwMCIgb3ZlcmZsb3c9InZpc2libGUiI
<02:27:34 +0000>          GZpbGw9IiNhZmFmZGUiLz48cGF0aCBkPSJNNDYuOTIzIDMzLjMzNWw5LjMyMiAzLjM5NCA5LjQ2LTMuNDQ0LTkuMzIyLTMuMzkzeiIgZmlsbD0iI2Y3ZjdmNCIvPjxwYXRoIGQ9Ik01Ni4yNDUgMzYuNzI5djEwLjk1N2w5LjQ2LTMuNDQ0VjMzLjI4NXoiIGZpbGw9IiNmZmYiLz48c
<02:27:34 +0000>          GF0aCBkPSJNNDYuOTIzIDMzLjMzNWw5LjMyMiAzLjM5NHYxMC45NTdsLTkuMzIyLTMuMzk0eiIgZmlsbD0iI2VmZWVlYSIvPjwvZz48ZyB0cmFuc2Zvcm09InRyYW5zbGF0ZSgtMTY4My42NiAtNTEzLjI3NSkgc2NhbGUoLjY1MTc3KSI+PGcgZmlsbD0iI2EyOWQ4NiIgc3Ryb2tlP
<02:27:34 +0000>          SIjY2NjIiBzdHJva2Utd2lkdGg9Ii4zMjgiIHN0cm9rZS1saW5lam9pbj0iYmV2ZWwiPjxwYXRoIHN0eWxlPSJpc29sYXRpb246YXV0bzttaXgtYmxlbmQtbW9kZTpub3JtYWwiIGQ9Ik0yNjU1LjM0OSA4MzguNTk0bDE0LjMwMyA1LjIwNnYxNi44MTFsLTE0LjMwMy01LjIwNnoiI
<02:27:34 +0000>          GNvbG9yPSIjMDAwIiBvdmVyZmxvdz0idmlzaWJsZSIgZmlsbD0iI2U5ZTlmZiIvPjxwYXRoIHN0eWxlPSJpc29sYXRpb246YXV0bzttaXgtYmxlbmQtbW9kZTpub3JtYWwiIGQ9Ik0yNjQwLjgzNCA4NDMuODc3djE2LjgxMWwxNC41MTUtNS4yODN2LTE2LjgxeiIgY29sb3I9IiMwM
<02:27:34 +0000>          DAiIG92ZXJmbG93PSJ2aXNpYmxlIiBmaWxsPSIjMzUzNTY0Ii8+PHBhdGggc3R5bGU9Imlzb2xhdGlvbjphdXRvO21peC1ibGVuZC1tb2RlOm5vcm1hbCIgZD0iTTI2NDAuODM0IDg2MC42ODhsMTQuMzAzIDUuMjA2IDE0LjUxNS01LjI4My0xNC4zMDMtNS4yMDZ6IiBjb2xvcj0iI
<02:27:34 +0000>          zAwMCIgb3ZlcmZsb3c9InZpc2libGUiIGZpbGw9IiNhZmFmZGUiLz48cGF0aCBkPSJNMjY0MC44MzQgODQzLjg3N2wxNC4zMDMgNS4yMDYgMTQuNTE1LTUuMjgzLTE0LjMwMy01LjIwNnoiIGZpbGw9IiNmN2Y3ZjQiLz48cGF0aCBkPSJNMjY1NS4xMzcgODQ5LjA4M3YxNi44MTFsM
<02:27:34 +0000>          TQuNTE1LTUuMjgzdi0xNi44MXoiIGZpbGw9IiNmZmQyNDIiLz48cGF0aCBkPSJNMjY0MC44MzQgODQzLjg3N2wxNC4zMDMgNS4yMDZ2MTYuODExbC0xNC4zMDMtNS4yMDZ6IiBmaWxsPSIjZWZlZWVhIi8+PC9nPjxjaXJjbGUgdHJhbnNmb3JtPSJza2V3WSgtMjApIHNjYWxlKC45M
<02:27:34 +0000>          zk3IDEpIiBjeT0iMTgyMy44OTkiIGN4PSIyODM1LjIxOCIgcj0iMi45NjciIGZpbGw9IiNmZmYiLz48L2c+PGcgZmlsbD0iI2EyOWQ4NiIgc3Ryb2tlPSIjY2NjIiBzdHJva2Utd2lkdGg9Ii4yMTQiIHN0cm9rZS1saW5lam9pbj0iYmV2ZWwiPjxwYXRoIGQ9Ik0zNy42NTcgMzYuN
<02:27:34 +0000>          zAybDkuMzIyIDMuMzkzdjEwLjk1N2wtOS4zMjItMy4zOTN6IiBzdHlsZT0iaXNvbGF0aW9uOmF1dG87bWl4LWJsZW5kLW1vZGU6bm9ybWFsIiBjb2xvcj0iIzAwMCIgb3ZlcmZsb3c9InZpc2libGUiIGZpbGw9IiNlOWU5ZmYiLz48cGF0aCBkPSJNMjguMTk2IDQwLjE0NXYxMC45N
<02:27:34 +0000>          TdsOS40Ni0zLjQ0M1YzNi43MDJ6IiBzdHlsZT0iaXNvbGF0aW9uOmF1dG87bWl4LWJsZW5kLW1vZGU6bm9ybWFsIiBjb2xvcj0iIzAwMCIgb3ZlcmZsb3c9InZpc2libGUiIGZpbGw9IiMzNTM1NjQiLz48cGF0aCBkPSJNMjguMTk2IDUxLjEwMmw5LjMyMyAzLjM5MyA5LjQ2LTMuN
<02:27:34 +0000>          DQzLTkuMzIyLTMuMzkzeiIgc3R5bGU9Imlzb2xhdGlvbjphdXRvO21peC1ibGVuZC1tb2RlOm5vcm1hbCIgY29sb3I9IiMwMDAiIG92ZXJmbG93PSJ2aXNpYmxlIiBmaWxsPSIjYWZhZmRlIi8+PHBhdGggZD0iTTI4LjE5NiA0MC4xNDVsOS4zMjMgMy4zOTMgOS40Ni0zLjQ0My05L
<02:27:34 +0000>          jMyMi0zLjM5M3oiIGZpbGw9IiNmN2Y3ZjQiLz48cGF0aCBkPSJNMzcuNTE5IDQzLjUzOHYxMC45NTdsOS40Ni0zLjQ0M1Y0MC4wOTV6IiBmaWxsPSIjZmZkMjQyIi8+PHBhdGggZD0iTTI4LjE5NiA0MC4xNDVsOS4zMjMgMy4zOTN2MTAuOTU3bC05LjMyMy0zLjM5M3oiIGZpbGw9I
<02:27:34 +0000>          iNlZmVlZWEiLz48L2c+PGcgZmlsbD0iI2EyOWQ4NiIgc3Ryb2tlPSIjY2NjIiBzdHJva2Utd2lkdGg9Ii4yMTQiIHN0cm9rZS1saW5lam9pbj0iYmV2ZWwiPjxwYXRoIHN0eWxlPSJpc29sYXRpb246YXV0bzttaXgtYmxlbmQtbW9kZTpub3JtYWwiIGQ9Ik0yOC4yOTMgNDAuMTA3b
<02:27:34 +0000>          DkuMzIzIDMuMzkzdjEwLjk1N2wtOS4zMjMtMy4zOTN6IiBjb2xvcj0iIzAwMCIgb3ZlcmZsb3c9InZpc2libGUiIGZpbGw9IiNlOWU5ZmYiLz48cGF0aCBzdHlsZT0iaXNvbGF0aW9uOmF1dG87bWl4LWJsZW5kLW1vZGU6bm9ybWFsIiBkPSJNMTguODMzIDQzLjU1djEwLjk1N2w5L
<02:27:34 +0000>          jQ2LTMuNDQzVjQwLjEwN3oiIGNvbG9yPSIjMDAwIiBvdmVyZmxvdz0idmlzaWJsZSIgZmlsbD0iIzM1MzU2NCIvPjxwYXRoIHN0eWxlPSJpc29sYXRpb246YXV0bzttaXgtYmxlbmQtbW9kZTpub3JtYWwiIGQ9Ik0xOC44MzMgNTQuNTA3bDkuMzIyIDMuMzkzIDkuNDYtMy40NDMtO
<02:27:34 +0000>          S4zMjItMy4zOTN6IiBjb2xvcj0iIzAwMCIgb3ZlcmZsb3c9InZpc2libGUiIGZpbGw9IiNhZmFmZGUiLz48cGF0aCBkPSJNMTguODMzIDQzLjU1bDkuMzIyIDMuMzkzIDkuNDYtMy40NDMtOS4zMjItMy4zOTN6IiBmaWxsPSIjZjdmN2Y0Ii8+PHBhdGggZD0iTTI4LjE1NSA0Ni45N
<02:27:34 +0000>          DNWNTcuOWw5LjQ2LTMuNDQzVjQzLjV6IiBmaWxsPSIjZmZmIi8+PHBhdGggZD0iTTE4LjgzMyA0My41NWw5LjMyMiAzLjM5M1Y1Ny45bC05LjMyMi0zLjM5M3oiIGZpbGw9IiNlZmVlZWEiLz48L2c+PGcgZmlsbD0iI2EyOWQ4NiIgc3Ryb2tlPSIjY2NjIiBzdHJva2Utd2lkdGg9I
<02:27:34 +0000>          i4yMTQiIHN0cm9rZS1saW5lam9pbj0iYmV2ZWwiPjxwYXRoIGQ9Ik01Ni4zODMgMTguODI2bDkuMzIzIDMuMzk0djEwLjk1N2wtOS4zMjMtMy4zOTR6IiBzdHlsZT0iaXNvbGF0aW9uOmF1dG87bWl4LWJsZW5kLW1vZGU6bm9ybWFsIiBjb2xvcj0iIzAwMCIgb3ZlcmZsb3c9InZpc
<02:27:34 +0000>          2libGUiIGZpbGw9IiNlOWU5ZmYiLz48cGF0aCBkPSJNNDYuOTIzIDIyLjI3djEwLjk1N2w5LjQ2LTMuNDQ0VjE4LjgyNnoiIHN0eWxlPSJpc29sYXRpb246YXV0bzttaXgtYmxlbmQtbW9kZTpub3JtYWwiIGNvbG9yPSIjMDAwIiBvdmVyZmxvdz0idmlzaWJsZSIgZmlsbD0iIzM1M
<02:27:34 +0000>          zU2NCIvPjxwYXRoIGQ9Ik00Ni45MjMgMzMuMjI3bDkuMzIyIDMuMzkzIDkuNDYtMy40NDMtOS4zMjItMy4zOTR6IiBzdHlsZT0iaXNvbGF0aW9uOmF1dG87bWl4LWJsZW5kLW1vZGU6bm9ybWFsIiBjb2xvcj0iIzAwMCIgb3ZlcmZsb3c9InZpc2libGUiIGZpbGw9IiNhZmFmZGUiL
<02:27:34 +0000>          z48cGF0aCBkPSJNNDYuOTIzIDIyLjI3bDkuMzIyIDMuMzkzIDkuNDYtMy40NDMtOS4zMjItMy4zOTR6IiBmaWxsPSIjZjdmN2Y0Ii8+PHBhdGggZD0iTTU2LjI0NSAyNS42NjNWMzYuNjJsOS40Ni0zLjQ0M1YyMi4yMnoiIGZpbGw9IiNmZmQyNDIiLz48cGF0aCBkPSJNNDYuOTIzI
<02:27:34 +0000>          DIyLjI3bDkuMzIyIDMuMzkzVjM2LjYybC05LjMyMi0zLjM5M3oiIGZpbGw9IiNlZmVlZWEiLz48L2c+PGcgZmlsbD0iI2EyOWQ4NiIgc3Ryb2tlPSIjY2NjIiBzdHJva2Utd2lkdGg9Ii4yMTQiIHN0cm9rZS1saW5lam9pbj0iYmV2ZWwiPjxwYXRoIHN0eWxlPSJpc29sYXRpb246Y
<02:27:34 +0000>          XV0bzttaXgtYmxlbmQtbW9kZTpub3JtYWwiIGQ9Ik01Ni4zODMgNy43Nmw5LjMyMyAzLjM5NFYyMi4xMWwtOS4zMjMtMy4zOTN6IiBjb2xvcj0iIzAwMCIgb3ZlcmZsb3c9InZpc2libGUiIGZpbGw9IiNlOWU5ZmYiLz48cGF0aCBzdHlsZT0iaXNvbGF0aW9uOmF1dG87bWl4LWJsZ
<02:27:34 +0000>          W5kLW1vZGU6bm9ybWFsIiBkPSJNNDYuOTIzIDExLjIwNHYxMC45NTdsOS40Ni0zLjQ0M1Y3Ljc2eiIgY29sb3I9IiMwMDAiIG92ZXJmbG93PSJ2aXNpYmxlIiBmaWxsPSIjMzUzNTY0Ii8+PHBhdGggc3R5bGU9Imlzb2xhdGlvbjphdXRvO21peC1ibGVuZC1tb2RlOm5vcm1hbCIgZ
<02:27:34 +0000>          D0iTTQ2LjkyMyAyMi4xNjFsOS4zMjIgMy4zOTMgOS40Ni0zLjQ0My05LjMyMi0zLjM5M3oiIGNvbG9yPSIjMDAwIiBvdmVyZmxvdz0idmlzaWJsZSIgZmlsbD0iI2FmYWZkZSIvPjxwYXRoIGQ9Ik00Ni45MjMgMTEuMjA0bDkuMzIyIDMuMzkzIDkuNDYtMy40NDMtOS4zMjItMy4zO
<02:27:34 +0000>          TN6IiBmaWxsPSIjZmZjOTFkIi8+PHBhdGggZD0iTTU2LjI0NSAxNC41OTd2MTAuOTU3bDkuNDYtMy40NDNWMTEuMTU0eiIgZmlsbD0iI2ZmZDI0MiIvPjxwYXRoIGQ9Ik00Ni45MjMgMTEuMjA0bDkuMzIyIDMuMzkzdjEwLjk1N2wtOS4zMjItMy4zOTN6IiBmaWxsPSIjZWZlZWVhI
<02:27:34 +0000>          i8+PC9nPjxnIGZpbGw9IiNhMjlkODYiIHN0cm9rZT0iI2NjYyIgc3Ryb2tlLXdpZHRoPSIuMjE0IiBzdHJva2UtbGluZWpvaW49ImJldmVsIj48cGF0aCBzdHlsZT0iaXNvbGF0aW9uOmF1dG87bWl4LWJsZW5kLW1vZGU6bm9ybWFsIiBkPSJNNDcuMDIgMjIuMjMxbDkuMzIyIDMuM
<02:27:34 +0000>          zkzdjEwLjk1N2wtOS4zMjItMy4zOTN6IiBjb2xvcj0iIzAwMCIgb3ZlcmZsb3c9InZpc2libGUiIGZpbGw9IiNlOWU5ZmYiLz48cGF0aCBzdHlsZT0iaXNvbGF0aW9uOmF1dG87bWl4LWJsZW5kLW1vZGU6bm9ybWFsIiBkPSJNMzcuNTYgMjUuNjc1djEwLjk1N2w5LjQ2LTMuNDQ0V
<02:27:34 +0000>          jIyLjIzMXoiIGNvbG9yPSIjMDAwIiBvdmVyZmxvdz0idmlzaWJsZSIgZmlsbD0iIzM1MzU2NCIvPjxwYXRoIHN0eWxlPSJpc29sYXRpb246YXV0bzttaXgtYmxlbmQtbW9kZTpub3JtYWwiIGQ9Ik0zNy41NiAzNi42MzJsOS4zMjIgMy4zOTMgOS40Ni0zLjQ0NC05LjMyMi0zLjM5M
<02:27:34 +0000>          3oiIGNvbG9yPSIjMDAwIiBvdmVyZmxvdz0idmlzaWJsZSIgZmlsbD0iI2FmYWZkZSIvPjxwYXRoIGQ9Ik0zNy41NiAyNS42NzVsOS4zMjIgMy4zOTMgOS40Ni0zLjQ0NC05LjMyMi0zLjM5M3oiIGZpbGw9IiNmN2Y3ZjQiLz48cGF0aCBkPSJNNDYuODgyIDI5LjA2OHYxMC45NTdsO
<02:27:34 +0000>          S40Ni0zLjQ0NFYyNS42MjR6IiBmaWxsPSIjZmZkMjQyIi8+PHBhdGggZD0iTTM3LjU2IDI1LjY3NWw5LjMyMiAzLjM5M3YxMC45NTdsLTkuMzIzLTMuMzkzeiIgZmlsbD0iI2VmZWVlYSIvPjwvZz48ZyBmaWxsPSIjYTI5ZDg2IiBzdHJva2U9IiNjY2MiIHN0cm9rZS13aWR0aD0iL
<02:27:34 +0000>          jIxNCIgc3Ryb2tlLWxpbmVqb2luPSJiZXZlbCI+PHBhdGggZD0iTTQ3LjAyIDExLjE2Nmw5LjMyMiAzLjM5M3YxMC45NTdsLTkuMzIyLTMuMzkzeiIgc3R5bGU9Imlzb2xhdGlvbjphdXRvO21peC1ibGVuZC1tb2RlOm5vcm1hbCIgY29sb3I9IiMwMDAiIG92ZXJmbG93PSJ2aXNpY
<02:27:34 +0000>          mxlIiBmaWxsPSIjZTllOWZmIi8+PHBhdGggZD0iTTM3LjU2IDE0LjYwOXYxMC45NTdsOS40Ni0zLjQ0M1YxMS4xNjZ6IiBzdHlsZT0iaXNvbGF0aW9uOmF1dG87bWl4LWJsZW5kLW1vZGU6bm9ybWFsIiBjb2xvcj0iIzAwMCIgb3ZlcmZsb3c9InZpc2libGUiIGZpbGw9IiMzNTM1N
<02:27:34 +0000>          jQiLz48cGF0aCBkPSJNMzcuNTYgMjUuNTY2bDkuMzIyIDMuMzkzIDkuNDYtMy40NDMtOS4zMjItMy4zOTN6IiBzdHlsZT0iaXNvbGF0aW9uOmF1dG87bWl4LWJsZW5kLW1vZGU6bm9ybWFsIiBjb2xvcj0iIzAwMCIgb3ZlcmZsb3c9InZpc2libGUiIGZpbGw9IiNhZmFmZGUiLz48c
<02:27:34 +0000>          GF0aCBkPSJNMzcuNTYgMTQuNjA5bDkuMzIyIDMuMzkzIDkuNDYtMy40NDMtOS4zMjItMy4zOTN6IiBmaWxsPSIjZjdmN2Y0Ii8+PHBhdGggZD0iTTQ2Ljg4MiAxOC4wMDJWMjguOTZsOS40Ni0zLjQ0M1YxNC41NTl6IiBmaWxsPSIjMzc3NWE5Ii8+PHBhdGggZD0iTTM3LjU2IDE0L
<02:27:34 +0000>          jYwOWw5LjMyMiAzLjM5M1YyOC45NmwtOS4zMjMtMy4zOTN6IiBmaWxsPSIjZWZlZWVhIi8+PC9nPjxnIGZpbGw9IiNhMjlkODYiIHN0cm9rZT0iI2NjYyIgc3Ryb2tlLXdpZHRoPSIuMjE0IiBzdHJva2UtbGluZWpvaW49ImJldmVsIj48cGF0aCBzdHlsZT0iaXNvbGF0aW9uOmF1d
<02:27:34 +0000>          G87bWl4LWJsZW5kLW1vZGU6bm9ybWFsIiBkPSJNNDcuMDIuMWw5LjMyMiAzLjM5M1YxNC40NWwtOS4zMjItMy4zOTN6IiBjb2xvcj0iIzAwMCIgb3ZlcmZsb3c9InZpc2libGUiIGZpbGw9IiNlOWU5ZmYiLz48cGF0aCBzdHlsZT0iaXNvbGF0aW9uOmF1dG87bWl4LWJsZW5kLW1vZ
<02:27:34 +0000>          GU6bm9ybWFsIiBkPSJNMzcuNTYgMy41NDNWMTQuNWw5LjQ2LTMuNDQzVi4xeiIgY29sb3I9IiMwMDAiIG92ZXJmbG93PSJ2aXNpYmxlIiBmaWxsPSIjMzUzNTY0Ii8+PHBhdGggc3R5bGU9Imlzb2xhdGlvbjphdXRvO21peC1ibGVuZC1tb2RlOm5vcm1hbCIgZD0iTTM3LjU2IDE0L
<02:27:34 +0000>          jVsOS4zMjIgMy4zOTMgOS40Ni0zLjQ0My05LjMyMi0zLjM5M3oiIGNvbG9yPSIjMDAwIiBvdmVyZmxvdz0idmlzaWJsZSIgZmlsbD0iI2FmYWZkZSIvPjxwYXRoIGQ9Ik0zNy41NiAzLjU0M2w5LjMyMiAzLjM5MyA5LjQ2LTMuNDQzTDQ3LjAyLjF6IiBmaWxsPSIjMmY2NDkxIi8+P
<02:27:34 +0000>          HBhdGggZD0iTTQ2Ljg4MiA2LjkzNnYxMC45NTdsOS40Ni0zLjQ0M1YzLjQ5M3oiIGZpbGw9IiMzNzc1YTkiLz48cGF0aCBkPSJNMzcuNTYgMy41NDNsOS4zMjIgMy4zOTN2MTAuOTU3TDM3LjU1OSAxNC41eiIgZmlsbD0iI2VmZWVlYSIvPjwvZz48ZyBmaWxsPSIjYTI5ZDg2IiBzd
<02:27:34 +0000>          HJva2U9IiNjY2MiIHN0cm9rZS13aWR0aD0iLjIxNCIgc3Ryb2tlLWxpbmVqb2luPSJiZXZlbCI+PHBhdGggZD0iTTM3LjY1NyAyNS42MzZsOS4zMjIgMy4zOTN2MTAuOTU3bC05LjMyMi0zLjM5M3oiIHN0eWxlPSJpc29sYXRpb246YXV0bzttaXgtYmxlbmQtbW9kZTpub3JtYWwiI
<02:27:34 +0000>          GNvbG9yPSIjMDAwIiBvdmVyZmxvdz0idmlzaWJsZSIgZmlsbD0iI2U5ZTlmZiIvPjxwYXRoIGQ9Ik0yOC4xOTYgMjkuMDh2MTAuOTU2bDkuNDYtMy40NDNWMjUuNjM2eiIgc3R5bGU9Imlzb2xhdGlvbjphdXRvO21peC1ibGVuZC1tb2RlOm5vcm1hbCIgY29sb3I9IiMwMDAiIG92Z
<02:27:34 +0000>          XJmbG93PSJ2aXNpYmxlIiBmaWxsPSIjMzUzNTY0Ii8+PHBhdGggZD0iTTI4LjE5NiA0MC4wMzZsOS4zMjMgMy4zOTQgOS40Ni0zLjQ0NC05LjMyMi0zLjM5M3oiIHN0eWxlPSJpc29sYXRpb246YXV0bzttaXgtYmxlbmQtbW9kZTpub3JtYWwiIGNvbG9yPSIjMDAwIiBvdmVyZmxvd
<02:27:34 +0000>          z0idmlzaWJsZSIgZmlsbD0iI2FmYWZkZSIvPjxwYXRoIGQ9Ik0yOC4xOTYgMjkuMDhsOS4zMjMgMy4zOTMgOS40Ni0zLjQ0NC05LjMyMi0zLjM5M3oiIGZpbGw9IiNmN2Y3ZjQiLz48cGF0aCBkPSJNMzcuNTE5IDMyLjQ3M1Y0My40M2w5LjQ2LTMuNDQ0VjI5LjAzeiIgZmlsbD0iI
<02:27:34 +0000>          2ZmZDI0MiIvPjxwYXRoIGQ9Ik0yOC4xOTYgMjkuMDhsOS4zMjMgMy4zOTNWNDMuNDNsLTkuMzIzLTMuMzk0eiIgZmlsbD0iI2VmZWVlYSIvPjwvZz48ZyBmaWxsPSIjYTI5ZDg2IiBzdHJva2U9IiNjY2MiIHN0cm9rZS13aWR0aD0iLjIxNCIgc3Ryb2tlLWxpbmVqb2luPSJiZXZlb
<02:27:34 +0000>          CI+PHBhdGggc3R5bGU9Imlzb2xhdGlvbjphdXRvO21peC1ibGVuZC1tb2RlOm5vcm1hbCIgZD0iTTM3LjY1NyAxNC41N2w5LjMyMiAzLjM5NFYyOC45MmwtOS4zMjItMy4zOTR6IiBjb2xvcj0iIzAwMCIgb3ZlcmZsb3c9InZpc2libGUiIGZpbGw9IiNlOWU5ZmYiLz48cGF0aCBzd
<02:27:34 +0000>          HlsZT0iaXNvbGF0aW9uOmF1dG87bWl4LWJsZW5kLW1vZGU6bm9ybWFsIiBkPSJNMjguMTk2IDE4LjAxNFYyOC45N2w5LjQ2LTMuNDQ0VjE0LjU3eiIgY29sb3I9IiMwMDAiIG92ZXJmbG93PSJ2aXNpYmxlIiBmaWxsPSIjMzUzNTY0Ii8+PHBhdGggc3R5bGU9Imlzb2xhdGlvbjphd
<02:27:34 +0000>          XRvO21peC1ibGVuZC1tb2RlOm5vcm1hbCIgZD0iTTI4LjE5NiAyOC45N2w5LjMyMyAzLjM5NCA5LjQ2LTMuNDQzLTkuMzIyLTMuMzk0eiIgY29sb3I9IiMwMDAiIG92ZXJmbG93PSJ2aXNpYmxlIiBmaWxsPSIjYWZhZmRlIi8+PHBhdGggZD0iTTI4LjE5NiAxOC4wMTRsOS4zMjMgM
<02:27:34 +0000>          y4zOTMgOS40Ni0zLjQ0My05LjMyMi0zLjM5NHoiIGZpbGw9IiNmN2Y3ZjQiLz48cGF0aCBkPSJNMzcuNTE5IDIxLjQwN3YxMC45NTdsOS40Ni0zLjQ0M1YxNy45NjR6IiBmaWxsPSIjMzc3NWE5Ii8+PHBhdGggZD0iTTI4LjE5NiAxOC4wMTRsOS4zMjMgMy4zOTN2MTAuOTU3bC05L
<02:27:34 +0000>          jMyMy0zLjM5M3oiIGZpbGw9IiNlZmVlZWEiLz48L2c+PGcgZmlsbD0iI2EyOWQ4NiIgc3Ryb2tlPSIjY2NjIiBzdHJva2Utd2lkdGg9Ii4yMTQiIHN0cm9rZS1saW5lam9pbj0iYmV2ZWwiPjxwYXRoIHN0eWxlPSJpc29sYXRpb246YXV0bzttaXgtYmxlbmQtbW9kZTpub3JtYWwiI
<02:27:34 +0000>          GQ9Ik0yOC4yOTMgMjkuMDRsOS4zMjMgMy4zOTR2MTAuOTU3bC05LjMyMy0zLjM5M3oiIGNvbG9yPSIjMDAwIiBvdmVyZmxvdz0idmlzaWJsZSIgZmlsbD0iI2U5ZTlmZiIvPjxwYXRoIHN0eWxlPSJpc29sYXRpb246YXV0bzttaXgtYmxlbmQtbW9kZTpub3JtYWwiIGQ9Ik0xOC44M
<02:27:34 +0000>          zMgMzIuNDg0djEwLjk1N2w5LjQ2LTMuNDQzVjI5LjA0eiIgY29sb3I9IiMwMDAiIG92ZXJmbG93PSJ2aXNpYmxlIiBmaWxsPSIjMzUzNTY0Ii8+PHBhdGggc3R5bGU9Imlzb2xhdGlvbjphdXRvO21peC1ibGVuZC1tb2RlOm5vcm1hbCIgZD0iTTE4LjgzMyA0My40NDFsOS4zMjIgM
<02:27:34 +0000>          y4zOTMgOS40Ni0zLjQ0My05LjMyMi0zLjM5M3oiIGNvbG9yPSIjMDAwIiBvdmVyZmxvdz0idmlzaWJsZSIgZmlsbD0iI2FmYWZkZSIvPjxwYXRoIGQ9Ik0xOC44MzMgMzIuNDg0bDkuMzIyIDMuMzkzIDkuNDYtMy40NDMtOS4zMjItMy4zOTN6IiBmaWxsPSIjZjdmN2Y0Ii8+PHBhd
<02:27:34 +0000>          GggZD0iTTI4LjE1NSAzNS44Nzd2MTAuOTU3bDkuNDYtMy40NDNWMzIuNDM0eiIgZmlsbD0iIzM3NzVhOSIvPjxwYXRoIGQ9Ik0xOC44MzMgMzIuNDg0bDkuMzIyIDMuMzkzdjEwLjk1N2wtOS4zMjItMy4zOTN6IiBmaWxsPSIjMmY2NDkxIi8+PC9nPjxnIGZpbGw9IiNhMjlkODYiI
<02:27:34 +0000>          HN0cm9rZT0iI2NjYyIgc3Ryb2tlLXdpZHRoPSIuMjE0IiBzdHJva2UtbGluZWpvaW49ImJldmVsIj48cGF0aCBkPSJNMjguMjkzIDE3Ljk3NWw5LjMyMyAzLjM5M3YxMC45NTdsLTkuMzIzLTMuMzkzeiIgc3R5bGU9Imlzb2xhdGlvbjphdXRvO21peC1ibGVuZC1tb2RlOm5vcm1hb
<02:27:34 +0000>          CIgY29sb3I9IiMwMDAiIG92ZXJmbG93PSJ2aXNpYmxlIiBmaWxsPSIjZTllOWZmIi8+PHBhdGggZD0iTTE4LjgzMyAyMS40MTl2MTAuOTU3bDkuNDYtMy40NDRWMTcuOTc1eiIgc3R5bGU9Imlzb2xhdGlvbjphdXRvO21peC1ibGVuZC1tb2RlOm5vcm1hbCIgY29sb3I9IiMwMDAiI
<02:27:34 +0000>          G92ZXJmbG93PSJ2aXNpYmxlIiBmaWxsPSIjMzUzNTY0Ii8+PHBhdGggZD0iTTE4LjgzMyAzMi4zNzZsOS4zMjIgMy4zOTMgOS40Ni0zLjQ0NC05LjMyMi0zLjM5M3oiIHN0eWxlPSJpc29sYXRpb246YXV0bzttaXgtYmxlbmQtbW9kZTpub3JtYWwiIGNvbG9yPSIjMDAwIiBvdmVyZ
<02:27:34 +0000>          mxvdz0idmlzaWJsZSIgZmlsbD0iI2FmYWZkZSIvPjxwYXRoIGQ9Ik0xOC44MzMgMjEuNDE5bDkuMzIyIDMuMzkzIDkuNDYtMy40NDQtOS4zMjItMy4zOTN6IiBmaWxsPSIjMmY2NDkxIi8+PHBhdGggZD0iTTI4LjE1NSAyNC44MTJ2MTAuOTU3bDkuNDYtMy40NDRWMjEuMzY4eiIgZ
<02:27:34 +0000>          mlsbD0iIzM3NzVhOSIvPjxwYXRoIGQ9Ik0xOC44MzMgMjEuNDE5bDkuMzIyIDMuMzkzdjEwLjk1N2wtOS4zMjItMy4zOTN6IiBmaWxsPSIjMmY2NDkxIi8+PC9nPjxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKC0xNjgzLjY2IC01MTMuMjc1KSBzY2FsZSguNjUxNzcpIj48ZyBmaWxsP
<02:27:34 +0000>          SIjYTI5ZDg2IiBzdHJva2U9IiNjY2MiIHN0cm9rZS13aWR0aD0iLjMyOCIgc3Ryb2tlLWxpbmVqb2luPSJiZXZlbCI+PHBhdGggc3R5bGU9Imlzb2xhdGlvbjphdXRvO21peC1ibGVuZC1tb2RlOm5vcm1hbCIgZD0iTTI2NDAuOTgzIDc5Mi44ODVsMTQuMzA0IDUuMjA2djE2LjgxM
<02:27:34 +0000>          WwtMTQuMzA0LTUuMjA2eiIgY29sb3I9IiMwMDAiIG92ZXJmbG93PSJ2aXNpYmxlIiBmaWxsPSIjZTllOWZmIi8+PHBhdGggc3R5bGU9Imlzb2xhdGlvbjphdXRvO21peC1ibGVuZC1tb2RlOm5vcm1hbCIgZD0iTTI2MjYuNDY4IDc5OC4xNjh2MTYuODExbDE0LjUxNS01LjI4M3YtM
<02:27:34 +0000>          TYuODExeiIgY29sb3I9IiMwMDAiIG92ZXJmbG93PSJ2aXNpYmxlIiBmaWxsPSIjMzUzNTY0Ii8+PHBhdGggc3R5bGU9Imlzb2xhdGlvbjphdXRvO21peC1ibGVuZC1tb2RlOm5vcm1hbCIgZD0iTTI2MjYuNDY4IDgxNC45NzlsMTQuMzA0IDUuMjA2IDE0LjUxNS01LjI4My0xNC4zM
<02:27:34 +0000>          DQtNS4yMDZ6IiBjb2xvcj0iIzAwMCIgb3ZlcmZsb3c9InZpc2libGUiIGZpbGw9IiNhZmFmZGUiLz48cGF0aCBkPSJNMjYyNi40NjggNzk4LjE2OGwxNC4zMDQgNS4yMDYgMTQuNTE1LTUuMjgzLTE0LjMwNC01LjIwNnoiIGZpbGw9IiMyZjY0OTEiLz48cGF0aCBkPSJNMjY0MC43N
<02:27:34 +0000>          zIgODAzLjM3NHYxNi44MTFsMTQuNTE1LTUuMjgzdi0xNi44MTF6IiBmaWxsPSIjMzc3NWE5Ii8+PHBhdGggZD0iTTI2MjYuNDY4IDc5OC4xNjhsMTQuMzA0IDUuMjA2djE2LjgxMWwtMTQuMzA0LTUuMjA2eiIgZmlsbD0iIzJmNjQ5MSIvPjwvZz48Y2lyY2xlIHRyYW5zZm9ybT0ic
<02:27:34 +0000>          2tld1koLTIwKSBzY2FsZSguOTM5NyAxKSIgY3k9IjE3NzIuOTIyIiBjeD0iMjgxNi4wMTciIHI9IjIuOTY3IiBmaWxsPSIjZmZmIi8+PC9nPjwvc3ZnPg==">                                                                                           
<02:27:34 +0000>                  <h1 class="viewport-section__heading">Sorry, something went wrong</h1>                                                                                                                                      
<02:27:34 +0000>                                                                                                                                                                                                                              
<02:27:34 +0000>                  <div class="viewport-section__text">                                                                                                                                                                        
<02:27:34 +0000>                    <p>PyPI is down for maintenance or is having an outage.</p>                                                                                                                                               
<02:27:34 +0000>                    <p>                                                                                                                                                                                                       
<02:27:34 +0000>                      This is affecting several of our services, including our web interface.</br>                                                                                                                            
<02:27:34 +0000>                      If you are trying to install a package, you should be able to <strong>pip install</strong> packages without problem.                                                                                    
<02:27:34 +0000>                    </p>                                                                                                                                                                                                      
<02:27:34 +0000>                                                                                                                                                                                                                              
<02:27:34 +0000>                    <ul class="unstyled">                                                                                                                                                                                     
<02:27:34 +0000>                      <li><a href="https://status.python.org/">Check our status page</a>, or</li>                                                                                                                             
<02:27:34 +0000>                      <li><a href="https://twitter.com/PythonStatus">View Python Status on Twitter</a></li>                                                                                                                   
<02:27:34 +0000>                    </ul>                                                                                                                                                                                                     
<02:27:34 +0000>                                                                                                                                                                                                                              
<02:27:34 +0000>                    <hr>                                                                                                                                                                                                      
<02:27:34 +0000>                                                                                                                                                                                                                              
<02:27:34 +0000>                    <p>                                                                                                                                                                                                       
<02:27:34 +0000>                      <strong>                                                                                                                                                                                                
<02:27:34 +0000>                        Rely on PyPI to get your job done?</br>                                                                                                                                                               
<02:27:34 +0000>                        Consider <a href="https://github.com/pypa/warehouse">contributing</a> or <a href="https://psfmember.org/civicrm/contribute/transact?reset=1&id=13">donating</a> to help us build a more stable and    
<02:27:34 +0000>          secure platform.                                                                                                                                                                                                    
<02:27:34 +0000>                      </strong>                                                                                                                                                                                               
<02:27:34 +0000>                    </p>                                                                                                                                                                                                      
<02:27:34 +0000>                  </div>                                                                                                                                                                                                      
<02:27:34 +0000>                </div>                                                                                                                                                                                                        
<02:27:34 +0000>              </div>                                                                                                                                                                                                          
<02:27:34 +0000>            </body>                                                                                                                                                                                                           
<02:27:34 +0000>          </html>                                                                                                                                                                                                             
<02:27:34 +0000>                                                                                                                                                                                                                              
<02:27:34 +0000> ERROR    HTTPError: 503 Service Unavailable from https://test.pypi.org/legacy/                                                                                                                                               
<02:27:34 +0000>          Service Unavailable    

Uploading package without large model files (succeeds)

$ (python -m twine upload --repository nighthawk-test dist/* --verbose) | TZ=UTC ts '<%H:%M:%S %z>'
<02:29:01 +0000> INFO     Using configuration from /Users/benjamin/.pypirc                                                                                                                                                                    
<02:29:01 +0000> Uploading distributions to https://test.pypi.org/legacy/
<02:29:01 +0000> INFO     dist/nighthawk-0.3.0.post3-py3-none-any.whl (430.3 KB)                                                                                                                                                              
<02:29:01 +0000> INFO     dist/nighthawk-0.3.0.post3.tar.gz (428.0 KB)                                                                                                                                                                        
<02:29:01 +0000> INFO     username set from config file                                                                                                                                                                                       
<02:29:01 +0000> INFO     password set from config file                                                                                                                                                                                       
<02:29:01 +0000> INFO     username: __token__                                                                                                                                                                                                 
<02:29:01 +0000> INFO     password: <hidden>                                                                                                                                                                                                  
<02:29:01 +0000> Uploading nighthawk-0.3.0.post3-py3-none-any.whl
100% ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 471.7/471.7 kB • 00:00 • 2.0 MB/s
<02:29:03 +0000> INFO     Response from https://test.pypi.org/legacy/:                                                                                                                                                                        
<02:29:03 +0000>          200 OK                                                                                                                                                                                                              
<02:29:03 +0000> Uploading nighthawk-0.3.0.post3.tar.gz
100% ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 469.3/469.3 kB • 00:00 • 165.2 MB/s
<02:29:05 +0000> INFO     Response from https://test.pypi.org/legacy/:                                                                                                                                                                        
<02:29:05 +0000>          200 OK                                                                                                                                                                                                              
<02:29:05 +0000> 
<02:29:05 +0000> View at:
<02:29:05 +0000> https://test.pypi.org/project/nighthawk/0.3.0.post3/
miketheman commented 6 months ago

Thanks @bmvandoren !

The good news - I was able to reproduce the error on testpypi.

The bad news - I played with limits, no dice there. The issue is happening between our edge cache and the backend application, and the request isn't showing up on the backend oddly.

Considering that TestPyPI is generally not used for production-grade packages, would it make more sense to use production PyPI, and thus sidestep the problem completely?

bmvandoren commented 6 months ago

Ah, I see. I thought that best practice was to first upload to TestPyPI before deploying to PyPI. But that assumed the two would be essentially identical.

I able to push this release to PyPI, so that's good! But it would be nice to be able to use TestPyPI for testing.

miketheman commented 6 months ago

I able to push this release to PyPI, so that's good!

Glad to hear it!

But it would be nice to be able to use TestPyPI for testing.

Indeed. Leaving this issue open for now, since there's definitely something different about how we are proxying the uploads for testpypi that is causing this issue.

asottile-sentry commented 3 months ago

fwiw we are seeing the same sort of problems but when uploading from github actions to public pypi: https://github.com/getsentry/publish/actions/runs/8437326194/job/23106871689#step:11:814

happy to provide whatever additional information that would help debug this -- it's running in a docker image (latest stable debian) with the current latest twine

ewdurbin commented 3 months ago

TestPyPI is being used for testing a redis upgrade and should be back soon. No SLA on that service.

asottile-sentry commented 3 months ago

@ewdurbin my message is about public pypi but the same failure modes

ewdurbin commented 3 months ago

Then please open an issue that isn't related to test.pypi.org, @asottile-sentry!

asottile-sentry commented 3 months ago

I was hoping to not lose the context that's already present in this thread since it is the same error message and same symptoms (large uploads)